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.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 应用层队头阻塞 | ❌ 存在(串行) | ✅ 解决(多路复用) | ✅ 解决 |
| 底层队头阻塞 | TCP 丢包阻塞整条 | TCP 丢包仍阻塞整条 | ✅ 解决(QUIC over UDP) |
| 传输格式 | 文本 | 二进制帧 | 二进制帧 |
| 头部压缩 | 无 | HPACK | QPACK |
❗ 易错点: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。