【问题标题】:String search in a packet数据包中的字符串搜索
【发布时间】:2011-03-21 21:35:49
【问题描述】:

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

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

如果我们只想对 HTTP 标头参数执行此操作,是否有任何 C API?我不清楚 libcurl 是否可以做到这一点...... 提前谢谢你。

【问题讨论】:

  • 只要确保你的有效载荷字符串是 NUL 终止的!

标签: c pcre pcap libpcap


【解决方案1】:

如果您只搜索单个短字符串,那么没有什么比strstr() 使用的线性比较快得多了。也就是说,strstr()NUL 字节的特殊处理几乎可以肯定不是您想要检查网络流量的,您最好编写自己的实现来处理所有字节相同并接受长度参数。

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

【讨论】:

  • 我正在搜索多个字符串... 1) 我无法真正理解为什么状态机更适合这种情况(例如 strstr(payload,"GET")!=NULL 会准确指向GET,因此我可以在此之后解析字符串)和 2)为什么 ragel 状态机比使用 strncmp 更好?谢谢!
  • 如果你有一个 n 字节数据包和 m 个字符串,你可能想在其中找到,那么对每个字符串的线性搜索至少是 O(m*n)。使用状态机方法(Aho-Corasick 等或解析器)您只需对数据进行一次线性传递。如果您尝试查找结构化信息,例如 HTTP 动词后跟正确格式的主机相对 URI,然后是“HTTP/”,然后是版本,那么使用解析器生成器可以让您省去很多麻烦严格描述您的预期输入。
【解决方案2】:

http://www.arstdesign.com/articles/fastsearch.html 有一些指标显示 strstr 的性能不错。对于短字符串匹配,我怀疑正则表达式库能否击败良好的优化程序集。

【讨论】:

  • 感谢您的回答。看起来 strstr 是最快的选择。
【解决方案3】:

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

【讨论】:

  • libpcap C API 可能会从 TCP/IP 标头中提取信息,但不会从有效负载中提取信息。由于 HTTP 标头是有效负载的一部分,因此需要通过另一种方式对其进行解析。
  • libpcap 不包含内置解析器,因为它旨在供具有自己解析器的程序(例如 tcpdump、Wireshark、snort 等)使用。它甚至不解析链路层、IP 或 TCP 标头。
猜你喜欢
  • 1970-01-01
  • 2011-05-25
  • 1970-01-01
  • 1970-01-01
  • 2021-06-12
  • 1970-01-01
  • 1970-01-01
  • 2019-05-17
  • 2013-06-26
相关资源
最近更新 更多