Skip to content

408

计算机网络

CN-05-07 TCP拥塞控制(慢开始/拥塞避免/快重传/快恢复)


一、定位信息

  • 圈层:核心层
  • 前置知识:需要掌握TCP可靠传输机制(确认、重传),理解滑动窗口和流量控制的基本概念,了解拥塞的基本含义
  • 知识网络位置:拥塞控制是TCP最复杂的机制,与流量控制共同决定发送窗口大小。它是传输层综合题的压轴考点,也是408计算机网络中分值最高的知识点之一
  • 考点热度等级H级(高频重点)——几乎每年都有大题或选择题考查拥塞控制过程

二、知识点讲解

2.1 拥塞的基本概念

**拥塞(Congestion)**是指网络中出现过量的数据分组,导致网络性能下降的现象。表现为:分组丢失概率增大、往返时间RTT增大、网络吞吐量下降。

拥塞产生的根本原因:网络中的总需求超过了网络的总处理能力。具体原因包括:路由器缓冲区溢出、链路带宽不足、处理器处理速度过慢等。

拥塞控制 vs 流量控制

  • 流量控制:点对点问题,只涉及发送方和接收方
  • 拥塞控制:全局性问题,涉及网络中的所有主机、路由器和链路

2.2 TCP拥塞控制的基本思路

TCP采用端到端的拥塞控制方法——网络层不提供拥塞反馈信息,TCP发送方通过观察网络行为来推断拥塞程度。

拥塞的判断信号:

  1. 超时(Timeout):最可靠的拥塞信号,说明报文段严重丢失
  2. 3个冗余确认(3 Duplicate ACKs):轻度拥塞信号,说明有个别报文段丢失

TCP引入**拥塞窗口(cwnd, Congestion Window)**来控制发送速率。实际发送窗口取: 发送窗口=min(rwnd,cwnd)\text{发送窗口} = \min(rwnd, cwnd)

2.3 慢开始(Slow Start)

核心思想:连接建立初期,不清楚网络状况,从小窗口开始试探性发送,每收到一个确认就将cwnd增加一个MSS(指数增长)。

过程

  1. 连接建立后,cwnd初始化为1个MSS
  2. 每收到一个对新数据的确认,cwnd += 1 MSS
  3. 因此每经过一个RTT,cwnd翻倍(指数增长)
  4. 当cwnd达到**慢开始门限(ssthresh)**时,转入拥塞避免阶段

举例:假设MSS=1000字节

  • 第1个RTT:cwnd=1 MSS → 发送1个报文段 → 收到1个ACK → cwnd=2 MSS
  • 第2个RTT:cwnd=2 MSS → 发送2个报文段 → 收到2个ACK → cwnd=4 MSS
  • 第3个RTT:cwnd=4 MSS → 发送4个报文段 → 收到4个ACK → cwnd=8 MSS
  • 以此类推...cwnd每RTT翻倍

2.4 拥塞避免(Congestion Avoidance)

核心思想:当cwnd达到ssthresh后,增长速度从指数变为线性,谨慎地探测网络容量。

过程

  1. 每经过一个RTT,cwnd增加1 MSS(而非翻倍)
  2. 即每收到一个ACK,cwnd += MSS × (MSS/cwnd) ≈ MSS/cwnd个MSS
  3. cwnd呈线性增长,缓慢逼近网络容量
  4. 直到发生拥塞(超时或3个冗余确认)

拥塞发生时的处理

  • 超时(严重拥塞):
    • ssthresh = cwnd / 2
    • cwnd = 1 MSS
    • 重新进入慢开始阶段
  • 3个冗余确认(轻度拥塞):
    • ssthresh = cwnd / 2
    • cwnd = ssthresh(而非1)
    • 进入快恢复阶段(TCP Reno)

2.5 快重传(Fast Retransmit)

快重传已在CN-05-05中详述。核心:收到3个冗余确认后立即重传丢失报文段,不等待超时。

2.6 快恢复(Fast Recovery)

