快速重传和快速恢复是Linux TCP应对单个报文丢失的核心机制:前者通过累计3个重复ACK立即重传丢包,后者在重传后保持cwnd不归零,以维持传输效率,并与超时重传互补协同。

快速重传和快速恢复是 Linux TCP 栈应对单个报文丢失的关键机制,它们不依赖等待超时,而是靠接收方反馈“挤出”丢包信息,从而大幅缩短恢复延迟。
快速重传:靠重复 ACK 提前发现丢包
当接收方收到乱序数据(比如收到 seq=200、300 的包,但没收到 seq=100),它会立即对最后正确按序到达的包(seq=100)发送确认,也就是重复 ACK。Linux 发送端持续计数这类重复 ACK —— 一旦累计到 3 个,就判定 seq=100 对应的报文段大概率已丢失,立刻重传,无需等 RTO 定时器到期。
这要求接收方有足够大的接收窗口,能持续接收后续数据并生成重复 ACK;若窗口太小或接收端处理慢,可能无法凑够 3 个重复 ACK,此时仍要退回超时重传。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
快速恢复:重传后不归零,保持管道有流量
触发快速重传的同时,Linux 进入快速恢复阶段,核心是避免像老式 Tahoe 算法那样把拥塞窗口(cwnd)直接砍回 1 MSS —— 那样会让网络“空转”一段时间。
- 将慢启动阈值 ssthresh 设为当前 cwnd 的一半(至少为 2 MSS)
- 把 cwnd 设为 ssthresh + 3 × MSS(预留空间用于重传和后续新数据)
- 每再收到一个重复 ACK,cwnd 加 1 MSS(相当于用“信用额度”继续发新数据)
- 一旦收到对新数据的 ACK(不是重复 ACK),说明丢包已恢复,退出快速恢复,cwnd 设为 ssthresh,进入拥塞避免阶段
与超时重传的配合关系
快速重传/恢复不是替代超时重传,而是互补:
- 快速重传适合单点丢包(如某路由器瞬时队列溢出),响应快、开销小
- 超时重传兜底处理连续丢包、ACK 大量丢失、或接收端根本没发重复 ACK 的情况
- 如果快速恢复期间又超时,Linux 会放弃恢复逻辑,直接执行超时重传流程(RTO 加倍、cwnd 归 1、重启慢启动)
Linux 内核中的实际表现
默认启用 Reno 或 Cubic 拥塞控制算法(均支持快速重传/恢复),行为受以下因素影响:
- /proc/sys/net/ipv4/tcp_reordering:控制接收端判定乱序的容忍度,默认 3 —— 即允许最多 3 个报文乱序才开始发重复 ACK
- 接收窗口大小:窗口太小会导致重复 ACK 不足,无法触发快速重传
- RTT 波动:RTO 计算越不准,超时重传越容易误触发,反而干扰快速重传的判断

















