1

Мне интересно, что именно происходит внутри TShark, когда я использую фильтр захвата. В частности, скажем, у меня есть следующий фильтр для сбора многоадресных данных:

host 224.0.26.3 && port 12345

Есть ли Wireshark:

  1. Попросите ОС скопировать все пакеты на интерфейсе в свой локальный буфер
  2. Применить фильтр захвата
  3. Запишите данные

или же

  1. Попросите ОС только затем скопировать все пакеты на интерфейсе с хоста 224.0.26.1 и порта 12345 в свой локальный буфер. , ,
  2. Запишите данные

или что-то еще целиком?

2 ответа2

2

В большинстве операционных систем это

  1. Попросите ОС только затем скопировать все пакеты на интерфейсе с хоста 224.0.26.1 и порта 12345 в свой локальный буфер. , ,

  2. Запишите данные

хотя Wireshark и TShark запускают dumpcap (часть Wireshark) с интерфейсом (интерфейсами) для захвата и фильтром для использования в качестве аргументов командной строки, а dumpcap просит libpcap запросить у ОС (или в Windows Драйвер WinPcap) для копирования всех пакетов, которые соответствуют фильтру, в его локальный буфер.

В некоторых операционных системах (например, Solaris до Solaris 11, HP-UX и IRIX) операционная система не может выполнять фильтрацию в ядре, поэтому libpcap просит операционную систему предоставить ей все пакеты, и это (libpcap) запускает сам фильтр и передает только пакеты, которые соответствуют фильтру, его вызывающей программе - dumpcap, в случае Wireshark и TShark.

1

Wireshark имеет два типа фильтров: фильтры отображения и фильтры захвата.

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

Фильтры захвата могут быть огромным преимуществом для производительности, если у вас есть много отдельных потоков данных, проходящих через сетевой интерфейс, но вы хотите захватить только небольшую их часть. Данные никогда не копируются в wireshark, если они не соответствуют фильтрам захвата.

Вы действительно можете попробовать это и почувствовать разницу в производительности в пользовательском интерфейсе (и наблюдать разницу в производительности при использовании процессора), выполнив что-то вроде этого:

  1. Запустите быстрый веб-сервер на localhost.
  2. Начните огромную загрузку HTTP-файла (гигабайты данных).
  3. Захват на локальном сетевом интерфейсе с фильтром захвата, который игнорирует порт, где происходит огромная загрузка.
  4. Полностью очистите фильтр захвата и сравните производительность и загрузку ЦП на шаге 3 с настройкой фильтра того же типа на стороне фильтра дисплея.

IIRC, Wireshark сбрасывает свои колпачки пакетов на диск (чтобы он не выходил за пределы OOM), поэтому, возможно, узкое место, которое возникает при использовании "слишком широких" фильтров захвата, связано с тем, что вашей дисковой подсистеме приходится регистрировать все происходящее на сетевом интерфейсе.

Вот почему, если вы подключаетесь к очень занятому серверу только для того, чтобы наблюдать за одним конкретным потоком или процессом, важно установить разумные фильтры захвата. В противном случае wireshark привнесет значительную нагрузку на процессор и пропускную способность ввода / вывода.

В любом случае, в Windows реализация захвата пакетов происходит в основном на стороне ядра. Wireshark использует инструмент под названием WinPcap, модуль ядра, который фактически компилирует ваши фильтры захвата в собственный код во время выполнения, чтобы создать чрезвычайно оптимизированный тест на соответствие фильтра захвата или нет. Если фильтр не совпадает, пакет никогда не копируется в пространство процесса wireshark.

Реализация бэкэнда на стороне ядра pcap может варьироваться в зависимости от платформы, и, следовательно, может изменяться его производительность и эффективность.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .