Skip to main content

Appendix A. Considerations for Transitioning from HTTP/2 (从HTTP/2过渡的考虑)

HTTP/3基于HTTP/2设计,共享核心语义。本附录总结了从HTTP/2到HTTP/3的主要差异,以帮助实现者理解两个协议之间的关系。

A.1. Streams (流)

HTTP/3使用QUIC流,而HTTP/2使用TCP上的流抽象。主要差异:

  • 流标识符:HTTP/3中的流ID由QUIC分配,而不是由HTTP/3分配
  • 流优先级:HTTP/3不包括HTTP/2的流优先级方案
  • 流控制:HTTP/3使用QUIC的流控制机制

A.2. HTTP Frame Types (HTTP帧类型)

许多HTTP/2帧类型在HTTP/3中被保留或修改:

保留的帧类型:

  • DATA(0x00)- 功能相似
  • HEADERS(0x01)- 功能相似
  • SETTINGS(0x04)- 功能相似但仅在控制流上
  • PUSH_PROMISE(0x05)- 功能相似
  • GOAWAY(0x07)- 功能相似

移除或替换的HTTP/2帧类型:

  • PRIORITY(0x02)- 在HTTP/3中移除
  • RST_STREAM(0x03)- 由QUIC的RESET_STREAM替换
  • PING(0x06)- 由QUIC的PING帧替换
  • WINDOW_UPDATE(0x08)- 由QUIC的流控制替换
  • CONTINUATION(0x09)- 在HTTP/3中不需要

HTTP/3新增的帧类型:

  • CANCEL_PUSH(0x03)- 取消服务器推送
  • MAX_PUSH_ID(0x0d)- 控制推送ID空间

A.3. HTTP/2 SETTINGS Parameters (HTTP/2设置参数)

HTTP/3中的设置与HTTP/2不同:

移除的设置:

  • 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替换

保留的设置:

  • SETTINGS_MAX_FIELD_SECTION_SIZE(0x06)- 类似于HTTP/2的SETTINGS_MAX_HEADER_LIST_SIZE

A.4. HTTP/2 Error Codes (HTTP/2错误码)

HTTP/3定义了自己的错误码集,与HTTP/2的错误码不同。实现者应该注意映射关系,但不应假设存在直接的一对一对应关系。

A.5. Other Differences (其他差异)

连接管理:

  • HTTP/3使用QUIC的连接管理,包括连接迁移和多路径支持
  • 不需要HTTP/2的连接前言

服务器推送:

  • HTTP/3中的服务器推送机制与HTTP/2类似,但使用不同的帧和流类型
  • 推送ID在HTTP/3中是显式的

字段压缩:

  • HTTP/3使用QPACK而不是HPACK
  • QPACK设计用于处理无序交付

扩展性:

  • HTTP/3提供了更灵活的扩展机制
  • 新的帧类型、设置和流类型可以在不协商的情况下使用