公司的慣例是每週五都會有乙個分享會,內容大概是前端,後台,軟體思想,工具使用,設計等,大家坐在一起聽一聽,說一說,交流一下。
這次是我給大家講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: upgradewebsocket協議:由握手和資料傳輸這兩部分組成。
握手: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有重疊,最明顯的交叉是在流 內容的發布上 大多是通過網頁進行的。目前的協議規範同時允許網頁伺服器和流 ...