Как отправить пакеты размером более 1500 байт с помощью pcap_sendpacket? - PullRequest
9 голосов
/ 13 февраля 2012

На самом деле у меня есть два связанных вопроса.

Я собираю отфильтрованный сетевой трафик libpcap в Debian. Затем мне нужно воспроизвести этот трафик на сервере Win2k3. Иногда я перехватываю пакеты, как TCP, так и UDP, намного больше 1500 байт (размер MTU по умолчанию для Ethernet). Например, 2000+ байтов. Я не внес никаких конкретных изменений в размер MTU в этом Linux. Итак, вопрос № 1:

В чем причина того, что эти пакеты намного больше, чем MTU по умолчанию? Jumbo frames ? В этой статье Википедии говорится, что «сетевым интерфейсным картам, способным работать с большими кадрами, требуется явная настройка для использования больших кадров», но я не знаю ни о какой такой конфигурации. Также ifconfig показывает мне «MTU: 1500». Может ли это быть как-то связано с техникой «объединения прерываний» (или «объединением прерываний», как в этой статье )? Могу ли я подавить такие пакеты?

Тогда вопрос № 2:

Как я могу отправить такие пакеты с помощью pcap_sendpacket в Windows? Я получаю сообщение об ошибке «Ошибка отправки: сбой PacketSendPacket» только для пакетов размером более 1500 байт. Кажется, я не могу использовать Jumbo-кадры, потому что я отправляю данные на напрямую подключенный пользовательский «net tap», такой как pci-карта, и я не уверен, что смогу настроить его NIC. Что-то еще? Должен ли я фрагментировать эти пакеты в соответствии с правилами протокола?

EDIT:

Проверено фрагментированием NIC, как предложил Гай Харрис:

~# ethtool -k eth0
Offload parameters for eth0:
rx-checksumming: on
tx-checksumming: on
scatter-gather: on
tcp-segmentation-offload: off
udp-fragmentation-offload: off
generic-segmentation-offload: off
generic-receive-offload: off
large-receive-offload: off
ntuple-filters: off
receive-hashing: off

То же самое для eth1 и br0 - сетевой мост между eth0 и eth1, который я нюхаю.

И я все еще получаю большие пакеты UDP.

Ответы [ 2 ]

7 голосов
/ 15 февраля 2012

Ваш сетевой адаптер, вероятно, выполняет разгрузку сегментирования / десегментации TCP и разгрузку фрагментации / повторной сборки IP, поэтому:

  • UDP-пакеты, отправляемые вашей машиной, которые больше, чем умещаются в одном кадре Ethernetпередаются сетевому адаптеру без фрагментации, при этом сетевой адаптер выполняет фрагментацию, и они также передаются libpcap перед фрагментацией;
  • фрагменты UDP, полученные сетевым адаптером, которые больше, чем подходятв одном фрейме Ethernet собираются сетевым адаптером перед передачей на хост и передаются libpcap после повторной сборки;
  • фрагменты данных потока TCP, отправляемых вашей машиной, которые слишком велики дляподключение к одному кадру Ethernet передается сетевому адаптеру, при этом сетевой адаптер разбивает фрагменты на более мелкие сегменты TCP, а полный блок передается libpcap;
  • полученные сегменты TCP by ваш сетевой адаптер собирается в более крупные порции данных TCP, а порции передаются на хост, а затем на libpcap;

, поэтому libpcap видит , а не Ethernetпакеты и не ограничены размером кадра Ethernet.

(т. е. Николай Фетиссов, вероятно, был прав;то, что вы получаете, может выглядеть как фреймы Ethernet, но это потому, что сетевой адаптер и драйвер делают их похожими.Фактически они не являются кадрами Ethernet, передаваемыми или полученными из Ethernet.)

Вы можете подавить их, только отключив любую форму сегментации / десегментации / фрагментации / повторной сборки, выполняемую на сетевом адаптере с помощьюкоманда ethtool;отключите такие параметры, как разгрузка сегментации TCP, разгрузка фрагментации UDP, разгрузка общей сегментации, разгрузка большого приема и разгрузка общего приема.

После того, как вы отключили эти опции, у вас больше не должно быть этих больших пакетов, иТаким образом, вы должны быть в состоянии воспроизвести их без проблем. - это простой способ воспроизвести повторно собранные / не фрагментированные или сегментированные пакеты, которые вы уже захватили - вам придется написать свой собственный код для их фрагментации, и нет гарантии, что онибыли бы фрагментированы / сегментированы так же, как они были первоначально фрагментированы / сегментированы на проводе.

4 голосов
/ 23 февраля 2012

you Используете ли вы wireshark для захвата?

Это важно, поскольку по умолчанию wireshark собирает фрагментированные дейтаграммы ip (и сохраняет их в файле pcap в виде повторно собранных пакетов MTU-Higger без фрагментации).Чтобы отключить:

Правка-> Настройки-> Протоколы-> ipV4-> и снимите флажок «Сборка фрагментированных дейтаграмм IPv4».

...