摘要

  • 一个 UDP 数据报可以包含多个完整的 QUIC 数据包,包括 Initial、Handshake 和应用数据包。
  • 每个数据包保留自己的保护、数据包编号空间、处理、ACK 和丢失语义。
  • 观测系统必须保存逐包证据,再分别关联应用接收结果。

抓包可能显示同一个 UDP 数据报中同时有 Initial、Handshake 和 1-RTT。这说明的是线路上的封装方式,并没有创造一个不可分割的交付事件。对 QUIC 而言,完整数据包是可处理单位;UDP 只是承载一个或多个单位的外壳。

合并的作用是提高线路效率。它可以减少完成加密握手并开始数据传输所需的 UDP 数据报数量。接收端必须能够识别并处理每个合并的数据包。Initial、0-RTT 和 Handshake 数据包带有 Length 字段,接收端可据此找到边界。短头部数据包没有 Length 字段,因此只能位于最后。Retry 和 Version Negotiation 不与其他数据包合并;具有不同 connection ID 的数据包也不得合并。

共同外壳不会合并协议语义。每个合并的数据包都必须独立处理并分别确认,就像它们到达不同的 UDP 数据报一样。如果一个数据包无法解密,接收端可以丢弃或暂存它,但仍必须尝试处理其余数据包。把整个数据报记录为一个握手成功事件,会抹去协议明确保留的差异。

Initial、Handshake 和应用数据使用不同的数据包编号空间。ACK 只标识其所属空间中的数据包;数据报中的相邻位置不会把这些空间变成一条序列,也不会形成共同的确认域。QUIC 重传的是帧携带的信息,通常放进新的数据包,并不重新使用原丢失数据包的编号。

必须区分一个数据包中的多个帧与一个数据报中的多个完整数据包。丢失一个 QUIC 数据包可能阻塞其中数据所属的流,而其他流仍可继续;这种影响来自帧被放在同一个数据包中,不来自不同数据包共享 UDP 外壳。

承载 Initial 的 UDP 数据报必须通过填充或合并达到至少 1200 字节;服务器会丢弃位于更小数据报中的 Initial。这是特定的承载约束,不能推广为数据报内所有数据包拥有共同交付命运。RFC 9000 还指出,除 Initial 数据报的填充规则外,改变数据包如何分组进 UDP 数据报,对连接没有功能性影响,但性能可能改变。

因此应记录数据报标识和观测点、源和目的元组、总长度、数据包偏移与长度、connection ID、类型、加密级别、数据包编号空间、可解码的编号、逐包解密和处理结果、帧清单、ACK 关系、丢失声明、重传信息映射、流编号与范围、Initial 的 1200 字节合规性及 PMTU 探测角色。应用接收必须单独记录。观测到一个外壳,只能证明从某个观测点看到了一个网络承载事件;不能证明所有数据包都解密、处理、确认或恢复,也不能证明字节抵达用户空间、消息完成、持久化提交或业务动作完成。