websocket介紹與原理
websocket protocol缺點:會導致過多不必要的請求,浪費流量和伺服器資源,每一次請求、應答,都浪費了一定流量在相同的頭部資訊上是html5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duplex)。一開始的握手需要借助http請求完成。
然而websocket的出現可以彌補這一缺點。在websocket中,只需要伺服器和瀏覽器通過http協議進行乙個握手的動作,然後單獨建立一條tcp的通訊通道進行資料的傳送。
原理websocket同http一樣也是應用層的協議,但是它是一種雙向通訊協議,是建立在tcp之上的。
連線過程 —— 握手過程
瀏覽器、伺服器建立tcp連線,三次握手。這是通訊的基礎,傳輸控制層,若失敗後續都不執行。
tcp連線成功後,瀏覽器通過http協議向伺服器傳送websocket支援的版本號等資訊。(開始前的http握手)
伺服器收到客戶端的握手請求後,同樣採用http協議回饋資料。
當收到了連線成功的訊息後,通過tcp通道進行傳輸通訊。
websocket與http的關係
相同點
都是一樣基於tcp的,都是可靠性傳輸協議。
都是應用層協議。
不同點
websocket是雙向通訊協議,模擬socket協議,可以雙向傳送或接受資訊。http是單向的。
websocket是需要握手進行建立連線的。
聯絡
websocket在建立握手時,資料是通過http傳輸的。但是建立之後,在真正傳輸時候是不需要http協議的。
websocket與socket的關係
socket其實並不是乙個協議,而是為了方便使用tcp或udp而抽象出來的一層,是位於應用層和傳輸控制層之間的一組介面。
socket是應用層與tcp/ip協議族通訊的中間軟體抽象層,它是一組介面。在設計模式中,socket其實就是乙個門面模式,它把複雜的tcp/ip協議族隱藏在socket介面後面,對使用者來說,一組簡單的介面就是全部,讓socket去組織資料,以符合指定的協議。
當兩台主機通訊時,必須通過socket連線,socket則利用tcp/ip協議建立tcp連線。tcp連線則更依靠於底層的ip協議,ip協議的連線則依賴於鏈路層等更低層次。
websocket則是乙個典型的應用層協議。
區別
socket是傳輸控制層協議,websocket是應用層協議。
html5與websocket的關係
websocket api 是 html5 標準的一部分, 但這並不代表 websocket 一定要用在 html 中,或者只能在基於瀏覽器的應用程式中使用。
實際上,許多語言、框架和伺服器都提供了 websocket 支援,例如:
websocket 機制
以下簡要介紹一下 websocket 的原理及執行機制。
websocket 是 html5 一種新的協議。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊,它建立在 tcp 之上,同 http 一樣通過 tcp 來傳輸資料,但是它和 http 最大不同是:
websocket 是一種雙向通訊協議,在建立連線後,websocket 伺服器和 browser/client agent 都能主動的向對方傳送或接收資料,就像 socket 一樣;
websocket 需要類似 tcp 的客戶端和伺服器端通過握手連線,連線成功後才能相互通訊。
非 websocket 模式傳統 http 客戶端與伺服器的互動如下圖所示:
圖 1. 傳統 http 請求響應客戶端伺服器互動圖
使用 websocket 模式客戶端與伺服器的互動如下圖:
圖 2.websocket 請求響應客戶端伺服器互動圖
上圖對比可以看出,相對於傳統 http 每次請求-應答都需要客戶端與服務端建立連線的模式,websocket 是類似 socket 的 tcp 長連線的通訊模式,一旦 websocket 連線建立後,後續資料都以幀序列的形式傳輸。在客戶端斷開 websocket 連線或 server 端斷掉連線前,不需要客戶端和服務端重新發起連線請求。在海量併發及客戶端與伺服器互動負載流量大的情況下,極大的節省了網路頻寬資源的消耗,有明顯的效能優勢,且客戶端傳送和接受訊息是在同乙個持久連線上發起,實時性優勢明顯。
我們再通過客戶端和服務端互動的報文看一下 websocket 通訊與傳統 http 的不同:
在客戶端,new websocket 例項化乙個新的 websocket 客戶端物件,連線類似 ws://yourdomain:port/path 的服務端 websocket url,websocket 客戶端物件會自動解析並識別為 websocket 請求,從而連線服務端埠,執行雙方握手過程,客戶端傳送資料格式類似:
清單 1.websocket 客戶端連線報文
可以看到,客戶端發起的 websocket 連線報文類似傳統 http 報文,」upgrade:websocket」引數值表明這是 websocket 型別請求,「sec-websocket-key」是 websocket 客戶端傳送的乙個 base64 編碼的密文,要求服務端必須返回乙個對應加密的「sec-websocket-accept」應答,否則客戶端會丟擲「error during websocket handshake」錯誤,並關閉連線。
服務端收到報文後返回的資料格式類似:
清單 2.websocket 服務端響應報文
「sec-websocket-accept」的值是服務端採用與客戶端一致的金鑰計算出來後返回客戶端的,「http/1.1 101 switching protocols」表示服務端接受 websocket 協議的客戶端連線,經過這樣的請求-響應處理後,客戶端服務端的 websocket 連線握手成功, 後續就可以進行 tcp 通訊了。
在開發方面,websocket api 也十分簡單,我們只需要例項化 websocket,建立連線,然後服務端和客戶端就可以相互傳送和響應訊息,在下文 websocket 實現及案例分析部分,可以看到詳細的 websocket api 及**實現。
websocket 實現
如上文所述,websocket 的實現分為客戶端和服務端兩部分,客戶端(通常為瀏覽器)發出 websocket 連線請求,服務端響應,實現類似 tcp 握手的動作,從而在瀏覽器客戶端和 websocket 服務端之間形成一條 http 長連線快速通道。兩者之間後續進行直接的資料互相傳送,不再需要發起連線和相應。
WebSocket協議介紹
websocket,即web瀏覽器與web伺服器之間全雙工通訊標準,其中,websocket協議由ietf定位標準,websocket api由w3c定位標準。一旦web伺服器與客戶端之間建立起websocket協議的通訊連線,之後所有的通訊都依靠這個專用協議進行。通訊過程中互相傳送json xml...
網路程式設計 ServerSocket與Socket
搭建伺服器 占用埠號 serversocket server newserversocket 55565 等待伺服器連線 socket socket server.accept socket socket newsocket localhost 55565 搭建伺服器 占用埠號 serversock...
WebSocket理解與使用
概念 websocket 是 html5 開始提供的一種在單個 tcp 連線上進行全雙工通訊的協議。特點 websocket 使得客戶端和伺服器之間的資料交換變得更加簡單,允許服務端主動向客戶端推送資料。在 websocket api 中,瀏覽器和伺服器只需要完成一次握手,兩者之間就直接可以建立永續...