Я использую библиотеку libpcap для мониторинга HTTP-запросов и ответов. Я также храню 10 самых последних запросов GET в памяти на основе поиска строк и нескольких ответов. Предположим, что монитор включен, и я загружаю файл, это повлияет на мою скорость загрузки, или это копия пакета будет передана в libpcap без влияния на трафик?
Ранее я делал то же самое, используя iptables + libnetfilter_queue. Мой модуль на основе libnetfilter_queue был немного медленным при анализе пакетов, так как было выполнено много операций поиска строк и связанных операций с каждым исходящим пакетом и несколько входящих пакетов. Это зависит от скорости загрузки, предположим, загрузка файла с использованием ускорителя загрузки. Когда модуль работал, мои скорости загрузки были меньше по сравнению с тем, когда он не работал. Возможно, потому что все пакеты были переданы моему модулю netfilter_queue, а затем другим пользовательским приложениям.
Буду ли я сталкиваться с той же проблемой с libpcap. Я слышал, что он использует какой-то механизм нулевого копирования.
Копия пакета передается в сокет PF_PACKET (я понимаю, из «libnetfilter», что вы используете Linux), поэтому он не обрабатывается по тому же пути кода, который обрабатывает его как обычный сетевой ввод.
Более новые версии libpcap (1.0 и более поздние) передают эти пакеты пользователю через общую память, которая является механизмом «нулевого копирования».
Тем не менее, есть еще обработка выполняется для каждого пакета, поэтому будет некоторое замедление, если ваша машина не имеет свободных процессорных ядер и свободной полосы пропускания памяти (и полосы пропускания диска, если ваша программа записывает значительные объемы данных в файловую систему). Это не будет напрямую увеличивать обработку пакетов задержка, поскольку он не находится в пути кода, каким был ваш механизм на основе сетевых фильтров, он, вероятно, не окажет такого большого влияния на производительность сети.
Это будет копия пакета, передаваемая в libpcap без влияния на трафик.