WebSocket 詳解

WebSocket 詳解

WebSocket

WebSocket

是一種

支援雙向通訊

網路通訊協議。

意思就是伺服器可以

主動向客戶端推送資訊

,客戶端也可以

主動向伺服器傳送資訊

屬於伺服器推送技術的一種。

特點:

(1)建立在

TCP 協議

之上,伺服器端的實現比較容易。

(2)與

HTTP 協議

有著良好的相容性。預設埠也是80和443,並且

握手階段

採用 HTTP 協議,因此握手時不容易遮蔽,

能透過各種 HTTP 代理伺服器

(3)資料格式比較輕量,效能開銷小,通訊高效。

(4)可以傳送

文字

,也可以傳送

二進位制資料

blob

物件或

Arraybuffer

物件)

(5)收到的資料型別 可以使用binaryType 指定, 顯式指定收到的二進位制資料型別

(6)沒有

同源限制

,客戶端可以與任意伺服器通訊。

(7)協議識別符號是

ws(握手http)

(如果加密,則為

wss(tcp +TLS)

),伺服器網址就是 URL。

WebSocket物件

WebSocket物件

提供了用於

建立和管理WebSocket 連線

,以及可以透過該連線

傳送和接收資料的 API

使用

WebSocket()

建構函式來構造一個

WebSocket

為什麼需要websocket

Hypertext Transfer Protocol (HTTP) 協議

一種

無狀態

的、

應用層

的、以

請求/應答方式執行

的協議,它使用

可擴充套件的語義

自描述訊息格式

,與

基於網路

超文字資訊系統

靈活的互動。

因為http 通訊只能由客戶端發起,伺服器返回查詢結果,HTTP 協議做不到伺服器主動向客戶端推送資訊,

伺服器有連續的狀態變化,客戶端要獲知就非常麻煩。

我們只能使用

輪詢

:每隔一段時候,就發出一個詢問,瞭解伺服器有沒有新的資訊。最典型的場景就是聊天室。

輪詢的效率低,非常浪費資源(因為必須不停連線,或者

HTTP 連線始終開啟

);

WebSocket 詳解

WebSocket 詳解

Chrome 請求列表:分析 WebSocket

過濾器(過濾資源xhr js ws css ws等):

按照型別:ws

屬性過濾:is:running

WebSocket 詳解

WebSocket 詳解

WebSocket 詳解

表格列 Frames

Data: 訊息負載。如果訊息為純文字,直接顯示。二進位制操作嗎顯示操作碼名稱和程式碼(Continuation Frame、 Binanry Frame、 Connection Close Frame、 Ping Frame或者Pong Frame)

Length: 訊息負載的長度 以位元組為單位

Time: 收到或者傳送的時間。

訊息顏色

傳送到伺服器的文字訊息為淺綠色

接收到的文字訊息為白色

WebSocket 操作碼 為淺黃色

錯誤為淺紅色

WebSocket 詳解

WbeSocket 的成本 對比http

1、實時性與可伸縮性。犧牲了簡單性。

2、網路效率與無狀態:請求1基於請求2 犧牲了簡單性與可見性

WebSocket 詳解

WebSocket 詳解

websocket 的心跳保持 對比http

(http 長連線只能基於簡單的超時(常見為65s))

websocket 連結基於

ping/pong 心跳機制維持

設計哲學:在web約束下暴露tcp 給上層

元資料

http 協議頭部會存放元資料。

websocket 上傳輸的應用層存放元資料

基於幀:不是基於位元組流(http, tcp)

每一幀要麼存放

字元資料

,要麼承載

二進位制

資料

基於瀏覽器的同源策略模型個(非瀏覽器無效)

可以使用Access-Control-Allow-Origin 等頭部

基於

URI

子協議

支援

同主機``同埠

上的多個服務

幀格式示意圖

ABNF 描述的幀格式

WebSocket 詳解

ws-frame = frame-fin ; 1 bit in length

frame-rsv1 ; 1 bit in length

frame-rsv2 ; 1 bit in length

frame-rsv3 ; 1 bit in length

frame-opcode ; 4 bits in length

frame-masked ; 1 bit in length

frame-payload-length ; 3 種長度

[ frame-masking-key ] ; 32 bits in length

frame-payload-data ; n*8 bits in ; length, where ; n >= 0

複製程式碼

紅色: 2 位元組必然存在的幀首部

WebSocket 詳解

資料幀格式:Rsv 保留值

RSV1/RSV2/RSV3:預設為 0,僅當使用 extension 擴充套件時,由擴充套件決定其值

WebSocket 詳解

資料幀格式:幀型別

WebSocket 詳解

持續幀

0: 繼續前一幀

非控制幀

1:文字幀(utf-8)

2:二進位制幀

3-7: 為非控制幀保留

控制幀 8: 關閉幀 9: 心跳幀ping A: 心跳幀pong B-F:控制幀保留

URI 格式

1、ws-uri:

ws://[host][:port][path][?query]

埠port預設 80

2、wss-uri:

wss://[host][:port][path][?query]

埠port 預設443

客戶端提供資訊

host、port 主機埠

schema: 是否基於SSL

訪問的資源:uri

握手隨機數:Sec-WebSocket-Key

選擇的子協議:Sec-WebSocket-Protocol

擴充套件協議:Sec-WebSocket-Extensions

CORS:Origin

WebSocket 詳解

WebSocket 詳解

如何證明握手被伺服器接受?預防意外

請求中的 Sec-WebSocket-Key 隨機數

Sec-WebSocket-Key: A1EEou7Nnq6+BBZoAZqWlg== 響應中的 Sec-WebSocket-Accept 證明值

GUID(RFC4122):258EAFA5-E914-47DA-95CA-C5AB0DC85B11

值構造規則:BASE64(SHA1(Sec-WebSocket-KeyGUID))

拼接值:A1EEou7Nnq6+BBZoAZqWlg==258EAFA5-E914-47DA-95CA-C5AB0DC85B11

SHA1 值:713f15ece2218612fcadb1598281a35380d1790f

BASE 64 值:cT8V7OIhhhL8rbFZgoGjU4DReQ8=

最終頭部:Sec-WebSocket-Accept: cT8V7OIhhhL8rbFZgoGjU4DReQ8=

文章分類

轉自

:https://juejin。cn/post/6989539483695710215