WebSocket 實現數據實時推送的核心機制在于其全雙工通信能力和持久的連接特性。以下是其工作原理的詳細步驟:
1. 握手階段(HTTP 升級協議)
-
客戶端發起請求:通過發送一個帶有特殊頭部的 HTTP 請求,請求協議升級。
GET /chat HTTP/1.1 Host: example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Sec-WebSocket-Version: 13
Upgrade: websocket
和Connection: Upgrade
表示希望升級到 WebSocket 協議。Sec-WebSocket-Key
是客戶端生成的隨機 Base64 編碼密鑰,用于握手驗證。
-
服務器響應確認:若服務器支持 WebSocket,返回
101 Switching Protocols
狀態碼。HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Accept
是服務器對客戶端密鑰處理后的響應值,通過固定算法生成,確保握手有效性。
2. 建立持久全雙工連接
- 完成握手后,TCP 連接保持打開,客戶端和服務器直接通過該通道交換數據,無需重復握手。
- 全雙工特性:雙方可同時發送和接收數據,互不阻塞,實現實時雙向通信。
3. 數據傳輸(WebSocket 幀)
- 數據分幀傳輸:所有數據以幀(Frame)形式傳遞,幀結構包含:
- 操作碼(Opcode):標識數據類型(如文本
0x1
、二進制0x2
、控制幀如ping/pong
)。 - 掩碼(Mask):客戶端發送的數據必須掩碼處理,防止緩存攻擊。
- 負載長度:指示數據內容的長度。
- 操作碼(Opcode):標識數據類型(如文本
- 示例幀結構:
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-------+-+-------------+-------------------------------+ |F|R|R|R| opcode|M| Payload len | Extended payload length | |I|S|S|S| (4) |A| (7) | (16/64) | |N|V|V|V| |S| | (if payload len==126/127) | | |1|2|3| |K| | | +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - + | Extended payload length continued, if payload len == 127 | + - - - - - - - - - - - - - - - +-------------------------------+ | |Masking-key, if MASK set to 1 | +-------------------------------+-------------------------------+ | Masking-key (continued) | Payload Data | +-------------------------------- - - - - - - - - - - - - - - - + : Payload Data continued ... : + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + | Payload Data continued ... | +---------------------------------------------------------------+
4. 心跳機制(保持連接活性)
- Ping/Pong 幀:用于檢測連接是否存活。
- 服務器或客戶端可發送
Ping
幀(操作碼0x9
),接收方必須回復Pong
幀(操作碼0xA
)。
- 服務器或客戶端可發送
- 自動重連:若連接意外斷開,客戶端可嘗試重新建立連接。
5. 關閉連接
- 關閉握手:任一方發送
Close
幀(操作碼0x8
),對方回應后關閉 TCP 連接。 - 狀態碼和原因:關閉幀可攜帶狀態碼(如
1000
表示正常關閉)和關閉原因。
關鍵優勢
- 低延遲:避免 HTTP 每次請求的開銷,數據實時到達。
- 高效傳輸:較少的協議頭開銷(通常僅 2-10 字節前綴)。
- 服務端主動推送:服務器無需等待客戶端請求即可發送數據。
應用場景
- 實時聊天:消息即時送達。
- 在線游戲:多玩家狀態同步。
- 金融行情:股價實時更新。
- 協同編輯:多人同時編輯文檔同步。
安全性
- wss://:基于 TLS 加密,防止中間人攻擊。
- 掩碼機制:客戶端到服務器的數據掩碼處理,增強安全性。
總結而言,WebSocket 通過升級 HTTP 連接為持久化的全雙工通道,結合高效的數據幀結構和心跳機制,實現了低延遲、高吞吐的實時數據推送,成為現代實時應用的基石。