首页 > 解决方案 > 使用 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为布尔值或条件?

标签: pythonpacketpcapdpkt

解决方案


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


推荐阅读