HTTP/2 中的多路复用是如何实现的?

HTTP/2 通过二进制分帧和流控制实现多路复用,提高资源加载效率。

网络协议 困难 HTTP HTTP/2 性能优化

HTTP/2 多路复用通过以下核心技术实现:

  1. 二进制分帧层
    HTTP/2 在 TCP 连接上引入二进制分帧层,将数据拆解为带有标识符的帧 (frame),每个帧携带:
    • Stream ID:标识所属流
    • 类型标记(如 HEADERS/DATA 帧)
    • 长度和标记位
      +-------------------------------+
      | Length (24 bits)              |
      +-------------------------------+ 
      | Type (8 bits)   | Flags (8)   |  
      +-------------------------------+
      | Stream Identifier (31 bits)   |
      +-------------------------------+
      | Frame Payload (可变长度)       |
      +-------------------------------+
      
  2. 流 (Stream) 的并发处理
    • 每个 HTTP 请求/响应对应一个独立流,通过唯一 Stream ID 区分。
    • 单 TCP 连接可承载数百个并发的双向流,帧可按任意顺序发送(如图形请求流和数据请求流交叉传输)。
  3. 帧的传输与重组
    • 发送方:将完整消息(如请求头+请求体)拆分成多个帧,通过单连接并发发送。
    • 接收方:根据 Stream ID 将乱序帧重组成完整消息(例如:Stream 1 的帧仅组合到 Stream 1)。
  4. 关键技术优势
    • 解决队头阻塞:单个流阻塞不影响其他流(如 Stream 2 延迟不影响 Stream 3 接收),而 HTTP/1.1 需等待前请求完成。
    • 连接复用:域名下所有资源仅需一个 TCP 连接(取代 HTTP/1.1 的 6-8 个连接),降低延迟与 TCP 握手开销。
  5. 支持扩展机制
    • 优先级调度:通过 31-bit 优先级值控制帧传输顺序(如 CSS 流优先级高于图片流)。
    • 流量控制:基于窗口机制平衡带宽(避免单一流耗尽连接资源)。

✅ 示例流程:
浏览器请求页面(Stream 1)时,服务器可并发推送资源(主动发起 Stream 2 传输 CSS 文件),全部帧在一个 TCP 连接中传输。