阈值分界在哪
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 快速翻倍说明还在慢启动,缓慢爬升说明已进入拥塞避免。
改用基于带宽与延迟估计的拥塞控制算法后,窗口随丢包的剧烈波动会明显减弱,但它并不消除链路本身的拥塞,只是让反应更平缓。