websocket協(xié)議簡(jiǎn)析

websocket協(xié)議是基于tcp的網(wǎng)絡(luò)協(xié)議瓢宦,實(shí)現(xiàn)了瀏覽器與客戶(hù)端的全雙工通信,與http協(xié)議不同的是送挑,它允許服務(wù)器主動(dòng)推送消息給客戶(hù)端茫陆。這樣便可以取代原來(lái)低效的輪詢(xún)颤芬。

背景

在websocket出現(xiàn)之前慰丛,客戶(hù)端獲取服務(wù)器消息卓囚,需要通過(guò)不停的輪詢(xún)。有如下缺陷:

1)服務(wù)器被迫為每個(gè)客戶(hù)端使用許多不同的底層TCP連接:一個(gè)用于向客戶(hù)端發(fā)送信息诅病,其它用于接收每個(gè)傳入消息哪亿。

2)http協(xié)議有額外的開(kāi)銷(xiāo),每個(gè)消息都有HTTP頭贤笆。

3)客戶(hù)端需要通過(guò)映射來(lái)維護(hù)傳出連接和傳人連接用以追蹤響應(yīng)蝇棉。

Websocket協(xié)議的出現(xiàn)正是彌補(bǔ)了上述缺陷,實(shí)現(xiàn)全雙工通信芥永,允許服務(wù)器主動(dòng)推送消息給客戶(hù)端篡殷。

協(xié)議分析

websocket協(xié)議分為兩部分,一是握手建立連接恤左;二是數(shù)據(jù)傳輸贴唇。

建立連接搀绣;

websocket的連接建立是基于http協(xié)議的。

請(qǐng)求報(bào)文示例:

GET /chat HTTP/1.1

Host: server.example.com

Upgrade: websocket

Connection:Upgrade

Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==

Origin: http://example.com

Sec-WebSocket-Protocol: chat, superchat

Sec-WebSocket-Version: 13

響應(yīng)報(bào)文示例:

HTTP/1.1 101 Switching Protocols

Upgrade: websocket

Connection: Upgrade

Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Protocol: chat

下面來(lái)分析一下上述報(bào)文:

WebSocket借用http請(qǐng)求進(jìn)行握手戳气,相比正常的http請(qǐng)求链患,多了一些內(nèi)容。其中瓶您,

HTTP/1.1 101表示websocket連接已成功建立麻捻,其他任何code表示連接建立失敗。

Upgrade: websocket

Connection: Upgrade

表示希望將http協(xié)議升級(jí)到Websocket協(xié)議呀袱。

Sec-WebSocket-Key是瀏覽器隨機(jī)生成的base64 encode的值贸毕,用來(lái)詢(xún)問(wèn)服務(wù)器是否是支持WebSocket。

服務(wù)器返回

Upgrade: websocket

Connection: Upgrade

告訴瀏覽器即將升級(jí)的是Websocket協(xié)議

Sec-WebSocket-Accept是將請(qǐng)求包"Sec-WebSocket-Key"的值夜赵,與"258EAFA5-E914-47DA-95CA-C5AB0DC85B11″這個(gè)字符串進(jìn)行拼接明棍,然后對(duì)拼接后的字符串進(jìn)行sha-1運(yùn)算,再進(jìn)行base64編碼得到的寇僧。用來(lái)說(shuō)明自己是WebSocket助理服務(wù)器摊腋。

Sec-WebSocket-Version是WebSocket協(xié)議版本號(hào)。

若請(qǐng)求報(bào)文中嘁傀,Sec-WebSocket-Version: 25兴蒸,服務(wù)端可能的響應(yīng)會(huì)是

HTTP/1.1 400 Bad Request ... Sec-WebSocket-Version: 13, 8, 7

此時(shí)客戶(hù)端將會(huì)重新進(jìn)行握手,并將版本修改為 Sec-WebSocket-Version: 13

數(shù)據(jù)傳輸:

websocket協(xié)議中數(shù)據(jù)是通過(guò)一系列的幀來(lái)傳輸细办。出于安全性考慮橙凳,所有客戶(hù)端發(fā)往服務(wù)器的數(shù)據(jù)幀需要掩碼,若服務(wù)器收到未掩碼的數(shù)據(jù)幀將會(huì)主動(dòng)斷開(kāi)連接笑撞;所有服務(wù)器發(fā)往客戶(hù)端的數(shù)據(jù)幀不能掩碼岛啸,若客戶(hù)端收到掩碼的數(shù)據(jù)幀將會(huì)主斷開(kāi)連接。

數(shù)據(jù)幀的定義:


FIN: 1 bit --是否是消息的最后一個(gè)數(shù)據(jù)幀娃殖。一個(gè)消息可以通過(guò)一個(gè)或多個(gè)數(shù)據(jù)幀發(fā)送值戳,第一個(gè)幀也可能是最后一個(gè)幀。

RSV1, RSV2, RSV3: 1 bit each-- 保留字段炉爆,如果有自定義的擴(kuò)展數(shù)據(jù)時(shí)使用堕虹。當(dāng)沒(méi)有擴(kuò)展數(shù)據(jù)時(shí),若保留字段非0芬首,則會(huì)導(dǎo)致連接失敗赴捞。

