WebSocket 是什么
WebSocket 是一種在單個 TCP 連接上進行全雙工通信的協議。WebSocket 使得客戶端和服務器之間的數據交換變得更加簡單,允許服務端主動向客戶端推送數據。在 WebSocket API 中,瀏覽器和服務器只需要完成一次 HTTP 握手,兩者之間就直接可以創建持久性的連接(長連接),並進行雙向數據傳輸。
為什么有了 HTTP 還需要 WebSocket?
HTTP協議是非持久化的、單向的網絡協議,HTTP 只能由客戶端來主動發起,也就是說,在建立連接后只允許瀏覽器向服務器發出請求后,服務器才能返回相應的數據。
如果有需要服務端主動通知的業務,就需要通過輪詢在特定的時間間隔(如1秒),由瀏覽器向服務器發送Request請求,然后將服務器中最新的數據返回給瀏覽器。
這樣的方法最明顯的缺點就是:需要不斷的發送請求,尤其是服務器更新頻率低的時候,客戶端的大多數輪詢請求都是無效的,浪費流量和服務器資源,每一次請求、應答,都浪費了一定流量在相同的HTTP頭部信息上。
為了解決這些 Web 端即時通訊的需求就出現了 WebSocket。
相比HTTP長連接,WebSocket有以下特點:
WebSocket是真正的全雙工方式,建立連接后客戶端與服務器端是完全平等的,可以互相主動請求。而HTTP長連接基於HTTP,是傳統的客戶端對服務器發起請求的模式。
HTTP長連接中,每次數據交換除了真正的數據部分外,服務器和客戶端還要大量交換HTTP header,信息交換效率很低。Websocket協議通過第一個request建立了TCP連接之后,之后交換的數據都不需要發送 HTTP header就能交換數據,這顯然和原有的HTTP協議有區別,所以它需要對服務器和客戶端都進行升級才能實現(主流瀏覽器都已支持HTML5)。此外還有 multiplexing、不同的URL可以復用同一個WebSocket連接等功能。這些都是HTTP長連接不能做到的。
WebSocket 協議的 URL 是以 ws:// 開頭,建立連接的時候,客戶端會在HTTP 請求頭中帶上 Upgrade: websocket 來和服務端協商,服務端同意后,返回 101 狀態碼,響應頭中也帶有 Upgrade: websocket,表明后續通信切換到 websocket 協議。如下圖所示:
WebSocket與Socket的關系
Socket其實並不是一個協議,而是為了方便使用TCP或UDP而抽象出來的一層,是位於應用層和傳輸控制層之間的一組接口。
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組API接口。在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議。
當兩台主機通信時,必須通過Socket連接,Socket則利用TCP/IP協議建立TCP連接。TCP連接則更依靠於底層的IP協議,IP協議的連接則依賴於鏈路層等更低層次。
WebSocket則是一個典型的應用層協議。
區別:Socket是傳輸層協議,WebSocket是應用層協議。
HTML5與WebSocket的關系
WebSocket 最早是在 HTML5 標准中的一部分,基本現代瀏覽器都是支持的,都可以直接使用。雖然是 HTML5 的一部分,但是在瀏覽器之外也有相應的實現。比如 Socket.io 這個庫支持 Java、C++、Swift、Datr ,Python 的 ws4py,C++ 的WebSocket++ 等等。
服務端主流的 Web 容器如 Apache、Nginx、Tomcat 也都支持 WebSocket,還有 WebSocket 服務端框架如 websocketd 等。
作者:QuincySx
鏈接:https://juejin.cn/post/6844903805797007374
來源:稀土掘金
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
參考文章
GO實現千萬級WebSocket消息推送服務-慕課網
WebSocket 與 Socket 的區別 - 掘金
websocket和socket的區別是什么-常見問題-PHP中文網
WebSocket的原理及運行機制 - 掘金