websocket 協(xié)議剖析

1、websocket小針數(shù)據(jù)傳輸?shù)母袷剑?/h3>
  • 1.1 websocket 發(fā)送"msg" 該字符長度不大于125長度通過 wireshark 抓包的顯示16進(jìn)制數(shù)據(jù)如下:
image.png
    • 1.1.1
      81 二進(jìn)制表示 1000 0001
      二進(jìn)制第一位 1表示 當(dāng)前數(shù)據(jù)沒有被分片
      二進(jìn)制第八位 1表示 文本消息片斷
    • 1.1.2
      83 二進(jìn)制表示 1000 0011
      二進(jìn)制第一位 1表示 該數(shù)據(jù)包有掩碼
      二進(jìn)制剩余位數(shù)據(jù) 000 0011表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 3
    • 1.1.3
      e4 b4 b5 c3表示 隨機(jī)4個(gè)字節(jié)的掩碼
    • 1.1.4
      89 c7 d2 表示掩碼后的數(shù)據(jù)內(nèi)容 也就是對 'msg' 字符進(jìn)行掩碼后的16進(jìn)制數(shù)據(jù)

2、websocket中針數(shù)據(jù)傳輸?shù)母袷剑?/h3>
  • 2.1 websocket 發(fā)送"111...." 該字符長度大于125 小于65536 長度通過 wireshark 抓包的顯示16進(jìn)制數(shù)據(jù)如下:
image.png
    • 2.1.1
      81 二進(jìn)制表示 1000 0001
      二進(jìn)制第一位 1表示 當(dāng)前數(shù)據(jù)沒有被分片
      二進(jìn)制第八位 1表示 文本消息片斷
    • 2.1.2
      fe 二進(jìn)制表示 1111 1110
      二進(jìn)制第一位 1表示 該數(shù)據(jù)包有掩碼
      二進(jìn)制剩余位數(shù)據(jù) 111 1110表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 126 如果長度為126 數(shù)據(jù)包后兩個(gè)字節(jié)表示 包體長度
    • 2.1.3
      00 8c 表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 140 實(shí)際上 發(fā)送了140個(gè) 字符為"1"的字符
    • 2.1.4
      69 77 68 06表示 隨機(jī)4個(gè)字節(jié)的掩碼
    • 2.1.5
      58 46 59 37...表示 掩碼后的數(shù)據(jù)內(nèi)容

3、websocket大針數(shù)據(jù)傳輸?shù)母袷剑?/h3>
  • 3.1websocket 發(fā)送"111...." 該字符長度 大于65536 長度通過 wireshark 抓包的顯示16進(jìn)制數(shù)據(jù)如下:
image.png
    • 3.1.1
      81 二進(jìn)制表示 1000 0001
      二進(jìn)制第一位 1表示 當(dāng)前數(shù)據(jù)沒有被分片
      二進(jìn)制第八位 1表示 文本消息片斷
    • 3.1.2
      ff 二進(jìn)制表示 1111 1111
      二進(jìn)制第一位 1表示 該數(shù)據(jù)包有掩碼
      二進(jìn)制剩余位數(shù)據(jù) 111 111表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 127 如果長度為127 數(shù)據(jù)包后八位字節(jié)表示 包體長度
    • 3.1.3
      00 00 00 00 00 01 7e d0表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 98000 實(shí)際上 發(fā)送了98000個(gè) 字符為"1"的字符
    • 3.1.4
      59 2a 90 c3表示 隨機(jī)4個(gè)字節(jié)的掩碼
    • 3.1.5
      68 1b a1 f5...表示 掩碼后的數(shù)據(jù)內(nèi)容

4、websocket分片數(shù)據(jù)傳輸?shù)母袷剑?【chrome瀏覽器在發(fā)送數(shù)據(jù)超過最大的tcp數(shù)據(jù)發(fā)送窗口(默認(rèn)大小131072) 是會(huì)對消息進(jìn)行分片 但是Safari 、ie 是不會(huì) 至于火狐是否會(huì),我沒有測試】:

image.png
    • 4.1.1
      01二進(jìn)制表示 0000 0001
      二進(jìn)制第一位 0表示 當(dāng)前數(shù)據(jù)已經(jīng)分片
      二進(jìn)制第八位 1表示 文本消息片斷
    • 4.1.2
      ff 二進(jìn)制表示 1111 1111
      二進(jìn)制第一位 1表示 該數(shù)據(jù)包有掩碼
      二進(jìn)制剩余位數(shù)據(jù) 111 111表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 127 如果長度為127 數(shù)據(jù)包后八位字節(jié)表示 包體長度
    • 5.1.3
      00 00 00 00 00 02 00 00 表示 包體的長度 如果轉(zhuǎn)成10進(jìn)制 就是 131072 實(shí)際上 發(fā)送了131072個(gè) 字符為"1"的字符
    • 5.1.4
      59 2a 90 c3表示 隨機(jī)4個(gè)字節(jié)的掩碼
    • 5.1.5
      bc f4 ea d0...表示 掩碼后的數(shù)據(jù)內(nèi)容
    • 5.1.6
      下圖 就是數(shù)據(jù)包第二個(gè)分片 所以可以看出 websocket協(xié)議的分片數(shù)據(jù)包的格式 就是協(xié)議+內(nèi)容1 協(xié)議+內(nèi)容2 這樣的格式
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容