包含偏移的AC多模匹配

【背景】 在網絡設備中會用到DPI技術對數據包的負載作檢測,從而挖掘網絡流量中的信息,DPI技術會用到多模式匹配,現有多模匹配的算法和實現只是專一於多模式匹配,都不會關注模式串的偏移信息,然而在對網絡中的數據包的負載作檢測會有三個特色,一是負載文本短,二是模式串較短,三是模式串出現的偏移固定。另外網絡設備對性能很是敏感,不帶偏移信息的傳統的多模式匹配算法實現必然會出現重複匹配,網絡設備須要對每一個匹配結果作偏移比對和去重的處理,這種處理頻率最壞的狀況下是負載的每一個字節都作一次偏移比對和去重處理,極大的損耗了性能。結合負載的模式串的特色和性能要求,須要一種包含偏移的多模式匹配算法。node

【過程】 a) 模式串解析模塊負責解析模式串 輸入的模式串必須帶有偏移值,該偏移值表示模式串在負載中出現的起始位置,所以在解析的時候模式串的各個字符的偏移等於前一個字符的偏移值加一。好比<0,」abcde」>表示偏移爲0的模式串」abcde」,字符’a’是」abcde」的第一個字符,由於這個字符是模式串的第一個字符,所以這個字符的偏移等於整個模式串的起始偏移0,而後’B’的偏移等於1,以此類推。 b) 帶偏移的Trie樹構造模塊 這個模塊負責根據模式串列表構造帶偏移的Trie樹。構造的時候遍歷模式串,而後依次取出模式串的每一個字符和偏移構成的二維向量<char,offset>做爲輸入input,逐層遍歷Trie樹,若是當前父節點的子節點中存在於該input相等的節點,就說明有相同的前綴,不然就新建一個節點,插入到當前父節點。構造的Trie樹以下:算法

Trie_with_offset

c) 肯定性有窮自動機(DFA)構造模塊 在Trie樹的基礎上構造DFA的過程就是計算在使用Trie樹匹配失敗時須要往哪一個節點回溯,以便匹配下一個輸入,Trie樹上每一個節點的回溯節點構成一個失敗匹配回溯表。構造時首先初始化Trie樹的root的子節點的回溯節點爲root,而且把每一個子節點加入到節點隊列中。若是節點隊列不爲空就從中取出節點cnode,取cnode的子節點subnode而且記錄邊input<char,offset>,把subnode加入到節點隊列,subnode的回溯節點按照下面步驟求得: 步驟1:取cnode的回溯節點btnode。 步驟2:若是btnode以邊input<char,offset>做爲輸入能到達一個子節點nextnode,那麼subnode的回溯節點就等於nextnode,不然令cnode等於btnode,而後重複步驟1。 仍是以以模式串<」abcd」,0>,<」ab」,0>,<」cd」,2>,<」bc」,1>和<」abe」,0>爲例構造的DFA以下圖(虛線箭頭表示匹配失敗的跳轉方向): 在此輸入圖片描述網絡

e) 搜索模塊 搜索模式實現帶偏移的多模式匹配過程,設待搜索文本串爲Text,從偏移x開始搜索到y結束,則從偏移x開始取得<Text[x],x>做爲輸入,把當前節點設爲DFA的根節點,到達下一個節點以後令當前節點等於下一個節點,判斷該節點是否有匹配上的模式串,若是有則輸出匹配上的模式串,而後繼續往下取偏移爲x+1的<Text[x+1],x+1>做爲輸入往下匹配,直到到達偏移y的位置。性能

Q:引入offset以後首先狀態會增長,而後是狀態機緯度增長會致使狀態機膨脹得厲害,預想是適用於少偏移短串的匹配。隊列

相關文章
相關標籤/搜索