HTTP2.0 核心功能
先序
HTTP2.0 引入了安全层,在 TCP 握手之后,需要经过 TLS 握手, 过程包括协商加密套件、验证服务器证书、密钥协商。
握手成功后就拥有了会话密钥,所有在这条 TCP 连接上进出的数据,都会经过会话密钥加密或解密。
二进制分帧
- 传统 http1.x 使用文本语法描述协议结构。它的处理方式本质上从字节流里找分隔符,切出一行一行,再把每一行解释成协议字段。
- 而二进制分帧则是将报文拆分为帧,分为帧头和帧负载,核心是按固定二进制格式解析帧流,帧头固定 9 字节,每一组字节和每一位语义清晰,几乎不用搜索分隔符
- 先读 9 字节帧头
- 直接知道长度、帧类型、ID等
- 再按长度读负载
- 再按类型解释负载

并发传输 & 多路复用
- 流(Stream)是 HTTP/2 连接中的一个独立的、双向的帧序列。每个 HTTP 请求/响应对对应一个流。
- 并发传输:通过 Stream 的设计,将一个(客户端-服务端)连接的多个请求-响应拆分为不同的 Stream 流,不同 Stream 的帧可以乱序发送,达到达到并发效果。而同一 Stream 内部的帧必须是严格有序的。解决 HTTP 层队头阻塞。
- 多路复用:来自不同流的帧会混合在一起,复用同一个 TCP 连接和 TLS 隧道加密进行传输。

服务端主动推送资源
- HTTP/2 规范定义了流 ID 分配规则,客户端发起的请求,必须使用奇数号 Stream ID,服务器主动推送必须使用偶数号 Stream ID,并通过头部PUSH_PROMISE头部告诉客户端。
- 服务器主动资源时通过发送 PUSH_PROMISE 帧来实现,这是 HTTP/2 专门为服务器推送设计的控制帧,用于告知客户端:我要主动给你推送一个资源
HPACK 头部压缩:静态编码表、动态编码表、Huffman 编码。
- 静态编码表:为高频出现在头部的字符串建立了一张表,使用只发索引和值代替完整字符串。
- 动态编码表:对方发了一个静态编码表里没有的字段,第一次发送后双方都会更新自己的动态表,数组里添加新的索引,下次也直接发索引。
- 哈夫曼编码:哈夫曼编码适用于动态编码表情况,比如自定义的头部、长 Cookie等,不在静态表里,如果直接序列化,每个字符固定占 1 byte,体积巨大,通过哈夫曼编码把字符串压到最小。
- 选择哈夫曼编码原因:
- HTTP 头部的特点是少数字符反复出现,大部分字符很少出现,而哈夫曼编码的规则是:出现越频繁的字符 → 分配越短的二进制码,能最大限度压缩字符串
- 选择哈夫曼编码原因:

浙公网安备 33010602011771号