跳到主要内容

2. HTTP/2 协议概述

HTTP/2 为 HTTP 语义提供优化的传输. HTTP/2 支持 HTTP 的所有核心特性, 但目标是比 HTTP/1.1 更高效.

HTTP/2 是一种面向连接的应用层协议, 运行在 TCP 连接 ([TCP]) 之上. 客户端是 TCP 连接的发起方.

HTTP/2 中的基本协议单元是帧 (frame, Section 4.1). 每种帧类型都有不同用途. 例如, HEADERS 和 DATA 帧构成 HTTP 请求和响应的基础 (Section 8.1); SETTINGS、WINDOW_UPDATE 和 PUSH_PROMISE 等其他帧类型用于支持 HTTP/2 的其他特性.

请求复用 (multiplexing) 通过将每个 HTTP 请求/响应交换关联到自己的流 (stream, Section 5) 来实现. 流之间大体相互独立, 因此被阻塞或停滞的请求或响应不会阻止其他流继续推进.

有效使用复用依赖于流量控制和优先级排序. 流量控制 (Section 5.2) 通过将传输数据限制为接收方能够处理的范围, 确保可以高效使用复用流. 优先级排序 (Section 5.3) 确保有限资源得到最有效使用. HTTP/2 的本次修订废弃了 [RFC7540] 中的优先级信令方案.

由于连接中使用的 HTTP 字段可能包含大量冗余数据, 包含这些字段的帧会被压缩 (Section 4.3). 在常见情况下, 这对请求大小尤其有利, 可使许多请求压缩到一个分组中.

最后, HTTP/2 增加了一种新的可选交互模式, 服务器可据此向客户端推送响应 (Section 8.4). 该机制旨在允许服务器推测性地向客户端发送它预计客户端将需要的数据, 以一定网络使用量换取潜在的延迟收益. 服务器通过合成一个请求来完成此操作, 并将其作为 PUSH_PROMISE 帧发送. 随后, 服务器可以在单独的流上发送对该合成请求的响应.

2.1. 文档组织

HTTP/2 规范分为四个部分:

  • 启动 HTTP/2 (Section 3) 说明如何发起 HTTP/2 连接.

  • 帧 (Section 4) 和流 (Section 5) 层描述 HTTP/2 帧的结构以及如何将其组成复用流.

  • 帧 (Section 6) 和错误 (Section 7) 定义包含 HTTP/2 中使用的帧类型和错误类型的细节.

  • HTTP 映射 (Section 8) 和附加要求 (Section 9) 描述如何使用帧和流表达 HTTP 语义.

尽管某些帧层和流层概念与 HTTP 相隔离, 本规范并未定义一个完全通用的帧层. 帧层和流层是为 HTTP 的需要量身定制的.

2.2. 约定和术语

本文档中的关键词 "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY" 和 "OPTIONAL", 当且仅当它们如本文所示以全大写形式出现时, 应按 BCP 14 [RFC2119] [RFC8174] 中的描述解释.

所有数值均采用网络字节序. 除非另有说明, 值均为无符号. 字面值会根据需要以十进制或十六进制给出. 十六进制字面值以 "0x" 为前缀, 以区别于十进制字面值.

本规范使用 RFC 9000 [QUIC] Section 1.3 中描述的约定来描述二进制格式. 请注意, 该格式使用网络字节序, 且高位比特列在低位比特之前.

使用以下术语:

client: 发起 HTTP/2 连接的端点. 客户端发送 HTTP 请求并接收 HTTP 响应.

connection: 两个端点之间的传输层连接.

connection error: 影响整个 HTTP/2 连接的错误.

endpoint: 连接的客户端或服务器.

frame: HTTP/2 连接内最小的通信单元, 由一个头部和一个按帧类型组织的可变长度八位组序列组成.

peer: 一个端点. 在讨论某个特定端点时, "peer" 指相对于主要讨论对象而言的远端端点.

receiver: 正在接收帧的端点.

sender: 正在传输帧的端点.

server: 接受 HTTP/2 连接的端点. 服务器接收 HTTP 请求并发送 HTTP 响应.

stream: HTTP/2 连接内的双向帧流.

stream error: 单个 HTTP/2 流上的错误.

最后, "gateway"、"intermediary"、"proxy" 和 "tunnel" 这些术语在 [HTTP] Section 3.7 中定义. 中介在不同时间既充当客户端也充当服务器.

术语 "content" 在适用于消息体时, 定义见 [HTTP] Section 6.4.