Opcode: 4 bits--說(shuō)明數(shù)據(jù)的類(lèi)型。eg:%x1表示文本幀郁稍;%x2表示二進(jìn)制幀赦政;%x8表示關(guān)閉連接幀;%x9表示ping幀;%xA 表示 pong幀恢着。從此可以看出桐愉,目前websocket支持的傳輸類(lèi)型包含文本,二進(jìn)制和ping/pong掰派。

Mask: 1 bit--是否掩碼从诲。(規(guī)則上文已述)

Payload length: 7 bits, 7+16 bits, or 7+64 bits--數(shù)據(jù)長(zhǎng)度

Masking-key: 0 or 4 bytes--掩碼的key(若mask is 1)

Payload data: (x+y) bytes-- 數(shù)據(jù),包含擴(kuò)展數(shù)據(jù)和應(yīng)用數(shù)據(jù)靡羡。

Extension data: x bytes--私有定制協(xié)議系洛。

Application data: y bytes--傳輸?shù)臄?shù)據(jù)

示例

o 非掩碼的Hello: * 0x81 0x05 0x48 0x65 0x6c 0x6c 0x6f

注解:

0x81 -->10000001

-->Fin=1(最后幀);RSV=000略步;Opcode=0001(文本幀)

0x05 -->00000101

--> mask=0(不掩碼);Payload length=0000101(5個(gè)字符)

0x48 0x65 0x6c 0x6c 0x6f -->Hello

o掩碼的Hello: * 0x81 0x85 0x37 0xfa 0x21 0x3d 0x7f 0x9f 0x4d 0x51 0x58 (contains "Hello")

o多幀不掩碼的Hello * 0x01 0x03 0x48 0x65 0x6c (contains "Hel")

0x80 0x02 0x6c 0x6f (contains "lo")

256字節(jié)二進(jìn)制非掩碼數(shù)據(jù)* 0x82 0x7E 0x0100 [256 bytes of binary data]

64KiB單幀二進(jìn)制非掩碼數(shù)據(jù)

0x82 0x7F 0x0000000000010000 [65536 bytes of binary data]

數(shù)據(jù)發(fā)送規(guī)則:

1)保證連接狀態(tài)為open描扯。

2)不知大小或太大的數(shù)據(jù),會(huì)分為一系列的幀來(lái)發(fā)送趟薄。

3)數(shù)據(jù)發(fā)送幀中必須標(biāo)明數(shù)據(jù)類(lèi)型

4)最后一個(gè)數(shù)據(jù)幀必須將Fin設(shè)置為1

5)客戶(hù)端發(fā)送的數(shù)據(jù)必須掩碼

6)擴(kuò)展數(shù)據(jù)必須有定義

7)數(shù)據(jù)必須通過(guò)下行連接發(fā)送绽诚。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市竟趾,隨后出現(xiàn)的幾起案子憔购,更是在濱河造成了極大的恐慌宫峦,老刑警劉巖岔帽,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異导绷,居然都是意外死亡犀勒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)妥曲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)贾费,“玉大人,你說(shuō)我怎么就攤上這事檐盟」酉簦” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵葵萎,是天一觀的道長(zhǎng)导犹。 經(jīng)常有香客問(wèn)我,道長(zhǎng)羡忘,這世上最難降的妖魔是什么谎痢? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮卷雕,結(jié)果婚禮上节猿,老公的妹妹穿的比我還像新娘。我一直安慰自己漫雕,他們只是感情好滨嘱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布峰鄙。 她就那樣靜靜地躺著,像睡著了一般太雨。 火紅的嫁衣襯著肌膚如雪先馆。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,679評(píng)論 1 305
  • 那天躺彬,我揣著相機(jī)與錄音煤墙,去河邊找鬼。 笑死宪拥,一個(gè)胖子當(dāng)著我的面吹牛仿野,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播她君,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼脚作,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了缔刹?” 一聲冷哼從身側(cè)響起球涛,我...
    開(kāi)封第一講書(shū)人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校镐,沒(méi)想到半個(gè)月后亿扁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鸟廓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年从祝,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片引谜。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡牍陌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出员咽,到底是詐尸還是另有隱情毒涧,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布贝室,位于F島的核電站契讲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏档玻。R本人自食惡果不足惜怀泊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望误趴。 院中可真熱鬧霹琼,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忠藤,卻和暖如春挟伙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背模孩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工尖阔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人榨咐。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓介却,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親块茁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子齿坷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

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

  • 上篇介紹了HTTP1.1協(xié)議的基本內(nèi)容,這篇文章將繼續(xù)分析WebSocket協(xié)議数焊,然后對(duì)這兩個(gè)進(jìn)行簡(jiǎn)單的比較永淌。 W...
    TheAlchemist閱讀 36,529評(píng)論 15 113
  • Before them people believedAristotle, who said that the n...
    咩咩咩233閱讀 211評(píng)論 0 0
  • 夜來(lái)幽夢(mèng)忽還鄉(xiāng) 小軒窗,正梳妝 相顧無(wú)言佩耳,唯有淚千行 好神奇遂蛀,我一直都很喜歡這首悼亡的詞,其后看到再多的春風(fēng)十里不...
    守望清橙閱讀 329評(píng)論 4 8
  • 很多健身菜鳥(niǎo)或者想增肌、減脂的人萍诱,剛踏入健身房或者剛開(kāi)始鍛煉的時(shí)候,腦袋里好像裝了一本《十萬(wàn)個(gè)為什么》污呼,經(jīng)常會(huì)問(wèn)一...
    桃白白ALEX閱讀 689評(píng)論 0 1