传输层

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