Проводит ли Wireshark (libpcap) пакеты, когда они все еще находятся в NIC или когда они были переданы ядру?

Я запускаю тестовую программу, которая ожидает сообщения от TCP-соединения с помощью функции recv а затем немедленно отвечает с помощью функции send . Затем я измеряю задержку между полученным и отправленным пакетом, которая измеряется метками времени, показанными в Wireshark. Я обнаружил, что эта задержка сильно варьируется при использовании разных сетевых карт. Похоже, это говорит о том, что Wireshark перехватывает пакеты, когда они все еще находятся в NIC, так что скорость, с которой NIC обрабатывает пакет, отражается в указанной задержке. Если захват происходит в ядре, я не могу объяснить, почему задержка отличается при использовании разных сетевых карт, поскольку все они используют (один и тот же) сетевой стек ядра.

Однако, если захват действительно происходит в NIC, как это возможно? Как libpcap может как-то добавить некоторые функции самой сетевой карты?

1 ответ1

0

Вы должны предположить, что этот захват не может произойти "в NIC".
Нет общего интерфейса для каждого сетевого адаптера; Вот почему каждая ОС должна использовать драйверы устройств для абстрагирования интерфейса.Вы указываете только сетевой интерфейс (например, eth0), который хотите использовать с Wireshark. Вы не указываете производителя / модель оборудования или название драйвера устройства.
Так что по простой логике одна из ваших альтернатив должна быть ошибочной.

Я читал о методе получения необработанных кадров Ethernet до их обработки стеком протоколов. Но правильный способ ответить на ваш вопрос - изучить исходный код GPL.

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

(Вам не ясно, какую "задержку" вы рассчитываете / измеряете и как она изменяется.)

Очевидно, вы не учли, что метод, который Wireshark использует для захвата кадров, может быть полностью отделен от метода, который ставит метки времени.
Linux поддерживает как аппаратные, так и программные временные метки кадров Ethernet.
Аппаратные метки времени будут генерироваться сетевым адаптером.
Программные метки времени будут генерироваться драйвером устройства Linux.
Подробности описаны в документации / сети / timestamping.txt

Нижняя линия
Wireshark - это пользовательское приложение.
Он может использовать только те возможности, которые ОС предлагает через API.
Поскольку временная метка кадров является неотъемлемой частью сетевой подсистемы, Wireshark не обязан выполнять свою собственную временную метку, а скорее использует существующие возможности ОС.
Следовательно, Wireshark может "перехватывать" необработанные сетевые пакеты (с временными метками), используя существующие системные вызовы.

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