首页/计算机网络/05-transport/TCP拥塞控制算法详解 🔗 在 Obsidian 中打开
计算机网络 · 05-transport

TCP拥塞控制算法详解

重要度 ⭐⭐⭐⭐⭐ 计算机网络/传输层拥塞控制慢启动拥塞避免快重传快恢复BBR
速查
TCP 拥塞控制核心:慢启动(cwnd 每 RTT 翻倍)→ 达 ssthresh拥塞避免(每 RTT +1 MSS)。丢包:超时→cwnd=1;3 个重复 ACK→快重传+快恢复(cwnd=ssthresh+3)。

基本概念

拥塞控制防止网络过载,通过调节发送速率避免拥塞。

拥塞控制 vs 流量控制

特性拥塞控制流量控制
目的防止网络过载防止接收方溢出
范围全局(整个网络)点对点(收发方)
机制调节发送窗口接收方通告窗口
关键实际发送窗口 = min(cwnd, rwnd);cwnd 为拥塞窗口,ssthresh 为慢启动阈值。

经典 TCP 拥塞控制(Reno)

1. 慢启动(Slow Start)

  • 初始 cwnd = 1 MSS,每收到一个 ACK 则 cwnd += 1 MSS
  • 每 RTT cwnd 翻倍(指数增长
  • cwnd ≥ ssthresh 时转入拥塞避免

2. 拥塞避免(Congestion Avoidance)

  • 每 RTT cwnd 增加约 1 MSS(线性增长
  • 收到一个 ACK 时 cwnd += 1/cwnd

3. 快重传(Fast Retransmit)

收到 3 个重复 ACK 立即重传丢失报文,不必等待超时。

4. 快恢复(Fast Recovery)

收到 3 个重复 ACK:
1. ssthresh = cwnd / 2
2. cwnd = ssthresh + 3   (不是 1!)
3. 进入拥塞避免
状态转换超时(丢包):ssthresh=cwnd/2, cwnd=1 重回慢启动;3 个重复 ACK:ssthresh=cwnd/2, cwnd=ssthresh+3 进入快恢复。

Tahoe vs Reno 与后续算法

Tahoe vs Reno

特性TahoeReno
丢包处理cwnd=1,慢启动快恢复(cwnd=ssthresh+3)
快重传 / 快恢复不支持支持

NewReno

改进多包丢失场景:追踪恢复过程最大 ACK,仅收到「恢复 ACK」(大于丢包前最大序号)才结束快恢复。

CUBIC(Linux 默认)

窗口按三次函数增长,在丢包点附近增长慢、远离后增长快,适合高带宽延迟积网络。

BBR

基于模型的拥塞控制:测量瓶颈带宽 BtlBw 与最小 RTT RTprop,主动探测最佳发送速率(状态机:Startup→Drain→ProbeBW→ProbeRTT),目标接近最优工作点而非填满缓冲区。

常见考法

考点说明
四阶段慢启动、拥塞避免、快重传、快恢复
增长规律慢启动指数、拥塞避免线性,转换点 ssthresh
Reno vs Tahoe遇丢包是否快恢复
BBR 思想带宽/RTT 模型驱动,非丢包驱动

易错点

注意
  • 超时3 个重复 ACK处理不同:前者 cwnd 回 1,后者 cwnd=ssthresh+3
  • 拥塞控制是全局概念,流量控制是点对点概念
  • 实际窗口 = min(cwnd, rwnd)
  • BBR 与 CUBIC 触发机制不同(模型测量 vs 丢包)

核心结论

必背
  1. 慢启动指数增长、拥塞避免线性增长,转换点为 ssthresh
  2. 超时 → cwnd=1 慢启动;3 个重复 ACK → 快重传 + 快恢复
  3. Reno 引入快恢复;NewReno 优化多包丢失;CUBIC 为 Linux 默认
  4. BBR 基于带宽/RTT 模型,主动探测最优工作点

记忆卡片

四个阶段?
慢启动(指数)、拥塞避免(线性)、快重传(3 重复 ACK 即重传)、快恢复(cwnd=ssthresh+3)。
增长规律?
慢启动每 RTT 翻倍;拥塞避免每 RTT +1 MSS;转换点 ssthresh。
Reno 与 Tahoe 区别?
Tahoe 丢包后 cwnd=1;Reno 用快恢复,cwnd=ssthresh+3。
BBR 与传统区别?
传统基于丢包信号;BBR 基于带宽/RTT 测量模型,主动探测最优工作点。

图示 · cwnd 增长曲线

cwnd RTT ssthresh 丢包→ssthresh=cwnd/2 慢启动(指数) 拥塞避免(线性)
图:cwnd 在 ssthresh 前指数增长(慢启动),之后线性增长(拥塞避免),丢包后阈值减半。

动画演示 · cwnd 四阶段变化

慢启动·每 RTT 翻倍 拥塞避免·每 RTT +1 丢包事件(快重传/超时) ssthresh 阈值

相关知识点

tcp-flow-and-congestion tcp-three-way-handshake

↑ 站内 HTML 相对链接(纯网页可浏览);本页右上「在 Obsidian 中打开」跳回源笔记。