摘要

  • MASQUE 工作组 10 月 28 日的第 02 版草案规定,HTTP 字段中通告的 mtu 是接收方接受的重建后包长上限。压缩后的 QUIC DATAGRAM 帧仍须满足对端帧长限制;加上 HTTP/3、QUIC、UDP、IP 外层开销后的包还须装进当前路径 MTU。
  • 原始长度相同的包,压缩结果可能不同。第 5.1.5 节提醒,一次 PMTU 探针成功,不能为其他同长包背书;隧道对共享流量公布 MTU 时,应按其中最少能得到的压缩收益估算,连完全不压缩的包也要算进去。

同一个 1500,管的是两件事

协议报文里的数字特别容易被挪用。MASQUE 的 http-datagram-contexts 字段可以出现 mtu=1500。读成“这条路能运 1500 字节”,下一步就会给隧道配上一个过于自信的尺寸。草案给这个数字安排的工作更窄:接收端愿意在处理上下文执行完以后,接收一个至多这么大的原始包。发送端在传输时可能删去稳定字段、让接收端推导长度或补完校验和;到了另一端,这些信息被重新拼回包里。mtu 管的是拼回来的结果。

能力通告还有方向。两端各自告诉对方,自己愿意接收和保存哪些处理上下文。对方只可建立已获支持的模板、派生字段或校验和卸载上下文。草案举例让两端都报 mtu=1500,却列出不同的派生字段和校验和能力。数字相同,没有让两端的压缩能力变成同一台机器;更没有替它们测量中间的链路。

7 月的第 01 版已经给重建包设置上限,并禁止发送会在重建后超限的数据报。第 02 版不是刚发明这条禁令。它把数字的主人写得更明白:这是接收端上限,既非路径 MTU 的测量值,也非“同样大小的包一定能放入 QUIC DATAGRAM 帧”的承诺。只要对端通告了该上限,发送端使用 QUIC DATAGRAM、DATAGRAM Capsule,甚至完全不用处理上下文,都不能发送重建后更大的包。换运输工具,改不了接收端明确给出的容量。

压缩器有本事,桥却没有变宽

MASQUE 提议的压缩有实在用途。CONNECT-IP 把 IP 包放进 HTTP 数据报时,同一流里的不少头部字段反复出现。模板可以省去稳定片段;派生字段可让对端算回包长、校验和等值。一个原本太大的包经过处理,可能缩到 QUIC DATAGRAM 帧和路径都装得下的程度。省下的是这个包在这个上下文里的字节,不是一张可供所有包兑现的通行证。

第 02 版新增的第 5.1.5 节把检查顺序写在压缩后。实际发出的 QUIC DATAGRAM 帧须落在对端帧长限制内。外层 IP 包连同 HTTP/3、QUIC、UDP 与 IP 开销,须符合当前路径 MTU。接收端可以重建 1500 字节,路上却只看实际传来的压缩包。某个原始大包因为头部重复而顺利过去;另一个包即使低于接收端 1500 的上限,也可能因为找不到合适的上下文或压缩收益太低而卡住。

这正是 PMTU 探针容易制造假把握的地方。探针和业务包原始长度相同,字节内容与处理上下文可以不同。草案明确指出,压缩率甚至会在同一尺寸的包之间变化。探针通过,只能证明那一份压缩后的外层包穿过了那一次的路径。RFC 8899所讨论的 PMTU 状态还可能由多个流共享,而这些流使用的压缩上下文并不一样。把一条流的好运记进大家共用的 MTU,就像让折叠椅替沙发测门宽。

因此草案给运营者的建议很具体:选择隧道 MTU,或者向所承载流量报告 PMTU 时,应考虑共享该尺寸的流量中最少能得到的压缩收益,其中包括不压缩的包。一个优秀模板当然可以改善其适用流量的效率;如果想为那一类流量单设尺寸,也得让上下文与测量范围保持一致。把最好看的探针结果宣布为全隧道能力,损失由那些最难压缩的业务包承担。

可靠胶囊也要收费

还有一种让大包继续抵达的办法:改用 DATAGRAM Capsules,把数据报分放在多个传输包里。草案说明,在底层 HTTP 数据报协议允许时,这条路可以运较大的数据报,但它带来可靠传送、队头阻塞、更多缓存和重传,和 QUIC DATAGRAM 帧之间还可能发生重排。原始内容没有变,交付的时间与顺序已经变了。

更麻烦的是,这条绕路可能遮住隧道内部流量需要知道的尺寸边界。第 5.1.5 节援引 CONNECT-IP 第 10.1 节和 CONNECT-UDP 第 6.1 节:遇到超大包,它们建议丢弃并回送 ICMP Packet Too Big,让原发送方调整包长,而非悄悄换成胶囊。胶囊可以救下这一次交付,却不能加宽物理路径,也不能撤销接收端通告的重建上限。只有“送达率”的看板会把这笔代价藏起来。

IETF 状态页仍把第 02 版列为 MASQUE 工作组的活跃 Internet-Draft,IESG 状态为 I-D Exists。文中没有给出现网丢包率或某个代理的实测抓包。要判断具体实现是否踩中了这道窄门,取两个原始长度相同、上下文不同的包,记录压缩后帧长、外层包长、当时路径 MTU 和 Packet Too Big 反馈即可。草案已把误判机制交代清楚:接收端能拼回去,与路径能运过去,是两张不同的收据。

来源