WebSocket協(xié)議-原理篇

本篇文章主要講述以下幾點(diǎn):

  • WebSocket的原理與機(jī)制
  • WebSocket與Socket.io
  • WebSocket兼容性

WebSocket的原理與機(jī)制

WebSocket協(xié)議分為兩部分:握手和數(shù)據(jù)傳輸
下面通過(guò)客戶端和服務(wù)端交互的報(bào)文對(duì)比WebSocket通訊與傳統(tǒng)HTTP的不同點(diǎn),主要關(guān)注握手階段。
根據(jù)上面的例子,運(yùn)行之后,new WebSocket實(shí)例化一個(gè)新的WebSocket客戶端對(duì)象,請(qǐng)求WebSocket URL為ws://localhost:8000的服務(wù)器,打開(kāi)控制臺(tái)的NetWork,客戶端WebSocket對(duì)象會(huì)自動(dòng)解析并識(shí)別為WebSocket請(qǐng)求,連接服務(wù)端端口,執(zhí)行雙方握手過(guò)程,來(lái)自客戶端握手發(fā)送數(shù)據(jù)格式如下:

request.png

客戶端發(fā)起的WebSocket連接報(bào)文類似傳統(tǒng)HTTP報(bào)文,其中:

  • Upgrade: websocket
    Connection: Upgrade
    這個(gè)是WebSocket的核心,告訴服務(wù)器,客戶端發(fā)起的是WebSocket類型請(qǐng)求。
  • Sec-WebSocket-Key是WebSocket客戶端發(fā)送的一個(gè) base64編碼的密文,瀏覽器隨機(jī)生成,要求服務(wù)端必須返回一個(gè)對(duì)應(yīng)加密的Sec-WebSocket-Accept應(yīng)答,否則客戶端會(huì)拋出Error during WebSocket handshake錯(cuò)誤,并關(guān)閉連接。
  • Sec-WebSocket-Version 是告訴服務(wù)器所使用的 Websocket 協(xié)議版本

服務(wù)端收到報(bào)文后會(huì)返回下列東西,表示已經(jīng)接收到請(qǐng)求,WebSocket建立成功,來(lái)自服務(wù)器的握手如下:
response.png
  • Upgrade: websocket
    Connection: Upgrade
    告訴客戶端即將升級(jí)的是WebSocket協(xié)議
  • Sec-WebSocket-Accept的值是服務(wù)端采用與客戶端一致的密鑰計(jì)算出來(lái)后返回客戶端的

至此,HTTP已經(jīng)完成它所有工作,接下來(lái)就是完全按照Websocket協(xié)議進(jìn)行了。

通過(guò)查看WebSocket的原理,與HTTP對(duì)比,得出結(jié)論:
HTTP長(zhǎng)連接中,每次數(shù)據(jù)交換除了真正的數(shù)據(jù)部分外,服務(wù)器和客戶端還要大量交換HTTP header,信息交換效率很低。Websocket協(xié)議通過(guò)第一個(gè)請(qǐng)求建立了TCP連接之后,之后交換的數(shù)據(jù)都不需要發(fā)送 HTTP header就能交換數(shù)據(jù),這顯然和原有的HTTP協(xié)議有區(qū)別,所以它需要對(duì)服務(wù)器和客戶端都進(jìn)行升級(jí)才能實(shí)現(xiàn)(主流瀏覽器都已支持HTML5)。此外還有 multiplexing、不同的URL可以復(fù)用同一個(gè)WebSocket連接等功能。這些都是HTTP長(zhǎng)連接不能做到的。

WebSocket與Socket.io

我們?cè)谑褂肳ebSocket協(xié)議時(shí)通常不會(huì)使用它的API來(lái)實(shí)現(xiàn),而是借助于Socket.io,Socket.io是一個(gè)WebSocket庫(kù),包括客戶端的js和服務(wù)端的nodejs,它的目標(biāo)是構(gòu)建可以在不同瀏覽器和移動(dòng)設(shè)備上使用的實(shí)時(shí)應(yīng)用。它會(huì)自動(dòng)根據(jù)瀏覽器從WebSocket、AJAX長(zhǎng)輪詢等各種方式中選擇最佳的方式來(lái)實(shí)現(xiàn)網(wǎng)絡(luò)實(shí)時(shí)應(yīng)用,也就是說(shuō)如果瀏覽器對(duì)WebSocket兼容性差,Socket.io會(huì)自動(dòng)選擇最佳方式實(shí)現(xiàn)實(shí)時(shí)通信,非常方便和人性化。
Socket.io官方文檔:https://socket.io/get-started/chat/

WebSocket兼容性

WebSocket兼容幾乎所有現(xiàn)代瀏覽器,IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+
socket.io對(duì)瀏覽器做了很好的兼容。

下一篇講述Socket.io客戶端API

參考文檔:https://www.zhihu.com/question/20215561

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • WebSocket簡(jiǎn)介 談到Web實(shí)時(shí)推送,就不得不說(shuō)WebSocket。在WebSocket出現(xiàn)之前,很多網(wǎng)站為...
    吧啦啦小湯圓閱讀 8,331評(píng)論 15 75
  • WebSocket 機(jī)制 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,能更...
    勇敢的_心_閱讀 2,380評(píng)論 0 4
  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢(mèng)敢當(dāng)閱讀 9,032評(píng)論 0 50
  • 端午節(jié)那天依然給我打電話說(shuō)一塊吃飯,中午我專門去超市買了粽子和零食去了她家。 依然是我比較要好的一個(gè)朋友,大學(xué)畢業(yè)...
    偲羽閱讀 817評(píng)論 0 1
  • 猶豫了很久 還是鼓起勇氣上去輕聲對(duì)他說(shuō)“千璽 能請(qǐng)你給我簽個(gè)名嗎” 我是他同學(xué) 不是私生 他轉(zhuǎn)學(xué)過(guò)來(lái)沒(méi)多久我就淪陷...
    宅宅宅男_閱讀 316評(píng)論 0 0

友情鏈接更多精彩內(nèi)容