TCP 拥塞控制算法 —— 慢启动(Slow Start)笔记
一、TCP 拥塞控制概述
TCP 拥塞控制(Congestion Control)是指在网络发生拥塞时,控制数据发送速率,避免网络资源被耗尽。
主要采用四种机制:
- 慢启动(Slow Start)
- 拥塞避免(Congestion Avoidance)
- 快重传(Fast Retransmit)
- 快恢复(Fast Recovery)
本节重点介绍 慢启动。
二、慢启动(Slow Start)原理
2.1 慢启动的目的
- 防止初始阶段因发送速率过快导致网络拥塞
- 通过逐步探测网络的可用带宽
2.2 工作机制
-
初始阶段:
- 拥塞窗口(cwnd)设置为 1 MSS(最大报文段)
- 每收到一个确认(ACK),
cwnd
增加 1 MSS
-
指数增长:
- 每个 RTT(往返时延),
cwnd
会翻倍 - 这种指数增长会持续到达到一个阈值(ssthresh)
- 每个 RTT(往返时延),
-
达到阈值后:
- 切换到 拥塞避免 阶段,改为线性增长
2.3 关键参数
参数 | 说明 |
---|---|
cwnd | 拥塞窗口,控制发送端能发送的未确认数据量 |
ssthresh | 拥塞窗口阈值,慢启动和拥塞避免的分界点 |
MSS | 最大报文段长度,通常为 1460 字节 |
三、慢启动过程图示
时间轴
|
| cwnd = 1
| cwnd = 2 (收到1个ACK,增长1)
| cwnd = 4 (收到2个ACK,各增长1)
| cwnd = 8 (收到4个ACK,各增长1)
| ...
| cwnd >= ssthresh(进入拥塞避免)
|
- 每轮 RTT,
cwnd
翻倍 - 增长速度很快,直到接近带宽上限或发生丢包
四、慢启动与拥塞避免的关系
- 慢启动阶段:
快速增长,指数级 - 拥塞避免阶段:
缓慢增长,线性级
如果发生超时或丢包,
ssthresh
通常会减半,cwnd
重置为 1,重新进入慢启动。
五、触发条件与阈值调整
事件 | 动作 |
---|---|
正常 ACK 收到 | cwnd 按规则增长 |
超时发生 | ssthresh = cwnd / 2,cwnd 重置为 1 |
快重传触发 | ssthresh = cwnd / 2,进入快恢复 |
六、慢启动和带宽利用
- 慢启动能快速增加数据发送速率,充分利用带宽
- 但如果
ssthresh
设置不当,可能触发丢包或超时 - 实际应用中,TCP 会根据网络状态动态调整
七、典型 TCP 拥塞控制曲线
cwnd
^
| /-- 慢启动 (指数增长)
| /
| /
|------/---- 拥塞避免 (线性增长)
| /
| /
|---/---- 丢包发生,cwnd 收缩
|
+---------------------> 时间
八、常见面试高频考点
-
为什么叫慢启动?
相对于直接满速发送,“慢启动” 是指从 1 MSS 开始,防止瞬间占满带宽,实际增长很快。 -
慢启动会一直进行下去吗?
不会,达到 ssthresh 后转为拥塞避免,发生丢包会重置。 -
丢包后会怎样?
超时重传会让cwnd
重置为 1,进入慢启动,ssthresh
设为cwnd / 2
。 -
慢启动是拥塞控制还是流量控制?
拥塞控制,面向网络,防止网络拥塞。
九、总结
特性 | 说明 |
---|---|
控制目的 | 探测网络可用带宽,防止一开始发送过快 |
窗口增长 | 每收到一个 ACK,cwnd 增加 1 MSS |
增长模式 | 指数增长 |
切换条件 | cwnd >= ssthresh 后,进入拥塞避免 |
丢包处理 | cwnd 重置,ssthresh 调整 |