TCP 有超时重传,为什么还需要快速重传机制?

46 阅读5分钟

1. 背景

在 TCP(Transmission Control Protocol)传输过程中,数据丢失是不可避免的,TCP 通过超时重传快速重传机制来保证可靠性。那么,既然有超时重传,为什么还需要快速重传机制?接下来深入探讨这两个机制的区别、超时重传的局限性以及快速重传的必要性。


2. TCP 超时重传机制

2.1 什么是超时重传?

TCP 发送数据时,每个数据包都会设置一个超时时间(RTO, Retransmission Timeout) ,如果在该时间内没有收到接收方的 ACK(确认应答),则认为数据包丢失,触发重传。

2.2 RTO(超时重传时间)如何计算?

TCP 采用自适应超时计算,通常使用加权平均 RTT(Round-Trip Time, 往返时间) 估算 RTO:

其中:

  • RTT_sample:单次往返时间测量值
  • SRTT(平滑 RTT):历史 RTT 的加权平均值
  • RTTVAR(RTT 偏差):测量值的变化范围
  • α(一般设为 0.125)
2.3 超时重传的局限性
  1. RTO 计算存在延迟
    RTO 通常较长(典型值在 200ms 以上),如果等到超时才重传,恢复速度会很慢。
  2. 适应性差
    TCP 采用指数回退(Exponential Backoff)调整 RTO,每次超时重传后,RTO 值会成倍增长,这可能导致传输恢复变慢。
  3. 丢失检测滞后
    如果数据包丢失但仍有部分数据包被成功接收,TCP 需要等待整个超时时间才能检测到丢失,这影响了整体吞吐量。

3. 快速重传机制

3.1 什么是快速重传?

TCP 采用累计确认(Cumulative Acknowledgment)机制,即接收方只会确认最后一个按序到达的数据包,如果某个数据包丢失,后续数据包仍然可能被接收,并导致 ACK 反复确认最后一个正确接收的包

快速重传(Fast Retransmit)机制就是基于重复 ACK 触发的:

  • 发送方如果连续收到 3 个重复 ACK(Duplicate ACK),就可以推测某个数据包可能丢失,而不必等待 RTO 触发超时重传。
  • 发送方立即重传该数据包,从而加速数据恢复。
3.2 快速重传的优点
  1. 减少超时等待,缩短恢复时间
    避免了等待完整 RTO,能够更快地进行数据恢复。
  2. 不影响 RTT 计算
    由于没有发生真正的超时,TCP 的 RTT 估算不会受到指数回退的影响,从而保持更稳定的 RTO 计算。
  3. 提高吞吐量
    及时重传丢失的数据包,减少了窗口阻塞,保证了数据流的连续性。
3.3 快速重传的触发条件
  • 发送方收到连续 3 个相同的 ACK(Duplicate ACK)
  • 立即重传对应的丢失数据包,而不等待超时

4. 快速重传和超时重传的对比

机制触发条件触发时机影响
超时重传(Timeout Retransmission)RTO 过期未收到 ACK影响吞吐量
快速重传(Fast Retransmit)收到 3 个重复 ACK提高传输效率

核心区别:快速重传是基于ACK 反馈,而超时重传是基于定时器


5. 为什么 TCP 需要同时使用超时重传和快速重传?

虽然快速重传能提高效率,但它有局限性:

  1. 丢包发生在窗口开始位置时,可能不会触发 3 个重复 ACK
    • 如果窗口很小(例如初始慢启动),可能无法积累足够的重复 ACK。
    • 解决方案:必须依赖超时重传进行恢复。
  1. 多个数据包丢失时,快速重传可能不够用
    • 例如,大量数据丢失会导致 TCP 序列号乱序,可能不会出现 3 个重复 ACK。
    • 解决方案:超时重传仍然是最后的兜底策略。
  1. ACK 丢失导致误判
    • 例如,ACK 丢失导致发送方无法收到 3 个重复 ACK,就无法触发快速重传。
    • 解决方案:最终仍然需要超时重传来保证数据可靠交付。

6. 快速重传的优化:快速恢复(Fast Recovery)

如果丢包导致窗口缩小,TCP 可能会进入拥塞避免状态,这会影响传输速率。

快速恢复(Fast Recovery)

  • 在快速重传后,不进入慢启动,而是直接进入拥塞避免(Congestion Avoidance) ,避免窗口回缩过猛。
  • 主要用于 Reno 和 NewReno 版本的 TCP。

示意流程

  1. 发生丢包,收到 3 个重复 ACK,触发快速重传
  2. 进入快速恢复模式,减小窗口而不进入慢启动。
  3. 收到新 ACK 后,恢复正常传输。

7. 总结

  • 超时重传 是 TCP 保证可靠性的基础,但它的等待时间长,影响吞吐量。
  • 快速重传 能在 3 个重复 ACK 时立即恢复丢包,提高传输效率。
  • 两者结合 使 TCP 能够既可靠又高效地传输数据,其中快速重传是优化吞吐量的关键,而超时重传是兜底策略。
  • 快速恢复(Fast Recovery) 进一步优化了快速重传后的拥塞控制,防止窗口过度回缩,提高性能。

最终结论
快速重传不能完全替代超时重传,但它大幅优化了 TCP 丢包恢复的效率,两者相辅相成,使 TCP 既能高效传输,又能保证可靠性。