HTTP/2 协议概述

HTTP/2 提供了 HTTP 语义的传输优化。HTTP/2 支持 HTTP/1.1 中所有的特性,它的目标是在不同的方面提升 HTTP 的效率。

HTTP/2 协议的基础单位是帧(Frame,参考章节 4.1)。每种帧的用途各不相同。比如,报头(HEADERS)帧和数据(DATA)帧组成了 基本的 HTTP 请求与响应(参考章节 8.1)。其他类型的帧则用于实现 HTTP/2 的其他特性,比如 设置(SETTINGS)、窗口更新(WINDOW_UPDATE)和推送承诺(PUSH_PROMISE)。

每一个 HTTP 通过在其流(参考章节 5)上分配多个请求响应交换,以实现请求多路复用。流与流之间是相互独立的,所以一个阻塞的或者慢速的请求或响应,并不会影响其他流的处理。

流量控制和优先级能够确保正确使用复用流。流量控制(参考章节 5.2)有助于确保只传播接受者所需要的数据。优先级(参考章节 5.3)确保有限的资源能够优先被重要的流所使用。

HTTP/2 新增了交互模式,以实现服务器推送响应消息给客户端(参考章节 8.2)。服务器推送技术允许服务器预测客户端所需要的数据,并推送至客户端,通过付出一些网络资源来降低等待延迟。服务器通过复用一个以 PUSH_PROMISE 帧发送的合成请求来实现推送,之后便可以在一个单独的流中发送相应信息给这个合成请求。

在一个连接中包含大量重复的 HTTP 报头字段,帧包含的 HTTP 报头字段是经过压缩的(参考章节 4.3)。在大多数情况下,这有利于请求大小的优化,允许很多请求被压缩至一个数据包。

文档结构

HTTP/2 协议被分为以下四部分:

  • 启用 HTTP/2 (第3章)包含了如何初始化一个 HTTP/2 连接。
  • 帧(第4章)和流层(第5章)描述了 HTTP/2 中帧的构成,以及如何形成复用流。
  • 帧定义(第6章)和错误码(第7章)定义了 HTTP/2 中帧的详细信息以及错误类型。
  • HTTP 寻址(第8章)和附加需求(第9章)描述了 HTTP 语法是如何由帧和流表达的。

一些帧和流的概念是独立于 HTTP 的,本协议没有定义一个完全通用的帧层。这些帧和流层是为了 HTTP 协议和服务端推送的需求定制的。

约定和术语

本文档中出现的关键字“必须(MUST)”,“禁止(MUST NOT)”,“需要(REQUIRED)”,“应(SHALL)”,“不应(SHALL NOT)”,“应该(SHOULD)”,“不应该(SHOULD NOT)”,“建议(RECOMMENDED)”,“可以(MAY)”,“可选(OPTIONAL)”,可通过 RFC2119 中的解释进行理解。

所有数值都是按网络字节顺序。除非另有说明,否则数值均为无符号。按情况提供十进制或十六进制的文本值。十六进制用前缀 0x 进行区分。

文中术语包括:

  • 客户端(client):发起 HTTP/2 连接的端点。
  • 连接(connection):两个端点之间的传输层连接。
  • 连接错误(connection error):整个 HTTP/2 连接过程中发生的错误。
  • 端点(endpoint):连接中的客户端或服务器。
  • 帧(frame):一个 HTTP/2 连接内通信的最小单元。包括根据帧类型决定的报头和可变长度序列。
  • 对等端(peer):一个端点。当讨论特定的端点时,“对等端”指的是所讨论主题的远程端点。
  • 接收端(receiver):接收帧的端点。
  • 发送端(sender):发送帧的端点。
  • 服务端(server):接收 HTTP/2 连接的端点。服务端接收 HTTP 请求,并发送 HTTP 响应。
  • 流(stream):HTTP/2 连接中帧双向流动的通道。
  • 流错误(stream error):一个 HTTP/2 流中的错误。

最后,术语“网关”、“中介”、“代理”和“隧道”在 RFC7230 的 2.3 章节 中有所定义。中介在不同的时候既充当客户端又充当服务端。

术语“有效载荷”在 RFC7230 的 3.3 章节中有所定义。