首页/网络/协议速查/ssthresh 阈值与线性增长
TCP 与 UDP54 条

ssthresh 阈值与线性增长

ssthresh 是慢启动与拥塞避免的分界:cwnd 低于它指数涨,达到后每个 RTT 大致 +1 MSS 线性涨;丢包时阈值减半(乘性减)。

协议速查网络更新于 2026-10-13

阈值分界在哪

ssthresh 是慢启动与拥塞避免的分界线。连接刚建立时拥塞窗口每个往返翻一倍(慢启动),一旦超过 ssthresh 就转入拥塞避免,改为每个往返大致增加一个最大报文段;发生丢包时 ssthresh 被减半,窗口回到较小区间重新爬升。这套「加性增、乘性减」就是吞吐呈锯齿状的原因(RFC 5681 §3.1)。

它能解释两件事

一是为什么刚建连的下载速度要慢慢爬上去;二是为什么丢包对长距离大窗口连接的伤害特别大——窗口越宽,被砍掉一半损失的绝对量越多。理解这两点,跨地域传输调优时就不会把问题归错方向。

基本信息

增长规则低于阈值时指数增长,达到阈值后线性增长
丢包响应阈值减半,窗口回落重新爬升
丢包信号重复确认触发快速重传,超时重传回落更狠
观察工具ss -ti 可看到 cwnd、ssthresh 与重传计数

典型使用场景

  • 解释「前几秒慢、后面快」的下载速度曲线
  • 大文件跨地域传输调优:区分瓶颈是带宽不足还是丢包
  • 实时音视频:锯齿式窗口调整会造成码率抖动
  • 排查「一丢包就崩」的链路,先量化丢包率与往返时延

从 ss 观察

从 ss 观察
ss -ti | grep -E 'cwnd|ssthresh|retrans' | head              # 窗口、阈值与重传
cat /proc/sys/net/ipv4/tcp_congestion_control               # 当前拥塞控制算法
ss -ti state established '( sport = :443 )'                  # 只看某个服务的连接

观察值含义

字段含义异常表现
cwnd当前拥塞窗口(以段计)反复掉到底部说明丢包频繁
ssthresh增长方式的分界点被反复砍半即为持续丢包
retrans累计重传次数缓慢增长可接受,成比例增长要查链路
rtt 与 rttvar往返时延及其抖动抖动大时窗口调整更保守,吞吐更不稳定
判断连接处于哪个阶段有个直观办法:cwnd 快速翻倍说明还在慢启动,缓慢爬升说明已进入拥塞避免。
改用基于带宽与延迟估计的拥塞控制算法后,窗口随丢包的剧烈波动会明显减弱,但它并不消除链路本身的拥塞,只是让反应更平缓。

易错点

  • 把锯齿状吞吐当故障:它是协议设计的必然结果,要平稳吞吐需换算法或做应用层自适应
  • 只看丢包率不看往返时延:相同时延下丢包率越高损失越大,反之亦然
  • 在丢包链路上盲目加大缓冲:缓冲膨胀把时延推得更高,队伍反而更长
  • 只观察 cwnd 不看 ssthresh:无法区分慢启动与拥塞避免,容易误判调优效果
  • 把调优重点放在单机参数上:跨地域链路的问题多半出在丢包与路由路径上

数据来源与参考

  • RFC 5681 §3.1
  • RFC 9438 §4

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