1. 程式人生 > >websocket協議簡介

websocket協議簡介

最近要做一個類似網路實時聊天系統的測試, 問了開發基本是基於websocket實現的, 於是週末花了點時間來了解下websocket協議的相關介紹, 在這裡做一個簡單的整理與總結.

什麼是websocket

在實時通訊的場景中(例如實時重新整理股票或者聊天室等情況), 如若使用http協議, 在每次更新資料時都需要客戶端主動向服務端發起請求, 想想一下這裡會有什麼缺點?

  1. http請求會帶上head資訊,head資訊頭佔空間比較大, 傳輸時佔頻寬資源;
  2. 服務端無法主動同步資料到客戶端;
  3. 客戶端必須輪詢get服務端資料, 浪費效能, 要麼輪詢是服務端資料並沒有更新,獲取不到新資料, 要麼服務端資料更新太快, 客戶端請求跟不上, 無法做到實時更新;

於是就有了websocket協議, 它就是為了這一類場景而設計的全雙工通訊協議(客戶端與服務端), 只有最一開始的握手需要通過http請求建立tcp通訊同道, 而後直接通過websocket協議進行資料傳輸, 節省了頻寬資源以及伺服器資源.

其他:

  1. websocket是HTML5一種新的協議.
  2. websocket是應用層協議, 位於傳輸層tcp協議之上.
  3. websockethttp使用相同的tcp埠, ws開頭預設埠為80, wss(SSL加密)預設埠為443.

websocket通訊過程

協議分為2個部分, 握手階段資料通訊階段.
1. 客戶端與服務端使用tcp3次握手建立連線, 完成tcp握手階段
2. 連線成功後, 客戶端會通過HTTP/1.1 協議的101狀態碼與伺服器進行握手, 請求如下

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

主要是告訴服務端需要使用webscoket協議通訊,並告知websocket的版本號, 其中UpgradeConnection欄位必須設定要設定, 伺服器接受到請求迴應如下:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Location: ws://example.com/

以上即表示websocket握手完成.
3. 進行資料通訊.

http和websocket的關係

相同點:

  • 都是基於TCP的應用層協議

不同點

  • http協議是非持久化的,單向的網路協議,在建立連線後只允許瀏覽器向伺服器發出請求後,伺服器才能返回相應的資料
  • websocket是持久化的全雙工通訊協議, 支援雙向傳送或接收訊息.
  • websocket需要通過http握手建立.

1張圖理解http和websocket互動方式, 如下:
這裡寫圖片描述

socket與websocket的關係

實際上, socket並不是協議, 是應用層與tcp/ip協議族通訊的中間軟體抽象層, 只是tcp/ip協議的封裝, 位於應用層和傳輸控制層之間的一組介面. 通常2臺主機通訊時, 必須呼叫socket進行連線, 其底層其實就是tcp/ip協議. 如下圖
這裡寫圖片描述