python-pcapng wireshark 包解析
目录背景环境配置包处理微信公众号背景Ubuntu上写程序, UDP发给MCU, 长度51字节, 10ms/帧, MCU如果100ms内收不到, 就报出UDP Lost错误.同事甩给我这个录了40分钟的wireshark的pcapng格式的包, 大概3.6GB, 要分析下UDP丢帧问题, 用wireshark打开不得了, 整整500多万行. 好家伙…环境配置Win10, Python3.9.4, 6
背景
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监测带宽负载率, 做流量的整体规划?
- 点对点通信和经过交换机的风险评估
- …
微信公众号
欢迎扫描二维码关注本人微信公众号, 及时获取最新文章:
更多推荐
所有评论(0)