это мой первый вопрос здесь @ stackoverflow.
Я пишу инструмент мониторинга для некоторых производственных серверов VoIP, в частности инструмент анализа, который позволяет захватывать весь трафик (вызовы VoIP), который соответствует заданному шаблонуиспользуя библиотеку pcap в Perl.
Я не могу использовать плохие селективные фильтры, такие как, например, "udp", а затем выполнять всю фильтрацию в коде моего приложения, потому что это потребует слишком много трафика, а ядро не справится с отчетным пакетом.потеря.
Что я делаю, так это итеративно создаю более избирательный фильтр, возможный во время захвата.Вначале я собираю только (все) сигнальный трафик SIP и фрагменты IP (сопоставление с образцом должно выполняться на уровне приложения в любом случае), затем, когда я нахожу некоторую информацию о RTP в пакеты SIP, я добавляю предложения 'или' кфактическая строка фильтра с определенными IP и PORT и переустановка фильтра с помощью setfilter ().
Так что в основном это выглядит примерно так:
Исходный фильтр: "(udpи порт 5060) или (udp и ip [6: 2] & 0x1fff! = 0) "-> перехватывает весь SIP-трафик и фрагменты IP
Обновленный фильтр:" (udp и порт5060) или (udp и ip [6: 2] & 0x1fff! = 0) или (IP-адрес хоста и порт PORT) "-> Записывает также RTP на определенный IP-адрес, PORT
Обновлен фильтр: "(udp и порт 5060) или (udp и ip [6: 2] & 0x1fff! = 0) или (IP-адрес хоста и порт PORT) или (IP2 хоста и порт PORT2)" -> Захватывает второй поток RTPа также
и т. д.
Это работает довольно хорошо, так как я могу получить «реальную» потерю пакетов RTP streaмс для целей мониторинга, в то время как в случае плохой версии селективного фильтра моего инструмента процент потери пакетов RTP был ненадежным, поскольку некоторые пакеты отсутствовали из-за сброса пакетов ядром.
Но давайте перейдем к недостаткуэтого подхода.
Вызов setfilter () во время захвата включает в себя тот факт, что libpcap отбрасывает пакеты, полученные «при изменении фильтра», как указано в комментариях к коду для функции set_kernel_filter (), в pcap-linux.c (проверенная версия libpcap0.9 и 1.1).
Итак, когда я вызываю setfilter () и некоторые пакеты приходят фрагментированными по IP, я теряю некоторые фрагменты, и это не сообщается статистикой libpcap в конце: я заметилон копается в следах.
Теперь я понимаю причину, по которой это действие выполняет libpcap, но в моем случае мне определенно не нужно сбрасывать пакеты (меня не волнует получение некоторого несвязанного трафика).
Не могли бы вы знать, как решить эту проблему, которая не является модифицированной?Ин код libpcap?