WebSocket協議分析及實現

前言

   Webscoket是Web瀏覽器和服務器之間的一種全雙工通信協議,WebSocket協議由IETF定義標準,WebSocket API則由W3C定義標準。

一、通信流程

   Web客戶端與服務器通過http協議建立起連接,然後在接下來的通信過程中,通過websocket協議可互相發送JSON、XML、HTML或圖片等任意格式的數據。
WebSocket通信原理圖
   如此一來服務器可以直接向客戶端推送消息。相對比之前採取的方式都是客戶端主動向服務器發送請求,然後由服務器響應,這樣比較耗費網絡及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 應用數據

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章