Skip to main content

8. HTTP消息交换 (HTTP Message Exchanges)

HTTP/2旨在尽可能保持与HTTP/1.1当前使用的语义兼容。例如,HTTP方法、状态码、URI和头部字段的定义保持不变。HTTP/2改变的是这些语义如何映射到底层传输的方式。

8.1 HTTP请求/响应交换 (HTTP Request/Response Exchange)

客户端通过在新流上发送HEADERS帧来发送HTTP请求。如果请求不依赖于从同一连接上的先前响应接收的头部压缩状态更新,则可以使用新的流标识符立即开始新的流。

服务器通过在同一流上发送一个或多个HEADERS帧(带有响应头部字段)后跟零个或多个DATA帧(带有响应体)来发送HTTP响应。

8.1.1 升级HTTP/1.1请求 (Upgrading from HTTP/1.1)

HTTP/2移除了对101(Switching Protocols)信息状态码([RFC7231]的第6.2.2节)的支持。

8.1.2 HTTP头部字段 (HTTP Header Fields)

HTTP头部字段在HTTP/2中的传输使用头部块片段的序列承载头部字段的名称-值对列表。

8.1.2.1 伪头部字段 (Pseudo-Header Fields)

虽然HTTP/1.x使用消息开始行(参见[RFC7230]的第3.1节)来传达目标URI、方法和响应的状态码,但HTTP/2使用特殊的伪头部字段以:字符(ASCII 0x3a)开头用于此目的。

伪头部字段不是HTTP头部字段。端点不得生成本文档中未定义的伪头部字段。

请求伪头部字段:

  • :method - HTTP方法([RFC7231]的第4节)
  • :scheme - 方案部分([RFC3986]的第3.1节)
  • :authority - 权限部分([RFC3986]的第3.2节)
  • :path - 路径和查询部分

响应伪头部字段:

  • :status - HTTP状态码([RFC7231]的第6节)

8.1.3 示例 (Examples)

以下示例说明HTTP/1.1请求和响应对如何在HTTP/2中表示。

HTTP/1.1 GET请求:

GET /resource HTTP/1.1
Host: example.org
Accept: image/jpeg

HTTP/2 HEADERS帧:

:method = GET
:scheme = https
:path = /resource
:authority = example.org
accept = image/jpeg

8.2 服务器推送 (Server Push)

HTTP/2允许服务器抢先地向客户端发送(或"推送")与先前客户端发起的请求相关联的响应(连同相应的"promised"请求)。当服务器知道客户端将需要拥有这些响应以完全处理对原始请求的响应时,这可能很有用。

客户端可以通过SETTINGS_ENABLE_PUSH设置为0来请求禁用服务器推送。

服务器必须在"对等方发起"的流上发送PUSH_PROMISE帧。PUSH_PROMISE帧包括一个头部块,该头部块包含服务器归因于请求的一组完整的请求头部字段。不允许推送对已禁用的方法([RFC7231]的第4.2.2节)、无法缓存或包含请求体的响应。

8.2.1 推送请求 (Push Requests)

服务器推送在语义上等效于服务器响应请求;但是,在这种情况下,该请求也由服务器发送,作为PUSH_PROMISE帧。

8.2.2 推送响应 (Push Responses)

在推送承诺流后,服务器发送推送承诺的响应,该响应使用与承诺的流标识符相同的流。

8.3 CONNECT方法 (The CONNECT Method)

在HTTP/1.x中,伪方法CONNECT([RFC7231]的第4.3.6节)用于将HTTP连接转换为到远程主机的隧道。CONNECT主要与HTTP代理一起使用,以与使用TLS([TLS12])的来源服务器建立TLS会话以进行HTTPS请求的目的。

在HTTP/2中,CONNECT方法用于通过单个HTTP/2流建立到远程主机的隧道,以实现类似目的。


上一章: 7. 错误码 (Error Codes)
下一章: 9. 其他HTTP要求/注意事项 (Additional HTTP Requirements/Considerations)