📖 TCP 超时重传时间 (RTO) 的选择
🎯 课程摘要:TCP 超时重传时间 RTO (Retransmission Time-Out) 的选择是 TCP 最复杂的问题之一。RTO 应略大于加权平均往返时间 RTT_S,采用 RFC 6298 推荐的公式:RTO = RTT_S + 4×RTT_D。针对超时重传时无法准确测量 RTT 的问题,采用 Karn 算法(重传报文段不采用其 RTT 样本)并配合"每重传一次 RTO 翻倍"的修正。
📝 详细笔记
1. RTO 选择的基本原则
- 概念定义:RTO (Retransmission Time-Out) 是 TCP 重传计时器的超时阈值;RTT (Round-Trip Time) 是报文段的往返时间。
- 原理解析:发送方记录发送数据报文段的时间与收到确认的时间,二者差值即该报文段的 RTT。
- ⚠️ 重点/考点:RTO 取值的两种极端情况:
| RTO 取值 | 后果 |
|---|---|
| RTO < RTT | 引起报文段不必要的重传,增大网络负荷 |
| RTO 远大于 RTT | 重传推迟太长,网络空闲时间增大,降低传输效率 |
- 结论:RTO 应设置为略大于往返时间 RTT 的值。
2. 加权平均往返时间 RTT_S 的计算
- 问题:Internet 环境复杂,报文段可能经过不同速率的网络、不同转发路由,各次 RTT 样本差异大,不能直接用某次 RTT 样本作为 RTO。
- 解决方法:利用每次测量得到的 RTT 样本计算加权平均往返时间 RTT_S,得到平滑的往返时间。
- 计算公式:
- 第一次测量:
RTT_S = RTT 样本(即 RTT_S₁ = RTT₁) - 之后每次测量:
- 第一次测量:
RTT_S = (1 - α) × RTT_S + α × 新RTT样本
- 参数 α:RFC 6298 推荐 α = 1/8 = 0.125。
- α 接近 0:新 RTT 样本对 RTT_S 影响小(平滑性强);
- α 接近 1:新 RTT 样本对 RTT_S 影响大(灵敏度高)。
3. RTT_D 与 RTO 的计算
- RTT_D:RTT 的偏差的加权平均值,与 RTT_S 和新 RTT 样本的差有关。
- RTT_D 计算公式:
- 第一次测量:
RTT_D = RTT 样本 / 2 - 之后每次测量:
- 第一次测量:
RTT_D = (1 - β) × RTT_D + β × |RTT_S - 新RTT样本|
- 参数 β:RFC 6298 推荐 β = 1/4 = 0.25。
- ⚠️ 重点/考点:RTO 计算公式(核心记忆):
RTO = RTT_S + 4 × RTT_D
4. RTT 测量的复杂性与 Karn 算法
- 问题根源:发送方出现超时重传后收到确认报文段时,无法判断该确认是对原数据报文段的确认还是对重传数据报文段的确认,因此无法准确测量 RTT。
- 两种误判情况:
实际情况 误判为 后果 确认是对重传报文段 误当作对原报文段 RTT_S 和 RTO 偏大,降低传输效率 确认是对原报文段(确认迟到) 误当作对重传报文段 RTT_S 和 RTO 偏小,导致后续不必要重传,增大网络负荷 - Karn 算法:在计算加权平均 RTT_S 时,只要报文段重传了,就不采用其 RTT 样本(即出现重传时不重新计算 RTT_S,RTO 也不重新计算)。
- Karn 算法的问题:若报文段时延突然增大且长期保持,则在原 RTO 内收不到确认而重传,但 Karn 算法不考虑重传报文段的 RTT 样本,导致 RTO 无法更新,报文段反复被重传。
- Karn 算法的修正:报文段每重传一次,就把 RTO 增大一些,典型做法是:
新 RTO = 2 × 旧 RTO
- ⚠️ 重点/考点:Karn 算法 + RTO 翻倍修正共同解决了"重传时无法测准 RTT"的问题。
💡 核心总结
- RTO 应略大于 RTT,过小致不必要重传、过大降低效率。
- RTT_S 是 RTT 的加权平均:
RTT_S = (1-α)×RTT_S + α×新样本,α=1/8。 - RTO = RTT_S + 4×RTT_D,RTT_D 偏差加权平均,β=1/4。
- 重传时无法判断确认归属 → Karn 算法:重传不采用其 RTT 样本。
- Karn 算法缺陷 → 修正:每重传一次 RTO 翻倍。
❓ 课后思考 / 经典考题
- 为什么 RTO 不能直接取某次测量到的 RTT 样本值?
- 写出 RTT_S、RTT_D 和 RTO 的计算公式,α 和 β 的推荐值分别是多少?
- 当确认报文段迟到导致误判时,RTT_S 和 RTO 会偏大还是偏小?有何后果?
- Karn 算法的核心思想是什么?它会引起什么新问题?如何修正?