📚 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 重新开始"的性能损失