
HTTP/2多路复用通过单连接并发传输多个请求/响应,适合静态资源或并发请求;实时推送场景需服务器主动推送,WebSocket更优,两者在连接数、实时性、数据传输效率上各有优劣,需根据业务场景选择。
老师口吻解释:HTTP/2的多路复用是核心机制,它将请求和响应拆分为二进制帧,在同一个TCP连接上交替传输,类似“多车道公路”——多个数据流(请求/响应)并行,避免了HTTP/1.1中多次建立连接的开销。比如访问一个网页时,CSS、JS等资源通过同一个连接传输。
但多路复用存在流控制问题:若请求和响应大小不匹配(如请求大、响应小),可能导致阻塞。HTTP/2通过**RST_STREAM帧(Reset Stream)**处理,请求方或响应方可发送RST_STREAM(流ID为对方流的ID),终止流以避免阻塞。
而WebSocket是基于TCP的长连接协议,通过握手(客户端发送Upgrade: websocket请求,服务器响应200并包含WebSocket协议头)建立连接后,数据双向传输,无HTTP头开销,适合实时双向通信(如聊天、股票行情)。
| 特性/场景 | HTTP/2多路复用 | WebSocket |
|---|---|---|
| 定义 | HTTP/2核心机制,单TCP连接并发传输多请求/响应 | 基于TCP的长连接协议,双向实时通信 |
| 连接数 | 单连接,受浏览器/服务器限制(如浏览器限6个HTTP/2连接) | 单连接,需保持长连接,现代浏览器支持更多(如20+) |
| 数据传输效率 | 头部压缩(Gzip/DEFLATE),请求/响应交替,传输开销较大 | 二进制帧,无HTTP头,数据格式轻量,传输效率高 |
| 实时性 | 请求/响应交替,实时性差(服务器需等待请求完成再响应) | 双向实时,服务器主动推送,延迟低 |
| 使用场景 | 静态资源加载、并发请求(如网页资源、API批量请求) | 实时推送(聊天、股票行情、在线游戏)、双向通信 |
| 注意点 | 受TCP连接数限制,不适合高并发实时场景;需匹配请求/响应;流控制(RST_STREAM)处理不匹配 | 需保持连接,断开需重连;数据格式自定义(如JSON、二进制);高并发下需优化连接管理 |
/index.html,同时通过同一连接请求/style.css和/script.js,服务器通过多帧传输资源(如帧1:index.html,帧2:style.css,帧3:script.js)。GET /ws?token=abc HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
服务器响应200:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPL6rbTrKj4OQsRTmH3eGp...
之后客户端发送消息(如{"type":"msg","content":"hello"}),服务器推送消息(如{"type":"push","data":"new stock price"})。面试官您好,HTTP/2的多路复用是指通过二进制分帧,在同一个TCP连接上并发传输多个请求/响应,避免多次建立连接的开销。比如访问一个网页时,CSS、JS等资源通过同一个连接传输,提升效率。但在实时推送场景,比如聊天或股票行情,需要服务器主动向客户端推送数据,这时候WebSocket更合适,因为它基于长连接,数据双向传输,实时性更好。两者对比:HTTP/2多路复用适合静态资源或并发请求,单连接传输多个资源,但受浏览器连接数限制;WebSocket需要保持长连接,数据格式更轻量,适合实时双向通信。总结来说,HTTP/2多路复用解决的是并发请求的效率问题,而WebSocket解决的是实时推送的双向通信需求,两者在场景上各有侧重。