Skip to content

TCP 拥塞控制

考情分析

TCP 拥塞控制是 408 计算机网络传输层的绝对核心,几乎每年都会以选择题或大题的形式出现。常见考法包括:给定初始 ssthresh 和某轮次发生超时/收到三个重复 ACK,要求画出 cwnd 变化曲线或计算某一轮次的 cwnd 值。

考频:★★★★★

拥塞的概念

网络中的链路容量、交换节点的缓存和处理能力都是有限的。当网络中的数据量超过了这些资源的承载能力时,网络性能就会急剧下降——丢包增多、时延增大、吞吐量反而降低。这种现象就是拥塞

拥塞是一个全局性问题,涉及网络中所有主机、所有路由器以及与降低网络传输性能有关的所有因素。

拥塞控制 vs 流量控制

对比项拥塞控制流量控制
解决的问题网络中整体负载过大发送方发太快,接收方来不及处理
作用范围全局性,涉及所有主机和路由器点对点,只涉及发送方和接收方
控制变量拥塞窗口 cwnd接收窗口 rwnd
触发条件丢包(超时或重复ACK)接收方通告窗口变化

TCP 发送方的实际发送窗口取两者较小值:

发送窗口=min(cwnd,rwnd)

四种拥塞控制算法

TCP 拥塞控制包含四种算法:慢开始拥塞避免快重传快恢复。前两种是 TCP Tahoe 引入的,后两种是 TCP Reno 在此基础上增加的改进。

慢开始(Slow Start)

"慢开始"这个名字容易产生误解——它并不是说增长慢,而是说起点低。发送方不会一上来就发送大量数据,而是从一个很小的窗口开始,逐步试探网络容量。

算法过程:

  1. 连接建立后,初始化 cwnd=1(单位为 MSS,最大报文段长度)
  2. 每收到一个新的 ACK,cwnd=cwnd+1
  3. 由于一个 RTT 内所有报文段都会被确认,所以每经过一个 RTT,cwnd 翻倍

也就是说,慢开始阶段 cwnd 按 124816 的规律指数增长

退出条件:cwndssthresh(慢开始门限)时,转入拥塞避免阶段。

传输轮次:  0    1    2    3    4    5
cwnd:      1    2    4    8   16   32
                                    ↑ 若 ssthresh=16,到16后转拥塞避免

拥塞避免(Congestion Avoidance)

当 cwnd 达到 ssthresh 后,继续指数增长风险太大,改为线性增长(也叫"加法增大",Additive Increase)。

算法过程:

  1. 每经过一个 RTT,cwnd=cwnd+1
  2. cwnd 按 16171819 的规律线性增长

"拥塞避免"并非完全避免拥塞,只是让 cwnd 增长得更谨慎,降低触发拥塞的概率。

遇到超时(网络拥塞的明确信号):

  1. ssthresh=cwnd/2
  2. cwnd=1
  3. 重新执行慢开始

这就是所谓的"乘法减小"(Multiplicative Decrease),和"加法增大"合称 AIMD(Additive Increase Multiplicative Decrease)策略。

快重传(Fast Retransmit)

在没有快重传机制时,发送方只能靠超时来判断丢包。但超时定时器的时间往往设得比较长,等待超时会白白浪费大量时间。

快重传的思路:利用冗余 ACK 来更早地发现丢包。

算法过程:

  1. 接收方收到失序报文段时,立即发送对已收到的最后一个按序报文段的重复确认(不等待延迟确认定时器)
  2. 发送方收到3 个重复 ACK(即连续 4 个相同的 ACK),立即重传丢失的报文段,不必等待超时

为什么是 3 个重复 ACK?1-2 个重复 ACK 可能只是报文段乱序,并非真的丢包。3 个重复 ACK 是一个比较可靠的丢包判据,同时又不会等待太久。

快恢复(Fast Recovery)

当发送方通过 3 个重复 ACK 判断发生了丢包时,说明网络虽然有拥塞但还没有严重到完全不通(否则连重复 ACK 都收不到)。因此没必要像超时那样把 cwnd 降到 1 重新慢开始。

TCP Reno 的快恢复算法:

  1. ssthresh=cwnd/2
  2. cwnd=ssthresh(即 cwnd 减半)
  3. 直接进入拥塞避免阶段(线性增长)

对比超时的处理方式:

事件ssthreshcwnd下一步
超时cwnd/21慢开始
3个重复ACKcwnd/2ssthresh(即cwnd/2)拥塞避免

交互可视化

下面的可视化工具可以动态展示 cwnd 随传输轮次的变化曲线。可以手动设置 ssthresh、模拟超时和三个重复 ACK 事件,观察四种算法的切换过程。

加载可视化中...

cwnd 变化过程实例

下面通过一个完整的例子,展示 cwnd 的逐轮变化。假设初始 ssthresh=16

