成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

淺析websocket

oujie / 3125人閱讀

摘要:握手結(jié)束后,雙方就可以進(jìn)行雙向通訊了,所有的通訊內(nèi)容都以數(shù)據(jù)幀格式來傳輸。數(shù)據(jù)幀比特表示一個中的最后一個。每個比特必須為,后續(xù)擴(kuò)展使用。比特表示負(fù)載數(shù)據(jù)是否?;蛘咦止?jié)如果標(biāo)志為時存在,保存。

Websocket 背景

歷史上,如果一個web應(yīng)用程序需要和server進(jìn)行雙向通信(例如,實(shí)時聊天和游戲),
需要大量的http請求來檢查server的內(nèi)容是否有更新, 同時也需要很多http請求來發(fā)送
通知,這種方式有許多問題:

server端必須使用大量的tcp連接來服務(wù)每一個client:一類連接用來發(fā)送信息給
client, 另一類連接用來接收新的消息。

有大量不必要網(wǎng)絡(luò)開銷,因?yàn)槊恳淮蜗⑼ㄓ嵍级及琱ttp header。

client需要維護(hù)一個map來映射發(fā)送數(shù)據(jù)的連接和接受數(shù)據(jù)的連接。

一個簡單的解決方案就是使用一個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和代理,所以一個端口可以同時服務(wù)HTTP請求和
websocket請求。

請求中Upgrage: websocket表示這是一個websocket請求。服務(wù)端收到該請求后會根據(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比特

表示一個message中的最后一個frame。

RSV1, RSV2, RSV3: 每個1比特

必須為0,后續(xù)擴(kuò)展使用。

Optcode: 4比特

定義負(fù)載數(shù)據(jù)的解析方式。

%x0 表示一個連續(xù)幀。

%x1 表示一個文本幀。

0x2 表示一個二進(jìn)制幀。

0x3-7 保留,以后給非控制幀使用。

0x8 表示連接關(guān)閉。

0x9 表示ping。

0xA 表示pong。

0xB-F 保留,以后給控制幀使用。

Mask: 1比特

表示負(fù)載數(shù)據(jù)是否masked。如果為1,masking-key包含一個key,用來unmask負(fù)載
數(shù)據(jù)。所有從客戶端方向發(fā)送的數(shù)據(jù),該位必須置1。

*Playload length: * 7比特,7+16比特, 或者7+64比特

0-125表示負(fù)載數(shù)據(jù)的長度。

126,接下來的兩個字節(jié)為16位無符號整型表示負(fù)載數(shù)據(jù)長度。

127, 接下來的8個字節(jié)為64為無符號整型表示負(fù)載數(shù)據(jù)長度。

Masking key: 0或者4字節(jié)

如果mask標(biāo)志為1時存在,保存mask key。

Payload data: 負(fù)載數(shù)據(jù)。

關(guān)閉握手過程

關(guān)閉握手比連接握手簡單的多,連接的任何一端都可以發(fā)送一個close frame,
開始關(guān)閉握手,收到這個control frame的端發(fā)送一個close frame響應(yīng),
另一端收到這個close frame后關(guān)閉連接。

一端發(fā)送close frame后就表示這個連接將會被關(guān)閉并且不會再發(fā)送任何數(shù)據(jù)到另一端, 對端
收到close frame后知道這個連接將會被關(guān)閉,后續(xù)收到的數(shù)據(jù)都會被丟棄。

websocket關(guān)閉握手的目的是完善TCP的關(guān)閉握手,因?yàn)樵诙说蕉说那榫癟CP的關(guān)閉握手并不
總是可信賴的,尤其端到端中間有代理或者防火墻的情況下。

通過發(fā)送一個close frame然后等待響應(yīng),這種方式避免了不必要的數(shù)據(jù)丟失。

websocket & nginx

nginx并沒有支持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è)計的。

哪些服務(wù)端支持websocket

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/38246.html

