Skip to main content

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

HTTP/2为HTTP语义提供了优化的传输方式。HTTP/2支持HTTP的所有核心特性,但旨在比HTTP/1.1更高效。

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

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

请求的多路复用是通过将每个HTTP请求/响应交换与其自己的流 (Stream, 第5节) 关联来实现的。流在很大程度上彼此独立,因此阻塞或停滞的请求或响应不会阻止其他流的进展。

多路复用的有效使用取决于流量控制和优先级排序。流量控制 (第5.2节) 确保可以通过限制传输的数据为接收方所能处理的数据来有效使用多路复用流。优先级排序 (第5.3节) 确保有限的资源得到最有效的使用。本修订版的HTTP/2废弃了 [RFC7540] 中的优先级信令方案。

因为连接中使用的HTTP字段可能包含大量冗余数据,包含它们的帧会被压缩 (第4.3节)。这对请求大小有特别有利的影响,在常见情况下允许许多请求被压缩到一个数据包中。

最后,HTTP/2添加了一种新的可选交互模式,服务器可以向客户端推送响应 (第8.4节)。这旨在允许服务器推测性地向客户端发送服务器预期客户端需要的数据,用一些网络使用量来换取潜在的延迟增益。服务器通过合成一个请求来实现这一点,它将该请求作为PUSH_PROMISE帧发送。然后服务器能够在单独的流上发送对合成请求的响应。

2.1. Document Organization (文档组织)

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

  • 启动HTTP/2 (第3节) 涵盖如何启动HTTP/2连接。

  • (第4节) 和 (第5节) 层描述HTTP/2帧的结构方式以及如何形成多路复用流。

  • (第6节) 和错误 (第7节) 定义包括HTTP/2中使用的帧和错误类型的详细信息。

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

虽然某些帧层和流层概念与HTTP隔离,但本规范并未定义完全通用的帧层。帧层和流层是为HTTP的需求量身定制的。

2.2. Conventions and Terminology (约定和术语)

本文档中的关键词"MUST" (必须)、"MUST NOT" (禁止)、"REQUIRED" (必需)、"SHALL" (应)、"SHALL NOT" (不应)、"SHOULD" (应该)、"SHOULD NOT" (不应该)、"RECOMMENDED" (推荐)、"NOT RECOMMENDED" (不推荐)、"MAY" (可以) 和 "OPTIONAL" (可选) 应按照BCP 14 [RFC2119] [RFC8174] 中的描述进行解释,当且仅当它们以全部大写形式出现时,如此处所示。

所有数值都采用网络字节序 (Network Byte Order)。除非另有说明,否则值都是无符号的。字面值根据需要以十进制或十六进制提供。十六进制字面值以"0x"为前缀,以区别于十进制字面值。

本规范使用RFC 9000 [QUIC] 第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] 的第3.7节中定义。中间人 (Intermediaries) 在不同时间充当客户端和服务器。

术语"content"应用于消息体时在 [HTTP] 的第6.4节中定义。


📊 HTTP/2架构总览

┌─────────────────────────────────────────────────────────┐
│ HTTP/2 Connection │
│ │
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
│ │Stream 1 │ │Stream 3 │ │Stream 5 │ │Stream 7 │ │
│ │ │ │ │ │ │ │ │ │
│ │ HEADERS │ │ HEADERS │ │ HEADERS │ │ HEADERS │ │
│ │ DATA │ │ DATA │ │ DATA │ │ DATA │ │
│ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │
│ │
│ ◄─────────── Binary Frames (帧) ──────────────► │
│ ◄─────────── Flow Control (流量控制) ─────────► │
│ ◄─────────── HPACK Compression (压缩) ────────► │
│ │
└─────────────────────────────────────────────────────────┘


TCP连接

🔑 关键特性

1. 帧和流

  • 帧 (Frame): 最小通信单元
  • 流 (Stream): 双向的帧序列
  • 连接 (Connection): 承载多个流的TCP连接

2. 多路复用

  • ✅ 单连接上并发多个请求/响应
  • ✅ 流彼此独立,无队头阻塞

3. 流量控制

限制传输数据量,防止接收方过载

4. 头部压缩

使用HPACK算法压缩HTTP头部,减少冗余

5. 服务器推送

服务器主动推送客户端可能需要的资源