showliuzp 2025-10-17 18:42 采纳率: 84.3%
浏览 5
已结题

tcpdump websocket抓包分析

//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包
  • 写回答

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: websocketHTTP/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...{..^..
    
    • 解析过程
      1. 第一个字节:0x81 → 二进制10000001
        • FIN=1, opcode=0001(即0x1,但无效,控制帧opcode需≥0x8)。
      2. 修正:实际ping帧应为:
        • 第一个字节:0x89(二进制10001001FIN=1, opcode=1001=0x9
        • 第二个字节:0x89(二进制10001001MASK=1, Payload len=9
      3. 后续4字节:5a b3 c4 d8 → Masking-key
      4. 载荷数据:按Masking-key解码(本例载荷为空,因Payload len=9但实际9-4=5字节载荷)。

    :完整帧格式需为0x89 0x8N ...N≤125),其中0x89标识ping0x8A标识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
    

    关键验证点

    1. 时序匹配ping由客户端(Chrome)发出后,服务器应在短时间内回复pong
    2. 长度校验ping/pong载荷长度≤125字节(RFC 6455规定)。
    3. Masking-key:客户端发出的帧必含4字节掩码(第二字节最高位=1)。

    ⚠️ 若未检测到ping/pong帧,可能原因:

    • 连接未使用心跳机制
    • 捕获时间不足
    • 过滤条件错误(如端口/IP不匹配)

    引用说明

    • WebSocket连接通过HTTP Upgrade建立,后续数据在TCP上以帧格式传输。
    • 基础TCP健康检查通过三次握手完成,但本场景需深入解析应用层载荷。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 10月25日
  • 已采纳回答 10月17日
  • 创建了问题 10月17日