//tcpdump 抓取33121端口的数据包命令:
tcpdump -XAns 4096 -iany port 33121
显示内容:
18:38:50.641793 IP 192.168.5.17.33121 > 192.168.5.109.56328: Flags [.], ack 1, win 237, length 0
0x0000: 4500 0028 ba46 4000 4006 f4ba c0a8 0511 E..(.F@.@.......
0x0010: c0a8 056d 8161 dc08 281d 1aed b9e1 264e ...m.a..(.....&N
0x0020: 5010 00ed 8be9 0000 P.......
18:38:50.642116 IP 192.168.5.109.56328 > 192.168.5.17.33121: Flags [.], ack 1, win 255, length 0
0x0000: 4500 0028 3f7e 4000 8006 2f83 c0a8 056d E..(?~@.../....m
0x0010: c0a8 0511 dc08 8161 b9e1 264e 281d 1aee .......a..&N(...
0x0020: 5010 00ff a261 0000 0000 0000 0000 P....a........
chrome浏览器和192.168.5.17.33121建立了websocket的连接,按ws协议的规定。浏览器定义会发送一个ping包,服务端回复pong包。我想通过tcpdump抓取ping/pong包,以上的字节应该怎么解析出来,怎么确定有没有包含ping/pong包
tcpdump websocket抓包分析
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
Juan_2012 2025-10-17 20:02关注回答参考deep seek
要解析tcpdump抓取的端口33121数据包,识别Chrome浏览器与192.168.5.17:33121的WebSocket连接中的ping/pong帧,需结合WebSocket协议规范(RFC 6455)和字节级分析。以下是完整步骤:
步骤1:捕获数据包
使用
tcpdump捕获目标端口的原始数据并保存为文件:tcpdump -i any port 33121 -XX -w capture.pcap-i any:监听所有网卡port 33121:过滤目标端口-XX:以十六进制+ASCII格式输出(用于手动解析)-w capture.pcap:保存为pcap文件
步骤2:识别WebSocket连接的TCP流
首先确认WebSocket握手成功(HTTP Upgrade请求):
tcpdump -r capture.pcap -A 'tcp port 33121 and (tcp[((tcp[12]>>2)+12):4] = 0x47455420 or tcp[((tcp[12]>>2)+12):4] = 0x48545450)'- 若输出包含
Upgrade: websocket和HTTP/1.1 101 Switching Protocols,表明WebSocket连接已建立。
步骤3:解析ping/pong帧的字节结构
WebSocket控制帧的字节格式如下(RFC 6455):
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| | | +-+-+-+-+-------+-+-------------+-------------------------------+ | Masking-key (32-bit, if MASK=1) | +---------------------------------------------------------------+ | Payload data (0-125 bytes) | +---------------------------------------------------------------+- 关键字段:
opcode:0x9(1001)→ping帧0xA(1010)→pong帧
MASK位:客户端(Chrome)发送的帧必须为1(第二字节最高位=1)。Payload len:- 若值≤125:直接表示载荷长度
- 若=126:后续2字节为长度
- 若=127:后续8字节为长度
Masking-key:4字节(当MASK=1时存在)。
步骤4:手动解析示例
假设某TCP负载的十六进制输出如下(已跳过IP/TCP头):
0000: 81 89 5a b3 c4 d8 7b f8 96 5e f8 96 ..Z...{..^..- 解析过程:
- 第一个字节:
0x81→ 二进制10000001FIN=1,opcode=0001(即0x1,但无效,控制帧opcode需≥0x8)。
- 修正:实际
ping帧应为:- 第一个字节:
0x89(二进制10001001→FIN=1,opcode=1001=0x9) - 第二个字节:
0x89(二进制10001001→MASK=1,Payload len=9)
- 第一个字节:
- 后续4字节:
5a b3 c4 d8→ Masking-key - 载荷数据:按Masking-key解码(本例载荷为空,因
Payload len=9但实际9-4=5字节载荷)。
- 第一个字节:
注:完整帧格式需为
0x89 0x8N ...(N≤125),其中0x89标识ping,0x8A标识pong。
步骤5:自动化检测方法
推荐用
tshark(Wireshark命令行工具)直接过滤:tshark -r capture.pcap -Y "websocket.opcode==9 || websocket.opcode==10" -T fields -e ip.src -e ip.dst -e websocket.opcode输出示例:
192.168.1.100 192.168.5.17 0x9 # ping from Chrome 192.168.5.17 192.168.1.100 0xA # pong from Server
关键验证点
- 时序匹配:
ping由客户端(Chrome)发出后,服务器应在短时间内回复pong。 - 长度校验:
ping/pong载荷长度≤125字节(RFC 6455规定)。 - Masking-key:客户端发出的帧必含4字节掩码(第二字节最高位=1)。
⚠️ 若未检测到
ping/pong帧,可能原因:- 连接未使用心跳机制
- 捕获时间不足
- 过滤条件错误(如端口/IP不匹配)
引用说明
- WebSocket连接通过HTTP Upgrade建立,后续数据在TCP上以帧格式传输。
- 基础TCP健康检查通过三次握手完成,但本场景需深入解析应用层载荷。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报