🌐 TCP拥塞控制算法交互式可视化

拥塞窗口 (cwnd)
1
MSS
慢启动阈值 (ssthresh)
64
MSS
当前状态
慢启动
 
传输轮次
0
RTT

状态转换图

cwnd 变化曲线 慢启动

📚 TCP拥塞控制算法详解

1️⃣ 慢启动 (Slow Start)

目标:快速探测可用带宽,从无到有指数级增长发送速率。

原理:

  • 初始 cwnd = 1 MSS(最大报文段)
  • 每收到一个 ACK,cwnd 增加 1 MSS
  • 每个 RTT(往返时间),cwnd 翻倍(指数增长)
  • 当 cwnd >= ssthresh 时,进入拥塞避免阶段
  • 遇到丢包(超时),ssthresh = cwnd/2,cwnd = 1,重新慢启动

增长公式:cwnd = cwnd * 2(每个RTT)

2️⃣ 拥塞避免 (Congestion Avoidance)

目标:当接近网络容量时,谨慎地线性增加发送速率。

原理:

  • 当 cwnd >= ssthresh 时进入此阶段
  • 每个 RTT,cwnd 增加 1 MSS(线性增长)
  • 增长速率远慢于慢启动,避免过度拥塞
  • 收到 3 个重复 ACK:ssthresh = cwnd/2,cwnd = ssthresh + 3,进入快速恢复
  • 超时丢包:ssthresh = cwnd/2,cwnd = 1,回到慢启动

增长公式:cwnd = cwnd + 1(每个RTT)

3️⃣ 快速重传 (Fast Retransmit)

目标:在超时之前快速重传丢失的数据包,减少等待时间。

原理:

  • 发送方收到 3 个重复 ACK(表明接收方收到了后续数据包)
  • 立即重传丢失的数据包,无需等待超时定时器
  • 避免不必要的等待,提高传输效率

触发条件:收到 3 个重复 ACK(dupACK = 3)

4️⃣ 快速恢复 (Fast Recovery)

目标:在快速重传后,避免过度降低发送速率,快速恢复传输。

原理:

  • 快速重传后不直接回到慢启动(cwnd = 1)
  • 而是设置 cwnd = ssthresh + 3 MSS(Tahoe版本直接回慢启动)
  • 每个重复 ACK,cwnd 增加 1 MSS(膨胀窗口)
  • 收到新 ACK 后,cwnd = ssthresh,进入拥塞避免
  • Reno 版本:快速恢复后进入拥塞避免
  • Cubic 版本:Linux 现代实现,更复杂的增长曲线

关键:避免"每个丢包都从 cwnd=1 重新开始"的性能损失

📋 事件日志