核心思想:收到3个冗余确认说明网络只是轻度拥塞(个别报文段丢失),不必像超时那样剧烈地减小cwnd。

过程(TCP Reno版本):

  1. 收到3个冗余确认
  2. ssthresh = cwnd / 2
  3. cwnd = ssthresh + 3 MSS(因为收到3个冗余确认,说明3个报文段到达了接收方)
  4. 进入拥塞避免阶段(线性增长)

2.7 TCP拥塞控制完整过程图

cwnd
(MSS)
  ^
  |                          * * * * *(拥塞避免:线性增长)
  |                     *  *
  |                  *     ← 超时!ssthresh=cwnd/2, cwnd=1
  |               *    |
  |            *       |
  |         *          |
  |      *             ↓
  |   *                |          * * * * * *(再次拥塞避免)
  |  *                 |     * * *
  | *                  |  * *
  |*                   |*      ← 3个冗余确认!ssthresh=cwnd/2, cwnd=ssthresh
  +------*-------------+*---------*----------→ 时间(RTT)
  0    ssthresh初始     ssthresh新

  阶段:慢开始 → | 拥塞避免 → | 慢开始 → 拥塞避免...

详细数值过程:假设ssthresh初始=16 MSS

RTT阶段cwnd事件
1慢开始1→2指数增长
2慢开始2→4指数增长
3慢开始4→8指数增长
4慢开始→拥塞避免8→16达到ssthresh,转入线性增长
5拥塞避免16→17线性增长
6拥塞避免17→18线性增长
7拥塞避免18→19线性增长
8拥塞避免19→20线性增长
9拥塞避免20→21此时发生超时
9+慢开始ssthresh=10, cwnd=1重新慢开始
10慢开始1→2指数增长
............

2.8 TCP Tahoe与TCP Reno

版本超时处理3个冗余确认处理现状
TCP Tahoessthresh=cwnd/2, cwnd=1, 慢开始同超时处理已过时
TCP Renossthresh=cwnd/2, cwnd=1, 慢开始ssthresh=cwnd/2, cwnd=ssthresh, 快恢复主流版本

考试中通常默认使用TCP Reno版本

2.9 AIMD原则

TCP拥塞控制遵循**AIMD(Additive Increase Multiplicative Decrease,加法增大乘法减小)**原则:

  • 加法增大(AI):拥塞避免阶段,cwnd线性增长(每RTT加1 MSS)
  • 乘法减小(MD):发生拥塞时,ssthresh和cwnd减半(乘以1/2)

AIMD是TCP公平性的重要保证——多个TCP连接共享同一链路时,AIMD使它们最终趋于公平分配带宽。


三、记忆与理解辅助

  1. 口诀:"慢开始指数往上翻,拥塞避免加一慢慢看;超时回到一把梭,三个冗余快恢复减一半"——记住四个阶段的核心行为。

  2. 数字记忆:ssthresh始终等于发生拥塞时cwnd的一半。超时后cwnd回到1(慢开始),3个冗余确认后cwnd降到ssthresh(快恢复)。

  3. 对比表:四种拥塞控制机制

机制触发条件ssthresh变化cwnd变化进入阶段
慢开始连接建立/超时后不变1→2→4→8...(指数)直到cwnd≥ssthresh
拥塞避免cwnd达到ssthresh不变每RTT+1(线性)直到拥塞发生
快重传3个冗余确认不变立即重传
快恢复3个冗余确认(Reno)cwnd/2cwnd=ssthresh拥塞避免
  1. 场景联想:慢开始像"新手上路"——小心翼翼从1开始试探。拥塞避免像"老司机巡航"——缓慢加速直到感觉不对。超时像"急刹车"——直接回到起步。快恢复像"点刹"——轻踩一下降到安全速度。

四、例题与精解

例题1(基础巩固)

题目:TCP连接的初始ssthresh=32 MSS。在慢开始阶段,当cwnd增长到32 MSS时转入拥塞避免阶段。经过若干个RTT后,cwnd增长到40 MSS时发生超时。则超时后ssthresh=( )MSS,cwnd=( )MSS。此后经过( )个RTT后cwnd才能再次达到ssthresh。

