附录 A. 从 HTTP/2 过渡的考虑 (Considerations for Transitioning from HTTP/2)
HTTP/3 基于 HTTP/2 设计并共享核心语义。本附录总结了 HTTP/2 和 HTTP/3 之间的主要差异, 以帮助实现者理解这两个协议之间的关系。
A.1. 流 (Streams)
HTTP/3 使用 QUIC 流, 而 HTTP/2 在 TCP 上使用流抽象。主要差异:
- 流标识符 (Stream Identifiers): HTTP/3 中的流 ID 由 QUIC 分配, 而不是由 HTTP/3 分配
- 流优先级 (Stream Priority): HTTP/3 不包括 HTTP/2 的流优先级方案
- 流量控制 (Flow Control): HTTP/3 使用 QUIC 的流量控制机制
A.2. HTTP 帧类型 (HTTP Frame Types)
许多 HTTP/2 帧类型在 HTTP/3 中被保留或修改:
保留的帧类型 (Preserved Frame Types):
- DATA (0x00) - 类似功能
- HEADERS (0x01) - 类似功能
- SETTINGS (0x04) - 类似但仅在控制流上
- PUSH_PROMISE (0x05) - 类似功能
- GOAWAY (0x07) - 类似功能
删除或替换的 HTTP/2 帧类型 (Removed or Replaced HTTP/2 Frame Types):
- PRIORITY (0x02) - 在 HTTP/3 中删除
- RST_STREAM (0x03) - 被 QUIC 的 RESET_STREAM 替换
- PING (0x06) - 被 QUIC 的 PING 帧替换
- WINDOW_UPDATE (0x08) - 被 QUIC 的流量控制替换
- CONTINUATION (0x09) - 在 HTTP/3 中不需要
HTTP/3 中的新帧类型 (New Frame Types in HTTP/3):
- CANCEL_PUSH (0x03) - 取消服务器推送
- MAX_PUSH_ID (0x0d) - 控制推送 ID 空间
A.3. HTTP/2 SETTINGS 参数 (HTTP/2 SETTINGS Parameters)
HTTP/3 中的设置与 HTTP/2 不同:
删除的设置 (Removed Settings):
- SETTINGS_HEADER_TABLE_SIZE - 被 QPACK 设置替换
- SETTINGS_ENABLE_PUSH - 通过 MAX_PUSH_ID 控制
- SETTINGS_MAX_CONCURRENT_STREAMS - 由 QUIC 传输参数控制
- SETTINGS_INITIAL_WINDOW_SIZE - 被 QUIC 流量控制替换
- SETTINGS_MAX_FRAME_SIZE - 在 HTTP/3 中不需要
- SETTINGS_MAX_HEADER_LIST_SIZE - 被 SETTINGS_MAX_FIELD_SECTION_SIZE 替换
保留的设置 (Preserved Settings):
- SETTINGS_MAX_FIELD_SECTION_SIZE (0x06) - 类似于 HTTP/2 的 SETTINGS_MAX_HEADER_LIST_SIZE
A.4. HTTP/2 错误码 (HTTP/2 Error Codes)
HTTP/3 定义了自己的错误码集, 与 HTTP/2 的错误码不同。实现者应当注意映射关系, 但不应假设存在直接的一对一对应关系。
A.5. 其他差异 (Other Differences)
连接管理 (Connection Management):
- HTTP/3 使用 QUIC 的连接管理, 包括连接迁移和多路径支持
- 不需要 HTTP/2 的连接序言
服务器推送 (Server Push):
- HTTP/3 中的服务器推送机制与 HTTP/2 类似, 但使用不同的帧和流类型
- HTTP/3 中推送 ID 是显式的
字段压缩 (Field Compression):
- HTTP/3 使用 QPACK 而不是 HPACK
- QPACK 旨在处理无序传输
可扩展性 (Extensibility):
- HTTP/3 提供更灵活的扩展机制
- 新帧类型、设置和流类型可以在不协商的情况下使用