Skip to content

TCP拥塞控制

背景

(课件原文):

TCP采用基于滑动窗口的方法进行拥塞控制,属于闭环控制方法。
TCP发送方维持一个拥塞窗口 cwnd(Congestion Window),其大小取决于网络的拥塞程度,并且是动态变化的。

真正的发送窗口:

\[\text{发送窗口} = \min(\text{接收方通知的窗口值 rwnd}, \text{拥塞窗口 cwnd})\]

判断拥塞的方法(隐式反馈)

(课件原文):

因传输出差错而丢弃分组的概率很小(远小于1%)。因此,发送方在超时重传计时器启动时,就判断网络出现了拥塞。

另一信号:收到3个重复ACK(快重传触发条件)。

四种拥塞控制算法(RFC 5681)

1. 慢开始(Slow Start)

(课件原文):

目的:探测网络的负载能力或拥塞程度。
算法:由小到大逐渐增大注入到网络中的数据字节。

cwnd增大规则(课件原文):

拥塞窗口cwnd每次的增加量 = min(N, SMSS) 其中N是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。

简化理解:每收到一个ACK,cwnd += 1 MSS → 指数增长(每RTT翻倍)

初始:cwnd = 1 MSS(或约10 MSS,RFC 6928)

2. 慢开始门限 ssthresh

(课件原文):

防止拥塞窗口cwnd增长过大引起网络拥塞。
- 当 cwnd < ssthresh:使用慢开始算法(指数增长)
- 当 cwnd > ssthresh:停止慢开始,改用拥塞避免算法
- 当 cwnd = ssthresh:两者均可

3. 拥塞避免(Congestion Avoidance)

(课件原文):

目的:让拥塞窗口cwnd缓慢地增大,避免出现拥塞。
每经过一个往返时间RTT(不管在此期间收到了多少确认),发送方的拥塞窗口 cwnd = cwnd + 1。 具有加法增大 AI(Additive Increase)特点:使拥塞窗口按线性规律缓慢增长。

超时拥塞处理(课件原文):

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时): $\(\text{ssthresh} = \max(\text{cwnd}/2, 2)\)$ cwnd 重置为 1,重新执行慢开始算法。

4. 快重传(Fast Retransmit)

触发条件:收到3个连续重复ACK(说明某报文段丢失,但网络未完全拥塞)

行动:立即重传该报文段,不等超时计时器。

5. 快恢复(Fast Recovery)

快重传后配套使用: - \(\text{ssthresh} = \text{cwnd}/2\) - \(\text{cwnd} = \text{ssthresh}\)(不归1!) - 直接进入拥塞避免阶段(线性增长)

完整状态机示意

cwnd
 32 |         *
 16 |       * |  ssthresh=16
  8 |     *   |
  4 |   *     |    * ← 快恢复起点
  2 | *       |  *
  1 |*        |*
    +──────────────── RTT
     慢开始    拥塞避免  快恢复后
              (超时:归1)

AIMD特性

  • 加法增大(AI):拥塞避免阶段,每RTT +1
  • 乘法减小(MD):检测到拥塞,ssthresh减半

AIMD是TCP公平性的数学基础:多条TCP连接共享链路时,最终收敛到公平分配带宽。

参见

  • [[05-运输层]] — TCP完整介绍
  • [[TCP三次握手]] — 连接建立
  • [[05-运输层|TCP流量控制]] — rwnd机制(与cwnd协作)
  • [[时延模型]] — RTT的测量