HTTP2.0 核心功能

先序

HTTP2.0 引入了安全层,在 TCP 握手之后,需要经过 TLS 握手, 过程包括协商加密套件、验证服务器证书、密钥协商。
握手成功后就拥有了会话密钥,所有在这条 TCP 连接上进出的数据,都会经过会话密钥加密或解密。

二进制分帧

  • 传统 http1.x 使用文本语法描述协议结构。它的处理方式本质上从字节流里找分隔符,切出一行一行,再把每一行解释成协议字段。
  • 而二进制分帧则是将报文拆分为帧,分为帧头和帧负载,核心是按固定二进制格式解析帧流,帧头固定 9 字节,每一组字节和每一位语义清晰,几乎不用搜索分隔符
    • 先读 9 字节帧头
    • 直接知道长度、帧类型、ID等
    • 再按长度读负载
    • 再按类型解释负载

http2

并发传输 & 多路复用

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

3

服务端主动推送资源

  • HTTP/2 规范定义了流 ID 分配规则,客户端发起的请求,必须使用奇数号 Stream ID,服务器主动推送必须使用偶数号 Stream ID,并通过头部PUSH_PROMISE头部告诉客户端。
  • 服务器主动资源时通过发送 PUSH_PROMISE 帧来实现,这是 HTTP/2 专门为服务器推送设计的控制帧,用于告知客户端:我要主动给你推送一个资源

HPACK 头部压缩:静态编码表、动态编码表、Huffman 编码。

  • 静态编码表:为高频出现在头部的字符串建立了一张表,使用只发索引和值代替完整字符串。
  • 动态编码表:对方发了一个静态编码表里没有的字段,第一次发送后双方都会更新自己的动态表,数组里添加新的索引,下次也直接发索引。
  • 哈夫曼编码:哈夫曼编码适用于动态编码表情况,比如自定义的头部、长 Cookie等,不在静态表里,如果直接序列化,每个字符固定占 1 byte,体积巨大,通过哈夫曼编码把字符串压到最小。
    • 选择哈夫曼编码原因:
      • HTTP 头部的特点是少数字符反复出现,大部分字符很少出现,而哈夫曼编码的规则是:出现越频繁的字符 → 分配越短的二进制码,能最大限度压缩字符串
posted @ 2026-04-01 18:02  huihui~  阅读(0)  评论(0)    收藏  举报