Unit 2. Transport
传输层
本单元着重讲解传输层。
主要是了解通讯中的数据传输问题。
Main Topics
三种广泛的协议
TCP 应用间字节流的可靠传输
UDP 应用间数据报的不可靠传输
ICMP 检测何时出问题
TCP 的工作原理
滑动窗口
Go back n
Selective repeat
TCP State Machine
End to End 原则
3 种 数据安全 错误检测方法
1. The TCP Service Model
TCP 按顺序提供了可靠的端到端字节流交付服务。
1.1. Transmission Control Protocol (·TCP)
Peer TCP layers communication
TCP 间的通讯通过三次握手建立连接
SYN
A 发送 B 同步信号,起始编号
SYN + ACK
B 返回 A 同步信号,和逆向起始编号
ACK
A 发送 接受 B 反向通讯的请求
1.2. TCP 字节流 服务
字节流是一个字节的时间序列。
TCP 把常见的传输形式看作字节流
流 stream 可以进行分割为 段 segment
如果传输没有回应会选择重发(简单粗暴)
1.3. Connection teardown
连接关闭
Fin
A 发送 Finish 表示结束
Data + Ack
B 选择回应,或同时发送新数据表示未关闭
Fin
B 发送 Finish 表示结束
Ack
A 发送 ACK 表示回应,确认连接已经关闭
1.4. Model 表现
提供可靠的字节流传输服务
可靠传输
Ack 表示接受信号
校验和 Checksums
序列号来进行数据的丢失检测,也就是一开始发送的 起始编号
流量控制防止双方过载,如果 A 快于 B 或相反,TCP提供服务来确定双法国可以继续发送数据
序列号传输
Controls network congestion
1.5. TCP Segment Format
|TCP Data | TCP Hdr| -> |IP Data |
|IP Data | IP Hdr|
体现了封装的重要性
HDR
包含以下字段
Source port
Destination port
Sequence
Ack Sequence
Checksum
Window size
Urgent pointer
(TCP Options)
1.6. TCP Unique ID
Host A 会使用递增的 port 来标识新连接
TCP picks ISN 来避免和以往的连接 ID 相同
1.7. Sequence Numbers
会告诉 主机 数据段的起始值 和长度,也就是下一次传输的偏移量。以便进行初步丢包校验。
TCP 包会封装到 IP 数据段
1.8. TCP Sliding Window
后面会学...
2. The UDP Service Model
or the User Datagram Protocol,提供给那些不需要严格的 TCP 协议的应用使用
2.1. UDP Datagram Format
简单的 Source port 和 Destination port。
还有
Checksum (optional),如果使用,会覆盖部分的 UDP 数据头
Length,至少为 8 字节,这是 UDP 头部的长度
2.2. UDP: Port Demultiplexing
UDP 可以看作是多路分解西医
2.3. UDP 表现
无建立连接,packets 可能会以任何顺序出现。
但可以重新排序,根据序列号
unreliable delivery
没有 Ack
没有 丢包检测(window size 和 sequence)
没有 flow control
那为什么还用呢?
只是提供简单的 request - response 应用。
使用更少的字节提供基础服务。轻量而快速。
有关 DNS,后面会学
3. The ICMP Service Model
The Internet Control Message Protocol - 为网路层服务 - 尽管他在 IP 层之上,看似在 传输层 工作
互联网控制消息协议 - 用于报告错误和诊断问题
3.1. 网络层的工作
IP
IP 数据包
逐跳传输数据
路由表
利用 算法 来填充路由器 转发表
ICMP
帮助 host 和 router 的交流
报告 error
找出出问题的数据包路径
3.2. ICMP run above the Network Layer
实际上在一些连接检验其作用。
EXAMPLE: 目标不可达。
目标地址在路由器的转发表不存在
Destination Network Unreachable
3.3. ICMP 表现
Reporting Message,自带报错信息
Unrelliable,仅仅提供简单的 数据报服务 - and no retries......
3.4. ICMP Message Type
不用记,用到再查 - Internet RFC 792
0 - 0 - 回应应答
3 - 0 - 目标网络不可达
3.5. How "ping" uses ICMP
ping 用来检查 B 和主机是否有连接
ping 可以直接调用 ICMP,通过发送一个 ICMP 回显请求
3.6. How "traceroute" uses ICMP
traceroute 告诉我们数据包跳转经过的路径,同样会调用 ICMP
通过发送 UDP 来实现,包含生存时间 TTL
例如 TTL = 0 时候会返回 ICMP 11, TTL Expired
等等,诸如此类
4. The End-to-End Principle
正确性
强端到端原则
4.1. Application View of the World
基本的网络通信比较简单 只需要基本的 socket 套接字,即可完成
网络的帮助很大!
压缩数据
格式化、翻译、改善 请求
添加安全性,加密
移动性支持,在网络中迁移链接...
any other
但是为什么没有 ?
它能保证帮助,但仅仅是帮助,不能实现主体。主题还得靠 端到端原则
4.2. Example: File Transfer
数据的传输在每一跳的节点都有 Error detection,但这其实并没有达到目的。它只会检测 传输的错误,而不是存储中的错误。
确保文件正确到达的唯一方式 还得是 端到端原则
还是那句话:
网络可以帮助,但不能完全保证正确性...
4.3. Example: Link Reliability
链路层的帮助极大的提升了性能。
在中间层可以做一些优化,但是无法避免有一天它会失效
有线链路
非常可靠
99.99% 的正确发送包率
无线链路:
进行重传来保证正确性
50 ~ 80% 的正确发送包率
但是可以通过优化来达到约 99%
4.4. "Strong" End to End
不要在中间层实现,只应在网络边缘执行
强调了简洁性...认为在中间层做优化并不总是正确的事情...
而且在中间层做优化会导致网络僵化...后续难以改变
5. Error Detection: 3 schemes
端到端原则
了解差异...做出正确的协议决策
Checksum 校验和
CRC 循环冗余校验码
MAC 消息认证码
5.1. Error Detection
在数据的头部或者尾部加入校验的功能。
如 CRC、TLS MAC...
5.2. Checksum
fast and cheap
not very robust 比较脆弱
IP\USP\TCP 使用 one's complement checksum algorithm 补码
IP Checksum
对比特位进行运算...作为数据包的校验和
5.3. Cyclic redundancy code
计算成本高于 checksum,鲁棒性也更好
可以检测更多的错误
在当今的硬件很容易实现。特别在 link layer
主要思想
将 n bits 的数据 提取为 c bits 且 c << n
但是不能匹配所有的数据包。2-c change another packet's CRC matches
涉及到计算多项式 以及 一些特殊计算方法。
5.4. Message authentication code
只有拥有秘密信息者可以查看信息。
对恶意修改具有很强的抵抗力,but not error
主要思想
千万不要与 Media Access Control (MAC) 地址混淆...
强大的密码学原理使得,如果你更改某个 bit of M,将会导致一个全新的 MAC......
错误检测能力不如 CRC
5.5. Quiz
错误检测
8/16 Checksum:
1 bit 错误
不能检测 2 bit 错误
不能检测 9 bit 错误
不能检测相隔 100 bits 的错误
8/16 CRC:
1 bit 错误
2 bits 错误
8 bits CRC 不能检测 2 bit 错误,16 bits 可以
不能检测相隔 100 bits 的错误
32 MAC:
不能保证检测到任何错误!
6. Finite State Machines
有限状态机
由有限状态组成,状态的边定义了 事件 event 和 行动 action
状态机只允许系统进入一种确定状态
6.1. FSM Example: HTTP Request
请求事件 可以导致 不同状态
例如 HTTP 的请求,导致不同的 响应
需要考虑具体的情况:
诸如
空闲状态的特殊请求
close connection
未定义状态或操作
用户需要制定协议
6.2. FSM Example: TCP Connection
课件上的例子。具有 TCP 的不同状态,状态切换,类似数电的状态转移图...状态机,只不过将情景转化为了网络的情况。
例子比较简单,借此机会复习了 TCP 连接的具体思路。有关三次握手。
下面在 CSDN 上找了个中文图片

