avatar

目录
TCP慢启动机制总结

image.png

TCP慢启动机制总结


References

Peterson Chapter 6.3

Alternative formats


🤖 Assistant

费曼学习法自检 Checklist:TCP 慢启动 (Slow Start)


📋 自检清单 (Checklist)

第一部分:背景理解

  • [ ] 1. 我能解释为什么 AIMD 不适合新连接的冷启动 (cold start) 场景吗?
  • [ ] 2. 我能说明为什么”窗口过大”比”窗口过小”的后果更严重吗?

第二部分:核心概念

  • [ ] 3. 我能用自己的话解释什么是慢启动 (Slow Start) 吗?
  • [ ] 4. 我能说明慢启动阶段拥塞窗口 (cwnd, Congestion Window) 是如何增长的吗?
  • [ ] 5. 我能解释为什么叫”慢”启动,尽管它是指数增长 (exponential increase) 吗?

第三部分:关键参数与阈值

  • [ ] 6. 我能解释慢启动阈值 (Slow Start Threshold) 的作用吗?
  • [ ] 7. 我能说明 CongestionThreshold 这个临时变量的用途吗?

第四部分:状态转换

  • [ ] 8. 我能描述从慢启动切换到 AIMD 的条件吗?
  • [ ] 9. 我能解释”膝点 (knee point)”和”悬崖点 (cliff point)”分别代表什么吗?

第五部分:特殊场景

  • [ ] 10. 我能解释超时等待 (timeout) 后慢启动如何重新启动吗?
  • [ ] 11. 我能说明累积确认 (cumulative ACK) 在重新打开连接时的作用吗?

第六部分:能否教给别人

  • [ ] 12. 我能画出慢启动的 cwnd 增长过程图吗?
  • [ ] 13. 我能用一个简单的数字例子演示慢启动过程吗?(如 cwnd: 1→2→4→8…)

✅ 答案与详解


问题 1:我能解释为什么 AIMD 不适合新连接的冷启动场景吗?

答案:
AIMD(加性增乘性减)每个 RTT 只增加 1 个包的窗口大小,增长太慢。对于新连接,从 cwnd=1 开始,如果用 AIMD,需要很长时间才能达到网络的可用带宽。慢启动通过指数增长快速探测可用带宽。


问题 2:我能说明为什么”窗口过大”比”窗口过小”的后果更严重吗?

答案:
窗口过大会导致:

  • 更多数据包被丢弃 (packets dropped)
  • 需要重传 (retransmission)
  • 加剧网络拥塞 (network congestion)

窗口过小只是效率低,但不会恶化网络状况。


问题 3:我能用自己的话解释什么是慢启动吗?

答案:
慢启动是 TCP Reno 中用于新连接的一种机制。它让拥塞窗口从 1 开始,每收到一个 ACK 就加 1,实际效果是每个 RTT 窗口翻倍(指数增长),直到达到慢启动阈值后切换为 AIMD 的线性增长。


问题 4:我能说明慢启动阶段 Cwnd 是如何增长的吗?

答案:

  • 初始:cwnd = 1,发送 1 个包
  • 收到 1 个 ACK:cwnd = 1+1 = 2,发送 2 个包
  • 收到 2 个 ACK:cwnd = 2+1+1 = 4,发送 4 个包
  • 收到 4 个 ACK:cwnd = 4+4 = 8,发送 8 个包

规律:每个 RTT,cwnd 翻倍(指数增长)


问题 5:我能解释为什么叫”慢”启动吗?

答案:
因为它从 cwnd=1 这个很小的值开始,相比于一开始就发送大窗口的数据,初始阶段确实很”慢”。名字强调的是起点低,而不是增长速度。


问题 6:我能解释慢启动阈值的作用吗?

答案:
慢启动阈值 (Slow Start Threshold, ssthresh) 是一个分界点:

  • cwnd < ssthresh:使用慢启动(指数增长)
  • cwnd ≥ ssthresh:切换到拥塞避免(AIMD,线性增长)

它帮助 TCP 在快速增长和稳定探测之间取得平衡。


问题 7:我能说明 CongestionThreshold 变量的用途吗?

答案:
当发生丢包后重新启动慢启动时,TCP 会记住上次丢包时的 cwnd 值,存入 CongestionThreshold 作为”目标值”。这样可以避免再次增长到同样大小时发生丢包。


问题 8:我能描述从慢启动切换到 AIMD 的条件吗?

答案:
当 cwnd 达到或超过慢启动阈值 (ssthresh) 时,TCP 从指数增长切换为加性增长(每 RTT 加 1)。


问题 9:我能解释”膝点”和”悬崖点”分别代表什么吗?

答案:

  • 膝点 (Knee Point):cwnd 达到 ssthresh,从指数增长变为线性增长的转折点
  • 悬崖点 (Cliff Point):发生丢包的点,此时 cwnd 会乘性减少(通常减半)

问题 10:我能解释超时后慢启动如何重新启动吗?

答案:
当连接因等待超时而”死亡”后,收到累积 ACK 重新打开连接时:

  1. 将上次丢包时的 cwnd 存为 CongestionThreshold
  2. cwnd 重置为 1
  3. 使用慢启动指数增长,直到达到 CongestionThreshold
  4. 然后切换为 AIMD 线性增长

问题 11:我能说明累积确认在重新打开连接时的作用吗?

答案:
累积 ACK (Cumulative ACK) 确认了之前所有已收到的数据,告诉发送方可以继续发送新数据。它是重新打开连接、恢复传输的信号。


问题 12 & 13:慢启动过程示意

Code
1
2
3
4
5
6
RTT 1: cwnd=1  → 发送 1 包 → 收到 1 ACK
RTT 2: cwnd=2 → 发送 2 包 → 收到 2 ACK
RTT 3: cwnd=4 → 发送 4 包 → 收到 4 ACK
RTT 4: cwnd=8 → 发送 8 包 → 收到 8 ACK
...
达到 ssthresh 后 → 每 RTT 只加 1(AIMD)

🎯 核心记忆口诀

“冷启动用慢启动,指数翻倍到阈值,过了阈值变线性,丢包减半重来过”


评论