轮次cwnd阶段说明
01慢开始初始状态
12慢开始指数增长
24慢开始指数增长
38慢开始指数增长
416慢开始cwnd = ssthresh,下一轮转拥塞避免
517拥塞避免线性增长 +1
618拥塞避免线性增长 +1
719拥塞避免线性增长 +1
820拥塞避免线性增长 +1
921拥塞避免线性增长 +1
1022拥塞避免线性增长 +1
1123拥塞避免线性增长 +1
1224拥塞避免此轮发生超时
调整ssthresh = 24/2 = 12,cwnd = 1
131慢开始重新开始
142慢开始指数增长
154慢开始指数增长
168慢开始指数增长
1712慢开始cwnd = ssthresh,下一轮转拥塞避免
1813拥塞避免线性增长 +1
1914拥塞避免收到3个重复ACK
快恢复ssthresh = 14/2 = 7,cwnd = 7
207拥塞避免从快恢复直接进入拥塞避免
218拥塞避免线性增长 +1

状态转换总览

TCP Tahoe vs TCP Reno

对比项TCP TahoeTCP Reno
提出时间19881990
包含的算法慢开始 + 拥塞避免慢开始 + 拥塞避免 + 快重传 + 快恢复
超时处理ssthresh=cwnd/2, cwnd=1, 慢开始同 Tahoe
3个重复ACK同超时处理(cwnd=1, 慢开始)ssthresh=cwnd/2, cwnd=ssthresh, 拥塞避免
性能每次丢包都回到 cwnd=1,恢复慢区分超时和重复ACK,轻度拥塞恢复快
408考试少数题目会考 Tahoe 行为408 默认考的是 Reno

关键区别在于对"3 个重复 ACK"的响应。Tahoe 把它当作超时一样处理,直接回到慢开始;Reno 则认为网络还没堵死,只需减半 cwnd 就行。

易错点

1. 慢开始的"慢"是指起点低,不是增长慢

慢开始阶段 cwnd 是指数增长的,增速很快。之所以叫"慢开始",是相对于一开始就把窗口开到最大而言的——它从 1 个 MSS 开始,所以"起步慢"。

2. cwnd = ssthresh 时到底执行哪个算法

408 考试中,cwnd=ssthresh 时既可以执行慢开始也可以执行拥塞避免。不同教材说法不一。王道和天勤的处理方式是:cwnd = ssthresh 时执行拥塞避免。做题时注意审题,看是否有特别说明。

3. 快恢复后 cwnd 的值

收到 3 个重复 ACK 后(Reno):先算 ssthresh=cwnd/2,然后 cwnd=ssthresh。有些同学会搞混顺序,先改 cwnd 再算 ssthresh,这样就错了。正确顺序是:先更新 ssthresh,再设置 cwnd

4. 发送窗口不等于 cwnd

实际发送窗口 = min(cwnd, rwnd)。题目如果只提到拥塞控制,默认接收窗口足够大,发送窗口 = cwnd。但如果题目同时给了 rwnd,要取较小值。

高频考点清单

  • cwnd 的指数增长阶段(慢开始)和线性增长阶段(拥塞避免)的切换条件
  • 超时事件的处理:ssthresh 减半,cwnd 置 1,回到慢开始
  • 3 个重复 ACK 的处理(Reno):ssthresh 减半,cwnd = ssthresh,进入拥塞避免
  • 给定初始 ssthresh 和事件序列,计算每一轮的 cwnd 值
  • 发送窗口 = min(cwnd, rwnd)
  • Tahoe 和 Reno 的区别(较少考,但偶尔出现)
  • AIMD 策略的含义:加法增大(拥塞避免阶段 +1)、乘法减小(遇到拥塞 /2)

真题练习

相关真题(11题)

2026Q47综合题9分

TCP 综合题:拥塞窗口变化、发送窗口计算、四次挥手时间分析

2025Q38选择题2分

TCP 流量控制与拥塞控制:发送窗口取 rwnd 和 cwnd 较小值

2024Q47综合题9分

TCP 拥塞控制综合题:FTP 数据传输中慢开始与拥塞避免过程

2023Q47综合题9分

TCP 拥塞控制综合题:慢开始、拥塞避免过程中的窗口变化与传输时间

2022Q38选择题2分

TCP 拥塞控制:超时后慢开始门限减半,经慢开始和拥塞避免恢复

2019Q38选择题2分

TCP 拥塞避免阶段窗口线性增长所需 RTT 数

2017Q39选择题2分

TCP 慢开始阶段窗口指数增长到目标值所需 RTT 数

2015Q39选择题2分

TCP 拥塞控制:发送窗口受接收窗口和拥塞窗口双重限制

2014Q38选择题2分

TCP 拥塞控制:超时后慢开始门限减半,经历慢开始和拥塞避免

2010Q39选择题2分

TCP 发送窗口与已发送未确认数据的关系

2009Q39选择题2分

TCP 超时后慢开始:门限减半为 8KB,从 1KB 指数增长