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 重新打开连接时:
- 将上次丢包时的 cwnd 存为 CongestionThreshold
- cwnd 重置为 1
- 使用慢启动指数增长,直到达到 CongestionThreshold
- 然后切换为 AIMD 线性增长
问题 11:我能说明累积确认在重新打开连接时的作用吗?
答案:
累积 ACK (Cumulative ACK) 确认了之前所有已收到的数据,告诉发送方可以继续发送新数据。它是重新打开连接、恢复传输的信号。
问题 12 & 13:慢启动过程示意
Code
1 | RTT 1: cwnd=1 → 发送 1 包 → 收到 1 ACK |
🎯 核心记忆口诀
“冷启动用慢启动,指数翻倍到阈值,过了阈值变线性,丢包减半重来过”

