Websocket相關(guān)知識(shí)整理

Websocket 協(xié)議格式說(shuō)明

最近整理項(xiàng)目中關(guān)于websocket中的部分砚嘴,由于之前代碼中websocket的功能不夠完整禾嫉,缺少了延續(xù)幀的數(shù)據(jù)拼接枚粘,以及mask的掩碼功能馅闽。所以初步深入了一下websocket協(xié)議。

關(guān)于websocket的數(shù)據(jù)幀格式馍迄,官方文檔提供了一個(gè)結(jié)構(gòu)圖

  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
 +-+-+-+-+-------+-+-------------+-------------------------------+
 |F|R|R|R| opcode|M| Payload len |    Extended payload length    |
 |I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
 |N|V|V|V|       |S|             |   (if payload len==126/127)   |
 | |1|2|3|       |K|             |                               |
 +-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
 |     Extended payload length continued, if payload len == 127  |
 + - - - - - - - - - - - - - - - +-------------------------------+
 |                               |Masking-key, if MASK set to 1  |
 +-------------------------------+-------------------------------+
 | Masking-key (continued)       |          Payload Data         |
 +-------------------------------- - - - - - - - - - - - - - - - +
 :                     Payload Data continued ...                :
 + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
 |                     Payload Data continued ...                |


  • FIN:標(biāo)識(shí)該數(shù)據(jù)幀是否是信息的最后一幀數(shù)據(jù)福也,如果為1則表明距 上一次 FIN為1 的一幀之間,這些數(shù)據(jù)是完整的一條信息攀圈。

  • RSV 1-3:默認(rèn)為0暴凑,除非協(xié)商了擴(kuò)展定義了非0的意義。如果接收到非0赘来,且沒有協(xié)商擴(kuò)展现喳,接收端必須使WebSocket連接失敗凯傲。

  • Opcode:幀類型

    1. 0:Continuation Frame,表明該幀數(shù)據(jù)是一條完整信息的其中一幀

    2. 1:Text Frame 拿穴,這是一條文本數(shù)據(jù)

    3. 2:Binary Frame 泣洞,這是一條二進(jìn)制流數(shù)據(jù)

    4. 3 - 7:為以后的非控制幀保留

    5. 8:Connection Close Frame,這是關(guān)閉websocket連接請(qǐng)求的數(shù)據(jù)幀

    6. 9:Ping Frame 默色,這是一條ping幀

    7. A:Pong Frame球凰,這是一條pong幀

    8. B - F:為以后的控制幀保留

  • Mask:掩碼,是否加密數(shù)據(jù)腿宰,為1則需要對(duì)根據(jù)一個(gè)隨機(jī)的maskCode對(duì)數(shù)據(jù)進(jìn)行一次位運(yùn)算呕诉,一般客戶端發(fā)送給服務(wù)端的數(shù)據(jù)需要用掩碼加密,而服務(wù)端發(fā)給客戶端的一般不需要

  • Payload:盛放該幀數(shù)據(jù)的長(zhǎng)度吃度,由于該字段占據(jù)7bit甩挫,所以最大為127,所以規(guī)定

    1. 如果數(shù)據(jù)長(zhǎng)度<126椿每,則直接將數(shù)據(jù)長(zhǎng)度存在這7bit中
    2. 如果長(zhǎng)度=126伊者,則將數(shù)據(jù)長(zhǎng)度存在接下來(lái)的2字節(jié)數(shù)據(jù)中(2字節(jié)長(zhǎng)度可存最大無(wú)符號(hào)整數(shù)為 65535)
    3. 如果長(zhǎng)度=127,則將數(shù)據(jù)長(zhǎng)度存在接下來(lái)的8字節(jié)數(shù)據(jù)中
  • Extended payload length:接上個(gè)字段间护,這兩個(gè)字段用來(lái)存放數(shù)據(jù)的長(zhǎng)度

  • Masking-key:占據(jù) 0或4 Byte亦渗,上面的Mask字段為1,則需要生成4bit的隨機(jī)值汁尺,為0則為空

  • Payload data: (x + y)字節(jié)法精,存放了該數(shù)據(jù)幀所有的數(shù)據(jù)。由(Extension data + Application data 構(gòu)成)

    1. Extension data:x字節(jié)痴突,保留參數(shù)搂蜓,默認(rèn)為0 Byte,除非協(xié)商了擴(kuò)展辽装。
    2. Application data:y字節(jié)帮碰,如果上面Extension data為0,沒有協(xié)商拓展拾积,則此字段存儲(chǔ)了該幀所有的數(shù)據(jù)殉挽。

大小端

定義:對(duì)于一個(gè)由2個(gè)字節(jié)組成的16位整數(shù),在內(nèi)存中存儲(chǔ)這兩個(gè)字節(jié)有兩種方法

  • 一種是將低序字節(jié)存儲(chǔ)在起始地址殷勘,這稱為小端(little-endian)字節(jié)序此再;
  • 另一種方法是將高序字節(jié)存儲(chǔ)在起始地址,這稱為大端(big-endian)字節(jié)序玲销。

