HTTP/2 多路复用

一句话总结

HTTP/2 多路复用 = 在一个 TCP 连接里,多个请求/响应像”交错的车流”同时跑,不用再像 HTTP/1.1 那样排成一队等前面的走完。


一、为什么需要多路复用?(HTTP/1.1 的痛点)

HTTP/1.1 虽然支持长连接(keep-alive),但有个致命问题——队头阻塞(Head-of-Line Blocking, HOLB)

  • 浏览器和服务器之间通常只开 约 6 条 TCP 连接(浏览器并发限制)。

  • 每条连接里,请求必须 串行:前一个响应没回来,后面的请求就只能排队干等。

  • 哪怕第 1 个请求只是卡了 100ms,后面同一连接上的请求全被堵在后面。


flowchart LR

    subgraph H11["HTTP/1.1(一条连接内)"]

        direction TB

        A1["请求1 → 响应1"] --> A2["请求2 → 响应2"] --> A3["请求3 → 响应3"]

    end

像什么?单车道公路,前面的车抛锚了,后面所有车一起堵死。


二、HTTP/2 怎么解决的?二进制分帧层

HTTP/2 引入了一个 二进制分帧层(Binary Framing Layer),把数据拆成最小的”帧(Frame)”:

  • 流(Stream):一次请求/响应对应一个逻辑流,有唯一 流 ID

  • 消息(Message):一个请求或响应 = 一个消息,由多个帧组成。

  • 帧(Frame):最小传输单位,包含 流ID + 类型 + 数据

多个流的帧可以 交错(interleave) 在同一个 TCP 连接里发送,接收端按 流ID 重组。


sequenceDiagram

    participant C as 客户端

    participant S as 服务器

    C->>S: 流1 帧(请求A头部)

    C->>S: 流3 帧(请求C头部)

    C->>S: 流1 帧(请求A body)

    S->>C: 流3 帧(响应C)

    S->>C: 流1 帧(响应A)

    Note over C,S: 多个流交错传输,互不阻塞


三、常问:多路复用解决了什么?没解决什么?

维度HTTP/1.1HTTP/2HTTP/3
应用层队头阻塞❌ 存在(串行)✅ 解决(多路复用)✅ 解决
底层队头阻塞TCP 丢包阻塞整条TCP 丢包仍阻塞整条✅ 解决(QUIC over UDP)
传输格式文本二进制帧二进制帧
头部压缩HPACKQPACK

易错点:HTTP/2 只解决了应用层的队头阻塞。一旦底层 TCP 丢了一个包,整条连接(里面所有流)都要等这个包重传——这就是 TCP 层队头阻塞。HTTP/3 把底层换成 QUIC(基于 UDP),才彻底解决。


四、和 HTTP/1.1 的关键区别速记

  • 多路复用:一个连接并发多个请求,不用开 6 条连接排队。

  • 二进制帧:解析更高效,不用一行行读文本。

  • HPACK 头部压缩:重复的请求头只发增量,省带宽。

  • 服务器推送(Server Push):服务器可主动推资源(已逐渐弃用,因缓存策略复杂)。


速记卡(面试闪卡)

Q1:一句话讲清「HTTP/2 多路复用」到底是什么?

A:HTTP/2 多路复用在一个 TCP 连接里把请求/响应拆成带流 ID 的二进制帧交错发送,并发不排队。

Q2:一、为什么需要多路复用?(HTTP/1.1 的痛点) —— 怎么理解?

A:HTTP/1.1 像”单车道公路”:一条连接内请求必须串行,前车卡住后面全堵;浏览器还只开约 6 条 TCP 连接。这就是队头阻塞(HOLB,Head-of-Line Blocking)——一个慢请求拖死整条连接。

Q3:二、HTTP/2 怎么解决的?二进制分帧层 —— 怎么理解?

A:像把货”拆成带标签的包裹”:引入二进制分帧层,数据切成最小帧(Frame),每个帧带流 ID;流(Stream)=一次请求/响应,消息(Message)=若干帧。多股流的帧在同一个 TCP 连接里交错(interleave)传输,接收端按流 ID 重组,谁先好谁先回。

Q4:三、常问:多路复用解决了什么?没解决什么? —— 怎么理解?

A:它只修了”应用层”队头阻塞;底层还是 TCP,一个包丢了整条连接(所有流)都要等重传——这叫 TCP 层队头阻塞。要彻底解决得靠 HTTP/3 的 QUIC(基于 UDP)。头部压缩 2.0 用 HPACK、3.0 用 QPACK。

Q5:四、和 HTTP/1.1 的关键区别速记 —— 怎么理解?

A:除了多路复用,还有三样升级:① 二进制帧——解析更高效;② HPACK 头部压缩——重复请求头只发增量,省带宽;③ 服务器推送(Server Push)——可主动推 CSS/JS,后因缓存太复杂渐被弃用。多路复用是主角,其余是配角。

Q6:核心速记主线有哪些?

  • HTTP/1.1 单连接串行 → 应用层队头阻塞

  • 二进制分帧:Stream/Message/Frame + 流 ID 交错

  • HTTP/2 只解应用层,TCP 丢包仍整条卡(HTTP/3 才解)

  • HPACK 头部压缩 + 服务器推送(已渐弃)

口诀

A:1.1 单道排长队,2.0 分帧多股流;

流 ID 当路标,交错传输不犯愁。

应用阻塞已修好,TCP 丢包仍卡轴;

要说彻底无拥堵,且等 3.0 换 UDP。

相关链接