TCP中,ssthresh的作用

在 TCP 拥塞控制中,ssthresh(slow-start threshold,慢启动阈值)是一个非常关键的变量,用来决定拥塞窗口(cwnd)采用哪种增长策略:

  1. 作用

    • 在连接启动或出现超时重传后,TCP 进入 慢启动(Slow Start) 阶段,此时 cwnd 指数增长(每收到一个 ACK,cwnd += 1 MSS)。
    • cwnd 达到或超过 ssthresh 时,TCP 退出慢启动,进入 拥塞避免(Congestion Avoidance) 阶段,此时改为线性增长(每收到一个 ACK,大约 cwnd += MSS²/cwnd,也就是每 RTT 增加 1 MSS)。
  2. 初始化

    • 连接一开始,ssthresh 往往被初始化为一个较大的值(如默认 32 *MSS 或者根据系统配置),让 cwnd 有机会先跑满这一阈值。
  3. 调整策略

    • 发生丢包(3 次重复 ACK)

      ssthresh ← max(cwnd / 2, 1)  
      cwnd ← ssthresh + 3 *MSS   // 在快速重传/恢复阶段“膨胀”窗口  
      

      这样做是 乘性减少(Multiplicative Decrease),将阈值下调为当前窗口一半,反映网络已有拥塞迹象。

    • 发生超时重传(RTO)

      ssthresh ← max(cwnd / 2, 1)  
      cwnd ← 1 *MSS  
      

      直接将窗口回退到 1 MSS,重回慢启动,同时更新阈值为之前窗口一半。

  4. 整体流程中的位置

    连接开始
        ↓
    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 的确定

  1. 操作系统或协议栈默认值

    • 大多数 TCP 实现会在连接刚建立时,把 ssthresh 设得比较大,以便让慢启动阶段有机会“跑满”网络带宽。
    • 典型默认值常见为 32 × MSS、64 × MSS 或者 65535 Bytes(64 KB),具体取决于操作系统或硬件配置。
  2. 可根据接收窗口(rwnd)或链路估算

    • 如果知道对端接收窗口很小,或通过先验带宽-延迟积(BDP)估算到一个上限,也可以把 ssthresh 设为

      ssthresh = min(默认值, rwnd, BDP / MSS)
      
    • 这样能更早从慢启动切换到拥塞避免,避免因为指数增长而引起接收端缓存溢出或过度拥塞。


二、ssthresh 在拥塞事件后的自适应更新

每当检测到网络拥塞(丢包)时,TCP 都会用 乘性减(Multiplicative Decrease) 的原则来下调阈值:

  1. 3 次重复 ACK(Fast Retransmit)

    ssthresh ← max(cwnd / 2, 2*MSS)  
    cwnd      ← ssthresh + 3*MSS   // 进入快速恢复 (TCP Reno)  
    
    • 这里常把 ssthresh 设为当前拥塞窗口一半(至少 2 × MSS),反映“网络承载力”减半。
  2. 重传超时(RTO)

    ssthresh ← max(cwnd / 2, 2*MSS)  
    cwnd     ← 1·MSS  
    
    • RTO 表示更严重的拥塞或丢包,cwnd 回退到 1 MSS 并重返慢启动,同时 ssthresh 仍按一半更新。

三、最佳实践

  • 不要将初始 ssthresh 设得太大,否则慢启动阶段可能就一次性把 cwnd 推得过大,引起丢包。
  • 也不要太小,否则每次连接都太早地进行线性增长,浪费可用带宽。
  • 现代操作系统往往在历史连接的带宽-延迟积基础上,动态调整初始 ssthresh,以兼顾“快速利用与安全稳健”。

总结

  • 初始值:常由系统默认(32 × MSS、64 × MSS 或基于 BDP 的估算);
  • 更新:每次丢包后按 ssthresh = max(cwnd/2, 2*MSS) 下调。

这样,TCP 就能在指数探测线性稳健之间取得平衡,既快速利用新连接的带宽,又在出现拥塞时及时收缩窗口。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值