部分以太网 crc 出现在 tcpdump 中

网络工程 以太网
2022-02-02 04:23:23

我正在我的 Digilent Nexus4 DDR FPGA 上测试以太网传输。我创建了一个非常简单的数据包,其中包含广播目标地址和一些组成的以太网类型。这是在 tcpdump 中捕获的数据包。

05:58:22.148546 00:00:00:00:00:00 (oui Ethernet) > Broadcast, ethertype Unknown (0xebeb), length 66: 
    0x0000:  ffff ffff ffff 0000 0000 0000 ebeb 0000
    0x0010:  0000 dead beef 0000 0000 0000 0000 0000
    0x0020:  0000 0000 0000 0000 0000 0000 0000 0000
    0x0030:  0000 0000 0000 0000 0001 0203 0405 0607
    0x0040:  27ae

在我发送的数据包中0x01 0x02 0x03 0x04 0x05 0x06 0x07,我可以在数据包中清楚地看到最后几个字节。然而,捕获的数据包不是以 0x07 结束,而是包含 0x27ae,它恰好是我的 CRC 码的前两个字节。当我使用chipscope检查输出信号时,看起来我只是在传输0x07,然后按预期为crc传输另外4个字节。我将 fpga 中的以太网插入桌面上的 USB 以太网适配器,因为主板上的以太网端口用于通过路由器连接到互联网。USB 网卡是“AmazonBasics USB 3.0 到 10/100/1000 千兆以太网适配器”。

然后我想也许卡上的 phy 正在为我创建一个 crc,所以我故意翻转了 crc 的第一个字节中的位,我停止接收数据包。在 ifconfig 中,我可以看到错误数据包被丢弃。所以看起来虽然我电脑上的以太网适配器正在检查完整的 4 字节 crc,但它也在将它的前半部分传输到计算机。

我尝试的下一个实验不是将我的 FPGA 连接到 USB 以太网适配器,而是将它直接插入我的路由器。由于我使用的是广播以太网目的地,我认为数据包将通过其主板内置的 nic 路由回我的电脑,从而跳过 USB 以太网适配器。这有效,数据包中的最后一个字节实际上是 0x07,我在转储中没有看到任何我的 crc。然后,在保持 fpga 连接到路由器的同时,我断开了主板与路由器的连接,并将 USB 以太网适配器连接到路由器。现在,当我从 fpga -> router -> usb ethernet 收到数据包时,它再次包含了 crc 的一部分。所以看起来问题出在我的 USB 适配器而不是 FPGA 上。

我以为我的 USB 适配器可能有问题,但我可以毫无问题地浏览互联网。但是,我能想到的大多数协议(如 TCP 或 UDP)都有一个长度字段,因此它们可能无论如何都忽略了额外的两个字节数据。这是某些网卡的正常行为吗?我认为这可能与卡在意识到它在 crc 中之前仅传输部分 crc 的延迟有关。

1个回答

这可能是 NIC 在捕获或混杂模式下的驱动程序问题。它也有可能在正常模式下发生,因为 - 正如您所指出的 - 大多数协议自己跟踪它们的数据,而尾随的垃圾被忽略。

NIC 必须以可靠的方式识别 FCS 字段,否则它会丢弃所有帧。在接收时,FCS 在帧的所有字节上“即时”计算。当检测到帧结束时,FCS 值具有 CRC 残差或“幻数”0xC704DD7B。如果正确的 NIC 然后剥离最后四个字节并将帧传递给操作系统。显然,此 NIC 不会剥离所有 FCS 字节。