websocket / 使用 wireshark 分析 websocket 连接过程
一、連接過程時(shí)序圖
二、wireshark 分析
上圖是一個(gè)完整的進(jìn)行 websocket 連接時(shí)產(chǎn)生的數(shù)據(jù)包。
根據(jù)時(shí)序圖可知,前 3 行是 tcp/ip 握手過程,因?yàn)榭梢酝ㄟ^標(biāo)志來看到,前 3 個(gè)標(biāo)志(Flags)分別為 SYN、SYN ACK、ACK。這是建立 http 請求的需要,和 websocket 沒有關(guān)系。
第 4 條就是 client 主動發(fā)給 server 的握手協(xié)議了,如下圖所示:
細(xì)心的小伙伴可以發(fā)現(xiàn),這套代碼是基于 C++ 版的 websocketpp 實(shí)現(xiàn)的,大家可以參考下。
大家可以發(fā)現(xiàn),websocket 的握手協(xié)議實(shí)際上是基于 http 協(xié)議實(shí)現(xiàn)的,client 告訴 server,我要升級為 websocket 了,不使用老土的 http 了。實(shí)現(xiàn)的方法就是 “Connection” 和 “Upgrade” 這兩個(gè)字段,
我要升級(Connection : upgrade),
升級為 websocket (Upgrade : websocket),
websocket 的版本得是 v13 的!(Sec-WebSocket-Version 13)。
第 5 條是 server 回復(fù)?client 的協(xié)議了。
狀態(tài)為 101,意味著協(xié)議切換成功。
這里?Sec-WebSocket-Accept 和?Sec-WebSocket-Key 是配套的,主要作用在于提供基礎(chǔ)的防護(hù),減少惡意連接、意外連接。
Sec-WebSocket-Accept 的計(jì)算方法是:
計(jì)算公式為:
將 Sec-WebSocket-Key 跟 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 拼接。通過 SHA1 計(jì)算出摘要,并轉(zhuǎn)成 base64 字符串。偽代碼如下:
toBase64( sha1( Sec-WebSocket-Key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 )??)?
參考鏈接:
https://blog.csdn.net/henryhu712/article/details/85090194
https://blog.csdn.net/libaineu2004/article/details/82774638
?
(SAW:Game Over!)
總結(jié)
以上是生活随笔為你收集整理的websocket / 使用 wireshark 分析 websocket 连接过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: boost / vs2017 编译 bo
- 下一篇: gdb / 调试进入 so 库的方法