WebSocket的Frame協(xié)議解析

原文鏈接:https://www.dubby.cn/detail.html?id=9105

先給出WebSocket Frame的協(xié)議

image

復制抓包抓到的數(shù)據(jù):

81 85 30 6c e2 9a 54 19 80 f8 49

字段分析:

81 85 30 6c e2 9a 54 19 80 f8 49
10000001 10000101 00110000 01101100 11100010 10011010 01010100 00011001 10000000 11111000 01001001
FIN:1,RSV1-3=0,OpCode=1 mask=1,payloadLen=101 Masking-key Masking-key Masking-key Masking-key Payload Data Payload Data Payload Data Payload Data Payload Data
  • FIN=1,說明這是這個消息的最后一個片段,我們這次的消息很短,第一個也就是最后一個
  • RSV1, RSV2, RSV3:分別是1bit,且一般時候都是0
  • OpCode=1(表示是一個text frame)
    • %x0 連續(xù)的frame
    • %x1 文本frame
    • %x2 二進制frame
    • %x3-7 預留
    • %x8 連接關閉
    • %x9 ping
    • %xA pong
    • %xB-F 預留
  • 如果mask=1,那么Masking-key存在,且都是4個字節(jié)(32位)
  • payloadLen=101(5),說明字節(jié)長度是4

最后我們看到數(shù)據(jù)部分是:

01010100 00011001 10000000 11111000 01001001
54 19 80 f8 49

掩碼解碼邏輯:

//掩碼
byte[] maskingKeyBytes = {(byte) 0x30, (byte) 0x6c, (byte) 0xe2, (byte) 0x9a};
//掩碼編碼過得payload
byte[] maskedBytes = {(byte) 0x54, (byte) 0x19, (byte) 0x80, (byte) 0xf8, (byte) 0x49};
int length = maskedBytes.length;
//解碼的結果
byte[] unmaskedByte = new byte[length];

for (int i = 0; i < length; ++i) {
    byte masking = maskingKeyBytes[i % 4];
    unmaskedByte[i] = (byte) (maskedBytes[i] ^ masking);
}

for (byte b : unmaskedByte) {
    System.out.print(b + " ");
}

輸出:

100 117 98 98 121

轉成16進制,正好是

64 75 62 62 79

dubby的utf-8編碼后是:

01100100 01110101 01100010 01100010 01111001
64 75 62 62 79

沒錯,我發(fā)的消息就是dubby。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 夏季排毒 有10多種排毒養(yǎng)身的小東西,特別適合夏季喝,幾塊錢就買到,不僅便宜,還很管用,熱水一沖喝就可以了,為了自...
    晨曦_邱月暉閱讀 339評論 0 0
  • “你要笑一笑,謝蘇泉!在我下次見到你的時候,你一定要沖我笑一笑,好嗎?” 我拉著那個男孩的手,真誠而滿懷期待地看著...
    陌上蓮花閱讀 274評論 2 6