Отправка битов по физическому кабелю Ethernet без исправления ошибок, например FCS или CRC

Я хотел бы отправить несколько сырых битов по кабелю Ethernet между двумя компьютерами. Ошибки в данных, возникшие во время передачи, исправляются с помощью последовательности проверки кадров Ethernet (FCS) (например, CRC: проверка избыточности цикла) и дальнейших проверок верхними уровнями, такими как TCP.

Но я не хочу, чтобы применялись какие-либо методы исправления ошибок. Я хочу видеть точные биты, полученные с ошибками, возникающими при передаче. Я видел несколько статей (например, http://hacked10bits.blogspot.in/2011/12/sending-raw-ethernet-frames-in-6-easy.html) при отправке сырых кадров Ethernet, но я думаю, что они также проходят FCS, как проверки CRC. Можно ли отправить данные без исправления таких ошибок. Спасибо.

Изменить 1

Я подключаю два компьютера напрямую друг к другу с помощью кабеля Ethernet (без коммутаторов или маршрутизатора между ними). Кабель Ethernet - «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 бит нулей в каждом кадре, и ни один из полученных битов не имеет единиц. Нужно ли мне постоянно отправлять много таких кадров, чтобы получить плохой кадр? (Поскольку частота ошибок по битам, вероятно, намного меньше для кабеля CAT 5E) Кроме того, могу ли я реализовать свой собственный протокол локальной сети с тем же текущим сетевым адаптером и кабелем Ethernet?

По сути, я хочу получить как можно больше ошибок во время передачи и обнаружить их все.


person user1877095    schedule 30.10.2017    source источник
comment
Учитывая, что FCS является частью стандарта Ethernet, для этого вам нужно будет написать свой собственный протокол LAN.   -  person Ron Maupin    schedule 30.10.2017
comment
@RonMaupin Спасибо. Я искал и нашел это: stackoverflow.com/a/24175679/1877095, который настраивает ethtool так, чтобы он не падал и не показывал плохие пакеты. Достаточно ли этого? Или перед этим слоем уже выполняются какие-то другие проверки? Спасибо.   -  person user1877095    schedule 30.10.2017
comment
Фреймы Ethernet по-прежнему будут иметь FCS. Это единственный способ сказать, что кадры плохие. Пакеты могут иметь CRC (IPv4 имеет IHL, а IPv6 нет), а TCP имеет CRC для своих сегментов. UDP имеет необязательный CRC для IPv4, но он необходим для IPv6. Сначала вы видите рамку.   -  person Ron Maupin    schedule 30.10.2017
comment
Думаю, я не так понятен. Используя описанный выше метод (используя ethtool для отображения плохих кадров), я могу захватить все плохие кадры, когда использую wirehark или tcpdump. Верно? Или некоторые из плохих кадров будут уже удалены, даже если я их не увидел? Спасибо.   -  person user1877095    schedule 30.10.2017
comment
Обычно оборудование пропускает плохие кадры. Это действительно будет зависеть от того, что у вас есть. В настоящее время Ethernet практически полностью переходит в аппаратное обеспечение. Например, большая часть коммутации полностью выполняется аппаратно, а плохие кадры отбрасываются на уровне 1.   -  person Ron Maupin    schedule 30.10.2017


Ответы (3)


Хотя обычно невозможно отправить кадры Ethernet без добавления правильной FCS, часто можно получить кадры, которые не имеют правильной FCS. Многие сетевые контроллеры поддерживают это, хотя для этого, вероятно, потребуется изменить собственный драйвер сетевого устройства.

Например, многие сетевые карты Intel имеют настройку режима, при которой ошибки кадрирования, ошибки FCS и другие типы кадров ошибок отбрасываются. Драйвер обычно включает эту функцию. Обычно это желательно, потому что такие кадры вряд ли будут полезны (поскольку известно, что они повреждены). Однако в целях устранения неполадок сетевая карта поддерживает получение всех кадров, включая кадры ошибок. Просто обычно нет причин открывать эту функцию пользователям. В конце концов, кто хочет получать заведомо поврежденные кадры?

Для таких фреймов принято включать счетчики. Многие сетевые карты фактически обнаруживают их через диагностические счетчики. В 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
person Gil Hamilton    schedule 30.10.2017
comment
У меня меньше счетчиков для моей сетевой карты Realtek r8169. Он не содержит rx_crc_errors и многих других ошибок. У вас есть представление, связано ли это с самой сетевой картой или другой драйвер может дать больше статистики. - person user1877095; 31.10.2017
comment
Выбор отображаемой статистики зависит от драйвера и сетевой карты. - person Gil Hamilton; 31.10.2017
comment
Ссылка здесь описывает способ отправки поврежденной FCS, хотя, когда я использую данный метод, автоматически добавляется правильная FCS. stackoverflow.com/a/6382971/1877095. Мой драйвер не поддерживает флаг SO_NOFCS (см. stackoverflow.com/a/25922139/1877095), так что, возможно, это причина. - person user1877095; 31.10.2017

Это невозможно. FCS является обязательной для кадров Ethernet (уровень 2); он проверяет наличие ошибок, но найти / исправить биты ошибок невозможно. FEC используется с более быстрыми физическими уровнями (уровень 1) и также не является необязательным.

При отключении проверки FCS на сетевом адаптере следует иметь в виду, что любой используемый вами коммутатор также проверяет ошибки FCS и отбрасывает входящие кадры с неправильной FCS. Ethernet явно спроектирован так, чтобы не распространять кадры ошибок.

Редактировать 1 комментарий к вопросу:

  • При правильной прокладке кабеля кадры ошибок на GbE должны быть очень редкими. Если вы действительно хотите ошибки (?), Используйте кабель Cat3 большой длины или сильно злоупотребляйте кабелем Cat5 ...

  • Сетевая карта Ethernet говорит об Ethernet. Если вам нужен собственный протокол, вам нужно будет создать собственное оборудование.

person Zac67    schedule 30.10.2017
comment
Реализован ли FEC на сетевых адаптерах или он каким-то образом является частью самого кабеля. Как узнать, используется ли FEC. Кроме того, обновлен вопрос с более подробной информацией. Спасибо. - person user1877095; 30.10.2017
comment
FEC реализуется внутри сетевой карты (на подуровне PCS физического уровня). - person Zac67; 30.10.2017
comment
Есть ли способ узнать, что моя текущая сетевая карта реализовала FEC? И можете ли вы предложить какие-либо другие средства для достижения этой цели, например, использование очень старой сетевой карты, или покупку специальной сетевой карты и соответствующего кабеля, или написания собственного протокола LAN? - person user1877095; 30.10.2017
comment
FEC является частью 10GbE и выше. Вы можете получить все опубликованные стандарты на ieeexplore.ieee.org/document/7428776. - person Zac67; 30.10.2017
comment
Семейство RTL8111 - это Gigabit Ethernet - без FEC. - person Zac67; 31.10.2017

Отправка неправильной CRC / FCS невозможна с вашим устройством NIC (Realtek). Ваша сетевая карта продолжает добавлять 4 байта FCS для каждого отправляемого вами пакета, даже для "сделанных вручную" сырых пакетов с использованием сокета AF_PACKET.

Насколько мне известно, единственными стандартными сетевыми адаптерами, которые поддерживают отправку неправильной CRC / FCS, являются следующие драйверы INTEL NIC: e1001, e1000, e100, ixgbe, i40e и igb.

person Adel Belasker    schedule 16.05.2018