国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

WebSocket協議 8 問

jaysun / 3245人閱讀

摘要:是個不太干凈協議。目前此協議的受眾的也不僅僅是開發者。借助協議進行握手,握手成功后,就會變身為通道,從此與不再相見。如此操作,可以盡量避免普通請求被誤認為協議。它包含四個事件和兩個動作發送和關閉。有類似協議的幀格式,在此不做過多解釋。

WebSocket是一種比較新的協議,它是伴隨著html5規范而生的,雖然還比較年輕,但大多主流瀏覽器都已經支持。它使用方面、應用廣泛,已經滲透到前后端開發的各種場景中。

對http一問一答中二式流程的不滿,催生了支持雙向通信的WebSocket誕生。WebSocket是個不太干凈協議。

一、WebSocket協議只能瀏覽器發起么?

不是。目前此協議的受眾的也不僅僅是web開發者。

WebSocket只是一種協議,它和http協議一樣,使用類似okhttp的組件,可以在任何地方進行調用,甚至可以借助WebSocket實現RPC框架。

二、WebSocket和HTTP什么關系?

WebSocket和http一樣,都是處于OSI模型中的最高層:應用層
WebSocket借助http協議進行握手,握手成功后,就會變身為TCP通道,從此與http不再相見。

使用netstat或者ss,能夠看到對應的連接,它與處于抽象層的socket,在外觀上沒有區別。

三、WebSocket和長輪詢有什么區別?

長輪詢,就是客戶端發送一個請求,服務端將一直在這個連接上等待(當然有一個超長的超時時間),直到有數據才返回,它依然是一個一問一答的模式。比如著名的comted。

WebSocket在握手成功后,就是全雙工的TCP通道,數據可以主動從服務端發送到客戶端,處于鏈接兩端的應用沒有任何區別。

WebSocket創建的連接和Http的長連接是不一樣的。由于Http長連接底層依然是Http協議,所以它還是一問一答,只是Hold住了一條命長點的連接而已。

長輪詢和Http長連接是阻塞的I/O,但WebSocket可以是非阻塞的(具體是多路復用)。

四、如何創建一個連接?

WebSocket的連接創建是借助Http協議進行的。這樣設計主要是考慮兼容性,在瀏覽器中就可以很方便的發起請求,看起來比較具有迷惑性。

下圖是一個典型的由瀏覽器發起的ws請求,可以看到和http請求長的是非常相似的。但是,它只是請求階段長得像而已:

請求的地址,一般是:ws://***,或者是使用了SSL/TLS加密的安全協議wss:,用來標識是WebSocket請求。

1、 首先,通過Http頭里面的Upgrade域,請求進行協議轉換。如果服務端支持的話,就可以切換到WebSocket協議。簡單點講:連接已經在那了,通過握手切換成ws協議,就是切換了連接的一個狀態而已。

1、Connection域可以認為是與Upgrade域配對的頭信息。像nginx等代理服務器,是要先處理Connection,然后再發起協議轉換的。

Sec-WebSocket-Key 是隨機的字符串,服務器端會用這些數據來構造出一個 SHA-1 的信息摘要。如此操作,可以盡量避免普通 HTTP 請求被誤認為 WebSocket 協議。

其他的,像Sec-WebSocket*字樣的頭信息,表明了客戶端支持的子協議以及其他信息。像loT中很流行的mqtt,就可以作為WebSocket的子協議。

使用javascript,可以很容易連接一個WebSocket服務端。

五、如何處理數據?

WebSocket是通過事件通知的方式運行的。它包含四個事件和兩個動作(發送和關閉)。

WebSocket的事件

事件 鉤子 備注
open onopen 連接建立時觸發
message onmessage 客戶端接收服務端數據時觸發
error onerror 通信發生錯誤時觸發
close onclose 連接關閉時觸發

數據可直接通過Socket.send()方法進行傳輸。

通過chrome的Inspect->Network->WS,可以看到頁面上的WebSocket連接。如圖Opcode為2,表明它是一個二進制幀。

WebSocket有類似tcp協議的幀格式,在此不做過多解釋。

