Skip to content

TCP 的快速重传解释一下

约 1063 字大约 4 分钟

计算机网络字节

2025-03-12

⭐ 题目日期:

字节 - 2024/09/03

📝 题解:

TCP 的快速重传(Fast Retransmit)是一种通过 重复确认(Duplicate ACK) 快速检测丢包并立即重传的机制,旨在避免传统超时重传(Timeout-based Retransmission)的长延迟,提升网络传输效率。


核心原理

  1. 重复 ACK 的生成
    1. 当接收方收到 乱序数据包(例如收到 Seq=4 但未收到 Seq=3),会重复发送 最后一个连续有序包的 ACK(即 ACK=3)。
    2. 每收到一个乱序包,接收方都会立即发送相同的 ACK(如 ACK=3),而不会等待超时。
  2. 触发快速重传的条件
    1. 发送方连续收到 3 个重复 ACK(默认阈值),认为对应的数据包(如 Seq=3)已丢失,直接重传该包,无需等待超时计时器到期。

工作流程示例

假设发送方发送数据包 Seq=1, 2, 3, 4,但 Seq=3 在网络中丢失:

  1. 接收方行为
    1. 收到 Seq=1 → 返回 ACK=2(期望下一个包是 Seq=2)。
    2. 收到 Seq=2 → 返回 ACK=3(期望下一个包是 Seq=3)。
    3. 收到 Seq=4 → 发现 Seq=3 缺失,立即重复发送 ACK=3(乱序触发)。
    4. 后续每收到一个乱序包(如 Seq=5, Seq=6),均重复发送 ACK=3
  2. 发送方行为
    1. 收到第 1 个 ACK=3 → 记录重复 ACK 计数为 1。
    2. 收到第 2 个 ACK=3 → 重复计数为 2。
    3. 收到第 3 个 ACK=3 → 判定 Seq=3 丢失,立即重传 Seq=3
    4. 进入 快速恢复(Fast Recovery) 阶段(见下文)。

快速恢复阶段(Fast Recovery)

重传丢失包后,TCP 进入快速恢复状态,调整拥塞控制策略:

  1. 拥塞窗口cwnd)调整:
    1. cwnd = cwnd / 2(窗口减半,缓解网络压力)。
    2. 每收到一个重复 ACK,临时增大 cwnd,允许发送新数据(避免窗口冻结)。
  2. 恢复阶段结束条件
    1. 收到新数据的 ACK(如 ACK=5),表示重传成功且网络恢复,退出快速恢复,进入 拥塞避免(Congestion Avoidance) 阶段。

与传统超时重传的对比

img


优势

  1. 降低延迟
    1. 快速检测丢包,避免等待超时(RTO 通常为 200ms 以上)。
    2. 示例:视频通话中丢失一个包,快速重传能在几十毫秒内恢复,减少卡顿。
  2. 减少性能波动
    1. 传统超时重传会重置拥塞窗口至初始值(慢启动),导致吞吐量骤降;快速重传仅减半窗口,性能影响更小。
  3. 适应高带宽网络
    1. 在高带宽延迟积(BDP)网络中(如卫星通信),快速重传显著提升效率。

优化与扩展

  1. 选择性确认(SACK)
    1. 接收方通过 SACK 选项告知发送方具体丢失的数据块(如 Seq=3-5),避免重传整个窗口。
    2. 示例:若 Seq=3Seq=5 丢失,SACK 可精确通知,发送方仅重传这两个包。
  2. 动态重复 ACK 阈值
    1. 部分实现(如 Linux)允许通过参数 tcp_reordering 调整触发阈值(默认 3 次)。
    2. 高乱序网络可适当增大阈值,避免误判丢包。
  3. 与拥塞控制算法结合
    1. 现代算法(如 CUBIC、BBR)在快速重传时动态调整发送速率,平衡效率和公平性。

实际应用场景

  1. 实时音视频传输
    1. 快速重传丢失的音频/视频帧,降低卡顿感知。
  2. 在线游戏
    1. 重传丢失的位置同步包,减少操作延迟。
  3. 高频交易系统
    1. 微秒级重传确保关键数据不丢失,避免交易失败。

总结

快速重传通过 重复 ACK 检测丢包立即重传,解决了传统超时重传延迟高的问题,成为 TCP 可靠传输的核心优化之一。其设计平衡了 效率网络公平性,尤其适合部分丢包和乱序场景。结合 SACK 和现代拥塞控制算法,可进一步提升复杂网络环境下的性能。