WebSocket 握手
關於WebSocket優點可以參閱WebSocket 用法詳解一章節。
Websocket是為解決web伺服器與客戶端瀏覽器全雙工通訊的問題而設計的,在訪問速度上也有諸多優勢。
具有ws和wss協議,分別為普通請求和基於SSL的安全傳輸;websocket基於http協議,因為它借用了一部分為http請求頭資訊來進行驗證和請求的的。
協議包含兩個部分:
(1).握手。
(2).資料傳輸。
本章節單獨介紹一下“握手”的相關內容。
一.Websocket URI:
定義Websocket URI與HTTP URI非常類似。
語法結構:
[JavaScript] 純文字檢視 複製程式碼ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ] wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]
預設埠(ws預設80埠,wss預設443埠)和path部分是可以省略的。
程式碼如下:
[JavaScript] 純文字檢視 複製程式碼ws://localhost:8181 wss://localhost:8181
二.握手:
1.傳送握手請求:
每個WebSocket連線都始於一個HTTP請求,該請求和其他請求很相似,但包含一個特殊的首標—Upgrade。
Upgrade首標表示客戶端將把連線升級到不同的協議,這個協議就是WebSocket。
[HTML] 純文字檢視 複製程式碼GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
上面是客戶端傳送到伺服器的握手請求,分析如下:
(1).在握手完成之前,WebSocket會話遵循HTTP/1.1協議。
(2).Upgrade: 用於告知伺服器HTTP連線是升級的Websocket連線。
(3).Connection: 用於告知伺服器當前請求連線是升級的。
(4).Origin:此欄位是用來防止客戶端瀏覽器使用指令碼進行未授權的跨源攻擊,這個欄位在WebSocket協議中非常重要。伺服器要根據這個欄位判斷是否接受客戶端的Socket連線。返回一個HTTP錯誤狀態碼來拒絕連線。
(5).Sec-WebSocket-Key:為了表示伺服器同意和客戶端進行Socket連線,伺服器端需要使用客戶端傳送的這個Key進行校驗,然後返回一個校驗過的字串給客戶端,客戶端驗證通過後才能正式建立Socket連線。伺服器驗證方法是:首先進行 Key + 全域性唯一標示符(GUID)“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”連線起來,然後將連線起來的字串使用SHA-1雜湊加密,再進行base64加密,將得到的字串返回給客戶端作為握手依據。其中GUID是一個對於不識別WebSocket的網路端點不可能使用的字串。
2.返回握手應答:
伺服器返回正確的相應頭後,客戶端驗證後將建立連線,此時狀態為OPEN。
伺服器響應頭如下:
[HTML] 純文字檢視 複製程式碼HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo= Sec-WebSocket-Protocol: chat
上述響應頭欄位被客戶端瀏覽器解析,如果驗證到Sec-WebSocket-Accept欄位的資訊符合要求就會建立連線,同時可以傳送WebSocket資料幀。如果該欄位不符合要求或者為空或者HTTP狀態碼不為101,就不會建立連線。
分析如下:
(1).首行返回的是HTTP/1.1協議版本和狀態碼101,表示變換協議(Switching Protocol)
(2).Upgrade 和 Connection:這兩個欄位是伺服器返回的告知客戶端同意使用升級並使用websocket協議,用來完善HTTP升級響應
(3).Sec-WebSocket-Accept:伺服器將加密後的Key通過此欄位返回客戶端表示伺服器同意握手建立連線。
(4).Sec-Websocket-Procotol:伺服器選擇的一個應用層協議。
相關文章
- 【譯】WebSocket協議第四章——連線握手(Opening Handshake)Web協議
- TCP 的 三次握手 四次握手TCP
- TCP:三次握手、四次握手、backlog及其他TCP
- WebSocketWeb
- 【譯】WebSocket協議第三章——WebSocket網址(WebSocket URIs)Web協議
- WebSocket的故事(一)—— WebSocket的由來Web
- 深入淺出Websocket(一)Websocket協議Web協議
- WebSocket 用法Web
- WebSocket APIWebAPI
- go websocketGoWeb
- FastAPI WebSocketASTAPIWeb
- 初探websocketWeb
- WebSocket 教程Web
- Golang 官方認可的 websocket 庫-gorilla/websocketGolangWeb
- WebSocket於HTTP 、WebSocket與Socket的區別WebHTTP
- WebSocket原理與實踐(二)---WebSocket協議Web協議
- TCP三次握手原理TCP
- 三次握手機制
- 前端系列-三次握手前端
- TCP建立連線三次握手和釋放連線四次握手TCP
- 深入淺出Websocket(二)分散式Websocket叢集Web分散式
- Sanic WebSocket 使用Web
- WebSocket 入門Web
- websocket及延展Web
- websocket使用(vue)WebVue
- 簡說websocketWeb
- webSocket筆記Web筆記
- websocket初次使用Web
- WebSocket簡介Web
- go websocket心跳GoWeb
- WebSocket探祕Web
- websocket封裝Web封裝
- Java-WebSocketJavaWeb
- WebSocket協議Web協議
- nginx代理websocketNginxWeb
- nginx 代理websocketNginxWeb
- 淺談WebSocketWeb
- websocket連線Web