Оптимальный SNAPLEN для PCAP Live Capture - PullRequest
7 голосов
/ 19 февраля 2012

При использовании pcap_open_live для прослушивания интерфейса я видел множество примеров использования различных чисел в качестве значения SNAPLEN, варьирующихся от BUFSIZ (<stdio.h>) до "магических чисел".

Разве не имеет смысла устанавливать в качестве SNAPLEN MTU интерфейса, с которого мы получаем данные?Таким образом, мы можем разместить больше пакетов одновременно в буфере PCAP.Можно ли предположить, что MRU равен MTU?

Иначе, существует ли неэкзотический способ установить значение SNAPLEN?

Спасибо

1 Ответ

6 голосов
/ 19 февраля 2012

MTU - это самый большой размер полезной нагрузки , который может быть передан на канальный уровень;он не включает никаких заголовков канального уровня, поэтому, например, для Ethernet это будет 1500, а не 1514 или 1518, и его будет недостаточно для захвата полноразмерного пакета Ethernet.

InКроме того, он не включает никаких заголовков метаданных, таких как заголовок радиоленты для радиоинформации 802.11.

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

Что касается размещения большего количества пакетов в PCAPбуфер, который применяется только к отображаемым в памяти механизмам захвата TPACKET_V1 и TPACKET_V2 в Linux, которые имеют слоты пакетов фиксированного размера;другие механизмы захвата не резервируют слот максимального размера для каждого пакета, поэтому более короткая длина снимка не имеет значения.Для TPACKET_V1 и TPACKET_V2 меньшая длина снимка может иметь значение, хотя, по крайней мере для Ethernet, libpcap 1.2.1 пытается, насколько это возможно, выбрать подходящий размер слота буфера для Ethernet.(Похоже, что TPACKET_V3 не имеет слотов фиксированного размера для каждого пакета, в этом случае у него не будет этой проблемы, но он появился только в официально выпущенных ядрах в последнее время, и в libpcap его пока не существует).

...