Skip to content

算法Algorithm

TCP往返估计与重传计时器

TCP RTO · Retransmission timeout · Karn algorithm · SRTT

按RFC6298的更新次序手算SRTT、RTTVAR和RTO,处理重传样本歧义及指数退避,区分重传与业务超时。

形式陈述 ​

TCP发送者在已发数据长期未获确认时,需要决定何时重传。往返时间RTT是一个发送样本到其确认返回的时间;RTO是据样本和保守余量选择的重传超时时间。RTT观察值不是以后每个包的时延上界。

本页固定RFC6298(2011)的算法,时钟粒度为 G 秒,平滑往返估计为 S,偏差估计为 V。尚无有效样本时选择规范建议的初始RTO=1秒。首个样本 R 给出 S=R,V=R/2;以后新样本 R′ 按以下次序更新:

V←34V+14|S−R′|,S←78S+18R′.

计算 V 时必须用旧 S。随后原始超时为 S+max(G,4V);本页采用该RFC建议的1秒下限,即取两者较大值。若设置最大RTO,该RFC要求上限至少60秒。生产栈与后续扩展可能有不同参数,本页不声称所有系统都使用1秒。

未使用能消除歧义的时间戳机制时,Karn规则不从重传过的段采RTT样本,因为返回ACK可能确认原发送,也可能确认重传。数据首次发出且计时器未运行时启动;新ACK确认了此前未确认数据时重启;全部在途数据获确认时关闭。计时器到期则重传最早未确认段,将RTO乘2,再启动下一轮计时。

直觉

只取平均RTT会忽略抖动。偏差大时多留一些余量,可减少原包只是慢了一点却被大量重传的情况。超时越多,退避越长,避免没有反馈时仍用原速率不断加压。

一次重传之后,ACK没有写明“这是回应第一份还是第二份”。用第二次发送时间强行计算一个很短RTT,会让以后更容易过早重传。

例子与边界

取 G=0.01 秒。第一有效样本为0.8秒,得到 S=0.8,V=0.4,RTO=0.8+1.6=2.4秒。第二样本为1.0秒,先算 V=0.75×0.4+0.25×0.2=0.35,再算 S=0.825,RTO=0.825+1.4=2.225秒。

第三样本为0.7秒:V=0.75×0.35+0.25×|0.825−0.7|=0.29375;S=0.875×0.825+0.125×0.7=0.809375;RTO=1.984375秒。三次都高于本页1秒下限。若先更新 S 再求偏差,第二行就会得到不同结果,违反指定次序。

在另一条时间线上,时刻10发出数据,RTO=2.225。到12.225仍无新确认,重传并退避至4.45秒;若继续无新确认,下一次到期是16.675。时刻12.4到达的ACK既可能回应原包,也可能回应重传,因此本页不把0.175秒加入估计。若ACK确认全部在途数据,停止计时器;若仍有未确认数据,则依新ACK规则重启。

初始SYN等待时若发生超时,并且实现使用小于3秒的RTO,RFC6298另要求握手完成后开始数据传输时把RTO重新初始化为3秒。这是握手特定条件,不能遗漏后仍称“覆盖该RFC全部初始化路径”。本页主要算例从已有有效数据RTT开始。

推论与应用

重传计时器为了修复传输缺口;应用deadline为了限制整个调用愿意等待多久。一个调用可以在TCP下一次重传之前就到达deadline;也可能经历多次TCP重传而仍在业务预算内。两者不应共用一个含糊的“超时”字段。

RTO到期是发送者的观察,不是原包必丢、对端必死或业务必未执行的证明。拥塞控制还规定超时后怎样降低发送窗口;那是另一个状态更新,不能只加倍计时器而保持任意大的发送压力。

参考资料
  • RFC 6298,2011,§§2–5:初值、更新次序、1秒建议下限、Karn、计时器管理和SYN超时例外。
  • RFC 9293,§3.8.1:TCP必须实现的RTO接口与RFC6298引用;更激进或保守的具体栈行为不由本算例推断。
关系图谱4 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组