摘要

  • RFC 6298 要求先用旧 SRTT 更新 RTTVAR,然后才让同一个 RTT 样本更新 SRTT。
  • RTO 由平滑均值、时钟粒度与四倍时延波动共同决定,并设有一秒下限。

一个样本留下两种记忆

首次得到 RTT 测量值 R 时,SRTT 被设为 R,RTTVAR 被设为 R/2。随后按 SRTT + max(G, 4*RTTVAR) 计算 RTO;其中 G 是时钟粒度。

后续样本 R' 不会直接覆盖旧值。RTTVAR 以四分之一的权重吸收新偏差,SRTT 则只以八分之一的权重移动。波动因此可以比中心预期更快地响应变化。

先衡量意外,再移动基准

规范明确要求先计算 |SRTT-R'|,此时 SRTT 仍是更新前的旧值。只有 RTTVAR 完成更新后,SRTT 才能吸收 R'。

如果顺序反过来,新样本会先把均值拉近自己,然后才接受偏差测量。它会在被判断之前参与改写判断基准,使异常程度被低估。因此,赋值顺序不是代码风格,而是估计器语义的一部分。

上下限不能代替估计器

重新计算出的 RTO 若低于一秒,应上调至一秒。实现也可以设置最大值,但最大值不得低于 60 秒。这些边界包围估计过程,并不抹去均值与波动的历史。

RFC 没有统计当代各家实现,也没有证明这组常数适合所有现代路径。它规定的是共同算法。Karn 规则负责判断某个 RTT 样本能否采用;本文讨论的是样本已被采用之后如何改变状态。

来源