首页/网络/协议速查/快恢复(Fast Recovery)
TCP 与 UDP54 条

快恢复(Fast Recovery)

快重传后不回到慢启动:ssthresh 设为 cwnd/2,cwnd 设为 ssthresh+3 继续发送,避免吞吐断崖式下跌。

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

快恢复是什么

快恢复(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)仍会回到慢启动,两者不要混为一谈。看窗口曲线的形态即可区分:台阶式下降是快恢复,垂直归零多半是超时。

易错点

  • 把快重传与快恢复当成同一件事:前者负责补发丢失的那一段,后者负责调整后续窗口
  • 关闭 SACK 后同一窗口的多个丢包只能靠 NewReno 逐个恢复,重传量与恢复时间都明显上升
  • 在随机丢包链路上盲调内核参数,反而掩盖了真实的丢包位置
  • 只看拥塞窗口不看接收窗口与路径时延,把接收端限流误判成拥塞控制问题

数据来源与参考

  • RFC 5681 §3.2
  • RFC 6582

相关工具

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