链接参考:https://web.dev/articles/performance-http2?hl=zh-cn#binary_framing_layer
在HTTP2.0中引入了新的编码机制,所有传输的数据都会被分割,并采用二进制格式编码
HTTP/2 所有性能增强的核心是新的二进制分帧层,它规定了 HTTP 消息的封装方式,并在客户端和服务器之间传输。
为了保证HTTP不受影响,那就需要在应用层(HTTP2.0)和传输层(TCP or UDP)之间增加一个二进制分帧层。在二进制分帧层上,HTTP2.0会将所有传输的信息分为更小的消息和帧,并采用二进制格式编码,其中HTTP1.x的首部信息会被封装到Headers帧,而Request Body则封装到Data帧。
在 HTTP/2 中,所有通信都在一个 TCP 连接上进行,并被分割成更小的二进制帧。这些帧按序列号发送和接收,并在接收端重新组装成完整的消息。这一层的实现为 HTTP/2 带来了显著的性能改进。

所以http2和http1.1互相不理解(但是应用无需感知这些变化,客户端和服务器会帮我们执行所有底层的动作)
定义和作用:
最小单位。所有的 HTTP/2 通信都通过帧进行。每个帧都包含一个固定长度的头部(标识所属于的stream流)和一个可变长度的负载帧是 HTTP/2 协议实现多路复用的基础,通过帧的分割和重组,能够在单个连接上并行传输多个请求和响应特点:
常见类型:
定义和作用:
一个完整的帧序列,用来映射到逻辑的请求或者响应信息)特点:
HEADERS 帧 + (可选的)多个 DATA 帧。消息表示一个完整的 HTTP 请求或响应,包含所有必要的头部和主体信息。定义和作用:
独立的、双向的字节流,包含多个帧。每个流都有一个唯一的标识符,用于区分同一连接上的不同流(在一个建立连接内的双向字节流,能承载一个或者多个消息)(TCP连接中的一个虚拟通道,可以承载双向的消息)多路复用的关键,通过在一个连接上同时存在多个流,可以并行处理多个请求和响应,避免了 HTTP/1.1 的队头阻塞问题。特点:
真正意义的全双工)奇偶数区分流的来源(客户端创建的流为奇数,服务器创建的流为偶数)。所有通信都在一个TCP连接上进行,该连接可以承载任意数量的双向流(streams)(一个流,一次请求与响应)每个流都有一个唯一的标识符和可选的优先级信息,用于承载双向消息每条消息是一个逻辑上的HTTP消息,例如请求或响应,由一个或多个帧组成帧是通信的最小单位,承载特定类型的数据,例如HTTP头部、消息负载等。来自不同流的帧可以交替发送,并通过每个帧头部中的嵌入流ID标识符重新组装
帧的组成部分
+-----------------------------------------------+
| Length (24) |
+---------------+---------------+---------------+
| Type (8) | Flags (8) |
+---------------+---------------+---------------+
|R| Stream Identifier (31) |
+=+=============================================+
| Frame Payload |
+-----------------------------------------------+
帧头部固定为 9 字节,由以下字段组成:
常见帧类型:
- 0x0:DATA 帧
- 0x1:HEADERS 帧
- 0x2:PRIORITY 帧
- 0x3:RST_STREAM 帧
- 0x4:SETTINGS 帧
- 0x5:PUSH_PROMISE 帧
- 0x6:PING 帧
- 0x7:GOAWAY 帧
- 0x8:WINDOW_UPDATE 帧
- 常见标志位:
- 0x1:END_STREAM,表示这是流的最后一个帧。
- 0x4:END_HEADERS,表示 HEADERS 帧的结束。
- 0x20:PRIORITY,表示包含优先级信息。
帧所属的流的唯一标识符,该帧所属的流,以便接收方将帧数据归属到正确的流中。流标识符是一个 31 位的无符号整数,最高位保留,必须设置为 0。帧负载数据的长度和内容根据帧类型的不同而变化。以下是一些常见帧类型的负载数据示例:
DATA 帧:
HEADERS 帧:
PRIORITY 帧:
SETTINGS 帧:
PING 帧:
使用 HTTP/1.x 时,如果客户端想要发出多个并行请求以提高性能,则必须使用多个 TCP 连接。这是 HTTP/1.x 传送模型的直接结果,该行为可确保每个连接一次只传送一个响应(响应排队)。更糟糕的是,这也会导致队首阻塞(http1.x队头阻塞),以及底层 TCP 连接的效率低下。
HTTP/2 中新的二进制分帧层消除了这些限制并实现了完整的请求和响应多路复用,方法是允许客户端和服务器将 HTTP 消息分解为独立的帧,交错发送,然后在另一端重新组装这些帧。

该快照捕捉了同一连接内传输的多个数据流。客户端正在向服务器传输 DATA 帧(流 5),而服务器正在将交错的帧序列发送到客户端,以便流 1 和流 3。因此,正在传输三个并行流。
能够将 HTTP 消息分解为独立的帧,交错这些帧,然后在另一端重新组装这些帧,是 HTTP/2 最重要的增强功能。事实上,它在所有 Web 技术的整个堆栈中带来了众多性能优势的连锁效应,使我们能够:
健壮性考虑的场景必然有很多,但是二进制则不同,只有0和1的组合,因此选择了二进制传输,实现方便且健壮。