跳到主要内容

5. HTTP Datagram 负载格式 (HTTP Datagram Payload Format)

当 HTTP Datagram (见 [HTTP-DGRAM] Section 2) 与 UDP 代理请求流关联时, HTTP Datagram Payload 字段采用 Figure 7 中定义的格式, 其表示法来自 [QUIC] Section 1.3. 注意, 当 HTTP Datagram 使用 QUIC DATAGRAM 帧 [QUIC-DGRAM] 编码时, 下文定义的 Context ID 字段紧随 Quarter Stream ID 字段之后, 后者位于 QUIC DATAGRAM 帧负载的起始位置; 见 [HTTP-DGRAM] Section 2.1.

UDP Proxying HTTP Datagram Payload { Context ID (i), UDP Proxying Payload (..), } Figure 7: UDP 代理 HTTP Datagram 格式

Context ID: 包含 Context ID 值的可变长度整数 (见 [QUIC] Section 16). 如果接收到携带未知 Context ID 的 HTTP/3 Datagram, 接收方应当 (SHALL) 静默丢弃该数据报, 或在等待相应 Context ID 注册期间临时缓冲它 (大约一个往返时间量级).

UDP Proxying Payload: 数据报的负载, 其语义取决于前一个字段的值. 注意, 此字段可以为空.

UDP 分组使用 Context ID 字段设置为零的 HTTP Datagram 进行编码. 当 Context ID 字段为零时, UDP Proxying Payload 字段包含未修改的 UDP 分组负载 (在 [UDP] 中称为数据八位字节).

根据 UDP 头部 [UDP] 的定义, 无法编码长度超过 65527 字节的 UDP 负载. 因此, 使用 Context ID 零时, 端点禁止 (MUST NOT) 发送 UDP Proxying Payload 字段长度超过 65527 的 HTTP Datagram. 如果端点收到使用 Context ID 零且 UDP Proxying Payload 字段长度超过 65527 的 HTTP Datagram, 则必须 (MUST) 中止相应流. 如果 UDP 代理知道由于底层链路 MTU 限制, 自己只能发出某个长度以内的 UDP 分组, 则对于使用 Context ID 零且 UDP Proxying Payload 字段长度超过该限制的入站 HTTP Datagram, 它只能将其丢弃. 如果被丢弃的 HTTP Datagram 是由 DATAGRAM capsule 传输的, 接收方应当 (SHOULD) 丢弃该 capsule, 且不缓冲 capsule 内容.

如果 UDP 代理在收到相应请求之前收到了 HTTP Datagram, 它应当 (SHALL) 静默丢弃该 HTTP Datagram, 或在等待相应请求期间临时缓冲它 (大约一个往返时间量级).

注意, 缓冲数据报 (无论是因为尚未收到请求, 还是因为尚未知晓 Context ID) 都会消耗资源. 会缓冲数据报的接收方应当 (SHOULD) 应用缓冲限制, 以降低资源耗尽风险. 例如, 接收方可以按每个流、每个上下文或每个连接限制已缓冲数据报的总数或累计大小.

客户端可以 (MAY) 在收到 UDP 代理请求的响应之前, 乐观地开始在 HTTP Datagram 中发送 UDP 分组. 但是, 实现者应注意, 如果 UDP 代理以失败响应处理该请求, 或者被代理的分组先于请求到达 UDP 代理且 UDP 代理选择不缓冲它们, 这些被代理的分组可能不会被 UDP 代理处理.