摘要:握手結(jié)束后,雙方就可以進(jìn)行雙向通訊了,所有的通訊內(nèi)容都以數(shù)據(jù)幀格式來傳輸。數(shù)據(jù)幀比特表示一個(gè)中的最后一個(gè)。每個(gè)比特必須為,后續(xù)擴(kuò)展使用。比特表示負(fù)載數(shù)據(jù)是否?;蛘咦止?jié)如果標(biāo)志為時(shí)存在,保存。
Websocket 背景
歷史上,如果一個(gè)web應(yīng)用程序需要和server進(jìn)行雙向通信(例如,實(shí)時(shí)聊天和游戲),
需要大量的http請求來檢查server的內(nèi)容是否有更新, 同時(shí)也需要很多http請求來發(fā)送
通知,這種方式有許多問題:
server端必須使用大量的tcp連接來服務(wù)每一個(gè)client:一類連接用來發(fā)送信息給
client, 另一類連接用來接收新的消息。
有大量不必要網(wǎng)絡(luò)開銷,因?yàn)槊恳淮蜗⑼ㄓ嵍级及琱ttp header。
client需要維護(hù)一個(gè)map來映射發(fā)送數(shù)據(jù)的連接和接受數(shù)據(jù)的連接。
一個(gè)簡單的解決方案就是使用一個(gè)tcp連接來進(jìn)行雙向通訊,這就是websocket的作用。
websocket使用80和443端口,對HTTP代理和網(wǎng)關(guān)友好。
連接握手過程client發(fā)送
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響應(yīng)
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
連接握手的目的是兼容基于HTTP的server和代理,所以一個(gè)端口可以同時(shí)服務(wù)HTTP請求和
websocket請求。
請求中Upgrage: websocket表示這是一個(gè)websocket請求。服務(wù)端收到該請求后會(huì)根據(jù)
請求中攜帶的Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==通過特定算法生成
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=響應(yīng)給客戶端,客戶端校驗(yàn)
通過握手成功。
握手結(jié)束后,雙方就可以進(jìn)行雙向通訊了,所有的通訊內(nèi)容都以數(shù)據(jù)幀格式來傳輸。
數(shù)據(jù)幀FIN: 1比特
表示一個(gè)message中的最后一個(gè)frame。
RSV1, RSV2, RSV3: 每個(gè)1比特
必須為0,后續(xù)擴(kuò)展使用。
Optcode: 4比特
定義負(fù)載數(shù)據(jù)的解析方式。
%x0 表示一個(gè)連續(xù)幀。
%x1 表示一個(gè)文本幀。
0x2 表示一個(gè)二進(jìn)制幀。
0x3-7 保留,以后給非控制幀使用。
0x8 表示連接關(guān)閉。
0x9 表示ping。
0xA 表示pong。
0xB-F 保留,以后給控制幀使用。
Mask: 1比特
表示負(fù)載數(shù)據(jù)是否masked。如果為1,masking-key包含一個(gè)key,用來unmask負(fù)載
數(shù)據(jù)。所有從客戶端方向發(fā)送的數(shù)據(jù),該位必須置1。
*Playload length: * 7比特,7+16比特, 或者7+64比特
0-125表示負(fù)載數(shù)據(jù)的長度。
126,接下來的兩個(gè)字節(jié)為16位無符號整型表示負(fù)載數(shù)據(jù)長度。
127, 接下來的8個(gè)字節(jié)為64為無符號整型表示負(fù)載數(shù)據(jù)長度。
Masking key: 0或者4字節(jié)
如果mask標(biāo)志為1時(shí)存在,保存mask key。
Payload data: 負(fù)載數(shù)據(jù)。
關(guān)閉握手過程關(guān)閉握手比連接握手簡單的多,連接的任何一端都可以發(fā)送一個(gè)close frame,
開始關(guān)閉握手,收到這個(gè)control frame的端發(fā)送一個(gè)close frame響應(yīng),
另一端收到這個(gè)close frame后關(guān)閉連接。
一端發(fā)送close frame后就表示這個(gè)連接將會(huì)被關(guān)閉并且不會(huì)再發(fā)送任何數(shù)據(jù)到另一端, 對端
收到close frame后知道這個(gè)連接將會(huì)被關(guān)閉,后續(xù)收到的數(shù)據(jù)都會(huì)被丟棄。
websocket關(guān)閉握手的目的是完善TCP的關(guān)閉握手,因?yàn)樵诙说蕉说那榫癟CP的關(guān)閉握手并不
總是可信賴的,尤其端到端中間有代理或者防火墻的情況下。
通過發(fā)送一個(gè)close frame然后等待響應(yīng),這種方式避免了不必要的數(shù)據(jù)丟失。
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,但
不是為流媒體設(shè)計(jì)的。
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
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/39407.html
摘要:握手結(jié)束后,雙方就可以進(jìn)行雙向通訊了,所有的通訊內(nèi)容都以數(shù)據(jù)幀格式來傳輸。數(shù)據(jù)幀比特表示一個(gè)中的最后一個(gè)。每個(gè)比特必須為,后續(xù)擴(kuò)展使用。比特表示負(fù)載數(shù)據(jù)是否?;蛘咦止?jié)如果標(biāo)志為時(shí)存在,保存。 Websocket 背景 歷史上,如果一個(gè)web應(yīng)用程序需要和server進(jìn)行雙向通信(例如,實(shí)時(shí)聊天和游戲),需要大量的http請求來檢查server的內(nèi)容是否有更新, 同時(shí)也需要很多http請...
摘要:過程涉及到三個(gè)對象,一個(gè)是或,一個(gè)是,另外一個(gè)就是瀏覽器或或其他。在中進(jìn)行配置了,也就是會(huì)執(zhí)行腳本。然后會(huì)給這個(gè)注冊一些監(jiān)聽在收到消息時(shí)會(huì)回調(diào)。發(fā)出一個(gè)消息讓瀏覽器準(zhǔn)備的運(yùn)行環(huán)境在收到消息會(huì)調(diào)用。 第一次在segmentfault寫博客,很緊張~~~公司項(xiàng)目上ReactNative,之前也是沒有接觸過,所以也是一邊學(xué)習(xí)一邊做項(xiàng)目了,最近騰出手來更新總結(jié)了一下RN的Debug的一個(gè)小知識...
摘要:過程涉及到三個(gè)對象,一個(gè)是或,一個(gè)是,另外一個(gè)就是瀏覽器或或其他。在中進(jìn)行配置了,也就是會(huì)執(zhí)行腳本。然后會(huì)給這個(gè)注冊一些監(jiān)聽在收到消息時(shí)會(huì)回調(diào)。發(fā)出一個(gè)消息讓瀏覽器準(zhǔn)備的運(yùn)行環(huán)境在收到消息會(huì)調(diào)用。 第一次在segmentfault寫博客,很緊張~~~公司項(xiàng)目上ReactNative,之前也是沒有接觸過,所以也是一邊學(xué)習(xí)一邊做項(xiàng)目了,最近騰出手來更新總結(jié)了一下RN的Debug的一個(gè)小知識...
摘要:概述本文是系列的第一篇,主要介紹相關(guān)的基礎(chǔ)協(xié)議知識和??蛻舳耸盏巾憫?yīng)后,立即發(fā)起下一次的請求。收到消息通過事件來接收消息。類型則需要傳遞一個(gè)對象作為參數(shù),相關(guān)的內(nèi)容也將在本系列第二篇中進(jìn)行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關(guān)的基礎(chǔ)協(xié)議知識和API。由于WebSocket的相關(guān)介紹在MDN中分布較亂,初學(xué)者不太容易入門,因此通過本文將相關(guān)基礎(chǔ)...
摘要:巧前端基礎(chǔ)進(jìn)階全方位解讀前端掘金我們在學(xué)習(xí)的過程中,由于對一些概念理解得不是很清楚,但是又想要通過一些方式把它記下來,于是就很容易草率的給這些概念定下一些方便自己記憶的有偏差的結(jié)論。 計(jì)算機(jī)程序的思維邏輯 (83) - 并發(fā)總結(jié) - 掘金從65節(jié)到82節(jié),我們用了18篇文章討論并發(fā),本節(jié)進(jìn)行簡要總結(jié)。 多線程開發(fā)有兩個(gè)核心問題,一個(gè)是競爭,另一個(gè)是協(xié)作。競爭會(huì)出現(xiàn)線程安全問題,所以,本...
閱讀 2908·2021-11-11 16:55
閱讀 955·2021-09-28 09:36
閱讀 3807·2021-09-22 15:22
閱讀 2239·2021-09-06 15:12
閱讀 1771·2021-08-19 10:55
閱讀 2896·2019-08-30 12:52
閱讀 503·2019-08-29 14:03
閱讀 1211·2019-08-29 12:27