在 TCP 拥塞控制中,ssthresh
(slow-start threshold,慢启动阈值)是一个非常关键的变量,用来决定拥塞窗口(cwnd
)采用哪种增长策略:
-
作用
- 在连接启动或出现超时重传后,TCP 进入 慢启动(Slow Start) 阶段,此时
cwnd
指数增长(每收到一个 ACK,cwnd += 1 MSS
)。 - 当
cwnd
达到或超过ssthresh
时,TCP 退出慢启动,进入 拥塞避免(Congestion Avoidance) 阶段,此时改为线性增长(每收到一个 ACK,大约cwnd += MSS²/cwnd
,也就是每 RTT 增加 1 MSS)。
- 在连接启动或出现超时重传后,TCP 进入 慢启动(Slow Start) 阶段,此时
-
初始化
- 连接一开始,
ssthresh
往往被初始化为一个较大的值(如默认32 *MSS
或者根据系统配置),让cwnd
有机会先跑满这一阈值。
- 连接一开始,
-
调整策略
-
发生丢包(3 次重复 ACK):
ssthresh ← max(cwnd / 2, 1) cwnd ← ssthresh + 3 *MSS // 在快速重传/恢复阶段“膨胀”窗口
这样做是 乘性减少(Multiplicative Decrease),将阈值下调为当前窗口一半,反映网络已有拥塞迹象。
-
发生超时重传(RTO):
ssthresh ← max(cwnd / 2, 1) cwnd ← 1 *MSS
直接将窗口回退到 1 MSS,重回慢启动,同时更新阈值为之前窗口一半。
-
-
整体流程中的位置
连接开始 ↓ cwnd = 1 MSS, state = SLOW_START(指数增) ↓ cwnd ≥ ssthresh state = CONG_AVOID(线性增) ↓ 触发丢包检测 state = FAST_RECOVERY ↓ ACK 恢复 state = CONG_AVOID 或 → SLOW_START(RTO 情况)
简而言之,ssthresh
就是慢启动和拥塞避免之间的“分界线”,同时在检测到网络拥塞后用来告诉 TCP 以后每 RTT 最多增长多少,从而在高带宽利用率和拥塞风险之间取得平衡。
ssthresh
(slow-start threshold)的初始值和后续更新完全依赖于两件事:启动时的默认配置,以及网络拥塞事件发生后的自适应调整。下面分两部分来说明。
一、初始 ssthresh
的确定
-
操作系统或协议栈默认值
- 大多数 TCP 实现会在连接刚建立时,把
ssthresh
设得比较大,以便让慢启动阶段有机会“跑满”网络带宽。 - 典型默认值常见为 32 × MSS、64 × MSS 或者 65535 Bytes(64 KB),具体取决于操作系统或硬件配置。
- 大多数 TCP 实现会在连接刚建立时,把
-
可根据接收窗口(rwnd)或链路估算
-
如果知道对端接收窗口很小,或通过先验带宽-延迟积(BDP)估算到一个上限,也可以把
ssthresh
设为ssthresh = min(默认值, rwnd, BDP / MSS)
-
这样能更早从慢启动切换到拥塞避免,避免因为指数增长而引起接收端缓存溢出或过度拥塞。
-
二、ssthresh
在拥塞事件后的自适应更新
每当检测到网络拥塞(丢包)时,TCP 都会用 乘性减(Multiplicative Decrease) 的原则来下调阈值:
-
3 次重复 ACK(Fast Retransmit)
ssthresh ← max(cwnd / 2, 2*MSS) cwnd ← ssthresh + 3*MSS // 进入快速恢复 (TCP Reno)
- 这里常把
ssthresh
设为当前拥塞窗口一半(至少 2 × MSS),反映“网络承载力”减半。
- 这里常把
-
重传超时(RTO)
ssthresh ← max(cwnd / 2, 2*MSS) cwnd ← 1·MSS
- RTO 表示更严重的拥塞或丢包,
cwnd
回退到 1 MSS 并重返慢启动,同时ssthresh
仍按一半更新。
- RTO 表示更严重的拥塞或丢包,
三、最佳实践
- 不要将初始
ssthresh
设得太大,否则慢启动阶段可能就一次性把cwnd
推得过大,引起丢包。 - 也不要太小,否则每次连接都太早地进行线性增长,浪费可用带宽。
- 现代操作系统往往在历史连接的带宽-延迟积基础上,动态调整初始
ssthresh
,以兼顾“快速利用与安全稳健”。
总结:
- 初始值:常由系统默认(32 × MSS、64 × MSS 或基于 BDP 的估算);
- 更新:每次丢包后按
ssthresh = max(cwnd/2, 2*MSS)
下调。
这样,TCP 就能在指数探测和线性稳健之间取得平衡,既快速利用新连接的带宽,又在出现拥塞时及时收缩窗口。