以太网数据不是总是包含 IP 数据包吗?

net*_*gog 0 python ip networking ethernet packet

我对以下用 Python 编写的代码有疑问:

def parse_ethernet(timestamp, packet)
    ethernet = dpkt.ethernet.Ethernet(packet)
    if isinstance(ethernet.data,dpkt.ip.IP):
        parse_ip(ethernet.data)
Run Code Online (Sandbox Code Playgroud)

代码的想法是使用python中的dpkt库解析以太网数据包。我的问题是关于以下行:

if isinstance(ethernet.data,dpkt.ip.IP):
Run Code Online (Sandbox Code Playgroud)

为什么需要证明 ethernet.data 是否是 IP 数据包的实例?以太网数据不是总是包含 IP 数据包吗?

Jör*_*tag 5

为什么需要证明 ethernet.data 是否是 IP 数据包的实例?以太网数据不是总是包含 IP 数据包吗?

不,它没有。例如,对于 ARP 请求,以太网帧包含 ARP 数据包,而不是 IP 数据包。

在 ATA-over-Ethernet 中,顾名思义,以太网帧包含封装的 ATA 数据包,而不是 IP。

然后是 AES51、AVB、SoundGrid、EtherSound、CobraNet、LLDP、FCoE、PTP(第 2 层)、MACsec、EtherCAT、HyperSCSI、PROFINET、PPPoE、MPLS、IPX、AppleTalk、DECnet 等等。维基百科列出了 50 多个协议,这些协议不是 IP 的,存在 EtherType 分配。