Как я могу получить CRC из полученных данных по TCP?

Мне нужно отправить пакеты Ethernet с одного устройства на другое по протоколу Ethernet. После некоторого исследования я решил использовать протокол TCP \ IP. Я создал TCP-сервер и TCP-клиент, которые взаимодействуют друг с другом. Для этого я использовал классы TcpClient и TcpListener. Работает нормально, но у меня есть вопросы:

  1. Мне нужно проверить CRC из полученного сообщения и как-то сравнить его с вычисленным вручную на стороне слушателя. Как я могу это сделать? Как я могу получить этот CRC из полученного сообщения? Все, что у меня есть, это точное сообщение, которое я отправляю от клиента.
  2. Как обычно видеть мое сообщение в этом формате пакета? Все, что я вижу на стороне слушателя, это поле «Данные», но я хочу видеть «сырые» с заголовками, CRC (FCS) и т. Д., нравится на этой картинке.

person Don chan    schedule 18.12.2019    source источник
comment
Мне нужно отправить пакеты Ethernet с одного устройства на другое, и я решил использовать TCP \ IP не складывается. Протоколы находятся на разных уровнях. (И Ethernet PDU лучше называть кадром, а не пакетом.)   -  person sticky bit    schedule 18.12.2019
comment
вы можете использовать инструмент анализатора пакетов, например tcpdump или Wireshark   -  person mangusta    schedule 18.12.2019
comment
@stickybit Извините, я еще новичок в этом. На самом деле это правда, я совершенно запутался в этих слоях. Вы можете порекомендовать что-нибудь прочесть, чтобы прояснить это? Не то чтобы книга, а что-то вроде скорочтения. И что вы можете мне порекомендовать в такой ситуации? Как я могу отправить эти Ethernet-фреймы в этом необработанном виде и прочитать их?   -  person Don chan    schedule 18.12.2019
comment
@mangusta, спасибо! Я попробую его поискать. Но это значит, что я не мог получить CRC по протоколу TCP / IP с помощью собственных инструментов .NET?   -  person Don chan    schedule 18.12.2019
comment
Я думаю, что все это встроено в TCP Client и не видно. Он использует это, чтобы гарантировать, что данные получены правильно (без ошибок). Если вы беспокоитесь о безопасности (например, о перехвате и изменении данных) больше, чем о проверке ошибок, вам нужно будет отправить свою собственную контрольную сумму вместе с переданными данными.   -  person Troy Mac1ure    schedule 18.12.2019


Ответы (1)


Свемир, вы можете проверить вопрос здесь о сырых общение с использованием сокетов в C #.

Вот хорошее объяснение SuperUser различных уровней. Если вы выберете необработанный метод сокетов, то вас ждут тяжелые времена.

вам придется обрабатывать детали TCP, если вы реализуете свой сокет таким образом.

Из документации Microsoft на SocketType.Raw

Поддерживает доступ к базовому транспортному протоколу. Используя Raw, вы можете общаться, используя такие протоколы, как Internet Control Message Protocol (ProtocolType.Icmp) и Internet Group Management Protocol (ProtocolType.Igmp). При отправке ваше приложение должно предоставить полный IP-заголовок. Полученные дейтаграммы возвращаются с IP-заголовком и параметрами без изменений

Из документации Microsoft на SocketType.Stream

Поддерживает надежные двусторонние потоки байтов на основе соединений без дублирования данных и без сохранения границ. Socket этого типа взаимодействует с одним одноранговым узлом и требует подключения к удаленному хосту, прежде чем связь может начаться. Stream использует протокол управления передачей (ProtocolType.Tcp) и семейство адресов AddressFamily.InterNetwork.

Это в основном означает, что все обрабатывается за вас и что вы можете иметь доступ только к тому, что ссылка SuperUser называет содержимым письма.

person Athanasios Kataras    schedule 18.12.2019
comment
Большое спасибо, Афанасий! Ваш ответ очень полезен, и теперь я знаю об этих протоколах гораздо больше и знаю, как они работают. Но я думаю, что сейчас я выберу путь, который посоветовал @ TroyMac1ure. Потому что эти сырые сокеты мне пока очень сложно. Но на будущее я знаю, как с этим справиться. Спасибо! - person Don chan; 23.12.2019