快恢复是什么
快恢复(Fast Recovery)是 TCP 拥塞控制在判定丢包后的一条处理路径:发送端靠三个重复 ACK 认定某段丢失,立刻重传该段,同时把慢启动阈值设为当前窗口的一半、把拥塞窗口压到「新阈值加三」后继续线性增长,而不是像 Tahoe 那样把窗口清零、重新慢启动。结果是同一轮丢包下吞吐跌得更浅、恢复更快。它由 Reno 首次完整表述,NewReno 改进了同一窗口内出现多个丢包时的处理。
基本信息
| 触发条件 | 收到 3 个重复 ACK,即快重传 |
|---|---|
| 慢启动阈值 | ssthresh = cwnd / 2 |
| 新拥塞窗口 | cwnd = ssthresh + 3 |
| 后续增长 | 每多一个重复 ACK 窗口加一,收到新 ACK 后转入拥塞避免 |
| 对照实现 | Tahoe 回慢启动,Reno 与 NewReno 走快恢复 |
| 现代默认 | Linux 默认拥塞算法为 CUBIC,可切换为 BBR |
观察窗口变化
观察窗口变化
ss -ti state established | grep -E 'cwnd|ssthresh' # 单条连接的窗口
dig +short example.com; nstat -az | grep -iE 'TcpExtTCPLostRetransmit|TcpRetransSegs'
# 丢包后 cwnd 从高位跃降到较低值,随后近似线性爬升,说明快恢复生效拥塞控制算法对照
| 算法 | 丢包响应 | 特点 |
|---|---|---|
| Tahoe | 窗口清零回慢启动 | 早期实现,恢复慢 |
| Reno | 阈值减半走快恢复 | 单丢包场景表现好 |
| NewReno | 阈值减半并改进部分 ACK 处理 | 一个窗口内多丢包也能恢复 |
| CUBIC | 按三次函数方式增长 | Linux 默认,长肥管道更稳 |
| BBR | 基于带宽与时延建模 | 对随机丢包不敏感,需按场景评估 |
典型使用场景
- 跨地域 API 调用:丢包率不高但对恢复速度敏感,快恢复决定尾延迟
- 大文件传输:快恢复与 SACK 配合决定吞吐能否维持在合理区间
- 无线与公网链路调优:区分真拥塞丢包与随机丢包,直接影响算法选择
- 内核参数评估:是否切换 CUBIC 与 BBR、是否开启 SACK 都需要先看恢复行为
- 排障解释:说明为什么某些连接的窗口呈台阶式下降,而不是垂直掉到零
快恢复由重复 ACK 触发,属于不等超时的处理路径;真正的重传超时(RTO)仍会回到慢启动,两者不要混为一谈。看窗口曲线的形态即可区分:台阶式下降是快恢复,垂直归零多半是超时。