websocket 協議概述
Webscoket是Web瀏覽器和服務器之間的一種全雙工通信協議,其中WebSocket協議由IETF定為標準,WebSocket API由W3C定為標準。一旦Web客户端與服務器建立起連接,之後的全部數據通信都通過這個連接進行。通信過程中,可互相發送JSON、XML、HTML或圖片等任意格式的數據。
websocket是基於TCP的一個應用協議,與HTTP協議的關聯之處在於websocket的握手數據被HTTP服務器當作HTTP包來處理,主要通過Update request HTTP包建立起連接,之後的通信全部使用websocket自己的協議。
0 1 2 3
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 ... |
+---------------------------------------------------------------+
Header
Sec-WebSocket-Protocol
Sec-WebSocket-Protocol報頭指定了你希望使用的一個或多個WebSocket協議,按優先級排序。第一個被服務器支持的將被服務器選擇並在響應中包含的Sec-WebSocket-Protocol頭中返回。你也可以在頭文件中使用它不止一次;結果與在單個報頭中使用逗號分隔的子協議標識符列表相同。
需要WebSocket服務器實現了相關protocol,否則這個字段沒什麼用。
// socket.io-client
var socket = io({
protocols: ["control"]
});
// 原生
var Socket = new WebSocket(url, [protocol]);
Sec-WebSocket-Version
- 請求頭
指定客户端希望使用的WebSocket協議版本,以便服務器可以確認其端是否支持該版本。(一般不需要改動)
Sec-WebSocket-Version: version
version: 客户端與服務器通信時希望使用的WebSocket協議版本。這個數字應該是IANA WebSocket版本號註冊表中列出的最新版本。 WebSocket協議的最新最終版本是版本13。
- 響應頭
如果服務器不能使用指定版本的WebSocket協議進行通信,它將響應一個錯誤(例如426 Upgrade Required),該錯誤在其報頭中包含一個Sec-WebSocket-Version報頭,以及一個以逗號分隔的支持協議版本列表。如果服務器不支持請求的協議版本,則響應中不包含Sec-WebSocket-Version頭。
Sec-WebSocket-Version: supportedVersions
supportVersions: 服務器支持的WebSocket協議版本的逗號分隔列表。
Sec-WebSocket-Accept
當服務器願意發起一個WebSocket連接時,包含在服務器在握手過程中的響應消息中。它將在響應頭中出現不超過一次。
Sec-WebSocket-Accept: hash
參考文章
- 協議升級機制
- WebSocket 協議 RFC 文檔(全中文翻譯)