Socket、Websocket
講到socket與 websocket 首先要講軟體通訊過程 軟體通訊有七層結構(osi模型)中由協議套協議最終組成最高階應用層協議(http等等),下三層結構偏向與資料通訊,上三層更偏向於資料處理,中間的傳輸層則是連線上三層與下三層之間的橋樑,每一層都做不同的工作,上層協議依賴與下層協議。 七層結構的最主要功能就是幫助不同系統的主機在不同的網路中進行資料傳輸。 資料傳輸層:tcp、udp協議,tcp協議依賴網際網路協議(ip協議)
一、Socket
Socket是什麼呢?
Socket是應用層與TCP/IP協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,Socket其實就是一個門面模式,它把複雜的TCP/IP協議族隱藏在Socket介面後面,對使用者來說,一組簡單的介面就是全部,讓Socket去組織資料,以符合指定的協議。
Socket其實並不是一個協議。它工作在 OSI 模型會話層(第5層),是為了方便大家直接使用更底層協議(一般是TCP或UDP)而存在的一個抽象層。Socket更像是一種網路程式設計的概念,是抽象出來的。Socket又分為UDP和TCP Socket. 當兩臺主機通訊時,必須通過Socket連線,Socket則利用TCP/IP協議建立TCP連線。TCP連線則更依靠於底層的IP協議,IP協議的連線則依賴於鏈路層等更低層次。
一般我們用TCP Socket稍多先從伺服器端說起。伺服器端先初始化Socket,然後與埠繫結(bind),對埠進行監聽(listen),呼叫accept阻塞,等待客戶端連線。在這時如果有個客戶端初始化一個Socket,然後連線伺服器(connect),如果連線成功,這時客戶端與伺服器端的連線就建立了。客戶端傳送資料請求,伺服器端接收請求並處理請求,然後把迴應資料傳送給客戶端,客戶端讀取資料,最後關閉連線,一次互動結束。

Socket抽象層示意圖
二、Websocket
WebSocket protocol 是HTML5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要藉助HTTP請求完成。
WebSocket 是為了滿足基於 Web 的日益增長的實時通訊需求而產生的。在傳統的 Web 中,要實現實時通訊,通用的方式是採用 HTTP 協議不斷髮送請求。但這種方式即浪費頻寬(HTTP HEAD 是比較大的),又消耗伺服器 CPU 佔用(沒有信息也要接受請求)。
WebSocket API是HTML5標準的一部分, 但這並不代表 WebSocket 一定要用在 HTML 中,或者只能在基於瀏覽器的應用程式中使用。實際上,許多語言、框架和伺服器都提供了 WebSocket 支援。
連線過程 —— 握手過程
1. 瀏覽器、伺服器建立TCP連線,三次握手。這是通訊的基礎,傳輸控制層,若失敗後續都不執行。
2. TCP連線成功後,瀏覽器通過HTTP協議向伺服器傳送WebSocket支援的版本號等資訊。(開始前的HTTP握手)
3. 伺服器收到客戶端的握手請求後,同樣採用HTTP協議回饋資料。
4. 當收到了連線成功的訊息後,通過TCP通道進行傳輸通訊。
WebSocket與HTTP的關係
相同點
1. 都是一樣基於TCP的,都是可靠性傳輸協議。
2. 都是應用層協議。
不同點
1. WebSocket是雙向通訊協議,模擬Socket協議,可以雙向傳送或接受資訊。HTTP是單向的。
2. WebSocket是需要握手進行建立連線的。
聯絡
WebSocket在建立握手時,資料是通過HTTP傳輸的。但是建立之後,在真正傳輸時候是不需要HTTP協議的。
三、Socket與WebSocket區別
Socket是傳輸控制層協議,WebSocket是應用層協議。
WebSocket 是 HTML5 一種新的協議。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊,它建立在 TCP 之上,同 HTTP 一樣通過 TCP 來傳輸資料,但是它和 HTTP 最大不同是:
WebSocket 是一種雙向通訊協議,在建立連線後,WebSocket 伺服器和 Browser/Client Agent 都能主動的向對方傳送或接收資料,就像 Socket 一樣;
WebSocket 需要類似 TCP 的客戶端和伺服器端通過握手連線,連線成功後才能相互通訊。