2010-07-27 94 views
2

假设我们使用libpcap的C API捕获数据包。以线速度(例如Mbps/Gbps)解析字符串搜索strstr()的某些有效负载字符串是否有效?例如strstr(有效载荷,“User-Agent”);数据包中的字符串搜索

使用正则表达式模式匹配库(比如libpcre)会更高效吗?

如果我们只想为HTTP头参数做这件事,请问有没有C API?我不清楚libcurl是否可以做到这一点... 提前谢谢你。

+0

只要确保您的有效载荷字符串NUL终止! – bstpierre 2010-07-28 00:05:17

+0

yeap,谢谢! – 2010-07-28 03:43:55

回答

1

如果您只搜索单个短字符串,则没有任何字符比strstr()使用的线性比较快得多。也就是说,strstr()NUL字节的特殊处理几乎肯定不是您想要检查网络流量的东西,而且您最好编写自己的实现,它将所有字节视为相同并且接受长度参数。

如果您要搜索多个字符串,最好使用像Aho-Corasick这样的快速字符串匹配算法,或者在您想要的上下文中构建一个匹配所需字符串的状态机 - 即解析器。为了解析像C这样的大部分常规语法,ragel state machine compiler是我的首选工具。

+0

我正在搜索多个字符串...... 1)我无法真正理解为什么状态机在这种情况下会更好(例如,strstr(有效内容,“GET”)!= NULL将完全指向GET,因此我可以解析之后的字符串)和2)为什么ragel状态机比使用strncmp更好?谢谢! – 2010-10-16 23:28:49

+0

如果你有一个n字节的数据包和m个字符串,你可能想在其中找到,那么每个字符串的线性搜索至少是O(m * n)。使用状态机方法 - 无论是Aho-Corasick等还是解析器 - 您只需对数据进行单个线性传递。如果您试图查找结构化信息(例如HTTP谓词,后跟正确格式化的主机相对URI,后跟“HTTP /”),那么使用解析器生成器,然后使用解析器生成器,您可以通过允许严格描述您的预期输入。 – llasram 2010-10-18 15:23:45

0

我真的无法想象strstr会比正则表达式的选择慢 - 但是,如果您需要提取各种HTTP标头值,那么解析数据包将是一个非常直接,更好的选择。 libpcap是否不包含任何内置解析器?

+0

libpcap C API可能会从TCP/IP标头中提取信息,但不会从有效负载中提取信息。由于HTTP标头是有效负载的一部分,因此需要通过其他方式进行解析。 – 2010-07-28 03:41:31

+0

libpcap不包含内置解析器,因为它打算供具有自己的解析器的程序(如tcpdump,Wireshark,snort等)使用。它甚至不解析链路层,IP或TCP头。 – 2012-02-16 02:32:22

1

http://www.arstdesign.com/articles/fastsearch.html有一些指标表明strstr性能很好。对于短字符串匹配,我怀疑一个正则表达式库可以打败优秀的组装。

+0

谢谢你的回答。看起来strstr是最快的选择。 – 2010-10-16 23:19:25