【网络系统与控制】3-传输层-拥塞控制

Posted by Orchid on March 14, 2025

一、流量控制

1.1 为什么需要流量控制?

  • 网络层与应用层速率不匹配:如果网络层数据到达接收端的速度比应用层从套接字接收缓存中提取数据的速度快,会导致接收缓冲区溢出,进而引发数据丢失。

  • 避免接收端缓冲区溢出:接收端的缓存容量有限,若发送端发送的数据量超过接收端的处理能力,将导致接收端无法及时处理,最终造成数据丢失或系统崩溃。

1.2 TCP报文段如何实现流量控制?

  • 接收窗口(rwnd)机制

    • 原理:接收方通过TCP报文段首部的 rwnd 字段向发送方“广播”其接收缓冲区的可用空间。发送方根据接收到的 rwnd 值,将已发送但未确认(“飞行中”)的数据量限制在 rwnd 范围内,从而避免发送过多数据导致接收端缓冲区溢出。

    • 动态调整:接收方根据应用层从缓冲区中提取数据的速度动态调整 rwnd 值,发送方则根据最新的 rwnd 值调整发送速率。

  • 接收缓冲区管理

    • RcvBuffer:接收端的接收缓冲区大小可以通过套接字选项设置(默认值为4096字节),许多操作系统会自动调整 RcvBuffer 大小以适应网络环境和应用需求。

    • 数据管理:接收缓冲区中存储的是尚未被应用层读取的TCP数据,发送方通过维护接收窗口,确保不会因发送过多数据而溢出接收端的缓冲区。

二、拥塞控制

2.1 什么是拥塞?

  • 定义:网络中的拥塞是指“太多的发送源以过快的速度发送数据,导致网络无法及时处理”的现象。
  • 表现形式
    • 长延迟:数据包在路由器缓冲区中排队等待处理,导致传输延迟显著增加。
    • 数据包丢失:路由器缓冲区溢出,无法存储新到达的数据包,从而导致数据包被丢弃。

2.2 为什么需要拥塞控制?

  • 避免网络资源浪费:拥塞会导致数据包丢失和重传,增加网络负担,降低网络资源的利用效率。
  • 提高传输性能:通过合理控制发送速率,减少延迟和丢包率,提高数据传输的可靠性和效率。
  • 公平性:在多条连接共享网络资源时,拥塞控制可以确保每条连接都能公平地分配带宽资源,避免某些连接过度占用资源而影响其他连接的性能。

2.3 TCP如何实现拥塞控制?

  • TCP发送端控制发送:$LastByteSent- LastByteAcked ≤ cwnd (拥塞窗口)$

  • AIMD算法(拥塞控制的基本准则):

    原理:发送者在检测到丢包(拥塞)发生之前增加发送速率,当检测到丢包后降低发送速率。具体表现为每个RTT内线性(加性)增加发送速率,检测到丢包时发送速率减半(乘性减),形成锯齿形的动态调整行为。

  • TCP Tahoe

    1. 慢启动(Slow Start)
      • 初始阶段:连接建立时,初始拥塞窗口(cwnd)设置为1个最大报文段(MSS)。
      • 指数增长:每收到一个ACK,cwnd增加1个MSS,每个往返时间(RTT)内,cwnd呈指数增长(即cwnd = cwnd × 2)。
      • 目的:快速探测网络的可用带宽,避免一开始就发送过多数据导致网络拥塞。
      • 结束条件:当cwnd达到阈值ssthresh时,进入拥塞避免阶段。
    2. 拥塞避免(Congestion Avoidance)
      • 线性增长:每经过一个RTT,cwnd增加1个MSS,以更平缓的速度增长。
      • 目的:在接近网络容量时,避免因过快增长导致的丢包。
    3. 拥塞检测与恢复
      • 丢包检测:通过超时重传(RTO)检测丢包。
      • 响应机制
        • 当检测到丢包时,将ssthresh设置为当前cwnd的一半(ssthresh = cwnd / 2)。
        • 将cwnd重置为1个MSS,重新进入慢启动阶段。
      • 特点:对丢包的反应较为激进,恢复速度较慢。
  • TCP Reno

    1. 慢启动(Slow Start)
      • 与 TCP Tahoe 相同,初始cwnd为1个MSS,每收到一个ACK,cwnd增加1个MSS,呈指数增长,直到达到ssthresh。
    2. 拥塞避免(Congestion Avoidance)
      • 与 TCP Tahoe 相同,每经过一个RTT,cwnd线性增加1个MSS。
    3. 快速重传(Fast Retransmit)
      • 机制:当发送方收到 3个冗余ACK(即连续收到3个相同的ACK)时,认为发生了丢包。
      • 目的:无需等待超时即可快速检测到丢包,减少等待时间。
    4. 快速恢复(Fast Recovery)
      • 机制
        • 当检测到3个冗余ACK时,将ssthresh设置为当前cwnd的一半(ssthresh = cwnd / 2)。
        • 将cwnd设置为ssthresh + 3个MSS(因为已经收到3个冗余ACK,说明有3个报文段已经发送成功)。
        • 之后进入拥塞避免阶段,每经过一个RTT,cwnd线性增加1个MSS。
      • 目的:避免重新进入慢启动阶段,加快恢复速度,提高吞吐量。
    5. 超时重传
      • 当检测到超时时,将ssthresh设置为当前cwnd的一半(ssthresh = cwnd / 2)。
      • 将cwnd重置为1个MSS,重新进入慢启动阶段。

