1. 程式人生 > >webSocket實時傳輸協議

webSocket實時傳輸協議

公司的慣例是每週五都會有一個分享會,內容大概是前端,後臺,軟體思想,工具使用,設計等,大家坐在一起聽一聽,說一說,交流一下。

這次是我給大家講webSocket傳輸協議。

最初對webSocket的印象是:它是一種實時的,用於網上實時聊天。例如QQ.

那麼,webSocket是什麼東西?真實時?那底層是不是還是輪訓 輪詢?和Http的長連線有什麼不同?(這些問題對於我來說有點難度啊)

簡書作者:TheAlchemist寫了三篇刨根問底HTTP和WebSocket協議,上面的問題就是從他的文章上摘抄的。連結地址:http://www.jianshu.com/p/265397f812d4

那麼趕緊去看文件,文件很重要很重要。這裡根據他的文章找到兩個連結,都是中文版,RFC6455:http://download.csdn.net/detail/relan365/7426065,RFC2616:http://download.csdn.net/detail/yintiliang/3043455。

關鍵字搜尋WEBSOCKET出現如下資訊:WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duple)。一開始的握手需要藉助HTTP請求完成。

全雙工(FullDuplex Transmissions):是指交換機在傳送資料的同時也能夠接收資料,兩者同步進行,

這好像我們平時打電話一樣,說話的同時也能夠聽到對方的聲音。目前的交換機都支援全雙工

優點:延遲小,速度快。


輪詢:輪詢是在特定的的時間間隔(如每1),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客服端的瀏覽器。輪詢會造成對網路和通訊雙方資源的浪費,並且非實時。

那麼從實時的角度,websocket底層就不是輪詢。

websocket是基於http協議的,借用http握手,比http多了兩個東西。

Upgrade: websocket

Connection: Upgrade

websocket協議:由握手和資料傳輸這兩部分組成。

握手:

GET /chat HTTP/1.1            //1  

    Host: server.example.com   //2

    Upgrade: websocket            //3

upgradeHTTP1.1中用於定義轉換協議的header域。

它表示,如果伺服器支援的話,客戶端希望使用現有的「網路層」已經建立好的這個「連線(此處是

TCP連線)」,

切換到另外一個「應用層」(此處是WebSocket)協議。

    Connection: Upgrade            //4

HTTP1.1中規定Upgrade只能應用在「直接連線」中,所以帶有Upgrade頭的HTTP1.1訊息必須含有Connection頭,

因為Connection頭的意義就是,任何接收到此訊息的人(往往是代理伺服器)都要在轉發此訊息之前處理掉Connection中指定的域(不轉發Upgrade域)。

如果客戶端和伺服器之間是通過代理連線的,那麼在傳送這個握手訊息之前首先要傳送CONNECT訊息來建立直接連線。

    Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==            //5

    Origin: http://example.com            //6

作安全使用,防止跨站攻擊,瀏覽器一般會使用這個來標識原始域

    Sec-WebSocket-Protocol: chat, superchat            //7

    Sec-WebSocket-Version: 13            //8

7行標識了客戶端支援的子協議的列表(關於子協議會在下面介紹),

8行標識了客戶端支援的WS協議的版本列表,

5行用來發送給伺服器使用(伺服器會使用此欄位組裝成另一個key值放在握手返回資訊裡傳送客戶端)。

資料傳輸:

資料傳輸使用的是一系列的資料幀,並且要進行掩碼處理,


FIN:1bit,表示是訊息的最後一幀,如果訊息只有一幀,那第一幀就是最後一幀。

RSV1,RSV2,RSV3:每個1bit,且必須是0,除非擴充套件定義為非零。如果接收到的是非零,但擴充套件沒有定義,那就要關閉連線。

Opcode:4bit,解釋Payload資料,有不同的狀態,如果狀態未知,必須馬上關閉連線。

0x0(附加資料幀),0x1(文字資料幀),0x2(二進位制資料幀),

0x3-7(保留為以後的非控制幀使用),0xB-F(保留為以後的控制幀使用),

0x8(關閉連線幀),0x9ping),0xApong.

Mask:1bit,掩碼,定義是否需要掩碼處理,如果是1表示進行了掩碼處理。

Masking-key:域的資料就是掩碼祕鑰,用於解碼payloadData,

Payload length:7位,7+16位,7+64位,payload資料的長度,如果是0-125,就是真實的payload 長度,如果是126,那麼接著後面2個位元組對應的16位無符號整數就是payload的資料 長度,如果是127,那麼後面2個位元組對應的64位無符號整數就是payload的資料長度。

Masking-key:04個位元組,如果mask設為1則有4個位元組的掩碼解密祕鑰,否則無。

Payload-data:任意長度資料。包含有擴充套件定義資料和應用資料,如果沒有定義擴充套件則沒有此項,僅含有應用資料。