WebSocket 握手

admin發表於2019-05-01

關於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:伺服器選擇的一個應用層協議。

相關文章