Skip to main content

附录 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 提供更灵活的扩展机制
  • 新帧类型、设置和流类型可以在不协商的情况下使用