Как отправить пакеты размером более 1500 байт с помощью pcap sendpacket?



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



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



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



Затем вопрос №2:



Как я могу отправить такие пакеты по pcap_sendpacket в Windows? я получаю сообщение об ошибке "ошибка отправки: PacketSendPacket failed" только для пакетов размером более 1500 байт. Кажется, я не могу использовать jumbo frames, потому что я отправляю данные на напрямую подключенный пользовательский "net tap", такой как pci-карта, и я не уверен, что могу настроить его 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.

739   2  

2 ответов:

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

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

Edit - > preferences - >Protocols - >ipV4 - > и снимите флажок "собрать фрагментированные дейтаграммы IPv4".

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

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

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

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

Comments

    Ничего не найдено.