HTTP/2 和 WebSocket 协议本身确实不兼容,不能像在 HTTP/1.1 中那样用标准 WebSocket 协议(ws:// / wss://)进行升级握手。但这事儿细节比较多,下面详细讲讲:
✅ HTTP/2 与 WebSocket 的关系
- HTTP/2 不直接支持 WebSocket(标准 ws/wss 协议)
WebSocket 的握手过程依赖 HTTP/1.1 的 Upgrade 机制:
GET /chat HTTP/1.1
Host: example.com
Upgrade: websocket
Connection: Upgrade
而 HTTP/2 中没有 Upgrade 头和 Connection: upgrade 的机制,所以不能像 HTTP/1.1 那样原生握手。
- 但可以使用 WebSocket over HTTP/2(h2-websocket)
为了解决这个问题,IETF 提出了一个草案叫:
RFC 8441: Bootstrapping WebSockets with HTTP/2
也就是 “WebSocket over HTTP/2”,允许在 HTTP/2 的流(stream)中创建 WebSocket 连接。
不过这个协议 不是所有浏览器和服务器都支持。
需要客户端(比如浏览器)+ 服务器(比如 Nginx、Node.js)同时支持该 RFC 才能用。
- ✅ 替代方案:使用 HTTP/2 + Server-Sent Events(SSE)或 gRPC
在 HTTP/2 的上下文中,为了实现“伪 WebSocket”通信,以下是常见替代方案:
技术 特点
SSE (Server-Sent Events) 适用于服务端单向推送;兼容性好
gRPC / gRPC-Web 双向通信,基于 HTTP/2,多用于微服务
WebTransport(下一代) 替代 WebSocket 的新协议(支持 HTTP/3)
📌 总结一句话:
HTTP/2 不直接支持传统 WebSocket(ws/wss),但可以通过扩展(如 RFC 8441)或其他协议实现类似效果。
如果你想在 HTTP/2 环境下保持类似 WebSocket 的实时通信,可以考虑:
用 HTTP/1.1 保 WebSocket 支持;
或者 gRPC/gRPC-Web、SSE;
如果客户端和服务端都支持,可以试试 h2-websocket。