0

我想通过两台计算机之间的以太网电缆发送一些原始位。传输过程中发生的数据错误通过以太网帧校验序列(FCS)(如CRC:循环冗余校验)进行纠正,并由TCP等上层进一步检查。

但是,我不希望应用任何纠错技术。我想查看在传输中发生错误时收到的确切位。我看过一些关于发送原始以太网帧的文章(例如http://hacked10bits.blogspot.in/2011/12/sending-raw-ethernet-frames-in-6-easy.html ),但我认为它们也经历了类似 FCS CRC 校验。是否可以在没有任何此类错误更正的情况下发送数据。谢谢。

编辑 1

我使用以太网电缆直接端到端连接两台计算机(中间没有交换机或路由器)。以太网电缆为“CAT 5E”,标记为“B 网络跳线 CAT 5E 24AWG 4PR-ETL TIA/EIA-568B”

lspci -v 的输出是(两台计算机几乎相同):

Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 0c)
    Subsystem: Lenovo RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
    Flags: bus master, fast devsel, latency 0, IRQ 28
    I/O ports at e000 [size=256]
    Memory at f7c04000 (64-bit, non-prefetchable) [size=4K]
    Memory at f7c00000 (64-bit, prefetchable) [size=16K]
    Capabilities: [40] Power Management version 3
    Capabilities: [50] MSI: Enable+ Count=1/1 Maskable- 64bit+
    Capabilities: [70] Express Endpoint, MSI 01
    Capabilities: [b0] MSI-X: Enable- Count=4 Masked-
    Capabilities: [d0] Vital Product Data
    Capabilities: [100] Advanced Error Reporting
    Capabilities: [140] Virtual Channel
    Capabilities: [160] Device Serial Number 01-00-00-00-68-4c-e0-00
    Capabilities: [170] Latency Tolerance Reporting
    Kernel driver in use: r8169
    Kernel modules: r8169

我使用以下命令显示 FCS 并且不丢帧

sudo ethtool -K eth0 rx-fcs on rx-all on

我仍然没有收到任何错误/坏帧。我在每帧中发送 1000 位零,并且收到的所有位都没有任何 1。我是否需要继续发送很多这样的帧才能接收到坏帧?(因为 CAT 5E 电缆的误码率可能要低很多)另外,我可以使用相同的当前 NIC 和以太网电缆实现我自己的 LAN 协议吗?

基本上,我希望在传输过程中得到尽可能多的错误并检测所有错误。

4

3 回答 3

2

这是不可能的。FCS 对以太网帧(第 2 层)是强制性的;它检查错误,但无法定位/纠正错误位。FEC 与更快的 PHY(第 1 层)一起使用,也不是可选的。

关闭 NIC 上的 FCS 检查时,您必须记住,您使用的任何开关也会检查 FCS 错误并丢弃 FCS 错误的入口帧。以太网被明确设计为不传播错误帧。

编辑 1 个问题评论:

  • 使用良好的布线,GbE 上的错误帧应该非常少见。如果您确实想要错误(?),请使用较长的 Cat3 电缆或严重滥用 Cat5 电缆...

  • 以太网 NIC 使用以太网。如果您想要自己的协议,则需要构建自己的硬件。

于 2017-10-30T18:11:43.093 回答
2

虽然通常不可能在不附加正确 FCS 的情况下发送以太网帧,但通常可以接收到没有正确 FCS 的帧。许多网络控制器都支持这一点,尽管它可能需要您修改本机网络设备驱动程序。

例如,许多英特尔 NIC 的模式设置会导致帧错误、FCS 错误和其他类型的错误帧被丢弃。驱动程序通常会打开该功能。这通常是可取的,因为这样的帧不太可能有用(因为已知它们已损坏)。但是,出于故障排除的目的,NIC 支持接收所有帧,包括错误帧。只是通常没有理由向用户公开该功能。毕竟,谁愿意接收已知损坏的帧?

通常此类帧启用计数器。许多 NIC 实际上通过诊断计数器公开这些。在 Linux 中,您经常可以使用ethtool -S <interface>.

例如,在我的机器上(注rx_crc_errors):

$ ethtool -S eth0
NIC statistics:
     rx_packets: 1629186
     tx_packets: 138121
     rx_bytes: 747886491
     tx_bytes: 12198820
     rx_broadcast: 0
     tx_broadcast: 0
     rx_multicast: 0
     tx_multicast: 0
     rx_errors: 0
     tx_errors: 0
     tx_dropped: 0
     multicast: 0
     collisions: 0
     rx_length_errors: 0
     rx_over_errors: 0
     rx_crc_errors: 0
     rx_frame_errors: 0
     rx_no_buffer_count: 0
     rx_missed_errors: 0
     tx_aborted_errors: 0
     tx_carrier_errors: 0
     tx_fifo_errors: 0
     tx_heartbeat_errors: 0
     tx_window_errors: 0
     tx_abort_late_coll: 0
     tx_deferred_ok: 0
     tx_single_coll_ok: 0
     tx_multi_coll_ok: 0
     tx_timeout_count: 0
     tx_restart_queue: 0
     rx_long_length_errors: 0
     rx_short_length_errors: 0
     rx_align_errors: 0
     tx_tcp_seg_good: 269
     tx_tcp_seg_failed: 0
     rx_flow_control_xon: 0
     rx_flow_control_xoff: 0
     tx_flow_control_xon: 0
     tx_flow_control_xoff: 0
     rx_long_byte_count: 747886491
     rx_csum_offload_good: 1590047
     rx_csum_offload_errors: 0
     alloc_rx_buff_failed: 0
     tx_smbus: 0
     rx_smbus: 0
     dropped_smbus
于 2017-10-30T22:35:08.523 回答
0

您的 NIC 设备 (Realtek) 无法发送错误的 CRC/FCS。您的 NIC 不断为您发送的每个数据包添加 FCS 4 字节,即使对于使用 AF_PACKET 套接字的“手工制作”原始数据包也是如此。

到目前为止,据我所知,唯一支持发送错误 CRC/FCS 的标准 NIC 是以下 INTEL NIC 驱动程序:e1001、e1000、e100、ixgbe、i40e 和 igb。

于 2018-05-16T15:20:28.377 回答