1. 程式人生 > >WebSocket 入門概念基礎 及 HTTP輪詢簡介

WebSocket 入門概念基礎 及 HTTP輪詢簡介

WebSocket 是一種網路通訊協議,很多高階功能都需要它。


百度百科解析:

WebSocket協議是基於TCP的一種新的網路協議。它實現了瀏覽器與伺服器全雙工(full-duplex)通訊——允許伺服器主動傳送資訊給客戶端

目錄

一、為什麼需要 WebSocket? 

二、WebSocket 的誕生 

三、接下來先分析一下http解決雙工常用方法(前面所提的輪詢)

四、websocket 技術特點


一、為什麼需要 WebSocket? 

初次接觸 WebSocket 的人,都會問同樣的問題:我們已經有了 HTTP 協議,為什麼還需要另一個協議?它能帶來什麼好處?

答案很簡單,因為 HTTP 協議有一個缺陷:通訊只能由客戶端發起。

HTTP 協議這個缺陷的原因:

  • 瞭解計算機網路協議的人,應該都知道:HTTP 協議是一種無狀態的、無連線的、單向的應用層協議。它採用了請求/響應模型。通訊請求只能由客戶端發起,服務端對請求做出應答處理。
  • 這種通訊模型有一個弊端:HTTP 協議無法實現伺服器主動向客戶端發起訊息。
  • 這種單向請求的特點,註定了如果伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。大多數 Web 應用程式將通過頻繁的非同步JavaScript和XML(AJAX)請求實現長輪詢。輪詢的效率低,非常浪費資源(因為必須不停連線,或者 HTTP 連線始終開啟)。
  • ——"輪詢解析"——:每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。最典型的場景就是聊天室。

 

二、WebSocket 的誕生 

WebSocket 協議在2008年誕生,2011年成為國際標準。所有瀏覽器都已經支援了。

WebSocket 連線允許客戶端和伺服器之間進行全雙工通訊以便任一方都可以通過建立的連線將資料推送到另一端。WebSocket 只需要建立一次連線,就可以一直保持連線狀態。這相比於輪詢方式的不停建立連線顯然效率要大大提高。


 

三、接下來先分析一下http解決雙工常用方法(前面所提的輪詢)

  1. ajax輪詢
  2. 長輪詢

1,橋樑技術 -- ajax輪詢

ajax輪詢 的原理非常簡單,讓瀏覽器隔個幾秒就傳送一次請求,詢問伺服器是否有新資訊。

場景再現:

客戶端:啦啦啦,有沒有新資訊(Request)

服務端:沒有(Response)

客戶端:啦啦啦,有沒有新資訊(Request)

服務端:沒有。。(Response)

客戶端:啦啦啦,有沒有新資訊(Request)

服務端:你好煩啊,沒有啊。。(Response)

客戶端:啦啦啦,有沒有新訊息(Request)

服務端:好啦好啦,有啦給你。(Response)

客戶端:啦啦啦,有沒有新訊息(Request)

服務端:。。。。。沒。。。。沒。。。沒有(Response) ---- loop

2,橋樑技術 -- 長輪詢

long poll 其實原理跟 ajax輪詢 差不多,都是採用輪詢的方式,不過採取的是阻塞模型(一直打電話,沒收到就不掛電話),也就是說,客戶端發起連線後,如果沒訊息,就一直不返回Response給客戶端。直到有訊息才返回,返回完之後,客戶端再次建立連線周而復始。

場景再現

客戶端:啦啦啦,有沒有新資訊,沒有的話就等有了才返回給我吧(Request)

服務端:額。。 等待到有訊息的時候。。來 給你(Response)

客戶端:啦啦啦,有沒有新資訊,沒有的話就等有了才返回給我吧(Request) -loop


 

四、websocket 技術特點

它的最大特點就是,伺服器可以主動向客戶端推送資訊,客戶端也可以主動向伺服器傳送資訊,是真正的雙向平等對話,屬於伺服器推送技術的一種,相比於輪詢方式的不停建立連線顯然效率要大大提高。

其他特點包括:

(1)建立在 TCP 協議之上,伺服器端的實現比較容易。

(2)與 HTTP 協議有著良好的相容性預設埠也是80和443,並且握手階段採用 HTTP 協議,因此握手時不容易遮蔽,能通過各種 HTTP 代理伺服器

(3)資料格式比較輕量,效能開銷小,通訊高效。

(4)可以傳送文字,也可以傳送二進位制資料(圖片、語音、文件等)。

(5)沒有同源限制,客戶端可以與任意伺服器通訊。

(6)協議識別符號是ws(如果加密,則為wss),伺服器網址就是 URL

ws://example.com:80/some/path

 


參考來源於:

http://www.ruanyifeng.com/blog/2017/05/websocket.html

https://www.java-mindmap.com/channel/7