TCP 超时重传时间(RTO)的计算机制详解 | 网络协议优化指南

TCP 的超时重传时间(Retransmission Timeout, RTO)是 TCP 协议中用于确定何时重传未确认的数据包的关键机制。RTO 的计算基于往返时间(Round-Trip Time, RTT)的估计,并结合了网络延迟的波动性。以下是 RTO 计算的详细步骤和原理:
1. 测量 RTT
TCP 通过测量数据包发送到接收到确认(ACK)的时间来计算 RTT。这个时间称为 SampleRTT。每次成功接收到一个 ACK 时,TCP 都会更新 SampleRTT。
2. 平滑 RTT 估计(SRTT)
为了减少 RTT 的波动对 RTO 计算的影响,TCP 使用指数加权移动平均(Exponential Weighted Moving Average, EWMA)来平滑 RTT 的估计值,称为 Smoothed RTT (SRTT)。SRTT 的计算公式如下:
[ SRTT = (1 - \alpha) \times SRTT + \alpha \times SampleRTT ]
其中,(\alpha) 是平滑因子,通常取值为 0.125。
3. 计算 RTT 的方差(RTTVAR)
为了反映 RTT 的波动性,TCP 还计算 RTT 的方差(RTTVAR)。RTTVAR 的计算公式如下:
[ RTTVAR = (1 - \beta) \times RTTVAR + \beta \times |SampleRTT - SRTT| ]
其中,(\beta) 是平滑因子,通常取值为 0.25。
4. 计算 RTO
最终的 RTO 计算基于 SRTT 和 RTTVAR,公式如下:
[ RTO = SRTT + 4 \times RTTVAR ]
这个公式确保了 RTO 不仅考虑了平均 RTT,还考虑了 RTT 的波动性,从而在网络条件变化时能够自适应地调整重传时间。
5. RTO 的上下限
为了防止 RTO 过长或过短,TCP 通常会设置 RTO 的上下限:
- 下限:通常设置为 1 秒,以防止过于频繁的重传。
- 上限:通常设置为 60 秒,以防止重传时间过长。
6. Karn 算法
在重传的情况下,TCP 无法准确测量 RTT,因为无法确定接收到的 ACK 是对原始数据包还是重传数据包的确认。为了解决这个问题,TCP 使用 Karn 算法,即在重传时不更新 RTT 估计值,而是直接使用当前的 RTO 进行重传。
7. 指数退避
当发生多次重传时,TCP 会采用指数退避策略,即每次重传时将 RTO 加倍,直到达到上限。这有助于在网络拥塞时减少重传的频率。
总结
TCP 的超时重传时间(RTO)的计算是一个动态调整的过程,基于对 RTT 的测量和波动性的估计。通过平滑 RTT 和计算 RTT 的方差,TCP 能够自适应地调整重传时间,以适应网络条件的变化。这种机制确保了 TCP 在各种网络环境下都能有效地进行可靠的数据传输。