相關(guān)文章

  • 淺析websocket

    摘要:握手結(jié)束后,雙方就可以進(jìn)行雙向通訊了,所有的通訊內(nèi)容都以數(shù)據(jù)幀格式來傳輸。數(shù)據(jù)幀比特表示一個中的最后一個。每個比特必須為,后續(xù)擴(kuò)展使用。比特表示負(fù)載數(shù)據(jù)是否?;蛘咦止?jié)如果標(biāo)志為時存在,保存。 Websocket 背景 歷史上,如果一個web應(yīng)用程序需要和server進(jìn)行雙向通信(例如,實(shí)時聊天和游戲),需要大量的http請求來檢查server的內(nèi)容是否有更新, 同時也需要很多http請...

    fou7 評論0 收藏0
  • React Native Debug原理淺析

    摘要:過程涉及到三個對象,一個是或,一個是,另外一個就是瀏覽器或或其他。在中進(jìn)行配置了,也就是會執(zhí)行腳本。然后會給這個注冊一些監(jiān)聽在收到消息時會回調(diào)。發(fā)出一個消息讓瀏覽器準(zhǔn)備的運(yùn)行環(huán)境在收到消息會調(diào)用。 第一次在segmentfault寫博客,很緊張~~~公司項(xiàng)目上ReactNative,之前也是沒有接觸過,所以也是一邊學(xué)習(xí)一邊做項(xiàng)目了,最近騰出手來更新總結(jié)了一下RN的Debug的一個小知識...

    senntyou 評論0 收藏0
  • React Native Debug原理淺析

    摘要:過程涉及到三個對象,一個是或,一個是,另外一個就是瀏覽器或或其他。在中進(jìn)行配置了,也就是會執(zhí)行腳本。然后會給這個注冊一些監(jiān)聽在收到消息時會回調(diào)。發(fā)出一個消息讓瀏覽器準(zhǔn)備的運(yùn)行環(huán)境在收到消息會調(diào)用。 第一次在segmentfault寫博客,很緊張~~~公司項(xiàng)目上ReactNative,之前也是沒有接觸過,所以也是一邊學(xué)習(xí)一邊做項(xiàng)目了,最近騰出手來更新總結(jié)了一下RN的Debug的一個小知識...

    avwu 評論0 收藏0
  • WebSocket系列之基礎(chǔ)知識入門篇

    摘要:概述本文是系列的第一篇,主要介紹相關(guān)的基礎(chǔ)協(xié)議知識和??蛻舳耸盏巾憫?yīng)后,立即發(fā)起下一次的請求。收到消息通過事件來接收消息。類型則需要傳遞一個對象作為參數(shù),相關(guān)的內(nèi)容也將在本系列第二篇中進(jìn)行介紹。 概述 本文是WebSocket系列的第一篇,主要介紹WebSocket相關(guān)的基礎(chǔ)協(xié)議知識和API。由于WebSocket的相關(guān)介紹在MDN中分布較亂,初學(xué)者不太容易入門,因此通過本文將相關(guān)基礎(chǔ)...

    Yuqi 評論0 收藏0
  • 原理解釋 - 收藏集 - 掘金

    摘要:巧前端基礎(chǔ)進(jìn)階全方位解讀前端掘金我們在學(xué)習(xí)的過程中,由于對一些概念理解得不是很清楚,但是又想要通過一些方式把它記下來,于是就很容易草率的給這些概念定下一些方便自己記憶的有偏差的結(jié)論。 計算機(jī)程序的思維邏輯 (83) - 并發(fā)總結(jié) - 掘金從65節(jié)到82節(jié),我們用了18篇文章討論并發(fā),本節(jié)進(jìn)行簡要總結(jié)。 多線程開發(fā)有兩個核心問題,一個是競爭,另一個是協(xié)作。競爭會出現(xiàn)線程安全問題,所以,本...

    AlphaGooo 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<