抓包红色_抓包三部曲 WebSocket 协议原理抓包分析
這篇文章通過(guò)抓包分析?WebSocket?協(xié)議的細(xì)節(jié),學(xué)習(xí)一下?WebSocket?執(zhí)行流程。
1.WebSocket 流程說(shuō)明
(1)客戶端和服務(wù)器之間完成三次握手建立?TCP?連接(TLS/SSL)握手。
(2)客戶端發(fā)起?HTTP?請(qǐng)求和服務(wù)器之間建立?WebSocket?握手。
(3)WebSocket?連接建立之后,雙方通信是基于?TCP?連接的,此后不需要?HTTP?協(xié)議了。
(4)完成?WebSocket?握手之后,就可以發(fā)送消息內(nèi)容了。
2.HTTP 建立 WebSocket 握手(HTTP 升級(jí)到 WebSocket)
Tips:其中紅色部分為必須,完成如上圖所示過(guò)程即建立了?WebSocket?連接,Sec-WebSocket-Key: 5C2dTYo3LMpWd/H+Nix4HQ==\r\n?表示建立握手生成的隨機(jī)串。
2.1 如何證明握手被服務(wù)器接受
從上圖可以看到構(gòu)建?WebSocket?握手的時(shí)候,發(fā)送了一個(gè)?Sec-WebSocket-Key,
#請(qǐng)求中的 Sec-WebSocket-Key 隨機(jī)數(shù)Sec-WebSocket-Key:c3SkgVxVCDhVCp69PJFf3A==
#響應(yīng)中的 Sec-WebSocket-Accept 證明值
Sec-WebSocket-Accept:YzgwZjRlZTcxMThiYTdjNDliYzAyNTdmZmNlN2E5MzBmYzNiYTQ0Mg==
2.2 Sec-WebSocket-Accept 證明值構(gòu)造規(guī)則
GUID(RFC4122):258EAFA5-E914-47DA-95CA-C5AB0DC85B11
值構(gòu)造規(guī)則:BASE64(SHA1(Sec-WebSocket-Key+GUID))
拼接值:c3SkgVxVCDhVCp69PJFf3A==258EAFA5-E914-47DA-95CA-C5AB0DC85B11
SHA1值:c80f4ee7118ba7c49bc0257ffce7a930fc3ba442
BASE64值:YzgwZjRlZTcxMThiYTdjNDliYzAyNTdmZmNlN2E5MzBmYzNiYTQ0Mg==
2.3 抓包數(shù)據(jù)
3.消息與數(shù)據(jù)幀說(shuō)明
Message 消息:1 條消息由一個(gè)或者多個(gè)幀組成,這些數(shù)據(jù)幀屬于同一類型,代理服務(wù)器可能合并、拆分消息的數(shù)據(jù)幀。
Frame 數(shù)據(jù)幀:持續(xù)幀、文本幀、二進(jìn)制幀
4.WebSocket 協(xié)議格式
4.1 WebSocket 協(xié)議的特點(diǎn)
基于幀:不是基于流(HTTP、TCP)
每一幀要么承載字符數(shù)據(jù),要么承載二進(jìn)制數(shù)據(jù)
基于瀏覽器的同源策略,可以使用?Access-Control-Allow-Origin?等頭部
基于?URI、子協(xié)議支持同主機(jī)同端口上的多個(gè)服務(wù)
4.2 幀格式示意圖
Tips:圖中藍(lán)色的?2?字節(jié)是必然存在的幀首部。
抓取到的包數(shù)據(jù)如下圖:
Tips:可以在百度搜索?WebSocket 在線測(cè)試,然后使用?Wireshark?工具抓取。
4.3 幀類型
從上圖抓取到的數(shù)據(jù)包可以看到幀首部中有?Opcode,它表示?幀類型,下面列出不同類型的幀對(duì)應(yīng)的?Opcode?的值:
持續(xù)幀:0
非控制幀:1:文本幀,2:二進(jìn)制幀,3-7:為非控制幀保留
控制幀:8:關(guān)閉幀,9:心跳幀ping,A:心跳幀pong,B-F:為控制幀保留
Tips:從?3.2?中可以看出?Opcode?的值為?1,表示文本幀。
4.4 MASK 掩碼作用
從上面的圖中可以看到?WebSocket?每次發(fā)送消息的時(shí)候幀首部會(huì)有MASK?掩碼,如下圖所示:
Tips:MASK?的作用是為了防止緩存污染攻擊,防止偽造?WebSocket?請(qǐng)求。
4.5 ABNF 描述的幀格式
ws-frame = frame-fin;1 bit int lengthframe-rsv1;1 bit in length
frame-rsv2;1 bit in length
frame-rsv3;1 bit in length
frame-masked;1 bit in length
frame-payload-length;3 種長(zhǎng)度
[frame-masking-key];32 bits in length
frame-payload-data;n*8 bits in;length,where;n >= 0
5.如何保持會(huì)話心跳
HTTP?長(zhǎng)連接是基于定時(shí)器維持的會(huì)話,若在定時(shí)器設(shè)置的時(shí)間范圍內(nèi),還沒(méi)有數(shù)據(jù)到達(dá),就會(huì)自動(dòng)斷開(kāi),而?WebSocket?連接保持會(huì)話是基于心跳的;
5.1 心跳幀
心跳幀是可以穿插在數(shù)據(jù)幀中傳輸?shù)?/p>
ping 幀:Opcode=9,可以含有數(shù)據(jù)
pong幀:Opcode=A,必須與?ping?幀數(shù)據(jù)相同
6.如何關(guān)閉 WebSocket 會(huì)話
6.1 關(guān)閉 WebSocket 會(huì)話
控制幀中的關(guān)閉幀:在 TCP 連接之上的雙向關(guān)閉。
發(fā)送關(guān)閉幀后,不能再發(fā)送任何數(shù)據(jù)。
接收關(guān)閉幀之后,不再接收任何到達(dá)的數(shù)據(jù)。
TCP 連接意外中斷也會(huì)關(guān)閉 WebSocket。
6.2 關(guān)閉幀的格式
關(guān)閉幀:Opcode=8。
可以含有數(shù)據(jù),但僅用于解釋關(guān)閉會(huì)話的原因,前 2 字節(jié)為無(wú)符號(hào)整型,遵循 mask 掩碼規(guī)則。
6.3 關(guān)閉幀抓包
Tips:從抓包軟件中可以看出?TCP?連接是在?WebSocket?關(guān)閉之后再關(guān)閉的。
6.4 關(guān)閉幀的錯(cuò)誤碼
總結(jié)
以上是生活随笔為你收集整理的抓包红色_抓包三部曲 WebSocket 协议原理抓包分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: ie8不兼容java项目_常见IE8兼容
- 下一篇: java标量替换_JAVA逃逸分析、栈上