摘要:握手結束后,雙方就可以進行雙向通訊了,所有的通訊內容都以數據幀格式來傳輸。數據幀比特表示一個中的最后一個。每個比特必須為,后續擴展使用。比特表示負載數據是否。或者字節如果標志為時存在,保存。
Websocket 背景
歷史上,如果一個web應用程序需要和server進行雙向通信(例如,實時聊天和游戲),
需要大量的http請求來檢查server的內容是否有更新, 同時也需要很多http請求來發送
通知,這種方式有許多問題:
server端必須使用大量的tcp連接來服務每一個client:一類連接用來發送信息給
client, 另一類連接用來接收新的消息。
有大量不必要網絡開銷,因為每一次消息通訊都都包含http header。
client需要維護一個map來映射發送數據的連接和接受數據的連接。
一個簡單的解決方案就是使用一個tcp連接來進行雙向通訊,這就是websocket的作用。
websocket使用80和443端口,對HTTP代理和網關友好。
連接握手過程client發送
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
server響應
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
連接握手的目的是兼容基于HTTP的server和代理,所以一個端口可以同時服務HTTP請求和
websocket請求。
請求中Upgrage: websocket表示這是一個websocket請求。服務端收到該請求后會根據
請求中攜帶的Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==通過特定算法生成
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=響應給客戶端,客戶端校驗
通過握手成功。
握手結束后,雙方就可以進行雙向通訊了,所有的通訊內容都以數據幀格式來傳輸。
數據幀FIN: 1比特
表示一個message中的最后一個frame。
RSV1, RSV2, RSV3: 每個1比特
必須為0,后續擴展使用。
Optcode: 4比特
定義負載數據的解析方式。
%x0 表示一個連續幀。
%x1 表示一個文本幀。
0x2 表示一個二進制幀。
0x3-7 保留,以后給非控制幀使用。
0x8 表示連接關閉。
0x9 表示ping。
0xA 表示pong。
0xB-F 保留,以后給控制幀使用。
Mask: 1比特
表示負載數據是否masked。如果為1,masking-key包含一個key,用來unmask負載
數據。所有從客戶端方向發送的數據,該位必須置1。
*Playload length: * 7比特,7+16比特, 或者7+64比特
0-125表示負載數據的長度。
126,接下來的兩個字節為16位無符號整型表示負載數據長度。
127, 接下來的8個字節為64為無符號整型表示負載數據長度。
Masking key: 0或者4字節
如果mask標志為1時存在,保存mask key。
Payload data: 負載數據。
關閉握手過程關閉握手比連接握手簡單的多,連接的任何一端都可以發送一個close frame,
開始關閉握手,收到這個control frame的端發送一個close frame響應,
另一端收到這個close frame后關閉連接。
一端發送close frame后就表示這個連接將會被關閉并且不會再發送任何數據到另一端, 對端
收到close frame后知道這個連接將會被關閉,后續收到的數據都會被丟棄。
websocket關閉握手的目的是完善TCP的關閉握手,因為在端到端的情景TCP的關閉握手并不
總是可信賴的,尤其端到端中間有代理或者防火墻的情況下。
通過發送一個close frame然后等待響應,這種方式避免了不必要的數據丟失。
websocket & nginxnginx并沒有支持websocket,只是支持websocket的代理。
http { map $http_upgrade $connection_upgrade { default upgrade; "" close; } upstream websocket { server 192.168.100.10:8010; } server { listen 8020; location / { proxy_pass http://websocket; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; } } }
nginx也有第三方支持websocket的模塊nchan,但
不是為流媒體設計的。
Node.js
Socket.IO
WebSocket-Node
ws
Java
Jetty
Rubby
EventMachine
Python
pywebsocket
Tornado
Erlang
Shirasu
.NET
SuperWebSocket
參考資料http://blog.teamtreehouse.com/an-introduction-to-websockets
http://www.websocket.org/aboutwebsocket.html
https://www.html5rocks.com/en/tutorials/websockets/basics
https://os.alfajango.com/websockets-slides/#/2
The WebSocket Protocol
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39407.html
摘要:握手結束后,雙方就可以進行雙向通訊了,所有的通訊內容都以數據幀格式來傳輸。數據幀比特表示一個中的最后一個。每個比特必須為,后續擴展使用。比特表示負載數據是否。或者字節如果標志為時存在,保存。 Websocket 背景 歷史上,如果一個web應用程序需要和server進行雙向通信(例如,實時聊天和游戲),需要大量的http請求來檢查server的內容是否有更新, 同時也需要很多http請...
摘要:過程涉及到三個對象,一個是或,一個是,另外一個就是瀏覽器或或其他。在中進行配置了,也就是會執行腳本。然后會給這個注冊一些監聽在收到消息時會回調。發出一個消息讓瀏覽器準備的運行環境在收到消息會調用。 第一次在segmentfault寫博客,很緊張~~~公司項目上ReactNative,之前也是沒有接觸過,所以也是一邊學習一邊做項目了,最近騰出手來更新總結了一下RN的Debug的一個小知識...
摘要:過程涉及到三個對象,一個是或,一個是,另外一個就是瀏覽器或或其他。在中進行配置了,也就是會執行腳本。然后會給這個注冊一些監聽在收到消息時會回調。發出一個消息讓瀏覽器準備的運行環境在收到消息會調用。 第一次在segmentfault寫博客,很緊張~~~公司項目上ReactNative,之前也是沒有接觸過,所以也是一邊學習一邊做項目了,最近騰出手來更新總結了一下RN的Debug的一個小知識...
摘要:概述本文是系列的第一篇,主要介紹相關的基礎協議知識和。客戶端收到響應后,立即發起下一次的請求。收到消息通過事件來接收消息。類型則需要傳遞一個對象作為參數,相關的內容也將在本系列第二篇中進行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關的基礎協議知識和API。由于WebSocket的相關介紹在MDN中分布較亂,初學者不太容易入門,因此通過本文將相關基礎...
摘要:巧前端基礎進階全方位解讀前端掘金我們在學習的過程中,由于對一些概念理解得不是很清楚,但是又想要通過一些方式把它記下來,于是就很容易草率的給這些概念定下一些方便自己記憶的有偏差的結論。 計算機程序的思維邏輯 (83) - 并發總結 - 掘金從65節到82節,我們用了18篇文章討論并發,本節進行簡要總結。 多線程開發有兩個核心問題,一個是競爭,另一個是協作。競爭會出現線程安全問題,所以,本...
閱讀 2898·2021-11-11 16:55
閱讀 944·2021-09-28 09:36
閱讀 3794·2021-09-22 15:22
閱讀 2223·2021-09-06 15:12
閱讀 1754·2021-08-19 10:55
閱讀 2888·2019-08-30 12:52
閱讀 496·2019-08-29 14:03
閱讀 1204·2019-08-29 12:27