通过无线连接接收原始以太网数据包时,以太网校验和在哪里计算,错误在哪里处理?
无线堆栈是处理这个,还是在上层处理?
通常,以太网级 FCS(帧校验序列)在硬件 MAC(媒体访问控制器)中处理。请注意,我们在这里讨论的是 CRC,而不仅仅是校验和(以太网帧级别没有“校验和”)。
如果检测到 FCS 不匹配,它很可能会在 HW MAC 级别被丢弃:然后将更新统计计数器。
换句话说,用不可用的帧来“打扰”软件堆栈是没有用的。
校验和可以在不同的地方进行。最近的以太网卡从网络堆栈中卸载了校验和。我不得不禁用硬件校验和以使网络取证更容易。这应该很有意义,因为如果没有此功能,硬件将始终默默地丢弃数据包。
正如其他海报所说,FCS 通常由 NIC 本身或驱动程序检查。但是,在您阅读原始以太网帧的情况下,我认为这完全取决于驱动程序。例如,在可以设置为“监控”或“混杂”模式的 WiFi NIC 中,您通常不希望它们丢弃 FCS 错误的帧,因为这可能表示您正在寻找的错误。
一个数据点:英特尔 4965AGN Linux 驱动程序在监控模式下将所有捕获的数据包中的 FCS 字段设置为 0。如果您运行 Wireshark,您会看到它计算了预期的 FCS 并抱怨 0 字段无效。这是否意味着它会丢弃 MAC 中 FCS 错误的帧,或者这些帧是否也被传递,不幸的是尚不清楚。
因此,如果最初的问题是“在捕获原始数据包时我必须自己检查 FCS”,那么 4965AGN 案例中的答案是“你不能”,如果您从 NIC 获得真正的 FCS,则可能是“是”。
大多数网络硬件都允许您在硬件中设置一个选项来“存储坏包”。这允许您查看以太网 CRC 失败的数据包。如果您将错误的以太网帧传递给堆栈,它很可能会由于错误的上层校验和而被拒绝。堆栈不检查以太网 CRC;这留给 NIC,软件中的 CRC 计算非常耗时。
请记住,堆叠网络协议通常会在堆栈中的各个点计算校验和。TCP 通常会在网络层计算 CRC,在 IP 层计算 IP 标头校验和,在 TCP 层计算 TCP 校验和。应用程序还可以验证数据的完整性。