websocket協議簡介
阿新 • • 發佈:2019-01-24
最近要做一個類似網路實時聊天系統的測試, 問了開發基本是基於websocket實現的, 於是週末花了點時間來了解下websocket協議的相關介紹, 在這裡做一個簡單的整理與總結.
什麼是websocket
在實時通訊的場景中(例如實時重新整理股票或者聊天室等情況), 如若使用http協議, 在每次更新資料時都需要客戶端主動向服務端發起請求, 想想一下這裡會有什麼缺點?
- http請求會帶上head資訊,head資訊頭佔空間比較大, 傳輸時佔頻寬資源;
- 服務端無法主動同步資料到客戶端;
- 客戶端必須輪詢get服務端資料, 浪費效能, 要麼輪詢是服務端資料並沒有更新,獲取不到新資料, 要麼服務端資料更新太快, 客戶端請求跟不上, 無法做到實時更新;
於是就有了websocket協議, 它就是為了這一類場景而設計的全雙工通訊協議(客戶端與服務端), 只有最一開始的握手需要通過http請求建立tcp通訊同道, 而後直接通過websocket協議進行資料傳輸, 節省了頻寬資源以及伺服器資源.
其他:
websocket
是HTML5一種新的協議.websocket
是應用層協議, 位於傳輸層tcp
協議之上.websocket
和http
使用相同的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的版本號, 其中Upgrade與Connection欄位必須設定要設定, 伺服器接受到請求迴應如下:
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協議. 如下圖