2013-03-27 2 views
1

Как видно из this question, контрольная сумма рассчитывается и проверяется аппаратным обеспечением ethernet, поэтому представляется маловероятным, что она должна быть сгенерирована программным обеспечением при отправке кадров с использованием гнезда AF_PACKET, как показано here и here. Кроме того, я не думаю, что он может быть получен из сокета или каким-либо простым средним значением, поскольку даже Wireshark его не отображает.Является ли контрольная сумма ethernet через AF_PACKET?

Итак, может ли кто-нибудь подтвердить это? Мне действительно нужно отправить контрольную сумму, как показано в последних двух ссылках? Будет ли создаваться контрольная сумма и автоматически проверяться адаптером ethernet?

ответ

2

Нет, вам не нужно включать CRC.

При использовании пакетного сокета в Linux с использованием socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)) вы должны указать заголовок уровня 2 при отправке. Это определяется struct ether_header в netinet/if_ether.h и включает хост-получатель, исходный хост и тип. Последовательность проверки кадра не включена и не является преамбулой, началом разделителя кадра или трейлером. Они добавляются аппаратными средствами.

2

В Linux, если вы упомянули сокет (AF_PACKET, SOCK_RAW, htobe16 (ETH_P_ALL)) аналогичный случай, вам не нужно вычислять контрольную сумму ethernet, оборудование/драйвер NIC сделает это за вас. Это означает, что вам нужно предоставить весь слой канала передачи данных, кроме контрольной суммы, прежде чем отправить его в raw-сокет.

Смежные вопросы