webSocket實時傳輸協議

2021-07-28 11:28:41 字數 3002 閱讀 3591

公司的慣例是每週五都會有乙個分享會,內容大概是前端,後台,軟體思想,工具使用,設計等,大家坐在一起聽一聽,說一說,交流一下。

這次是我給大家講websocket傳輸協議。

最初對websocket的印象是:它是一種實時的,用於網上實時聊天。例如qq.

那麼,websocket是什麼東西?真實時?那底層是不是還是輪訓 輪詢?和http的長連線有什麼不同?(這些問題對於我來說有點難度啊)

那麼趕緊去看文件,文件很重要很重要。這裡根據他的文章找到兩個鏈結,都是中文版,rfc6455:

關鍵字搜尋websocket出現如下資訊:

websocket protocol 是html5一種新的協議。它實現了瀏覽器與伺服器全雙工通訊(full-duple)。一開始的握手需要借助http請求完成。

全雙工(full

-duplex transmissions)

:是指交換機在傳送資料的同時也能夠接收資料,兩者同步進行,

這好像我們平時打**一樣,說話的同時也能夠聽到對方的聲音。目前的交換機都支援全雙工

優點:延遲小,速度快。

輪詢:輪詢是在特定的的時間間隔(如每

1秒),由瀏覽器對伺服器發出

,然後由伺服器返回最新的資料給客服端的瀏覽器。

輪詢會造成對網路和通訊雙方資源的浪費,並且非實時。

那麼從實時的角度,websocket底層就不是輪詢。

websocket是基於http協議的,借用http握手,比http多了兩個東西。

upgrade:

websocket

connection: upgrade

websocket協議:由握手和資料傳輸這兩部分組成。

握手:get /chat http/1.1            //1  

host: server.example.com   //2

upgrade: websocket            //3

upgrade是

中用於定義轉換協議的

header域。

它表示,如果伺服器支援的話,客戶端希望使用現有的「網路層」已經建立好的這個「連線(此處是tcp連線)」,

切換到另外乙個「應用層」(此處是websocket)協議。

connection: upgrade            //4

http1.1中規定

upgrade

只能應用在「直接連線」中,所以帶有

upgrade

頭的http1.1

訊息必須含有

connection頭,

因為connection頭的意義就是,任何接收到此訊息的人(往往是**伺服器)都要在**此訊息之前處理掉

connection

中指定的域(不**

upgrade

域)。

如果客戶端和伺服器之間是通過**連線的,那麼在傳送這個握手訊息之前首先要傳送connect訊息來建立直接連線。

sec-websocket-key: dghlihnhbxbszsbub25jzq==            //5

origin:            //6

作安全使用,防止跨站攻擊,瀏覽器一般會使用這個來標識原始域

sec-websocket-protocol: chat, superchat            //7

sec-websocket-version: 13            //8

第7行標識了客戶端支援的子協議的列表(關於子協議會在下面介紹),

第8行標識了客戶端支援的

ws協議的版本列表,

第5行用來傳送給伺服器使用(伺服器會使用此欄位組裝成另乙個

key值放在握手返回資訊裡傳送客戶端)。

資料傳輸:

資料傳輸使用的是一系列的資料幀,並且要進行掩碼處理,

fin:1bit,表示是訊息的最後一幀,如果訊息只有一幀,那第一幀就是最後一幀。

rsv1,rsv2,rsv3:每個

1bit,

且必須是

0,除非擴充套件定義為非零。如果接收到的是非零,但擴充套件沒有定義,那就要關閉連線。

opcode:4bit,解釋

payload

資料,有不同的狀態,如果狀態未知,必須馬上關閉連線。

0x0(附加資料幀),

0x1(文字資料幀),

0x2(二進位制資料幀),

0x3-7(保留為以後的非控制幀使用),

0xb-f

(保留為以後的控制幀使用),

0x8(關閉連線幀),

0x9(

ping

),0xa

(pong).

mask:1bit,掩碼,定義是否需要掩碼處理,如果是

1表示進行了掩碼處理。

masking-key:域的資料就是掩碼秘鑰

,用於解碼

payloaddata,

payload length:7位,

7+16

位,7+64

位,payload

資料的長度,如果是

0-125

,就是真實的

payload

長度,如果是126,那麼接著後面

2個位元組對應的

16位無符號整數就是

payload

的資料長度,如果是127,那麼後面

2個位元組對應的

64位無符號整數就是

payload

的資料長度。

masking-key:0到

4個位元組,如果

mask設為1

則有4個位元組的掩碼解密秘鑰,否則無。

payload-data:任意長度資料。

包含有擴充套件定義資料和應用資料,如果沒有定義擴充套件則沒有

此項,僅含有應用資料。

實時傳輸協議詳解

實時傳輸協議詳解 實時傳輸協議rtp 1.rtp協議 rtp real time transport protocol 協議最初是在70年代為了嘗試傳輸聲音檔案,把包分成幾部分用來傳輸語音,時間標誌和佇列號。經過一系列發展,rtp第一版本在1991年8月由美國的乙個實驗室發布了。到本世紀1996年形...

rtp 實時傳輸協議

實時傳輸協議 real time transport protocol或簡寫rtp 是乙個網路傳輸協議,它是由ietf的多 傳輸工作小組1996年在rfc 1889中公布的。中文名實時傳輸協議 外文名real time transport protocol 簡 稱 rtp類 型 概念1 特徵 2 組...

實時流傳輸協議 RTSP

rtsp實時流傳輸協議 real time streaming protocol 是乙個c s多 節目協議,控制實時資料的傳送,也是tcp ip協議體系中的乙個應用層協議。rtsp在功能上與http有重疊,最明顯的交叉是在流 內容的發布上 大多是通過網頁進行的。目前的協議規範同時允許網頁伺服器和流 ...