Web Socket
發表於 : 2013-10-17 16:20:13
http://itzone.hk/article/article.php?ai ... 2044089879
這也是 WebSocket 的根本理念及功能:伺服器端能用同一個 TCP 連接,主動發送資料至用戶端。
建立 WebSocket 連接後,便不會再使用 HTTP,而是使用 RFC 6455 的 frame header,引自 IETF RFC 6455:
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 ... |
+---------------------------------------------------------------+
以上的 frame header 以最左方為 most significant bit:
「FIN」:「0」代表此 frame 並不是最後的一個 frame,接收方須收到之後的 frame 才能行動;「1」代表這是最後的一個 frame。一般靜態訊息 (即不需等待用戶輸入、檔案上載之類) 都能以一個 frame 處理。
「RSV1」、「RSV2」、「RSV3」:必須為「0」
「Opcode」:此 4-bit 值定義了此 frame 將要執行的動作:
0x01:此 frame 內容為純文字
0x02:此 frame 內容為二進制碼
0x08:此 frame 將告訴對方終止 WebSocket 連結
0x09:此 frame 為 Ping control frame
0x0A:此 frame 為 Pong control frame
「Mask」:「1」則有 payload masking,「0」則沒有。用戶端所發送的 frame 必須將「Mask」設為「1」
「Payload length」:此 7-bit 數值為 frame 內容的長度,內容長度分為三種尺度:
0 byte 至 125 bytes:會以 000 0000 至 111 1101 表示,並代表下一個 byte 即為 frame 內容的開始
126 bytes 至 65535 bytes:會以「111 1110」即「126」表示,並指示下兩個 byte 才載有實際的內容長度
65536 bytes 至 2^64 - 1 bytes:會以「111 1111」即「127」表示,並指示下八個 bytes 才載有實際的內容長度
「Masking-key」:只適用於「Masking」為「1」時,當「Masking」為「0」時,此欄不佔空間
「Payload data」:即實際的 frame 內容
這也是 WebSocket 的根本理念及功能:伺服器端能用同一個 TCP 連接,主動發送資料至用戶端。
建立 WebSocket 連接後,便不會再使用 HTTP,而是使用 RFC 6455 的 frame header,引自 IETF RFC 6455:
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 ... |
+---------------------------------------------------------------+
以上的 frame header 以最左方為 most significant bit:
「FIN」:「0」代表此 frame 並不是最後的一個 frame,接收方須收到之後的 frame 才能行動;「1」代表這是最後的一個 frame。一般靜態訊息 (即不需等待用戶輸入、檔案上載之類) 都能以一個 frame 處理。
「RSV1」、「RSV2」、「RSV3」:必須為「0」
「Opcode」:此 4-bit 值定義了此 frame 將要執行的動作:
0x01:此 frame 內容為純文字
0x02:此 frame 內容為二進制碼
0x08:此 frame 將告訴對方終止 WebSocket 連結
0x09:此 frame 為 Ping control frame
0x0A:此 frame 為 Pong control frame
「Mask」:「1」則有 payload masking,「0」則沒有。用戶端所發送的 frame 必須將「Mask」設為「1」
「Payload length」:此 7-bit 數值為 frame 內容的長度,內容長度分為三種尺度:
0 byte 至 125 bytes:會以 000 0000 至 111 1101 表示,並代表下一個 byte 即為 frame 內容的開始
126 bytes 至 65535 bytes:會以「111 1110」即「126」表示,並指示下兩個 byte 才載有實際的內容長度
65536 bytes 至 2^64 - 1 bytes:會以「111 1111」即「127」表示,並指示下八個 bytes 才載有實際的內容長度
「Masking-key」:只適用於「Masking」為「1」時,當「Masking」為「0」時,此欄不佔空間
「Payload data」:即實際的 frame 內容