Back

HTTP/2 协议综述

HTTP/2 协议综述

HTTP/2基于HTTP语义提供了优化的传输机制。HTTP/2 支持所有HTTP/1.1的核心特性,并在如下几个方面对其进行了改进。

HTTP/2中基础的协议单元是帧(见第4.1节)。每个类型的帧都服务于不同的目的。例如 HEADERS和DATA 帧构成了基本的HTTP请求与应答(8.1节); 其他诸如SETTINGS, WINDOW_UPDATE, PUSH_PROMISE等帧类型用于支持其他的HTTP/2 特性。

请求的多路复用即每个HTTP请求/应答在各自的流(stream)中完成数据交换。由于每个流之间都是相互独立的,因此即使请求和应答被阻塞或速度很慢也不会影响各自流中的处理进程。

流量控制以及优先级机制可以保证有效的利用流的多路复用。流量控制(见 5.2节)确保只有接受者会使用的数据被传输。优先级机制可以确保有限的资源被优先传输到最重要的流。

HTTP/2中增加了一种新的交互模式,即服务端可以将应答推送给客户端(见8.2节)。服务器推送机制允许服务器预测客户端可能需要的数据,并将其推送给客户端,这是一种以增加网络使用来减少延迟的折衷设计。服务器首先合成一个带有 PUSH_PROMISE帧的请求,随后服务器可以在另一个流中响应这个请求。

由于连接中使用的HTTP头包含大量冗余数据,因此包含它们的帧均需进行压缩(见 4.3节)。一般情况下,经过压缩后对于请求大小的影响很显著,可以将多个请求压缩到一个包(packet)中。

2.1 文档结构

HTTP/2 标准说明包含以下四个部分:

  • 发起HTTP/2请求(见第3节) 主要讨论一个HTTP/2链接是如何初始化的
  • 帧(见第4节)与 流(见第5节) 主要讨论HTTP/2帧的结构以及如何组成多路复用的流
  • 帧(见第6节)与 错误定义(见第7节) 主要讨论帧的细节以及HTTP/2中的错误类型
  • HTTP 映射(见第8节)及附加要求(见第9节)主要讨论如何使用帧和流来表述HTTP语义

由于部分帧与流中的层的定义与HTTP无关,因此该标准中并没有提供完整的帧层的定义。帧与流的层均针对HTTP协议与服务器推送进行一定程度的裁剪。

2.2 约定与术语

对于关键词"MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" 的定义以 RFC 2119[RFC2119]中解释为准。

所有数值均使用网络字节序。如未特别指出,所有值均为无符号的。本文中数值根据需要可以为十进制和十六进制。十六进制数值以“0x”开头,以示区分。

该标准中主要使用的术语包括:

  • 客户端(client):即发起HTTP/2连接的端点(endpoint). 客户端发出HTTP请求,并接收HTTP应答。
  • 连接(connection): 两个端点之间的传输层连接
  • 连接错误(connection error):影响HTTP/2连接的错误
  • 端点(endpoint): 连接的客户端或服务端
  • 帧(frame): HTTP/2连接中的最小通讯单元,由帧头与任意长度的字节流组成,字节流的具体结构由帧类型决定。
  • 节点(peer): 一类特殊的端点,主要用来代指在讨论中与主要端点对应的远端端点
  • 接收端: 接收帧的端点
  • 发送端: 发送帧的端点
  • 服务器: 接收HTTP/2连接的端点。服务器接收HTTP请求,并发送HTTP应答
  • 流: HTTP/2中的双向帧传输流
  • 流错误:发生在单独的HTTP/2流中的错误

最后,术语"网关(gateway)", "中间人(intermediary)", "代理(proxy)", "隧道(tunnel)"均在 [RFC7230]的第2.3节进行了定义。中间人在不同时段可分别担当客户端或者服务器。

术语"请求体(payload body)"在[RFC7230]的3.3节中定义。

Submit