Skip to content

算法Algorithm

QUIC丢包检测与探测超时

QUIC loss detection · Probe timeout · QUIC PTO

从ACK与发送时刻复算RTT、包号和时间阈值,分别追踪判丢计时器与PTO探测。

形式陈述 ​

限定恢复状态,先区分两种闹钟 ​

沿用QUIC包号与ACK区间:确认属于某一空间、某次发送,较大包号表示较晚发送。本页采用RFC 9002推荐阈值,讨论握手已确认、路径固定、地址验证已完成的Application空间;所有主例发送包都含引发确认的帧。排除握手防死锁、密钥丢弃、迁移和完整拥塞控制,给出的是可复算恢复片段。[1, §§5、6]

发送端保留每个在途包的包号 p、发送时刻 tp、字节数与可恢复信息。这里“在途”是发送端账本状态,不是声称包此刻还在网络线上:ACK可能已在返回途中。收到合法ACK后,先找新确认包并更新RTT,再判断未确认包是否满足丢失阈值。

ack-eliciting(引发确认)包含ACK、PADDING、CONNECTION_CLOSE之外的至少一种帧;STREAM或PING都满足。纯ACK包不会仅为自己触发一轮ACK,避免无限确认相互追逐。一般在途定义还包含PADDING包;本页所有包均引发确认,因而无需另拆这条分支。[1, §2]

RTT估计要扣哪一段等待 ​

记最新原始样本为 L,最小原始样本为 M,平滑值为 S,波动量为 V,均按毫秒。只有当ACK的Largest是新确认的包,并且本次至少新确认一个引发确认的包时,才采样

L=ACK处理时刻−tLargest.

ACK Delay只描述Largest对应的接收端等待,不分别描述帧中每个包。首次样本设 M=S=L,V=L/2,不先扣延迟。后续先令 M←min(M,L),把已解码ACK Delay截到对端声明上限 D,得到 d;若 L−d≥M,取调整样本 R=L−d,否则取 R=L。不能靠一个声称很大的等待量,把网络RTT扣到本端从未观测过的更小值。

最后使用更新前的 Sold 计算

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

顺序依据RFC 9002附录A.7及已验证勘误7539。原版§5.3把更新 S 放在计算波动之前,勘误已纠正这一点;直接照抄那三行会得到不同的 V。[1, §5、A.7;2]

有更晚包获确认,才启动这两种判丢证据 ​

以下号差公式限定发送端在本空间按连续包号发送,没有主动跳号;ACK页允许跳号是协议的一般能力,这里收窄为RFC 9002附录A.10注明的前提。令 a 为本空间至今确认的最大包号。对仍未确认且在途的包 p<a,采用以下任一条件判丢:

p≤a−3,或now−tp≥Δ,Δ=max(98max(S,L),G).

主例计时器粒度 G=1 ms。第一条在连续发送前提下比较包号差,不要求收到三个不同ACK;第二条允许后续没有新ACK时,定时器在 tp+Δ 触发。若尚未到时间阈值,记所有候选中最早的这个期限。比 a 更晚的尾包不能仅因“已经很老”就套用这条ACK驱动时间规则。[1, §6.1]

若实际只发送20和25,中间21至24被主动跳过,号差5只隔着一次真实后继发送,不能算成五次重排机会。支持这种发送策略时,需要记录实际发送次序或另行调整相应阈值;本文的连续号检查器不覆盖这条扩展。

PTO安排探测,不把沉默变成送达事实 ​

如果没有更早的时间阈值任务,且仍有引发确认的包在途,本页场景的探测基础间隔为

P=S+max(4V,G)+D.

PTO期限按本空间最后一个引发确认包的发送时刻加 2cP 安排,c 为连续探测退避计数。到期后本页策略发送一个新包号的探测包,再把 c 加一;有新确认进展后清零。若还有新数据,优先携带新数据;也可携带仍需恢复的旧信息,没有载荷时可发PING。新包里的旧流字节仍用原流偏移。[1, §§6.2.1、6.2.4、A.8–A.9]

PTO到期本身不证明此前所有包丢失;本页始终选择发送探测的分支。RFC另在无数据可发的特殊收尾讨论了放弃在途包的替代策略,不能把它误当一般到期规则。时间阈值计时器有优先权:存在已记录的loss_time时,不同时把PTO当作先执行的任务。

直觉

观察到后来者,和完全没声音,提供不同信息 ​

若包23已经被确认,而包20仍没确认,至少知道某个后来发送的包走通了。发送端允许一定乱序,然后按号差或等待时间推断20丢失。这个推断能被一个很迟的20推翻,因此阈值不是物理故障证明。

