前情提要

在上一篇文章《​​【HTTP 2.0】 简介(Introduction) ​​》中,我们简单介绍了 HTTP 2。

在本篇文章中,我们将会了解到 HTTP 2 协议概述部分的内容。

HTTP/2 协议概述(HTTP/2 Protocol Overview)

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 报头字段,帧中包括了这些字段,并对其进行了压缩(参考​​章节 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”如 ​​RFC 2119 ​​ 中所描述的进行解读。

所有数值都是按网络字节顺序。值均为无符号,除非进行特殊说明。字面量通过十进制或者十六进制表示。十六进制字面量以 0x 作为前缀,以区别于十进制字面量。

以下术语用于:

客户端(client):

发起一个 HTTP 2 连接的终端。客户端发送 HTTP 请求,并接收 HTTP 响应。

连接(connection):

两个终端之间的传输层连接。

连接错误(connection error):

影响整个 HTTP 2 连接的错误。

终端(endpoint):

连接中的客户端或者服务器。

帧(frame):

一个 HTTP 2 连接内通信的最小单位。是一个由报头和帧类型(八种帧类型之一)所组成的可变长度序列。

点(peer):

点是一个终端。当讨论一个特定终端时,“点”指代的是讨论的主题所对应的远程终端。

接收者(receiver):

接收帧的终端。

发送者(sender):

发送帧的终端。

服务器(server):

接受 HTTP 2 连接的的终端。服务器接收 HTTP 请求,并发送 HTTP 响应。

流(stream):

HTTP 2 连接中双向流动的帧。

流错误(stream error):

独立的 HTTP 2 流中产生的错误。

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