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

Doesn't the ethernet data always contain the IP packet?

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

def parse_ethernet(timestamp, packet)
    ethernet = dpkt.ethernet.Ethernet(packet)
    if isinstance(ethernet.data,dpkt.ip.IP):
        parse_ip(ethernet.data)

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

if isinstance(ethernet.data,dpkt.ip.IP):

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

Why do we need to prove if the ethernet.data is an instance of the IP packet? Doesn't the ethernet data always contain the IP packet?

不,不是。例如,对于 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 分配。

是的,以太网框架总是在 osi 模型的第 2 层具有 Mac - 地址。数据包在 layer3

受到 ip 地址的影响