外观
TCP 的快速重传解释一下
⭐ 题目日期:
字节 - 2024/09/03
📝 题解:
TCP 的快速重传(Fast Retransmit)是一种通过 重复确认(Duplicate ACK) 快速检测丢包并立即重传的机制,旨在避免传统超时重传(Timeout-based Retransmission)的长延迟,提升网络传输效率。
核心原理
- 重复 ACK 的生成:
- 当接收方收到 乱序数据包(例如收到
Seq=4但未收到Seq=3),会重复发送 最后一个连续有序包的 ACK(即ACK=3)。 - 每收到一个乱序包,接收方都会立即发送相同的 ACK(如
ACK=3),而不会等待超时。
- 当接收方收到 乱序数据包(例如收到
- 触发快速重传的条件:
- 发送方连续收到 3 个重复 ACK(默认阈值),认为对应的数据包(如
Seq=3)已丢失,直接重传该包,无需等待超时计时器到期。
- 发送方连续收到 3 个重复 ACK(默认阈值),认为对应的数据包(如
工作流程示例
假设发送方发送数据包 Seq=1, 2, 3, 4,但 Seq=3 在网络中丢失:
- 接收方行为:
- 收到
Seq=1→ 返回ACK=2(期望下一个包是Seq=2)。 - 收到
Seq=2→ 返回ACK=3(期望下一个包是Seq=3)。 - 收到
Seq=4→ 发现Seq=3缺失,立即重复发送ACK=3(乱序触发)。 - 后续每收到一个乱序包(如
Seq=5,Seq=6),均重复发送ACK=3。
- 收到
- 发送方行为:
- 收到第 1 个
ACK=3→ 记录重复 ACK 计数为 1。 - 收到第 2 个
ACK=3→ 重复计数为 2。 - 收到第 3 个
ACK=3→ 判定Seq=3丢失,立即重传Seq=3。 - 进入 快速恢复(Fast Recovery) 阶段(见下文)。
- 收到第 1 个
快速恢复阶段(Fast Recovery)
重传丢失包后,TCP 进入快速恢复状态,调整拥塞控制策略:
- 拥塞窗口(cwnd)调整:
cwnd = cwnd / 2(窗口减半,缓解网络压力)。- 每收到一个重复 ACK,临时增大
cwnd,允许发送新数据(避免窗口冻结)。
- 恢复阶段结束条件:
- 收到新数据的 ACK(如
ACK=5),表示重传成功且网络恢复,退出快速恢复,进入 拥塞避免(Congestion Avoidance) 阶段。
- 收到新数据的 ACK(如
与传统超时重传的对比

优势
- 降低延迟:
- 快速检测丢包,避免等待超时(RTO 通常为 200ms 以上)。
- 示例:视频通话中丢失一个包,快速重传能在几十毫秒内恢复,减少卡顿。
- 减少性能波动:
- 传统超时重传会重置拥塞窗口至初始值(慢启动),导致吞吐量骤降;快速重传仅减半窗口,性能影响更小。
- 适应高带宽网络:
- 在高带宽延迟积(BDP)网络中(如卫星通信),快速重传显著提升效率。
优化与扩展
- 选择性确认(SACK):
- 接收方通过 SACK 选项告知发送方具体丢失的数据块(如
Seq=3-5),避免重传整个窗口。 - 示例:若
Seq=3和Seq=5丢失,SACK 可精确通知,发送方仅重传这两个包。
- 接收方通过 SACK 选项告知发送方具体丢失的数据块(如
- 动态重复 ACK 阈值:
- 部分实现(如 Linux)允许通过参数
tcp_reordering调整触发阈值(默认 3 次)。 - 高乱序网络可适当增大阈值,避免误判丢包。
- 部分实现(如 Linux)允许通过参数
- 与拥塞控制算法结合:
- 现代算法(如 CUBIC、BBR)在快速重传时动态调整发送速率,平衡效率和公平性。
实际应用场景
- 实时音视频传输:
- 快速重传丢失的音频/视频帧,降低卡顿感知。
- 在线游戏:
- 重传丢失的位置同步包,减少操作延迟。
- 高频交易系统:
- 微秒级重传确保关键数据不丢失,避免交易失败。
总结
快速重传通过 重复 ACK 检测丢包 和 立即重传,解决了传统超时重传延迟高的问题,成为 TCP 可靠传输的核心优化之一。其设计平衡了 效率 与 网络公平性,尤其适合部分丢包和乱序场景。结合 SACK 和现代拥塞控制算法,可进一步提升复杂网络环境下的性能。