A. 20, 1, 5

B. 20, 1, 4

C. 40, 1, 5

D. 20, 32, 1

命题意图:考查超时后ssthresh和cwnd的重置,以及慢开始阶段cwnd的增长过程。

精解

  1. 审题分析:超时发生在cwnd=40时,需要计算超时后的参数和恢复时间。

  2. 解题思路:超时→ssthresh=cwnd/2,cwnd=1 MSS→慢开始阶段→指数增长→cwnd达到新ssthresh时转入拥塞避免。

  3. 完整步骤

    • 超时时cwnd=40 MSS

    • ssthresh = 40 / 2 = 20 MSS

    • cwnd = 1 MSS(超时后回到慢开始)

    • 慢开始阶段cwnd指数增长:

      • RTT 1: cwnd=1→2
      • RTT 2: cwnd=2→4
      • RTT 3: cwnd=4→8
      • RTT 4: cwnd=8→16
      • RTT 5: cwnd=16→20(达到ssthresh=20,转入拥塞避免)
    • 但注意:cwnd从1到20需要5个RTT吗?

      • RTT 1: cwnd=1→2(经过一个RTT)
      • RTT 2: cwnd=2→4
      • RTT 3: cwnd=4→8
      • RTT 4: cwnd=8→16
      • RTT 5: cwnd=16→32...不对,ssthresh=20,到16后下一步应该是转入拥塞避免还是继续慢开始?
      • 关键规则:cwnd达到ssthresh时转入拥塞避免,所以cwnd从16增长时,如果下一个值>20,则在cwnd=20时转入拥塞避免
      • 慢开始阶段:1→2→4→8→16,在cwnd=16时还没达到ssthresh=20
      • 下一个RTT:cwnd=16→32(慢开始的指数增长),但这超过了20
      • 实际上在cwnd增长到>=ssthresh时就转入拥塞避免,所以当cwnd=16时,下一RTT增长到32>20,此时应该在cwnd到达20时就转入拥塞避免
      • 更准确地说:当cwnd=16时,发送16个报文段,收到16个ACK后cwnd=16+16=32>20,所以在这一RTT中cwnd增长到20时就应该转为拥塞避免
      • 考研中的简化处理:cwnd从1开始,每RTT翻倍,当cwnd≥ssthresh时转入拥塞避免
      • 1→2→4→8→16→(转入拥塞避免,cwnd=20)
      • 需要5个RTT?还是4个?
      • 让我重新计算:RTT0(初始):cwnd=1; RTT1:cwnd=2; RTT2:cwnd=4; RTT3:cwnd=8; RTT4:cwnd=16; RTT5:此时cwnd从16增长,由于16<20,仍处于慢开始,但增长后16*2=32>20,所以在此RTT中转入拥塞避免,cwnd变为20
      • 实际上从cwnd=1到cwnd达到ssthresh=20,需要约5个RTT(但第5个RTT的值受限为20而非32)
    • 从1到20需要5个RTT(1→2→4→8→16→20),答案是5。

  4. 方法反思:慢开始的指数增长可以用 cwnd=2RTTcwnd = 2^{RTT} 来近似计算。从 20=12^0=124=162^4=16 需要4个RTT,第5个RTT从16到20(受限于ssthresh),共5个RTT。

答案:A


例题2(中等提升)

题目:TCP Reno版本下,初始ssthresh=64 MSS。在拥塞避免阶段cwnd增长到80 MSS时收到了3个冗余确认。则此时ssthresh=( )MSS,cwnd=( )MSS,随后进入( )阶段。若在此后的拥塞避免阶段cwnd增长到100 MSS时发生超时,则ssthresh=( )MSS,cwnd=( )MSS。

A. 40, 43, 拥塞避免; 50, 1

B. 40, 40, 拥塞避免; 50, 1

C. 40, 43, 慢开始; 50, 1

D. 40, 40, 慢开始; 50, 1

命题意图:考查TCP Reno版本下快恢复和超时两种拥塞处理方式的区别。

