HTTP2.0多路复用的原理

1. 什么是多路复用

2. 为什么HTTP1.1不能多路复用

HTTP/2是基于二进制“帧”的协议,HTTP/1.1是基于“文本分割”解析的协议。

以上就是HTTP/1.1发送请求消息的文本格式:以换行符分割每一条key:value的内容。“服务端”需要不断的读入字节,直到遇到分隔符(这里指换行符,代码中可能使用/n或者/r/n表示)

3. HTTP/2帧结构设计和多路复用实现

帧是一个数据单元,实现了对消息的封装。下面是HTTP/2的帧结构:

如果使用HTTP/1.1的话,你需要发送完上一个请求,才能发送下一个;由于HTTP/2是分帧的,请求和响应可以交错甚至可以复用。

为了能够发送不同的“数据信息”,通过帧数据传递不同的内容,HTTP/2中定义了10种不同类型的帧,

我们先来了解“流”的概念:HTTP/2连接上独立的、双向的帧序列交换。流ID(帧首部的6-9字节)用来标识帧所属的流

流的概念提出是为了实现多路复用,在单个连接上实现同时进行多个业务单元数据的传输。

下面两张图分别表示了HTTP/2协议上POST请求数据流“复用”的过程,很容易看的明白:

补充

补充:HTTP/2 多路复用解决的是「HTTP/1.1 一个连接只能串行处理请求」的问题,通过「二进制分帧 + Stream」让多个请求/响应可以并发交错传输。

为什么 HTTP/1.1 不能多路复用:

  • HTTP/1.1 基于文本分隔解析,消息边界依赖换行符;且服务端只能按请求顺序响应,无法真正并发。
  • 浏览器为绕过「每个域名 6 个连接」限制,会把多个请求分散到不同连接,依然存在队头阻塞和资源浪费。
  • 常见的「雪碧图 / 域名分片 / 内联 CSS」等优化都是为了绕开这个限制。

HTTP/2 多路复用机制:

  • 二进制分帧:HTTP/2 把消息切分为二进制帧(HEADERS / DATA / PRIORITY / RST_STREAM 等 10 种)。
  • Stream:每个请求分配一个 Stream ID,帧在连接上交叉传输;接收端按 Stream ID 重组。
  • 连接复用:单个 TCP 连接可承载上百个 Stream,无需多个连接。
  • 流量优先级:可以为 Stream 设置优先级(已废弃但仍可优化),关键资源优先到达。

带来的优势:

  • 解决应用层队头阻塞。
  • 减少 TCP 连接数,降低握手 / TLS 握手开销。
  • 配合头部压缩(HPACK)和服务端推送,整体页面加载更快。

补充:HTTP/2 多路复用解决的是「HTTP 层」队头阻塞,但 TCP 层丢包仍会阻塞整条连接——这正是 HTTP/3 改用 QUIC/UDP 的根本动机。