摘要

  • PTO 到期会触发一个或两个可引发 ACK 的探测数据报,并增加退避时间。
  • 它本身不声明任何数据包丢失,也不证明拥塞或某个 ACK 丢失。
  • 计时器、packet number space、探测内容、后续 ACK、丢失声明和应用结果必须分开记录。

最危险的误读,是把计时器到期直接写成“丢包事件”。PTO 到期首先只是某个 packet number space 中的计时器事件。它表示,可引发 ACK 的数据包在预期时间内没有带来所需的确认进展,或者服务器可能在客户端地址尚未验证前需要进行探测。协议采取的动作是继续寻找进展:端点至少发送一个可引发 ACK 的探测包,也可以发送最多两个全尺寸探测数据报,随后增加 PTO 退避。计时器到期并没有指出哪个数据包丢失。

PTO 按 packet number space 维护,Initial、Handshake 和 Application Data 不能被合并成一条没有边界的队列。普通 PTO 计算为 smoothed_rtt + max(4*rttvar, kGranularity) + max_ack_delay。Initial 和 Handshake 中,max_ack_delay 这一项取零。握手确认之前不会启动 Application Data PTO。发送可引发 ACK 的数据包、此类数据包得到确认,以及丢弃 Initial 或 Handshake 密钥,都可能使发送方重新启动 PTO。到期后下一周期加倍;连续周期在不同 packet number space 中呈指数增长,最终受到独立 idle timeout 的限制。

丢失检测有自己的证据路径。time-threshold loss-detection timer 优先于 PTO;该计时器已经设置时,不应再启动 PTO。随后收到的 ACK 范围可以依据 RFC 9002 触发 packet threshold 或 time threshold 的丢失声明。那是后续事件,不能倒推成 PTO 到期时已经完成的判定。如果监控系统在 PTO 到期时把所有未确认数据包标记为丢失,它是在没有相应阈值或 ACK 证据时提前下结论。

探测数据报也不能简单称为“重传”。有新数据时应优先使用新数据;没有新数据时,可以在新的帧和新的数据包中再次携带此前发送过的信息。没有可用数据时,可以发送 PING 或其他可引发 ACK 的帧。RFC 9000 明确说明,丢失的 QUIC 数据包不会整体重传;需要修复的信息会在新的帧和新的数据包中再次携带。再次发送信息不等于逐字节重放同一个数据包;PING 和 PADDING 不包含可重传信息。

在地址验证之前,服务器的探测数据包会计入 anti-amplification limit。如果预算不允许服务器继续发送,服务器必须等到新的客户端数据报增加预算后才能启动 PTO。客户端仍可能需要发送探测来解除服务器的限制。这说明的是发送预算和状态,不是某个数据包或 ACK 已经丢失。

RFC 9002 允许一种实现策略:不发送探测,而是把剩余的在途数据包标记为丢失。但这是实现选择,不是 PTO 到期的语义,并且可能让拥塞控制器过于激进地降低发送速率。PTO 到期也不能证明拥塞导致 ACK 进展缺失,不能证明接收端处理了应用数据,不能证明服务已经响应,更不能证明业务操作已经完成。