之所以關(guān)注這個(gè)問題是因?yàn)槭淠矗谕晟苿e人的Websocket協(xié)議時(shí),當(dāng)數(shù)據(jù)長(zhǎng)度大于125的時(shí)候贤斜,我需要將真正的數(shù)據(jù)長(zhǎng)度填充至2個(gè)字節(jié)或者8個(gè)字節(jié)的Extended payload length之中策吠,由于采用的小端模式存儲(chǔ)逛裤,導(dǎo)致服務(wù)端那邊讀取的數(shù)據(jù)長(zhǎng)度一直不對(duì),最后才發(fā)現(xiàn)是這個(gè)問題猴抹。


位運(yùn)算

&: 與 當(dāng)兩個(gè)位都為1時(shí)带族,結(jié)果才為1
1. 清零 與一個(gè)各位都為零的數(shù)值相與,結(jié)果為零
2. 取一個(gè)數(shù)的指定位, 用另一個(gè)指定位上全為1蟀给,其余位上全為0的數(shù)與該數(shù)相與蝙砌,則獲得的新值就是該數(shù)的指定位
3. 判斷奇偶 最未位為0則為偶數(shù),為1則為奇數(shù)
由此 可以用if ((a & 1) == 0)代替if (a % 2 == 0)來(lái)判斷a是不是偶數(shù)跋理,因?yàn)?br> 1的末位數(shù)為1

|: 或 當(dāng)兩個(gè)位都為0時(shí)择克,結(jié)果才為0
1. 對(duì)一個(gè)數(shù)的某些位設(shè)置為1, 用另一個(gè)指定位上全為1前普,其余位上全為0的數(shù)與該數(shù)相或肚邢,則獲得的新值指定位上的位就為1,非指定位還是會(huì)保持不變拭卿。

^: 異或 當(dāng)兩個(gè)位相同則為0骡湖,相異則為1
1. 翻轉(zhuǎn)指定位, 用另一個(gè)指定位上全為1峻厚,其余位上全為0的數(shù)與該數(shù)異或响蕴,則獲得的新值置頂位與該數(shù)指定位上的值正好相反
2. 與0相異或值不會(huì)改變 1000 0001 ^ 0000 0000 = 1000 0001
3. 交換兩個(gè)數(shù)
a = 1000 1001, b = 1101 0000
a ^= b; // a = 0101 1001
b ^= a; // b = 1000 1001
a ^= b; // a = 1101 0000
如上所示,a 與b進(jìn)行兩次異或后目木,得出的新值還是a换途。

~: 取反懊渡, 每一位上0 ——> 1, 1 ——> 0
該運(yùn)算符的優(yōu)先級(jí)比其他的要高刽射!

<< 左移運(yùn)算符 將一個(gè)數(shù)的二進(jìn)制位上各個(gè)位往左移若干位(左邊的位丟
棄,右邊補(bǔ)0)
a = 1011 1010, a<< 2 = 1110 1000

若左移時(shí)舍棄的高位不包含1剃执,則每左移一位誓禁,相當(dāng)于該數(shù)乘以2。
即 0011 1010<< 2 = 1110 1000
即  0011 1010 =  58肾档, 1110 1000 = 116

>> 右移運(yùn)算符 將一個(gè)數(shù)的二進(jìn)制位上各個(gè)位往右移若干位(右邊的位丟
棄摹恰,正數(shù)左邊補(bǔ)0,負(fù)數(shù)左邊補(bǔ)1)
a = 1011 1010, a>> 2 = 0010 1110

操作數(shù)每右移一位怒见,相當(dāng)于該數(shù)除以2俗慈。
即 1011 1010 = 186
即 0010 1110 = 46

不同長(zhǎng)度的數(shù)據(jù)進(jìn)行位運(yùn)算時(shí),則按照右端對(duì)齊遣耍,左端補(bǔ)齊0或者1闺阱,正數(shù)或者無(wú)符號(hào)數(shù)補(bǔ)0,負(fù)數(shù)補(bǔ)1


最后

??上篇文章立的flag這么快就被打臉了舵变,這是2021年的第一篇酣溃,也希望今年有一個(gè)好的開始吧瘦穆,再接再厲!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊豌,一起剝皮案震驚了整個(gè)濱河市扛或,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碘饼,老刑警劉巖熙兔,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異艾恼,居然都是意外死亡黔姜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門蒂萎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)秆吵,“玉大人,你說(shuō)我怎么就攤上這事五慈∧杉牛” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵泻拦,是天一觀的道長(zhǎng)毙芜。 經(jīng)常有香客問我,道長(zhǎng)争拐,這世上最難降的妖魔是什么腋粥? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮架曹,結(jié)果婚禮上隘冲,老公的妹妹穿的比我還像新娘。我一直安慰自己绑雄,他們只是感情好展辞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著万牺,像睡著了一般罗珍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上脚粟,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天覆旱,我揣著相機(jī)與錄音,去河邊找鬼核无。 笑死扣唱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播画舌,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼堕担,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了曲聂?” 一聲冷哼從身側(cè)響起霹购,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朋腋,沒想到半個(gè)月后齐疙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡旭咽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年贞奋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片穷绵。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轿塔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仲墨,到底是詐尸還是另有隱情勾缭,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布目养,位于F島的核電站俩由,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏癌蚁。R本人自食惡果不足惜幻梯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望努释。 院中可真熱鬧碘梢,春花似錦、人聲如沸洽洁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)饿自。三九已至,卻和暖如春龄坪,著一層夾襖步出監(jiān)牢的瞬間昭雌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工健田, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留烛卧,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像总放,于是被迫代替她去往敵國(guó)和親呈宇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容