2. HTTP/3 协议概览 (HTTP/3 Protocol Overview)
HTTP/3 使用 QUIC 传输协议和类似于 HTTP/2 的内部帧层为 HTTP 语义提供传输。
一旦客户端知道某个端点存在 HTTP/3 服务器, 它就会打开一个 QUIC 连接。QUIC 提供协议协商、基于流的多路复用和流量控制。HTTP/3 端点的发现在第 3.1 节中描述。
在每个流中, HTTP/3 通信的基本单元是帧 (frame, 第 7.2 节)。每种帧类型服务于不同的目的。例如, HEADERS 和 DATA 帧构成 HTTP 请求和响应的基础 (第 4.1 节)。适用于整个连接的帧在专用的控制流上传送。
请求的多路复用使用 QUIC 流抽象执行, 在 [QUIC-TRANSPORT] 的第 2 节中描述。每个请求-响应对占用一个 QUIC 流。流之间相互独立, 因此一个被阻塞或遭受数据包丢失的流不会阻止其他流的进展。
服务器推送 (Server push) 是 HTTP/2 ([HTTP/2]) 中引入的一种交互模式, 允许服务器在客户端发出指定请求之前主动向客户端推送请求-响应交换。这以网络使用量换取潜在的延迟收益。几个 HTTP/3 帧用于管理服务器推送, 如 PUSH_PROMISE, MAX_PUSH_ID 和 CANCEL_PUSH。
与 HTTP/2 一样, 请求和响应字段在传输时被压缩。由于 HPACK ([HPACK]) 依赖于压缩字段段的有序传输 (QUIC 不提供这种保证), HTTP/3 用 QPACK ([QPACK]) 替换了 HPACK。QPACK 使用单独的单向流来修改和跟踪字段表状态, 而编码的字段段引用表的状态而不修改它。
2.1. 文档组织 (Document Organization)
以下各节提供了 HTTP/3 连接生命周期的详细概述:
-
"连接建立与管理" (Connection Setup and Management, 第 3 节) 涵盖如何发现 HTTP/3 端点以及如何建立 HTTP/3 连接。
-
"在 HTTP/3 中表达 HTTP 语义" (Expressing HTTP Semantics in HTTP/3, 第 4 节) 描述如何使用帧来表达 HTTP 语义。
-
"连接关闭" (Connection Closure, 第 5 节) 描述 HTTP/3 连接如何终止, 无论是优雅终止还是突然终止。
线路协议 (wire protocol) 的细节以及与传输层的交互在后续各节中描述:
-
"流映射与使用" (Stream Mapping and Usage, 第 6 节) 描述 QUIC 流的使用方式。
-
"HTTP 帧层" (HTTP Framing Layer, 第 7 节) 描述大多数流上使用的帧。
-
"错误处理" (Error Handling, 第 8 节) 描述如何处理和表达错误条件, 无论是在特定流上还是针对整个连接。
最后各节提供了额外的资源:
-
"HTTP/3 的扩展" (Extensions to HTTP/3, 第 9 节) 描述如何在未来文档中添加新功能。
-
附录 A 中可以找到 HTTP/2 和 HTTP/3 之间更详细的比较。
2.2. 约定和术语 (Conventions and Terminology)
本文档中的关键词 "MUST" (必须), "MUST NOT" (禁止), "REQUIRED" (必需), "SHALL" (应), "SHALL NOT" (不应), "SHOULD" (应当), "SHOULD NOT" (不应当), "RECOMMENDED" (推荐), "NOT RECOMMENDED" (不推荐), "MAY" (可以) 和 "OPTIONAL" (可选) 应按照 BCP 14 [RFC2119] [RFC8174] 中的描述进行解释, 当且仅当它们以全大写形式出现时, 如此处所示。
本文档使用 [QUIC-TRANSPORT] 中的可变长度整数编码。
使用以下术语:
abort (中止): 流或连接的突然终止, 可能由于错误条件。
client (客户端): 发起 HTTP/3 连接的端点。客户端发送 HTTP 请求并接收 HTTP 响应。
connection (连接): 使用 QUIC 作为传输协议的两个端点之间的传输层连接。
connection error (连接错误): 影响整个 HTTP/3 连接的错误。
endpoint (端点): 连接的客户端或服务器。
frame (帧): HTTP/3 中流上通信的最小单元, 由标头和根据帧类型构造的可变长度字节序列组成。
本文档和 [QUIC-TRANSPORT] 中都存在称为 "帧" 的协议元素。当引用来自 [QUIC-TRANSPORT] 的帧时, 帧名称将以 "QUIC" 为前缀。例如, "QUIC CONNECTION_CLOSE 帧"。没有此前缀的引用指的是第 7.2 节中定义的帧。
HTTP/3 connection (HTTP/3 连接): 协商的应用层协议为 HTTP/3 的 QUIC 连接。
peer (对等方): 一个端点。在讨论特定端点时, "peer" 指的是讨论主体远程的端点。
receiver (接收方): 正在接收帧的端点。
sender (发送方): 正在传输帧的端点。
server (服务器): 接受 HTTP/3 连接的端点。服务器接收 HTTP 请求并发送 HTTP 响应。
stream (流): QUIC 传输提供的双向或单向字节流。HTTP/3 连接中的所有流都可以被视为 "HTTP/3 流", 但在 HTTP/3 中定义了多种流类型。
stream error (流错误): 单个流上的应用层错误。
术语 "content (内容)" 在 [HTTP] 的第 6.4 节中定义。
最后, 术语 "resource (资源)", "message (消息)", "user agent (用户代理)", "origin server (源服务器)", "gateway (网关)", "intermediary (中间方)", "proxy (代理)" 和 "tunnel (隧道)" 在 [HTTP] 的第 3 节中定义。
本文档中的数据包图使用 [QUIC-TRANSPORT] 第 1.3 节中定义的格式来说明字段的顺序和大小。