Appearance
408
计算机网络
CN-05-07 TCP拥塞控制(慢开始/拥塞避免/快重传/快恢复)
一、定位信息
- 圈层:核心层
- 前置知识:需要掌握TCP可靠传输机制(确认、重传),理解滑动窗口和流量控制的基本概念,了解拥塞的基本含义
- 知识网络位置:拥塞控制是TCP最复杂的机制,与流量控制共同决定发送窗口大小。它是传输层综合题的压轴考点,也是408计算机网络中分值最高的知识点之一
- 考点热度等级:H级(高频重点)——几乎每年都有大题或选择题考查拥塞控制过程
二、知识点讲解
2.1 拥塞的基本概念
**拥塞(Congestion)**是指网络中出现过量的数据分组,导致网络性能下降的现象。表现为:分组丢失概率增大、往返时间RTT增大、网络吞吐量下降。
拥塞产生的根本原因:网络中的总需求超过了网络的总处理能力。具体原因包括:路由器缓冲区溢出、链路带宽不足、处理器处理速度过慢等。
拥塞控制 vs 流量控制:
- 流量控制:点对点问题,只涉及发送方和接收方
- 拥塞控制:全局性问题,涉及网络中的所有主机、路由器和链路
2.2 TCP拥塞控制的基本思路
TCP采用端到端的拥塞控制方法——网络层不提供拥塞反馈信息,TCP发送方通过观察网络行为来推断拥塞程度。
拥塞的判断信号:
- 超时(Timeout):最可靠的拥塞信号,说明报文段严重丢失
- 3个冗余确认(3 Duplicate ACKs):轻度拥塞信号,说明有个别报文段丢失
TCP引入**拥塞窗口(cwnd, Congestion Window)**来控制发送速率。实际发送窗口取:
2.3 慢开始(Slow Start)
核心思想:连接建立初期,不清楚网络状况,从小窗口开始试探性发送,每收到一个确认就将cwnd增加一个MSS(指数增长)。
过程:
- 连接建立后,cwnd初始化为1个MSS
- 每收到一个对新数据的确认,cwnd += 1 MSS
- 因此每经过一个RTT,cwnd翻倍(指数增长)
- 当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后,增长速度从指数变为线性,谨慎地探测网络容量。
过程:
- 每经过一个RTT,cwnd增加1 MSS(而非翻倍)
- 即每收到一个ACK,cwnd += MSS × (MSS/cwnd) ≈ MSS/cwnd个MSS
- cwnd呈线性增长,缓慢逼近网络容量
- 直到发生拥塞(超时或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版本):
- 收到3个冗余确认
- ssthresh = cwnd / 2
- cwnd = ssthresh + 3 MSS(因为收到3个冗余确认,说明3个报文段到达了接收方)
- 进入拥塞避免阶段(线性增长)
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 Tahoe | ssthresh=cwnd/2, cwnd=1, 慢开始 | 同超时处理 | 已过时 |
| TCP Reno | ssthresh=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使它们最终趋于公平分配带宽。
三、记忆与理解辅助
口诀:"慢开始指数往上翻,拥塞避免加一慢慢看;超时回到一把梭,三个冗余快恢复减一半"——记住四个阶段的核心行为。
数字记忆:ssthresh始终等于发生拥塞时cwnd的一半。超时后cwnd回到1(慢开始),3个冗余确认后cwnd降到ssthresh(快恢复)。
对比表:四种拥塞控制机制
| 机制 | 触发条件 | ssthresh变化 | cwnd变化 | 进入阶段 |
|---|---|---|---|---|
| 慢开始 | 连接建立/超时后 | 不变 | 1→2→4→8...(指数) | 直到cwnd≥ssthresh |
| 拥塞避免 | cwnd达到ssthresh | 不变 | 每RTT+1(线性) | 直到拥塞发生 |
| 快重传 | 3个冗余确认 | 不变 | — | 立即重传 |
| 快恢复 | 3个冗余确认(Reno) | cwnd/2 | cwnd=ssthresh | 拥塞避免 |
- 场景联想:慢开始像"新手上路"——小心翼翼从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的增长过程。
精解:
审题分析:超时发生在cwnd=40时,需要计算超时后的参数和恢复时间。
解题思路:超时→ssthresh=cwnd/2,cwnd=1 MSS→慢开始阶段→指数增长→cwnd达到新ssthresh时转入拥塞避免。
完整步骤:
超时时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个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版本下快恢复和超时两种拥塞处理方式的区别。
精解:
审题分析:两个拥塞事件——先是3个冗余确认(Reno的快恢复),后是超时。
解题思路:
- 3个冗余确认(Reno):ssthresh=cwnd/2, cwnd=ssthresh+3, 进入拥塞避免
- 超时:ssthresh=cwnd/2, cwnd=1, 进入慢开始
完整步骤:
第一个事件(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
- 随后进入慢开始阶段
方法反思: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原则也是常见考点
- 基于大纲与命题规律推测
六、易错点提醒
错误表现:将3个冗余确认后的处理等同于超时处理
- 错误原因:对两种拥塞信号的严重程度区分不清
- 正确理解/做法:超时是严重拥塞,cwnd回到1重新慢开始;3个冗余确认是轻度拥塞(Reno版本),cwnd降到ssthresh进入拥塞避免。两者对cwnd的打击完全不同。
错误表现:快恢复时cwnd=ssthresh(忘记+3)
- 错误原因:只记得"降到ssthresh",忽略了加3的细节
- 正确理解/做法:TCP Reno快恢复时cwnd=ssthresh+3 MSS。+3是因为收到3个冗余确认说明3个报文段成功到达了网络对端,网络还有一定的传输能力。
错误表现:慢开始阶段cwnd增长到ssthresh后,下一个RTT直接将cwnd设为ssthresh×2
- 错误原因:没有理解转入拥塞避免的时机
- 正确理解/做法:当cwnd增长到>=ssthresh时,立即转入拥塞避免阶段,之后每RTT只增加1 MSS(线性增长),不再翻倍。
错误表现:将发送窗口直接等同于cwnd
- 错误原因:忽略了流量控制的限制
- 正确理解/做法:实际发送窗口 = min(rwnd, cwnd)。如果接收方的rwnd很小,即使cwnd很大,发送窗口也不会超过rwnd。
错误表现:混淆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