2010-07-27 2 views
2

Предположим, мы собираем пакеты с API C libpcap. Эффективно ли анализировать некоторые строки полезной нагрузки со строковым поиском strstr() в линейной скорости (например, Mbps/Gbps)? Например strstr (полезная нагрузка, «User-Agent»);Поиск строк в пакете

Было бы более эффективным сделать это с помощью библиотеки соответствия шаблонов регулярных выражений, таких как libpcre?

Если мы хотим сделать это только для аргументов заголовка HTTP, существует ли какой-либо C API? Мне непонятно, может ли libcurl это сделать ... заблаговременно.

+0

Просто убедитесь, что ваши строки полезной нагрузки завершены NUL! – bstpierre

+0

yeap, спасибо! –

ответ

1

Если вы ищете только одну короткую строку, то ничего не будет намного быстрее, чем линейное сравнение, используемое strstr(). При этом специальная обработка strstr() для байтов NUL почти наверняка не является тем, что вы хотите для изучения сетевого трафика, и вам было бы лучше написать собственную реализацию, которая обрабатывала бы все байты одинаковыми и принятыми параметрами длины.

Если вы ищете несколько строк, вам лучше использовать быстрый алгоритм сопоставления строк, такой как Aho-Corasick, или создать машину состояний, которая соответствует строкам, которые вы хотите в нужном вам контексте, то есть синтаксический анализатор , Для анализа основной регулярной грамматики, такой как HTTP в C, ragel state machine compiler является моим инструментом выбора.

+0

Я ищу несколько строк ... 1) Я не могу понять, почему конечный автомат будет лучше для этого случая (например, strstr (полезная нагрузка, «GET»)! = NULL будет точно указывать на GET, и поэтому я могу разобрать строки после этого) и 2) почему лучшая машина для ragel лучше, чем использование strncmp? Спасибо! –

+0

Если у вас есть n-байтовый пакет и строки m, которые вы могли бы найти в нем, то линейный поиск для каждой строки должен быть не менее O (m * n). С помощью подхода с государственной машиной - либо Aho-Corasick и т. Д., Либо анализатора - вы просто выполните один линейный проход по данным. Если вы пытаетесь найти структурированную информацию, такую ​​как HTTP-глагол, за которым следует корректно отформатированный URI-адрес, а затем «HTTP /», затем версия, а затем использование синтаксического анализатора позволит вам значительно уменьшить боль, строго укажите ожидаемый результат. – llasram

0

Я действительно не могу представить, чтобы strstr была медленнее, чем альтернатива регулярного выражения, однако, если вам нужно вытащить различные значения HTTP-заголовка, тогда синтаксический анализ пакетов будет довольно хорошим вариантом. Не включает ли libpcap какие-либо встроенные парсеры?

+0

API libpcap C может извлекать информацию из заголовков TCP/IP, но не из полезной нагрузки. Поскольку заголовки HTTP являются частью полезной нагрузки, их нужно разбирать по-другому. –

+0

libpcap не содержит встроенных парсеров, поскольку он предназначен для использования такими программами, как tcpdump, Wireshark, snort и т. Д., Которые имеют свои собственные парсеры. Он даже не анализирует заголовки link-layer, IP или TCP. – 2012-02-16 02:32:22

1

http://www.arstdesign.com/articles/fastsearch.html имеет некоторые показатели, показывающие, что strstr прилично исполнен. Для коротких совпадений строк я сомневаюсь, что библиотека регулярных выражений может превзойти хорошую оптимизированную сборку.

+0

Благодарим вас за ответ. Похоже, strstr является самым быстрым выбором. –

Смежные вопросы