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請求完成。
全雙工(Full-Duplex Transmissions):是指交換機在傳送資料的同時也能夠接收資料,兩者同步進行,
這好像我們平時打電話一樣,說話的同時也能夠聽到對方的聲音。目前的交換機都支援全雙工
優點:延遲小,速度快。
輪詢:輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客服端的瀏覽器。輪詢會造成對網路和通訊雙方資源的浪費,並且非實時。
websocket是基於http協議的,借用http握手,比http多了兩個東西。
Upgrade: websocket
Connection: Upgrade
websocket協議:由握手和資料傳輸這兩部分組成。
握手:
GET /chat HTTP/1.1 //1
Host: server.example.com //2
Upgrade: websocket //3
upgrade是HTTP1.1中用於定義轉換協議的header域。
它表示,如果伺服器支援的話,客戶端希望使用現有的「網路層」已經建立好的這個「連線(此處是
切換到另外一個「應用層」(此處是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(關閉連線幀),0x9(ping),0xA(pong).
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:0到4個位元組,如果mask設為1則有4個位元組的掩碼解密祕鑰,否則無。
Payload-data:任意長度資料。包含有擴充套件定義資料和應用資料,如果沒有定義擴充套件則沒有此項,僅含有應用資料。