精解

  1. 审题分析:两个拥塞事件——先是3个冗余确认(Reno的快恢复),后是超时。

  2. 解题思路

    • 3个冗余确认(Reno):ssthresh=cwnd/2, cwnd=ssthresh+3, 进入拥塞避免
    • 超时:ssthresh=cwnd/2, cwnd=1, 进入慢开始
  3. 完整步骤

    第一个事件(3个冗余确认)

    • 当前cwnd=80 MSS
    • ssthresh = 80 / 2 = 40 MSS
    • cwnd = ssthresh + 3 = 40 + 3 = 43 MSS(加上3是因为收到了3个冗余确认,说明3个报文段到达了)
    • 随后进入拥塞避免阶段(线性增长)

    第二个事件(超时)

    • 当前cwnd=100 MSS
    • ssthresh = 100 / 2 = 50 MSS
    • cwnd = 1 MSS
    • 随后进入慢开始阶段
  4. 方法反思:Reno版本的关键区别在于:3个冗余确认后cwnd=ssthresh+3(不是ssthresh,更不是1),进入拥塞避免(不是慢开始)。而超时后cwnd=1,进入慢开始——这是最严重的拥塞处理。注意"快恢复"中的"+3"是因为收到3个冗余确认意味着有3个报文段成功到达了接收方,网络还有传输能力。

答案:A


五、考情分析

  • 考查频次:近5年408真题中拥塞控制相关题目每年必考,约6~10次
  • 常见题型:选择题(参数计算、阶段判断)和综合题(画cwnd变化曲线、计算特定时刻的窗口大小和ssthresh)
  • 分值占比:6~12分,是408计算机网络中单个知识点分值最高的之一
  • 命题趋势:近年综合题难度提升,要求画出完整的cwnd变化过程图,或结合流量控制计算实际发送窗口。TCP Reno vs Tahoe的区别、AIMD原则也是常见考点
  • 基于大纲与命题规律推测

六、易错点提醒

  1. 错误表现:将3个冗余确认后的处理等同于超时处理

    • 错误原因:对两种拥塞信号的严重程度区分不清
    • 正确理解/做法:超时是严重拥塞,cwnd回到1重新慢开始;3个冗余确认是轻度拥塞(Reno版本),cwnd降到ssthresh进入拥塞避免。两者对cwnd的打击完全不同。
  2. 错误表现:快恢复时cwnd=ssthresh(忘记+3)

    • 错误原因:只记得"降到ssthresh",忽略了加3的细节
    • 正确理解/做法:TCP Reno快恢复时cwnd=ssthresh+3 MSS。+3是因为收到3个冗余确认说明3个报文段成功到达了网络对端,网络还有一定的传输能力。
  3. 错误表现:慢开始阶段cwnd增长到ssthresh后,下一个RTT直接将cwnd设为ssthresh×2

    • 错误原因:没有理解转入拥塞避免的时机
    • 正确理解/做法:当cwnd增长到>=ssthresh时,立即转入拥塞避免阶段,之后每RTT只增加1 MSS(线性增长),不再翻倍。
  4. 错误表现:将发送窗口直接等同于cwnd

    • 错误原因:忽略了流量控制的限制
    • 正确理解/做法:实际发送窗口 = min(rwnd, cwnd)。如果接收方的rwnd很小,即使cwnd很大,发送窗口也不会超过rwnd。
  5. 错误表现:混淆TCP Tahoe和TCP Reno的行为

    • 错误原因:教材中可能同时介绍两个版本,容易混记
    • 正确理解/做法:考试中默认使用TCP Reno。关键区别:3个冗余确认后,Tahoe的cwnd=1(同超时),Reno的cwnd=ssthresh+3(快恢复)。

七、来源标注

  • 依据2026考研统考大纲·计算机网络部分
  • 依据《计算机网络(第8版)》谢希仁版
  • 依据《计算机网络:自顶向下方法(第8版)》James F. Kurose版
  • 依据RFC 2581 - TCP Congestion Control

考研全科复习资料 - 基于2026考研统考大纲