python - 使用 DPKT python 检查数据包是否包含以太网层或原始 IP 数据包
问题描述
我有一些 pcap 文件,我需要从中提取一些信息,这些数据包是混合的,一些是原始 IP,另一些包含以太网帧。
我需要在解析之前有条件地检查数据包的类型,因为带有以太网帧的数据包可以被解析为:
for ts, buf in pkts:
if buf contains_ethernet:
eth = dpkt.ethernet.Ethernet(buf)
if eth.type == dpkt.ethernet.ETH_TYPE_IP:
ip = eth.data
else:
continue
else:
ip = dpkt.ip.IP(buf)
如何将其定义contains_ethernet
为布尔值或条件?
解决方案
pcap 头文件定义了捕获的链接类型(以太网、原始 IP、...)
在处理数据包之前,您应该使用 dpkt.pcap.Reader() 对象的 datalink() 来获取 pcap 文件的链接类型。根据您的脚本示例:
if <<dpkt.pcap.Reader>>.datalink() == LINKTYPE_ETHERNET:
## Process Ethernet frame
elif <<dpkt.pcap.Reader>>.datalink() == LINKTYPE_RAW:
## Processs Raw IP datagram
else:
## Other link types
以下是链接类型列表:http ://www.tcpdump.org/linktypes.html
LINKTYPE_ETHERNET 用于以太网,LINKTYPE_RAW 用于原始 IP
推荐阅读
- laravel-5.4 - 在 laravel 4.2 和 5+ 中获取每周/每月记录?
- c++ - C++ GDI+ 清除前一个屏幕
- vue.js - 导入组件时未找到 VueJS 模块错误
- android - Android相机预览有“花边”或“马赛克”的边框使用SurfaceTexture,为什么图片不能完全填满屏幕?
- c# - 社区工具包控件的 XAML 错误
- django - django 如何确保一个持久连接不会同时被多线程共享?
- angular - 如何在 ng build 上添加“严格”代码检查(没有生产标志)?
- scala - 将完整类型提升为单子变压器
- html - CSS - 跨度 bg-color 与文本高度相同
- ibm-cloud - 我们如何将意图、实体等从 Excel 导入 Watson Asssitant?