7. Flow Control - Stop and Wait
Stop and Wait 流量控制算法
当某一方的收发数据不对等时,流量控制作为实现简单高效通信的重要因素之一。
发送方不要超过接收方
接受对方会给发送方某种 显性或者隐性的反馈
滑动窗口(后续会讲)
7.1. Stop and Wait
基本算法 是 发送方 会等 接收方 发送 接受信息 后才会发送下一个 数据包。
如果长时间没有 回复,就会重发数据。
但是问题接踵而至:
如果网络延迟,如何判断 Data 和 ACK 的对应关系?
使用 1 bit 的 cnt 可以解决
标注 Data 0 对应 ACK 0
Data 1 对应 ACK 1
但会有其他问题,比如多倍长时延迟
8. Flow Control - Slip Window
前情提要:SW 算法有一些弊端难以避免,适合在一些理想环境的 Network 使用
Problem:
Bottleneck:传输瓶颈:10 Mbps,代表接收方的最大接受数据量 per second
RTT:往返时间
SaW 算法效率往往底下,不能充分利用网络容量
这是用我们可以使用段的思想。发送多个数据包(包数量称为窗口),一旦接收信号到达就发送下一个数据包。保持每次都有 window size 的数量的数据包在传输
窗口大小可以进行动态调整
8.1. Sliding Window Sender
每一段都有一个序列号 - SeqNo
维护着 三个变量
Send window size(SWS)发送窗口大小
Last acknowledgment received(LAR)接收方的最后一个确认 的位置编号
Last segement sent(LSS)最后一个发送的段 的位置编号
维护一个不等式
LSS - LAR <= SWS
也就是 最后一个发送 - 最后一个接收 <= 窗口大小
更新 LAR 当有新的确认时
选择性确认
NOTE: TCP 不是确认它接受到的数据 n ,而是确认 n + 1
8.2. Example
Receive window size,接收方缓存的大小内的包接收方可以一并缓存。
接收方实际上会连续发送两次 的连续最后接受数据 ACK,来提醒发送方丢包。
累计确认
9. Retransmission Strategies
传输协议的重传策略,需要小心的选择策略,根据多方因素(如 SWS\RWS)。
go back n 回退重传 - pessimistic behavior,如果一个数据包丢失,我们会停止传输,回退 n 个数据包并重传
selective repeat 选择性重传
9.1. Go-Back-N
将丢包之后的包也重发一遍,就像事件倒流一样。
如果接收方窗口大小为 1,实际上它只能 go back n
9.2. Selective Repeat
只重新传那个没有 收到 ACK 的。但如果有大量数据包丢失,这个策略其实比 go back n 更慢。
如果 接收方窗口大小 与 发送方大小均为 n,实际上它可以冒险的使用 selective repeat
10. TCP Header
32 bits 4 octets
source port
destination port
sequence number
acknowledgment number
offset: 告诉你每次的偏移量
reserved
U: urgent bit
A: ack bit 建立的时候没有 ACK
P: push bit
R: reset 发生了错误
S: SYN 建立的时候需要告诉 序列号
F: FIN 拆除链接
window
checksum
urgent pointer: 如果有 U,会指向此数据
options
padding
10.1. 安全性
固然可以每次使用同一个序列号,但是人们就可以猜测你的序列号,然后插入一些致命的数据包
11. TCP Setup and Teardown
三次握手
同时打开现象
TCP有限状态机
11.1. 3-way Handshake
回顾一下 TCP 的 Header,connection setup.
下面详细了解三次握手的过程
随机化起始序列号
避免别人插入数据
避免与其他包混淆
一方主动,标准三次握手
发送端是 active 的
接收方是 passive 的
双方互相知道对方的端口号
11.2. simutaneous open 同时打开现象
双方主动,四次握手
发送端是 active 的
接收方是 active 的
双方同时回应...形成四次握手
11.3. Connection Tearfown
需要使用 Fin bit......
Both sides must send FIN to terminate a connection
典型关闭交换
A -> B: Fin, seq SA , ack SB
B -> A: ack SA+1
B -> A: FIN, seq SB , ack SA+1
A -> B: ack SB+1
对于 seq,确认的方式是 ack + 1
对于 fin,确认 FIN 即可,甚至可以并行 FIN
11.4. Cleaning Up Safely
发送了最后一个 ACK 之后 不能马上发送 FIN
最后一个包丢了怎么办?
主动关闭者会进入一个 TIME WAIT 阶段
称为 2MSL 最大的段寿命
11.5. 三次握手 关闭连接
发送 FIN0,确认之前的一些数据
确认 FIN0,发送你自己的 FIN1
确认 FIN1
11.6. Full TCP FSM
整合上述的和之前所学的内容可以得到一个完整的 TCP 有限状态机

一共有 12 个状态。(我一直觉得自己画一次这个图是很好的练习...)
Last updated