三、主动队列管理技术(AQM)

主动队列管理(Active Queue Management, AQM)是一种在网络中间节点(如路由器)上主动管理队列的技术,目的是在网络拥塞发生之前通过丢弃或标记数据包来避免拥塞的加剧。AQM 的核心思想是让网络节点在队列尚未溢出时就对拥塞做出反应,从而避免尾丢弃(Tail Drop)带来的全局同步问题和不公平性。

3.1 FIFO队列管理

3.1.1 基本原理

FIFO(First-In-First-Out,先进先出)队列管理是一种传统的队列调度机制,其核心思想是按照数据包到达的顺序进行处理:

  • 数据包按到达顺序进入队列。

  • 队列中的数据包按到达顺序依次离开队列。

  • 当队列长度超过缓冲区的最大容量时,新到达的数据包将被丢弃,这种丢弃策略被称为 尾丢弃(Tail Drop)

3.1.2 尾丢弃的缺点

尾丢弃策略虽然简单,但在拥塞控制中存在以下问题:

  1. 全局同步(Global Synchronization)
    • 当多个数据流共享一个队列时,尾丢弃会导致多个发送方同时检测到丢包,从而同时降低发送速率。
    • 当拥塞缓解后,这些发送方又会同时增加发送速率,导致网络流量的剧烈波动,进一步加剧拥塞。
  2. 不公平性(Unfairness)
    • 尾丢弃对所有数据流采用相同的丢弃策略,不区分数据流的优先级或类型(如TCP和UDP)。
    • 一些对延迟敏感的流量(如实时视频)可能会因为尾丢弃而受到不公平的对待。
  3. 缺乏动态调整能力
    • 尾丢弃仅在队列溢出时发生,无法提前对拥塞做出反应,容易导致队列长度过长,增加延迟。

3.2 随机早期检测(RED)

3.2.1 基本原理

随机早期检测(Random Early Detection, RED)是一种主动队列管理技术,通过在队列尚未溢出时就开始丢弃数据包,从而避免尾丢弃带来的问题。RED 的核心思想是根据队列长度动态调整数据包的丢弃概率,以平滑地控制队列长度和网络拥塞。

RED 的工作原理如下:

  1. 队列长度监测

    • 路由器维护一个平均队列长度(avg),用于平滑地反映队列的实际长度。

    • avg 的计算公式为: \(avg = (1 - w) * avg + w * q\) 其中,q 是当前队列的实际长度,w 是一个加权因子(0 < w < 1),用于控制avg的平滑程度。

  2. 丢弃策略

    • RED 预设两个队列长度阈值:最小阈值 min_th 和最大阈值 max_th

    • 根据平均队列长度avg与阈值的关系,决定是否丢弃到达的数据包:

      • 如果 avg < min_th,则不丢弃数据包。
      • 如果 min_th ≤ avg < max_th,则以一定的概率 p 丢弃数据包。
      • 如果 avg ≥ max_th,则直接丢弃数据包。
    • 丢弃概率 p 的计算公式为: \(p = (avg - min\_th) / (max\_th - min\_th)\) 这种机制使得丢弃概率随着队列长度的增加而平滑增加,而不是在队列溢出时突然丢弃所有数据包。

  3. 动态调整

    • RED 通过动态调整丢弃概率,避免了全局同步现象,能够更平滑地控制队列长度和网络拥塞。

3.2.2 RED 的优点

  1. 避免全局同步
    • RED 通过随机丢弃数据包,避免了多个发送方同时降低发送速率的现象,减少了网络流量的剧烈波动。
  2. 平滑控制队列长度
    • RED 在队列尚未溢出时就开始丢弃数据包,能够更平滑地控制队列长度,减少延迟。
  3. 提高公平性
    • RED 对不同数据流的丢弃概率是动态调整的,能够更好地适应不同流量类型的需求,提高网络资源的公平性。

3.2.3 RED 的缺点

  1. 参数敏感性
    • RED 的性能高度依赖于参数设置(如 min_thmax_thw 等)。如果参数设置不当,可能会导致丢弃概率过高或过低,影响网络性能。
  2. 缺乏业务区分能力
    • RED 对所有数据流采用相同的丢弃策略,无法区分不同优先级或类型的流量(如TCP和UDP),可能导致不公平性。