外观
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 和现代拥塞控制算法,可进一步提升复杂网络环境下的性能。