2010-07-27 95 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