摘要
- RFC 6298 根据平滑往返时间及其波动计算重传超时,并拒绝可能把 ACK 归给错误发送副本的含混样本。
- 初次等待可以从一秒开始;若 SYN 超时,数据阶段恢复三秒,而此后每次超时都会先把 RTO 加倍再继续。
沉默是一种很弱的证据。可能是数据段丢了,可能是 ACK 丢了,也可能两者都只是在变慢。过早重传会制造副本,并向可能已拥塞的路径增加流量;等待过久又会让真实丢包迟迟得不到修复。RTO 的作用是在不知道原因的情况下约束这项选择。
估计同时保存时间与不确定性
首次 RTT 测量之前,RFC 建议把 RTO 设为一秒,也允许采用更保守的较大值。取得第一个样本 R 后,设置 SRTT = R、RTTVAR = R/2,再计算 RTO = SRTT + max(G, 4*RTTVAR);G 是时钟粒度。
后续样本必须先用旧 SRTT 更新 RTTVAR,再更新 SRTT。beta 为四分之一,alpha 为八分之一,K 为四。这个顺序让波动量衡量新样本相对旧估计有多意外。新的 RTO 仍是平滑时间加上时钟粒度与四倍波动量中的较大者。
若计算结果低于一秒,应上调到一秒。实现可以设置最大值,但不得低于 60 秒。RFC 的立场很明确:可以更保守,不能比规定算法更激进地重传。
不是每个 ACK 都能教会时钟
Karn 算法是强制要求。重传之后到达的 ACK 可能确认第一次发送,也可能确认重传副本,因此不能成为 RTT 样本;只有 TCP Timestamps 消除这种对应歧义时才例外。没有时间戳时,每个 RTT 通常至少取一次样本;有时间戳时可得到更多样本,但估计器规则并未取消。
这与 PAWS 不同。RFC 6298 借助时间戳只为确定 ACK 对应哪次发送,不负责拒绝序列号回绕后的旧报文。
一个计时器盯住最早的未确认数据
发送新数据且计时器未运行时,以当前 RTO 启动它。ACK 覆盖全部未确认数据时停止计时;ACK 确认了新数据但仍有数据在途时,则以当前 RTO 重新开始。
计时器到期后,TCP 重传最早的未确认段,把 RTO 加倍,并用加倍后的值重新计时。指数退避使发送方在反复沉默下越来越不愿意再次行动。之后若得到干净 RTT 样本,RTO 可以下降;多次退避后,实现还可以清空 SRTT 与 RTTVAR,因为旧估计可能已不再描述路径。
一秒初值有一个精确例外:若实现使用低于三秒的 RTO 而 SYN 超时,那么连接建立、准备发送数据时,RTO 必须重置为三秒。路径已经否定了更快的初始假设。
计时器是控制,不是诊断
攻击者可能拖延被测报文以抬高 RTO,也可能用伪造流量尝试压低它。平滑与退避限制影响持续时间,却不能鉴别延迟来源。因此,RTO 到期只是一次在不确定性下采取的动作,并不是某个报文确实丢失的证明。
唯一来源是 2011 年 6 月发布于标准轨道的 RFC 6298。它规定计时算法和历史理由,不证明当前实现默认值、路径 RTT 分布或厂商行为。
会员简报
档案背景详情
使用相应会员等级登录,即可解锁完整简报与来源注释。
仅限 Strategic Circle
Strategic Circle
所有读者均可浏览。加入并登录后可解锁档案简报。
加入 Strategic Circle仅限 Leadership Alliance
Leadership Alliance
符合条件的 IP 资产所有者和管理层可登录查看 Leadership Alliance 简报。
加入 Leadership Alliance