若最后只剩24、25没有确认,就没有“更晚包已到”的证据。等待PTO后发出26,可以让对端再次给出可用反馈。若25其实早已到达而ACK丢失,这次探测同样能帮助恢复;不必先断言数据路径丢了25。

阈值判丢与PTO探测的分工
例子与边界

三个RTT样本逐行更新 ​

取 D=25 ms,依次使用原始RTT与已解码延迟 (100,10),(140,25),(90,20)。

样本 原始L 更新后M 使用R 更新后S 更新后V
首次 100 100 100 100 50
第二次 140 100 115 101.875 41.25
第三次 90 90 90 100.390625 33.90625

第二次 140−25=115≥100,所以扣25;V=37.5+15/4=41.25。第三次先把最小值降为90;扣20会得到70,小于90,因此不扣。此时基础PTO为 100.390625+4×33.90625+25=261.015625 ms。它不是旧页TCP RTO的一秒下限规则。

如果第二次ACK仍只重复已经确认的Largest,不能再生成同一个包的第二份RTT样本。ACK一次列出十个新包,也不表示要把十个发送时刻各算一次带同样ACK Delay的样本。

包号阈值、时间阈值和尾部探测 ​

以下另开一个已更新估计的快照,与上表不是同一组估计:S=100,L=80,V=20,D=25,G=1,于是 Δ=112.5,P=205 ms。PN20至25的发送时刻分别为0、10、20、30、40、50 ms。110 ms收到只新确认23的ACK;表中参数已包含此次ACK的RTT更新。为只追踪计时器,假定在下面列出的探测前没有其他新发送。

时刻ms 事件 从在途移除 仍未确认且在途
110 ACK23,包号差达到3 23确认;20判丢 21、22、24、25
122.5 最早loss_time 21判丢 22、24、25
132.5 下一loss_time 22判丢 24、25
255 最后发送50,加基础PTO205 不因此移除24、25 24、25及新探测26

110时21的年龄100,22的年龄90,都未达到112.5。24、25的包号大于已确认最大23,后面两次时间阈值仍不适用。255时用26发探测;若仍没有新确认,退避后的间隔是410,下一PTO为 255+410=665 ms。期限必须从新探测的发送时刻算,不能只把绝对时间255乘二。

这个表刻意延后了丢失信息的再次发送。实际发送器可以更早按窗口、节奏和应用优先级补发;一旦有新的引发确认包发送,就要重算相应PTO期限,而不能沿用表里的255。

遗漏的边界会怎样破坏结论 ​

把Handshake空间的ACK12拿来与Application包9比较,会造出虚假的号差3;包号阈值始终在同一空间内。路径迁移后仍把旧路径最小RTT直接当作新路径下界,也超出本页固定路径假设。

探测包增加网络负载,须进入在途字节账本。PTO探测有拥塞窗口特例,但不由此取消连接流量信用、地址验证或应用数据边界。一次PTO也不是持续拥塞判据;完整控制器还要按RFC的另一组条件决定窗口如何变化。

推论与应用

恢复哪个信息,要查帧语义 ​

丢失一个包,只是对那次发送的判断。若同一STREAM区间已经由另一个包确认,就不必因旧包判丢再发送一份;流被RESET后也不继续补普通数据。ACK帧本身不按原样重传,新的ACK可以重新表达当前接收状态。恢复队列因此需要“信息仍有必要吗”的查询,而不只是复制旧包字节。[3, §13.3]

最简单的有限实现收到ACK后扫描 n 个发送记录,耗时 O(1+n),另计ACK解码成本;RTT数值更新为常数次算术。按发送时刻有序或维护候选计时结构可以减少扫描,但不能把本文线性扫描代码声称为恒定的整次ACK处理。

把可发送和应该何时发送分别记账 ​

恢复逻辑产生候选信息,DRR可在教学发送器里选择哪个队列先服务,令牌桶可对出口聚合字节设置时间预算。这两项不是QUIC强制调度算法。本文也不把令牌可用误当拥塞窗口可用:实际发送仍须同时满足采用的各项限制。

参考资料

[1] Jana Iyengar、Ian Swett,RFC 9002: QUIC Loss Detection and Congestion Control,2021,§2定义,§§5.1–5.3及附录A.7的RTT更新,§§6.1–6.2和附录A.8–A.10的判丢与探测计时。

[2] RFC Editor,RFC 9002勘误7539,Verified,2023-06-13核定:波动项必须在平滑RTT更新前计算。本文数字与附录A.7一致。

[3] Jana Iyengar、Martin Thomson,RFC 9000 §13.3: Retransmission of Information,2021:按信息与帧类型恢复,而非复用原包号。

关系图谱3 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

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