參考:(https://tools.ietf.org/html/r...

心跳

心跳對應的ping、pong操作,opcode分別是0x9、0xA。收到心跳的一方需要自行更新心跳的更新時間。同使用Netty,我們到底在開發些什么?介紹的類似,在一些移動環境中,需要更加智能的控制心跳。

六、如何使用Nginx做負載均衡?

nginx官網已經給出了例子。主要是Upgrade和Connection頭的設置。

map $http_upgrade $connection_upgrade {
    default upgrade;
    "" close;
}

location /chat/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

需要注意的是,nginx做負載均衡,不需要配置ip_hash等參數,nginx天然支持。由于ip_hash僅使用ip地址的前三個數字做hash,還有可能造成服務端的不均衡。

七、java服務端怎么實現?

可以實現javax.WebSocket下的包,簡單的實現ws服務端。目前基本可以通過注解的方式去編寫代碼,比如ServerEndpoint

推薦使用基于netty的netty-socketio進行服務端的編寫。由于使用的是netty,所以能夠在多個層面進行切入,獲取一些統計數據,執行一些控制指令。socketio是一套解決方案,它有多個語言的客戶端,并處理了市面上大多數的兼容問題。

八、WebSocket能干些啥? 通知功能

保持一個長連接,當服務端游新的消息,能夠實時的推送到使用方。像知乎的點贊通知、評論等,都可以使用WebSocket通信。

某些使用H5的客戶端,為了簡化開發,也會使用WebSocket進行消息的通知,由于它是實時推送的,會有更好的用戶體驗。

數據收集

一些次優級別的數據,比如行為日志、trace、異常執棧收集等,都可以開辟專門的WebSocket通道進行傳輸。這能夠增加信息的集中度,并能及時的針對用戶的行為進行合適的配置推送。由于大多數瀏覽器內核都支持,它將使客戶端APM編程模型變得簡單。

加密 && 認證

雖然使用Fiddler、Charles等能夠抓到很多WebSocket包。但如果同時開啟SSL,傳輸加密后的二進制數據,會大幅增加破解的成本,會安全的多。

反向控制鉤子

這個...由于是雙工長連接,服務端完全可以推送一些鉤子命令,甚至直接是代碼,在客戶端進行執行。比如截個屏,錄個音,種個小馬。用戶只要通過了授權申請,剩下的就隨你發揮了。

支付寶偷偷調用你的相機給你拍照的梗,我是相信的。

End

想當年,cometd的出現,驚為天人,振奮了很久。但技術日新月異,cometd已經衰老,而Socket.io得到了快速發展。WebSocket經過一段時間的混沌期,規范已經越來越完善,使用也越來越方便,不需要再處理那么多的兼容。

但它的本質,還是新瓶裝舊酒,換湯不換藥。WebSocket的發展得益于HTML5規范的制定。規范的意義,就是約束廠商們天馬行空的實現,以及指明發展的方向。

這當然有典型的反例,那就是ie。現在,只有一群公認的**,還堅持在用。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/74020.html

相關文章

  • nodejs + websocket (socket.io)

    摘要:協議做不到服務器主動向客戶端推送信息。這種單向請求的特點,注定了如果服務器有連續的狀態變化,客戶端要獲知就非常麻煩。雙向通信,服務器可以向客戶端主動發送數據。數據格式比較輕量,性能開銷小,通信高效。 為什么需要 WebSocket? 因為個人對概念理解不是很深,文字表達能力不強,如果有關HTTP等方面描述不準確,歡迎糾正,謝謝大家 初次接觸 WebSocket 的人,都會問同樣的問題:...

    awkj 評論0 收藏0
  • socket.io原理和實戰

    摘要:就是為了解決這一問題產生的,現在已經寫入標準,主流瀏覽器基本支持。 由于最近寫項目要使用socekt.io技術,于是研究了一段時間,把自己早期學習階段寫的小游戲改造了一下,變成了一個比較完整的小程序。點擊這里可以體驗游戲,建議使用手機模式查看,也可以下載打包好的webapp,安卓版已上架酷安市場,掃碼可下載體驗: showImg(https://segmentfault.com/img...

    ivyzhang 評論0 收藏0
  • 前端面試之websocket

    摘要:服務器將資源復本寫到套接字,由客戶端讀取。釋放連接連接服務器主動關閉套接字,釋放連接客戶端被動關閉套接字,釋放連接。使用約定好的計算握手消息,并使用生成的隨機數對消息進行加密,最后將之前生成的所有信息發送給網站。 還是同以往一樣,面試會考到的地方,我都會做出標記,websocket如何在前端如何用的,這個得用,別這個都不知道,那這個教程就沒用了。如果你想對其原理進行深入了解,那么本教程...

    codeGoogle 評論0 收藏0

發表評論

0條評論

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