準備:如果不太瞭解網路的朋友可以先看一下我之前寫的文章 需要了解的網路協議 。
想必大家再做即時通訊業務或需要替代輪訓的時候,肯定聽說過 WebSocket 和 Socket 這兩個東西,我們今天就來簡單說一下這兩者的區別。
WebSocket 是什麼
WebSocket 是一種在單個 TCP 連線上進行全雙工通訊的協議。WebSocket 使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。在 WebSocket API 中,瀏覽器和伺服器只需要完成一次 HTTP 握手,兩者之間就直接可以建立永續性的連線,並進行雙向資料傳輸。
為什麼有了 HTTP 還需要 WebSocket?
一般情況下我們使用 HTTP 有一個很大的缺陷,就是 HTTP 只能由客戶端來主動發起,如果有需要服務端主動通知的業務,就需要輪訓。輪詢的效率低,非常浪費資源。為了解決 Web 端即時通訊的需求就出現了 WebSocket。
WebSocket(2)--為什麼引入WebSocket協議
相容性
WebSocket 最早是在 HTML5 標準中的一部分,基本現代瀏覽器都是支援的,都可以直接使用。雖然是 HTML5 的一部分,但是在瀏覽器之外也有相應的實現。比如 Socket.io 這個庫支援 Java、C++、Swift、Datr ,Python 的 ws4py,C++ 的WebSocket++ 等等。 服務端主流的 Web 容器如 Apache、Nginx、Tomcat 也都支援 WebSocket,還有 WebSocket 服務端框架如 websocketd 等。
Socket 是什麼
Unix 中的 Socket
作業系統中也有使用到 Socket 這個概念用來進行程式間通訊,它和通常說的基於 TCP/IP 的 Socket 概念十分相似,代表了在作業系統中傳輸資料的兩方,只是它不再基於網路協議,而是作業系統本身的檔案系統。
網路中的 Socket
網路中的 Socket 並不是什麼協議,而是為了使用 TCP,UDP 而抽象出來的一層 API,它是位於應用層和傳輸層之間的一個抽象層。Socket 是對 TCP/IP 的封裝;HTTP 是轎車,提供了封裝或者顯示資料的具體形式;Socket 是發動機,提供了網路通訊的能力。在 Unix 一切皆檔案哲學的思想下,Socket 是一種"開啟—讀/寫—關閉"模式的實現,伺服器和客戶端各自維護一個"檔案",在建立連線開啟後,可以向自己檔案寫入內容供對方讀取或者讀取對方內容,通訊結束時關閉檔案。所以如果你想基於 TCP/IP 來構建服務,那麼 Socket API 可能就是你會接觸到的API。
WebSocket 與 Socket 的區別
正如如上所說:
- Socket 是傳輸控制層的介面。使用者可以通過 Socket 來操作底層 TCP/IP 協議族通訊。
- WebSocket 是一個完整應用層協議。
- Socket 更靈活,WebSocket 更易用。
- 兩者都能做即時通訊