1. 程式人生 > >Websocket協議解析

Websocket協議解析

Html5引入webSocket來實現資料的實時互動。 要想自己編寫個webSocket伺服器,必須對webSocket協議有所瞭解才行。

WebSocket協議主要分為兩部分:連線許可驗證驗證後的資料互動。

連線許可驗證就是進行一次握手操作,由Client傳送一個類似於HTTP的請求,服務端獲取請求後 將傳送過來的資料中的 Sec-WebSocket-Key 解析出來,然後按照把“Sec-WebSocket-Key”加上一個魔幻字串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。使用SHA-1加密,之後進行BASE-64編碼,將結果做為“Sec-WebSocket-Accept”頭的值,返回給客戶端。

連線請求內容:

GET / HTTP/1.1
Connection:Upgrade
Host:127.0.0.1:8088
Origin:null
Sec-WebSocket-Extensions:x-webkit-deflate-frame
Sec-WebSocket-Key:puVOuWb7rel6z2AVZBKnfw==
Sec-WebSocket-Version:13
Upgrade:websocket

服務端返回內容:
HTTP/1.1 101 Switching Protocols
Connection:Upgrade
Server:beetle websocket server
Upgrade:WebSocket
Date:Mon, 26 Nov 2012 23:42:44 GMT
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:content-type
Sec-WebSocket-Accept:FCKgUr8c7OsDsLFeJTWrJw6WO8Q= 


經過伺服器的返回處理後連線成功,後面就可以進行TCP通訊.WebSocket在握手後傳送資料並象下層TCP協議那樣由使用者自定義,還是需要遵循對應的應用協議規範。

資料互動格式如下:


各欄位的解釋:

FIN                  1bit 表示資訊是否結束, 如果為1則該訊息為訊息尾部,如果為零則還有後續資料包; 

RSV 1-3         1bit 備用欄位 預設都為 0

Opcode          4bit 訊息型別,訊息型別暫定有15種,其中有幾種是預留設定。

Mask               1bit 掩碼,是否加密資料,(客戶端傳送給後端時,mask必須為1,否則close連線;伺服器傳送給前端時,mask必須為0,否則斷開連線)

Payload len    7bit 資料的長度,當這個7 bit的資料 == 126 時,後面的2 個位元組表示資料長度,當它 == 127 時,後面的 8 個位元組表示資料長度

Masking-key   0/32 bit 掩碼值( Mask為1時才有)

Payload data  長度為Payload len的資料,如果有掩碼 需要用mask-Key來異或 才能得到


下圖為opcode 所代表的意思