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