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。