На самом деле у меня есть два связанных вопроса.
Я собираю отфильтрованный сетевой трафик 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.