前言
Webscoket是Web瀏覽器和服務器之間的一種全雙工通信協議,WebSocket協議由IETF定義標準,WebSocket API則由W3C定義標準。
一、通信流程
Web客戶端與服務器通過http協議建立起連接,然後在接下來的通信過程中,通過websocket協議可互相發送JSON、XML、HTML或圖片等任意格式的數據。
如此一來服務器可以直接向客戶端推送消息。相對比之前採取的方式都是客戶端主動向服務器發送請求,然後由服務器響應,這樣比較耗費網絡及cpu的資源。(相當節省了向服務器請求這個過程);採用websocket協議,只要第一次建立連接,就可以一直進行通信,不用像HTTP協議頻繁的建立請求(一問一答)。
二、握手過程
1. 客戶端請求連接
websocket是基於TCP的一個應用協議,websocket的握手先是以 HTTP包與HTTP服務器通過Update request HTTP包建立起連接,然後接下來的通信使用websocket自己的協議。具體的請求格式如下:
GET /chat HTTP/1.1 //請求的方法,類型必須爲GET,協議版本號必須大於1.1
Host: server.example.com
**Upgrade: websocket** //Upgrade字段:必須包含,值爲websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== //Connection字段:必須包含,值爲Upgrade
Origin: https://example.com //Origin:作安全使用,防止跨站攻擊
Sec-WebSocket-Protocol: chat, superchat //Sec-WebSocket-Key字段:必須包含,記錄握手的鍵值
Sec-WebSocket-Version: 13 //Sec-WebSocket-Protocol字段:必須包含,記錄使用的子協議
2. 服務器響應連接
websocket服務器接收到請求後,返回狀態碼爲101 Switching Protocols 響應客戶端;
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= //握手請求中的Sec-WebSocket-Key字段生層的。
Sec-WebSocket-Protocol: chat
3. WebSocket獨立的數據幀
域 | 說明 |
---|---|
FIN | 1bit,是否爲信息的最後一幀 |
RSV 1-3 | 1bit,備用,默認爲0 |
opcode | 4bit,幀類型 0x00 連續消息分片 0x01 文本消息分片 0x02 二進制消息分片 0x03 ~ 0x07 爲將來的非控制消息片段保留測操作嗎 0x08 連接關閉 0x09 心跳檢查 ping 0x0a 心跳檢查pong 0x0b ~ 0x0f 爲將來的控制消息片段保留的操作碼 |
MASK | 定義傳輸的數據是否有加掩碼 如果設置爲1,掩碼鍵必須放在masking-key區域,客戶端發送給服務端的所有消息,此位的值都是1 |
payload length | 7bit,傳輸數據長度,以字節爲單位。 當這個長度爲7bit數字爲126時,緊隨其後的2個字節也是表示數據長度。 當這個長度爲7bit數字爲127時,緊隨其後的8個字節也是表示數據長度。 |
Masking-key | 0或者4bit,只有當MASK設置爲1時纔有效。 |
Playload data | 負載數據,爲擴展數據和應用數據之和,Extension data + Application data。 |
Extension data | 擴展數據,如果客戶端和服務端沒有特殊的約定,那麼擴展數據長度始終爲0 |
Application data | 應用數據 |