传输层
- UDP
- 结构

- 按顺序为源端口、目的端口、UDP 总长、校验和。
- 在排除了分组的情况下,UDP 长度为 IP 长度减 IP 头长度。
- 校验和的伪首部包括了 IP 头的部分。
- 结构
- TCP
- 结构

- 序列号:4 字节,以字节为单位,表示数据载荷中第一个字节的偏移量。
- 确认:4 字节,同样以字节为单位,为累积语义,表示期待接受的下一段的数据的首字节偏移量。
- 窗口大小:用于表示自己接下来可以接收的数据大小。
- 标志位:
- URG:急。
- ACK:包括确认。
- PSH:请求推送。
- RST:重置连接。
- SYN:同步序列号,用于连接起始。
- FIN:终结连接。
- 通信行为
- 开始连接,使用三次握手:
- 客户端发送 SYN,序列号为 ,即客户端的起始序列号。
- 服务器端发生 SYN + ACK ,序列号为 ,即服务器端的起始序列号。
- 客户端发送 ACK 。
- 此次可以只发 ACK,则下一次发送无需增加序列号。
- 也可以直接开始携带数据。
- 双方同时开始连接的情况:
- 双方同时发送 SYN 和 。
- 接收后,同时发送 SYN ACK 、SYN ACK 。
- 这里发送的 SYN 序列号与前一次握手相同,假装是收到对方的 SYN 后触发的。
- 接收后,开始发送数据。
- 关闭连接,使用四次握手:
- 客户端发送 FIN,序列号为 ,ACK 为 。
- 服务器端发送 ACK ,序列号为 。
- 服务器端在发送完自己的剩余数据后,发送 FIN,序列号为 ,ACK 为 。
- 如果之前没有剩余数据需要发送,可以把 FIN 和 ACK 合并,即合并第二、三次握手。
- 客户端发送 ACK ,序列号为 。
- 客户端等待 2 MSL(Maximum Segment Lifetime),如果没有再接收到 FIN,则完全断开。
- 同时关闭连接的情况:
- 双方同时发送 FIN ACK 和 FIN ACK 。
- 接收后,同时发送 ACK 和 ACK 。
- 同时等待 2 MSL,没有再收到就完全断开。
- 其他情况下,遇到不正常的消息,则发送 RST。
- 开始连接,使用三次握手:
- 差错控制
- 序列号保证顺序、超时保证丢包时重传。
- 超时时间与 RTT 相关,通过采样每次发送的 RTT 和指数滑动平均来估计 RTT。
- 流量控制
- 一个端给对方发送时,TCP 头包括窗口大小,表示下一次自己再发送 ACK 前,对方可以发送的数据大小。
- 超出窗口范围的不能发送,窗口内的再超时情况下可以重传。
- 一个端控制自己的接收窗口大小和对方的发送窗口大小。
- 发送窗口大小实际上也受拥塞情况控制,取两者最小值。
- 拥塞控制
- Tahoe
- 状态:
- :拥塞窗口大小。实际的发送窗口大小为 和对方反馈的窗口大小的最小值。
- :拥塞避免阈值,超过此阈值后就从慢启动进入拥塞避免。
- 慢启动:
- 设置 。
- 每次接收到一个 ACK 后就给 增加 。这里假设每次发送都有对应一个 ACK 回复。
- 效果为每轮结束后, 翻倍,指数级增长。
- 如果大于等于 ,则退出慢启动。
- 拥塞避免:
- 每次接收到一个 ACK 后就给 增加 。
- 效果为为每轮结束后, 加 ,线性增长。
- 如果遇到超时,则认为发生拥塞, 缩减为 ,重回慢启动过程,重传丢失的部分。
- 每次接收到一个 ACK 后就给 增加 。

- 状态:
- Tahoe + Fast Retransmit
- 拥塞避免阶段,如果遇到三个重复的 ACK,则跳过超时等待,重新进入慢启动过程。
- Reno
- 拥塞避免阶段,如果遇到三个重复的 ACK,则跳过超时等待, 缩减,不进入慢启动过程,而是 重置为新的 。
- 如果遇到超时,仍然重回慢启动过程。
- Tahoe
- 结构