python-pcapng wireshark 包解析

背景

Ubuntu上写程序, UDP发给MCU, 长度51字节, 10ms/帧, MCU如果100ms内收不到, 就报出UDP Lost错误.

同事甩给我这个录了40分钟的wireshark的pcapng格式的包, 大概3.6GB, 要分析下UDP丢帧问题, 用wireshark打开不得了, 整整500多万行. 好家伙…

环境配置

Win10, Python3.9.4, 64bit. 安装pcapng的一个包:

pip install python-pcapng

参考:

包处理

载入包, 打印出相比上一帧的时间差大于100ms(0.1s)的行号:

import pcapng
from datetime import datetime

cnt = -2
old_timestamp = 0
with open('2021672005_666.pcapng', 'rb') as fp:
    scanner = pcapng.FileScanner(fp)
    for block in scanner:
        cnt += 1
        if (cnt>0):
            if (cnt == 1):
                old_timestamp = block.timestamp
            if (block.packet_payload_info[0]==93):
                dt = block.timestamp - old_timestamp
                if (dt > 0.1):
                    print("line:", cnt, '%.4fs' % dt)
                old_timestamp = block.timestamp

其中:

  • 包的第一个block为SectionHeader 信息(cpu, os, wireshark version等)

  • 包的第二个block为InterfaceDescription, 主要是接口的信息, 如以太网网卡信息等

  • 包的第三个block以及往后才开始是EnhancedPacket, 也是正常的包信息, 典型的格式如下:

    <EnhancedPacket interface_id=0 timestamp_high=377899 timestamp_low=1033621862 packet_payload_info=(93, 93, b'\x11"3DUfH\xb0-\x13G*\x08\x00E\x00\x00O^e@\x00@\x11NN\xc0\xa8\x06B\xc0\xa8\x06X\xe2\x15\x0f\xa1\x00;\xbc\xd3\xaa\x00\x00\x00\x19\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00') options=Options({})>
    
  • packet_payload 为93字节, 除去头部的42字节信息, 对应51字节的数据

  • block里面的时间戳为timestamp_high和timestamp_low, 可以对比下不同格式的时间戳表示, 这里用block.timestamp求时间差, 单位s:

    print(block.timestamp_high, block.timestamp_low, block.timestamp)
    print(datetime.utcfromtimestamp(block.timestamp).strftime("%Y-%m-%d %H:%M:%S:%f"))
    
    377899 1033621862 1623064879.8129659
    2021-06-07 11:21:19:812966
    

运行结果如下:

> python3 .\2.py
line: 231442 0.2080s
line: 236810 0.1918s
line: 276706 0.6385s
line: 283443 1.3004s
line: 284352 1.3068s
line: 285149 0.8137s
line: 288395 0.4814s
line: 292113 0.6660s
line: 293014 0.3902s
line: 295419 0.9919s
line: 296189 1.0845s
line: 296845 1.3165s
line: 297662 1.2829s
line: 298549 1.3162s
line: 299379 1.5020s
...

wireshark转到最严重的299379行, 发现ssh图形界面占据了大量带宽, 导致UDP包阻塞, 之后一口气发出来100多帧, 如果MCU处理不好, 可能直接就卡死了:

在这里插入图片描述

SSH图形界面还是很占用带宽的, 慎用. 很多问题思路需要思考尝试, 如何彻底解决问题呢?

  • 交换/路由的小包优先+带宽均分+简单队列限制?: ROS小包优先+带宽均分+简单队列限制
  • TCP可以优化UDP的这个问题么?
  • Ubuntu和MCU改用SPI/UART通信?
  • 连发时MCU的接收如何处理?
  • Linux的实时补丁是否可用?
  • Linux监测带宽负载率, 做流量的整体规划?
  • 点对点通信和经过交换机的风险评估

微信公众号

欢迎扫描二维码关注本人微信公众号, 及时获取最新文章:
在这里插入图片描述

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值