TCP拥塞控制通过动态调整拥塞窗口(cwnd)来适应网络状况,避免数据过载。其核心步骤可分为以下几个阶段:
1. 慢启动(Slow Start)
- 目的:初始阶段探测可用带宽,快速提升发送速率。
- 规则:
- 初始拥塞窗口(cwnd)通常为1个MSS(最大报文段大小)。
- 每收到一个ACK,cwnd增加1个MSS(指数增长,每个RTT窗口翻倍)。
- 当cwnd达到慢启动阈值(ssthresh)时,进入拥塞避免阶段。
- 若检测到丢包(超时或重复ACK),退出慢启动:
- 将ssthresh更新为当前cwnd的一半(至少2个MSS)。
- 根据丢包类型决定后续操作(见步骤3、4)。
2. 拥塞避免(Congestion Avoidance)
- 目的:谨慎增加窗口,避免触发拥塞。
- 规则:
- 每收到一个ACK,cwnd增加 ( \frac{1}{cwnd} ) 个MSS(线性增长,每个RTT窗口增加1个MSS)。
- 持续探测带宽,直到检测到丢包。
- 若发生丢包:
- 调整ssthresh为当前cwnd的一半。
- 根据丢包类型处理(见步骤3、4)。
3. 超时重传(处理严重拥塞)
- 触发条件:数据包超时未收到ACK(表明网络拥塞严重)。
- 操作:
- 将cwnd重置为1个MSS,重新进入慢启动阶段。
- 更新ssthresh为超时前cwnd的一半。
4. 快速重传与快速恢复(处理轻微拥塞)
- 触发条件:收到3个重复ACK(表明部分数据包丢失,但网络仍有吞吐能力)。
- 操作:
- 快速重传:立即重传丢失的报文,无需等待超时。
- 快速恢复:
- 更新ssthresh为当前cwnd的一半。
- 将cwnd设为 ( ssthresh + 3 )(补偿已确认的3个重复ACK)。
- 每收到一个重复ACK,cwnd增加1个MSS。
- 当收到新数据的ACK:将cwnd设为ssthresh,进入拥塞避免阶段。
总结流程
- 初始阶段为慢启动,cwnd指数增长至ssthresh。
- 达到ssthresh后转为拥塞避免,cwnd线性增长。
- 丢包时:
- 超时:cwnd=1,ssthresh=cwnd/2,重启慢启动。
- 3个重复ACK:快速重传,进入快速恢复,调整ssthresh和cwnd后进入拥塞避免。
关键点
- ssthresh:动态阈值,决定慢启动与拥塞避免的切换。
- Reno vs Tahoe:Tahoe在丢包时无论类型均重置cwnd=1;Reno引入快速恢复,减少性能波动。
- 公平性:通过AIMD(加性增、乘性减)平衡不同连接的带宽竞争。
这一机制使得TCP能够在高效利用带宽的同时,主动适应网络变化,维持全局稳定性。