Как фильтры захвата в Wireshark работают внутри?

1034
Chuu

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

host 224.0.26.3 && port 12345 

Есть ли Wireshark:

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

или же

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

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

1

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.

Информативно знать, что некоторые операционные системы не поддерживают фильтрацию ядра. Я * подозревал *, что это будет так, но у меня не было доказательств, подтверждающих это, поэтому я оставил это открытым в своем ответе. Horn OK Please 10 лет назад 0
1
Horn OK Please

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

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

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

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

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

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

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

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

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

Это не касается конкретно моего вопроса. То, что я пытаюсь выяснить, это именно то, что Wireshark (в данном случае TShark) делает на уровне операционной системы, чтобы выяснить, как многократные захваты в одном масштабе шкалы. Chuu 10 лет назад 0
Невозможно узнать без указания вашей точной операционной системы и версии wireshark / tshark. Смотрите мое редактирование. Я могу с уверенностью сказать, что * данные не копируются из ядра в пользовательское пространство * (то есть без переключения контекста) в случае пакета *, не * соответствующего фильтру захвата, в случае бэкенда Windows WinPcap. Понятия не имею о том, как это работает в Linux, BSD и т. Д. Вам нужно будет посмотреть исходный код ядра для соответствующих драйверов захвата. Horn OK Please 10 лет назад 0
Обратите внимание, что под «нет данных» я имею в виду, что полезная нагрузка пакета не перехватывается. По различным техническим причинам может потребоваться скопировать заголовок пакета в пространство пользователя или чтобы ядро ​​сообщило wireshark, что оно пропустило пакет, но это скорее сообщение связи / координации, а не фактическая полезная нагрузка данных. Полезные данные копируются только при положительном совпадении. Horn OK Please 10 лет назад 0