摘要

  • max_udp_payload_size 是声明端经过认证的单方面接收意愿,不是路径测量结果。
  • RFC 9000 的数据报大小是 UDP 负载,不包括 IP 和 UDP 首部;PMTU 是路径在不分片条件下能够承载的完整 IP 包的最大大小。
  • 最大 UDP 负载等于适用 PMTU 减去 IP 首部和 UDP 首部;发送还必须受对端上限以及 PMTUD 或 DPLPMTUD 当前证据约束。

运维面板最容易制造一种危险的错觉:握手中收到一个 QUIC 传输参数,随后把它标成“MTU”。这样做把端点的接收能力声明,误写成了网络路径的状态。RFC 9000 中的 max_udp_payload_size 含义更具体:声明该参数的端点表示自己愿意接收的最大 UDP 负载。对端可以用它进一步限制发送,但不能把它当作路径测量、安全发送大小或路径状态。

认证只证明声明的来源和完整性。参数在加密握手中传递,并在握手完成后可用且经过验证;这并不意味着中间路径已经被测量。默认值为 65527,即允许的最大 UDP 负载。它不表示路径能承载 65527 字节。小于 1200 的值无效,会触发传输参数错误处理。

一个 UDP 数据报可以承载一个或多个完整 QUIC 包。RFC 9000 的数据报大小计入 QUIC 首部和受保护负载,表示 UDP 负载总量,但不包括 IP、UDP 首部。PMTU 则是路径在相关条件下不发生分片时能够传输的完整 IP 包最大大小。对应的最大 UDP 负载,是适用 PMTU 减去 IP 首部和 UDP 首部。二者不能互换。PMTU 可能随时间变化,也可能因本地和远端地址对不同而不同。

QUIC 要求路径至少支持 1200 字节 UDP 负载。没有 PMTUD 或 DPLPMTUD 时,端点不应发送超过 1200 字节的数据报。承载 QUIC 的 UDP 数据报不得在 IP 层分片;IPv4 中如有可能应设置 Don't Fragment 位。在得知对端参数前发送超过 1200 字节会有丢失风险。实际发送上限是对端接收上限与由当前 PMTU 证据推导出的 UDP 负载上限中更严格的一个。Initial 数据报扩展到至少 1200 字节,只证明协议最低路径要求。

PMTUD 使用 ICMP 反馈。收到 Packet Too Big 后,应依据地址、端口,并在可能时依据 QUIC 连接 ID 进行验证;不能仅凭一条 ICMP 声明就提高 PMTU。DPLPMTUD 通过不同大小的探测包验证路径,并针对每个地址对记录已确认或丢失的探测结果。探测丢失不是可靠的拥塞证据,不应单独触发拥塞响应,但探测会消耗拥塞窗口。

证据账本应分别记录连接和观察时间、地址对、声明端点、经过认证的 max_udp_payload_size 及其可用时间、0-RTT 是否受记忆值控制、当前 PMTU 和推导出的最大 UDP 负载、PMTUD 或 DPLPMTUD 方法与状态、探测大小及确认或丢失、经验证的 ICMP、IP 版本、首部和扩展开销假设、分片策略、应用负载、QUIC 开销与数据报内的报文合并情况,以及丢包、拥塞、吞吐、时延、完成情况和应用结果。单个参数不能替代这些证据,也不能推出应用成功。

HIST-008 讨论 PMTUD 证据和控制的历史;TR-039 讨论三倍反放大预算;TR-049 讨论一个数据报中的多个 QUIC 包;TR-046 讨论流和连接的流控许可;TR-040 讨论连接 ID 与迁移。它们都不能替代当前地址对的路径大小证据。