專利名稱:基于tcam的非確定性有限自動機的匹配方法和裝置的制作方法
技術領域:
本發(fā)明涉及計算機應用技術領域,尤其涉及一種基于TCAM(ternary contentaddressable memory,三態(tài)內(nèi)容尋址存儲器)的 NFA(non-deterministic finiteautomaton,非確定性有限自動機)的匹配方法和裝置。
背景技術:
從最早的 grep(global search regular expression and print out theline,全面搜索正則表達式并把行打印出來),到現(xiàn)在非常流行的PCRE (Perl CompatibleRegular Expressions, peri語言兼容正則表達式),正則表達式因其強大、便捷、高效的文本處理能力,得到了廣泛的使用。目前,幾乎所有主編程流語言都支持正則表達式;在軟件開發(fā)和日常數(shù)據(jù)處理工作中,正則表達式更是人們不可或缺的得力助手。正則表達式是一種“通用的模式語言”,它由兩種字符構成:特殊字符和普通字符。特殊字符稱為“元字符”,普通字符稱為“文字”。“文字”就像語言中的單詞,“元字符”則像文法;把單詞按文法組織起來,就有了語義。正如文章由句子段落構成一樣,一個完整的正則表達式也是由小的模塊單元組成的。雖然模塊單元各自都很簡單,但它們的組合卻千變?nèi)f化。正是這種簡單模塊的復雜組合,使得正則表達式具有了強大的表達能力。例如,正則表達式a+b可以用來描述ab, aab, aaab,......等一系列特征的字符串。正則表達式匹配技術是一項用于檢測給定的輸入字符流中是否包含特定的正則表達式所描述的模式的技術,它計算機網(wǎng)絡系統(tǒng)的一項核心基礎技術,被廣泛應用于如入侵檢測和防護、簽名匹配、蠕蟲檢測、深度包檢測、流量分析、協(xié)議識別等等。正則表達式的匹配通過有限自動機實現(xiàn),即將正則表達式的規(guī)則編譯成一個等價的有限自動機,包括NFA (non-deterministic finite automaton,非確定性有限自動機)和DFA (deterministic fin ite automaton,確定性有限自動機)?;谧詣訖C的正則表達式匹配技術急需解決的兩大難題是自動機的存儲體積和匹配速度。在這兩個關鍵性能指標上,DFA和NFA各自具有不同的優(yōu)點和缺點。DFA的每個狀態(tài)對于每個輸入字符都只轉移到一個唯一的目的狀態(tài),使得在DFA運行的時刻,都只有一個狀態(tài)是活躍的,因此DFA實現(xiàn)正則表達式匹配的過程非常簡單:一次DFA狀態(tài)轉換即可處理一個輸入字符。DFA因此具有確定的匹配速度,但是DFA所需的狀態(tài)空間可能呈現(xiàn)指數(shù)膨脹,在最壞情況下,具有η個狀態(tài)的DFA,其等價的DFA可能多達2η個狀態(tài),在實際的網(wǎng)絡應用中,幾十個具有結構(表示匹配任意多數(shù)量的任意字符)的正則表達式組合在一起,就會使得編譯得到的DFA因為狀態(tài)空間發(fā)生指數(shù)膨脹而無法存儲。而隨著網(wǎng)絡應用和流量的快速發(fā)展,需要同時檢測的正則表達式規(guī)則往往成千上萬,基于DFA的正則表達式技術往往變得不可行。NFA的優(yōu)點在于它的存儲體積小,其體積與正則表達式規(guī)則集大小(即規(guī)則集中字符數(shù))成線性增長關系,即使成千上萬條規(guī)則,所生成的NFA占用的體積也很小。但NFA的狀態(tài)轉移具有不確定性,對于NFA的每一個狀態(tài)和每一個字符,它所到達的目的狀態(tài)的數(shù)目是不唯一的,也就是說一個NFA狀態(tài)可以經(jīng)過一個字符激活多個NFA狀態(tài),而這多個NFA狀態(tài)被同時激活以后,在處理下一個輸入字符時,又可能進一步激活更多的狀態(tài)。因此在NFA運行的過程中,總是會有一組數(shù)目不確定的狀態(tài)同時活躍。由于同時活躍的狀態(tài)所組成的集合始終是NFA全體狀態(tài)集合的一個子集,我們把NFA運行時可能出現(xiàn)的活躍狀態(tài)組成的集合稱之為活躍狀態(tài)子集,NFA的一次狀態(tài)轉換的過程也就是一個源活躍狀態(tài)子集經(jīng)過一個輸入字符激活一個目的活躍狀態(tài)子集的過程。目前,NFA的上述特征導致其匹配速度變得緩慢和不可預測。實際應用中,通常需要幾十次內(nèi)存訪問甚至更多才能完成一次NFA狀態(tài)轉換,遠不能滿足網(wǎng)絡線速。
發(fā)明內(nèi)容
本發(fā)明的實施例提供了一種基于三態(tài)內(nèi)容尋址存儲器的正則表達式的匹配方法和裝置,以提高基于NFA的正則表達式匹配的速度。為實現(xiàn)上述的發(fā)明目的,本發(fā)明采用下述的技術方案:一種基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,包括:對非確定性有窮狀態(tài)自動機NFA的狀態(tài)和活躍狀態(tài)子集進行編碼,將所述NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,所述匹配域包括:源狀態(tài)域、輸入字符域,所述目的域包括目的狀態(tài)域或者包括目的狀態(tài)域和掩碼域;將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為所述NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在所述NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活躍的狀態(tài)的集合。一種基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,包括:編碼處理模塊,用于對非確定性有窮狀態(tài)自動機NFA的狀態(tài)和活躍狀態(tài)子集進行編碼;TCAM條目構造模塊,用于將所述NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,所述匹配域包括:源狀態(tài)域、輸入字符域,所述目的域包括目的狀態(tài)域或者包括目的狀態(tài)域和掩碼域;搜索匹配模塊,用于將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為所述NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在所述NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活躍的狀態(tài)的集合。本發(fā)明實施例通過將正則表達式等構造的NFA的每個狀態(tài)用若干TCAM條目表示,使得NFA的一次狀態(tài)轉換僅需要一次TCAM條目并行查找就能完成,從而提高了 NFA的匹配速度和效果,實現(xiàn)了和基于DFA的正則表達式匹配技術一樣的匹配速度。
圖1為本發(fā)明實施例一提供的一種基于三態(tài)內(nèi)容尋址存儲器的NFA的匹配方法的具體處理流程圖;圖2為本發(fā)明實施例二提供的一種用于匹配正則表達式ab.*cd的和ef.*gh的NFA的示意圖;圖3為本發(fā)明實施例二提供的對圖2所示的NFA中的狀態(tài)劃分得到的“兼容組”的示意圖;圖4為本發(fā)明實施例二提供的圖2所示的NFA中的各狀態(tài)的“活躍碼”的示意圖;圖5為當目的域”不包含“掩碼域”時,本發(fā)明實施例四提供的對“活躍狀態(tài)子集” {0}和{0,3}產(chǎn)生的狀態(tài)轉移進行編碼的TCAM條目的示意圖;圖6為當“目的域”包含“掩碼域”時,本發(fā)明實施例四提供的對“活躍狀態(tài)子集” {0}和{0,3}產(chǎn)生的狀態(tài)轉移進行編碼的TCAM條目的示意圖;圖7為本發(fā)明實施例五提供的對字符b的所有狀態(tài)轉移進行編碼的TCAM條目的示意圖;圖8為本發(fā)明實施例六提供的對圖7中的TCAM條目進行壓縮的結果的示意圖;圖9為本發(fā)明實施例七提供的用于匹配正則表達式ab.*cd的和ef.*gh的TCAM條目的不意圖;圖10為本發(fā)明實施例八提供的一種基于TCAM的NFA的匹配裝置的具體結構圖。
具體實施例方式為使本發(fā)明實施例的目的、技術方案和優(yōu)點更加清楚,下面將結合附圖,以對本發(fā)明實施例進行清楚、完整地 描述人員。實施例一該實施例提供的一種基于三態(tài)內(nèi)容尋址存儲器的NFA的匹配方法的具體處理流程如圖1所示,包括如下的處理步驟:步驟SlOljf NFA中的狀態(tài)進行分組,對NFA的每個狀態(tài)進行編碼。定義“活躍狀態(tài)子集”,它是NFA運行過程中某一時刻所有同時活躍的狀態(tài)的集合;定義“自循環(huán)狀態(tài)”,它是NFA中轉移到自身的邊超過了一定閾值(128)的狀態(tài);定義“兼容組”,它是由若干NFA狀態(tài)組成的集合,集合中的狀態(tài)兩兩之間都不能同時活躍;NFA中不含“ ε邊”,所謂“ ε邊”是指不消耗任何輸入字符轉移到新狀態(tài)的邊;所有的NFA狀態(tài)被劃分為若干個兼容組;每個自循環(huán)狀態(tài)單獨組成一個兼容組,稱之為“自循環(huán)兼容組”;兼容組的劃分方法如下:假設NFA中有η個狀態(tài),從O到η_1編號;維護一個二維布爾數(shù)組,記為 incompatible,若 incompatible [i] [j] (O < i, j < η)的值為 true 表示狀態(tài)i和j是不兼容的(即可以同時活躍的),步驟1、確定狀態(tài)兩兩之間能否同時活躍:步驟1.1 incompatible中所有的值初始化為false ;步驟1.2維護一個狀態(tài)對的隊列,將所有的incompatible [i] [i] (O ^ i < η)的值置為true,且將所有的狀態(tài)對(i,i) (O < i < η)入隊;步驟1.3依次迭代取隊首元素(記為(i,j))出隊,處理狀態(tài)對(i,j)如下,直至隊列為空:依次處理每一個字符C,將狀態(tài)i和狀態(tài)j經(jīng)過字符c所到達的目的狀態(tài)的集合記為D,對于D中的任意兩個狀態(tài)(i ' , j'),若incompatible [i ' ] [ j ']尚未標記為true,則將 incompatible [i' ] [j 1 ]標記為 true,并將狀態(tài)對(i ' , j 1 )入隊;步驟I至多經(jīng)歷η2次迭代即可完成,因為NFA中至多只有η2個狀態(tài)對,且每個狀態(tài)對在步驟I中至多只入隊一次;凡是最終在incompatible中被標記為true的狀態(tài)對,一定不會同時出現(xiàn)在任何“活躍狀態(tài)子集”中,反之,凡是最終在incompatible中被標記為false的狀態(tài)對,一定會同時出現(xiàn)在某個“活躍狀態(tài)子集”中;步驟2每個自循環(huán)狀態(tài)單獨組成一個兼容組,然后依次迭代處理每一個NFA狀態(tài)S,每次迭代過程如下:步驟2.1如果s是自循環(huán)狀態(tài),不做處理,退出本次迭代;步驟2.2逐個檢查已有的每一個非自循環(huán)兼容組G:檢查s與G(中的所有狀態(tài))是否是兼容的,也就是檢查所有的incompatible [s] [t] (t e G)是否都為false,如果是,貝Ij將s加入到兼容組G中,退出本次迭代;步驟2.3若s與所有的非自循環(huán)兼容組都不兼容,則創(chuàng)建一個新的兼容組,將s加入這個組中;步驟2的結果使得NFA的所有狀態(tài)都被劃分為若干個兼容組,在NFA運行的任意時刻,每個兼容組中至多只有一個狀態(tài)是活躍的;
在每個兼容組內(nèi),每個狀態(tài)被分配一個狀態(tài)編碼,稱之為“活躍碼”,一個包含m個狀態(tài)的兼容組需要為其中每個狀態(tài)分配一個長度統(tǒng)一的(長為+ I )1比特)各不相同的活躍碼,其中全“O”的活躍碼不分配給這m個狀態(tài),所述兼容組的編碼由該兼容組所包括的各個狀態(tài)的編碼進行拼接得到。步驟S102、對NFA同時活躍的狀態(tài)的集合進行編碼。NFA的每一個“活躍狀態(tài)子集”的編碼為一個長度統(tǒng)一的“活躍向量”,該活躍向量由所述活躍狀態(tài)子集中包括的每個狀態(tài)所歸屬的兼容組的編碼進行組合得到。每個兼容組都在“活躍向量”中依次占據(jù)一段編碼,若總共有k個兼容組,且第i(l ^k)個兼容組中的狀態(tài)的編碼長度為Ii,則第i個兼容組在“活躍向量”中占據(jù)長度為Ii的第i段編碼,“活躍向量”的總長度為Ef=I O。對于一個“活躍狀態(tài)子集”,它包含的狀態(tài)都分屬于不同的兼容組,遍歷其中每一個狀態(tài),若此狀態(tài)屬于第i個兼容組,則“活躍向量”中的第i段編碼設置為該狀態(tài)的“活躍碼”;對于無任何狀態(tài)出現(xiàn)在該“活躍狀態(tài)子集”中的兼容組,它在“活躍向量”中占據(jù)的編碼設置為全“O”。步驟S103、在TCAM中對NFA的狀態(tài)轉移進行編碼。TCAM(ternary content addressable memory,三態(tài)內(nèi)容尋址存儲器)作為一種高速并行查找引擎,已廣泛部署于各種高速網(wǎng)絡設備中,用于IP地址查找和基于包頭的包分類等網(wǎng)絡應用。TCAM存儲單元可存儲“0”、“ I ”和三種狀態(tài)的比特值,其中,比特值
表示“不關心狀態(tài)”,即其代表的值既可以是“O”也可以是“I”。TCAM芯片由一定數(shù)目的TCAM條目組成。每個時鐘周期內(nèi),TCAM并行地將所有條目與搜索關鍵詞進行比較,在所有滿足匹配條件的條目中,TCAM返回第一個條目作為輸出。TCAM的輸出將作為新的搜索關鍵詞的一部分,繼續(xù)參與下一次匹配。由于TCAM能存儲的模糊匹配能力,使得TCAM能有效存儲和壓縮NFA的存儲空間;由于TCAM的并行查找能力,使得TCAM每執(zhí)行一次NFA狀態(tài)轉換,只需要一次TCAM時鐘周期,從而保證了基于NFA方法的正則表達式匹配技術既可以實現(xiàn)像NFA —樣的確定的匹配速度,同時又能避免狀態(tài)膨脹;本發(fā)明實施例將NFA的每個狀態(tài)轉換用一個TCAM條目表示,NFA運行中的一次狀態(tài)轉移的過程是指一個源活躍狀態(tài)子集經(jīng)過某個輸入字符到達一個新的目的活躍狀態(tài)子集的過程;TCAM物理上由一個TCAM存儲器和一個附屬的SRAM存儲器組成,TCAM邏輯上由若干個TCAM條目組成,每個TCAM條目由存儲在TCAM存儲器中的匹配域和存儲在附屬的SRAM存儲器中的目的域組成,匹配域可存儲“ O ”、“ I ”和“ * ”三種比特,其中“ ”表示“不關心”(8卩“0”或“I”均可匹配“*”),目的域存儲“O”和“I”兩種比特。上述匹配域包括:源狀態(tài)域、輸入字符域,上述“目的域”可以只包括:目的狀態(tài)域;或者,同時包括目的狀態(tài)域和掩碼域。在實際應用中,上述源狀態(tài)域、輸入字符域可以是由和組成的字符串,目的域可以是“O”和“I”組成的字符串。上述NFA可能是由正則表達式規(guī)則編譯得到,也可能是由字符串規(guī)則編譯得到,甚至別的任何方式得到。上述源狀態(tài)域存儲的是所述NFA狀態(tài)轉換的源活躍狀態(tài)子集的活躍向量,輸入字符域存放的是輸入字符的ASCII編碼;TCAM條目的“目的域”可分兩種方法表示:方法一,“目的域”僅由“目的狀態(tài)域”組成,“目的狀態(tài)域”存放的是“目的活躍狀態(tài)子集”的“活躍向量”;方法二,“目的域”由“目的狀態(tài)域”和“掩碼域”組成,掩碼域的長度為自循環(huán)兼容組的數(shù)目,即為每個自循環(huán)兼容組依次分配一個比特;當?shù)趇個自循環(huán)兼容組的掩碼值為“1”,則該兼容組在“目的狀態(tài)域”中存儲該組在“目的活躍狀態(tài)子集”中的“活躍碼”與該組在“源活躍狀態(tài)子集”中的“活躍碼”的異或結果,否則該兼容組在“目的狀態(tài)域”中直接存儲該組在“目的活躍狀態(tài)子集”中的“活躍碼”;在TCAM中存儲NFA中所有的狀態(tài)轉移的方法可分為兩種:方法一,枚舉NFA中所有的狀態(tài)轉移并按照上述方案在TCAM中存儲;方法二,基于“有效集”的方法。上述基于“有效集”存儲NFA中所有狀態(tài)轉移的方法二的處理過程包括:定義字符c的有效集E。,它是所有自循環(huán)狀態(tài)以及所有對字符c有轉移邊的NFA狀態(tài)的集合;依次為每一個字符各自生成一組TCAM條目,對當前字符C,其處理步驟如下:步驟I計算E。與NFA中每一個“活躍狀態(tài)子集”S的交集,這些交集組成的集合記為I。,即I。= U s(ec n s),將I。中的這些交集按集合大小的非遞增順序進行排序;步驟2依次處理排過序的I。中的每一個交集Ε。H S,為之生成一個新的TCAM條目,在TCAM中,后生成的條目放置于先生成的條目之后:步驟2.1.這個新條目的“輸入字符域”存儲的是字符c的編碼;
步驟2.2.這個新條目的“源狀態(tài)域”存儲的“活躍向量”按如下設置:對Ε。H S中的每一個狀態(tài)S,設置S所在的兼容組的編碼為S的“活躍碼”,對每一個自循環(huán)狀態(tài)S,,若s'g ^則設置s'所在的兼容組的編碼為“0”,其他的兼容組的編碼均設置為
全 “*,,;步驟2.3.若TCAM條目的“目的域”包含“掩碼域”,則對每一個自循環(huán)狀態(tài)s',若S,對存在一條邊經(jīng)過字符C轉移到自身,則在“掩碼域”中設置S'所在的兼容組的編碼為“1”,否則設置為“O”;步驟2.4.這個新條目的“目的狀態(tài)域”存儲的“活躍向量”按如下設置:對Ε。H S中的所有狀態(tài),計算它們經(jīng)過字符c所轉移到的目的狀態(tài)的集合,記為D,在新條目的“目的狀態(tài)域”中存儲D的“活躍向量”;步驟2.5.若TCAM條目的“目的域”包含“掩碼域”,則對每一個自循環(huán)狀態(tài)s',若s'所在的兼容組在“掩碼域”中的值為“ I ”,則該兼容組在“目的狀態(tài)域”中改為存儲該組在“目的狀態(tài)域”中的編碼與該組在“源狀態(tài)域”中的編碼的異或結果。步驟S104、對TCAM存儲空間進行壓縮。定義一個TCAM條目Ti “匹配”另一個TCAM條目Tj,是指對于Ti和Tj的“匹配域”中的沒一位比特,Ti在該比特位的值等于L在該比特位的值,或者L在該比特位的值為
“氺,,.
定義兩個TCAM條目的“沖突”關系,TCAM條目Ti與TCAM條目Tj沖突,當且僅當:條目Ti和條目L的“目的域”不相同并且NFA中存在一個“活躍狀態(tài)子集”,使得由這個“活躍狀態(tài)子集”的“活躍向量”拼接上某個輸入字符的編碼所組成的搜索關鍵詞能夠同時匹配條目Ti和條目Tj ;定義將一個TC AM條目Ti “合并到”另一個TCAM條目L的過程,即生成一個新條目T' J7Ti j初始化為Tj,然后在T' j的“匹配域”,將Ti和Tj之間相異的比特位的值置為“*”,然后在TCAM中用T' j代替Tj,并刪除條目Ti;判斷兩個TCAM條目Ti和L能否合并的步驟如下:步驟3如果Ti和Tj的“目的狀態(tài)域”的值相同,則繼續(xù)往下檢查確保Ti和Tj的合并不會改變TCAM的語義;否則不能合并,返回檢查結果,退出;步驟4檢查Ti和L之間的每一個條目,如果它們都不與Ti沖突,則可進入下述步驟繼續(xù)檢查Ti是否可以“合并到;如果它們都不與L沖突,則可進入下述步驟繼續(xù)檢查Tj是否可以“合并到” Ti ;如果Ti和L之間存在一個條目Tk,它與Ti和L都沖突,則Ti和Tj不能合并,返回檢查結果,退出;步驟5假定檢查Ti是否可以“合并到” Tj,然后不妨假定Ti可以“合并到” Tj,即生成一個新條目T'」代替Tj,若1\和1的“匹配域”相差共m位比特,在T'」中,這m位比特全部都置“*”,可表示2m種不同的比特“O”和“I”的組合,依次對每一種組合,將T' j的這m位比特替換為這種組合,可得到一個新的條目T"」,下面檢查T"」是否會改變TCAM語乂:步驟5.1.如果T" j不能被任何由一個“活躍狀態(tài)子集”的“活躍向量”和輸入字符的編碼拼接而成的搜索關鍵詞所匹配,則T" J不會改變TCAM語義,跳過下面兩個步驟;
步驟5.2.如果T" j匹配條目Tj或者Tj以上的任意條目,則T" j不會改變TCAM語義,跳過下一個步驟;步驟5.3.找到T" j下方第一個滿足如下條件的條目T1:T" j匹配T1,且T" j和T1的“目的狀態(tài)域”的值相同,再找到T" ^下方第一個滿足如下條件的條目T2:Τ" 0ΡΤ2沖突,如果T2在T1上方(包括T2存在但T1不存在的情形),則T" j會改變TCAM語義,返回檢查結果,退出;否則T" j不會改變TCAM語義;如果以上檢查發(fā)現(xiàn)所有的2m種不同的T" j都不會改變TCAM語義,則Ti確實可以“合并到” Ir返回檢查結果,退出;否則,交換Ti和L的角色,繼續(xù)執(zhí)行一次步驟3檢查Tj是否可以“合并到” Ti;在TCAM中迭代判斷是否存在兩個條目能夠合并,如果能夠合并則將其中一個條目“合并到”另一個條目,迭代過程直至TCAM中再無任意兩個條目能夠合并時終止;若TCAM條目的“目的域”包含“掩碼域”,則編碼同一個字符的所有TCAM條目的“掩碼域”的值都相同,故只需為每一個字符存儲一份“掩碼域”的值。步驟S105、利用TCAM實現(xiàn)NFA匹配的方法,一次NFA狀態(tài)轉換只需要一次TCAM并行查找。在本發(fā)明實施例中,一次NFA狀態(tài)轉換只需要一次TCAM并行查找。將NFA的源活躍狀態(tài)子集的編碼和輸入字符編碼拼接作為TCAM的搜索關鍵詞,對于TCAM返回的匹配結果,若TCAM條目的目的域僅由目的狀態(tài)域組成,則返回的結果即為目的活躍狀態(tài)子集的編碼;否則,TCAM條目的目的域由目的狀態(tài)域和掩碼域組成,對匹配結果中掩碼值為“I”的每一個自循環(huán)兼容組,將其編碼與該組在搜索關鍵詞中的編碼做異或,異或的結果覆蓋該組在匹配結果中的編碼,最終得到的結果即為目的活躍狀態(tài)子集的編碼;一次TCAM查找得到的目的活躍狀態(tài)子集的編碼,繼續(xù)與下一個輸入字符的編碼拼接,作為新的搜索關鍵詞,進入下一次狀態(tài)轉移。實施例二以下實施例均以正則表達式ab.*cd的和ef.*gh所生成的NFA進行說明,正則表達式ab.*cd用于識別如下特征的字符串:首先匹配ab,接下來是任意字符出現(xiàn)任意多次,接下來是Cd ;正則表達式ef.*gh用于識別如下特征的字符串:首先匹配ef,接下來是任意字符出現(xiàn)任意多次,接下來是gh。這兩個正則表達式匹配的字符串均可以出現(xiàn)在輸入文本中的任意位置。將正則表達式編譯為一個不含“ ε邊”(即不消耗任何輸入字符轉移到新狀態(tài)的邊)的NFA,將所有狀態(tài)劃分為若干個“兼容組”,在每個“兼容組”內(nèi)部為每一個狀態(tài)分配一個狀態(tài)編碼。圖2所示是用于匹配正則表達式ab.*cd的和ef.*gh的NFA,圖中圓圈為NFA狀態(tài),箭頭為NFA的狀態(tài)轉移邊。狀態(tài)O是起始狀態(tài),接收狀態(tài)用雙圈表示,狀態(tài)7和狀態(tài)8是接收狀態(tài),其中狀態(tài) 接收規(guī)則ab.*cd,狀態(tài)8接收規(guī)則ef.*gh。 定義“活躍狀態(tài)子集”,它是NFA運行過程中某一時刻所有同時活躍的狀態(tài)的集合;在圖2中,NFA開始運行的時候,同時活躍的狀態(tài)只有起始狀態(tài)0,隨著狀態(tài)轉移的不斷進行,“活躍狀 態(tài)子集”不斷發(fā)生變化,若輸入為abc,則依次處理a,b,c后得到的“活躍狀態(tài)子集”為{0,1},{0,3},{0,3,5};并不是任意一個NFA狀態(tài)集合的子集都是“活躍狀態(tài)子集”,如{0,6},因為NFA運行過程中不會出現(xiàn)僅有狀態(tài)O和6活躍的情形,“活躍狀態(tài)子集”的數(shù)目是有限的,可通過從“活躍狀態(tài)子集” {0}出發(fā)遍歷每一個已有的“活躍狀態(tài)子集”和每一個字符以得到所有的“活躍狀態(tài)子集”; 定義“自循環(huán)狀態(tài)”,它是NFA中轉移到自身的邊超過了一定閾值(128)的狀態(tài);圖2的自循環(huán)狀態(tài)為狀態(tài)0、3、4 ; 定義“兼容組”,它是由若干NFA狀態(tài)組成的集合,集合中的狀態(tài)兩兩之間都不能同時活躍;如圖2中的狀態(tài)O和1,由于它們同時出現(xiàn)在“活躍狀態(tài)子集” {O,1}中,故狀態(tài)O和I不能放在同一個兼容組中; 每個自循環(huán)狀態(tài)單獨組成一個兼容組,稱之為“自循環(huán)兼容組”;非自循環(huán)狀態(tài)所組成的兼容組稱之為“非自循環(huán)兼容組”; 兼容組的劃分方法如下:假設NFA中有η個狀態(tài),從O到η_1編號;維護一個二維布爾數(shù)組,記為 incompatible,若 incompatible [i] [j] (O < i, j < η)的值為 true 表示狀態(tài)i和j是不兼容的(即可以同時活躍的),步驟I確定狀態(tài)兩兩之間能否同時活躍:步驟1.1 incompatible中所有的值初始化為false ;步驟1.2維護一個狀態(tài)對的隊列,將所有的incompatible [i] [i] (O ^ i < η)的值置為true,且將所有的狀態(tài)對(i,i) (O < i < η)入隊;步驟1.3依次迭代 取隊首元素(記為(i,j))出隊,處理狀態(tài)對(i,j)如下,直至隊列為空:依次處理每一個字符C,將狀態(tài)i和狀態(tài)j經(jīng)過字符c所到達的目的狀態(tài)的集合記為D,對于D中的任意兩個狀態(tài)(i ' , j'),若incompatible [i ' ] [ j ']尚未標記為true,則將 incompatible [i' ] [j 1 ]標記為 true,并將狀態(tài)對(i ' , j 1 )入隊;步驟2每個自循環(huán)狀態(tài)單獨組成一個兼容組,然后依次迭代處理每一個NFA狀態(tài)S,每次迭代過程如下:步驟2.1如果s是自循環(huán)狀態(tài),不做處理,退出本次迭代;步驟2.2逐個檢查已有的每一個非自循環(huán)兼容組G:檢查s與G(中的所有狀態(tài))是否是兼容的,也就是檢查所有的incompatible [s] [t] (t e G)是否都為false,如果是,貝Ij將s加入到兼容組G中,退出本次迭代;步驟2.3若s與所有的非自循環(huán)兼容組都不兼容,則創(chuàng)建一個新的兼容組,將s加入這個組中;圖2中的NFA狀態(tài)經(jīng)過兼容組劃分算法后,最終得到的四個兼容組如圖3所示,其中,{0},{3},{4}是三個自循環(huán)兼容組,{1,2,5,6,7,8}是一個非自循環(huán)兼容組; 在每個兼容組內(nèi),每個狀態(tài)被分配一個狀態(tài)編碼,稱之為“活躍碼”,一個包含m個狀態(tài)的兼容組需要為其中每個狀態(tài)分配一個長度統(tǒng)一的(長為+ I )1比特)各不相同的活躍碼,其中全“O”的活躍碼不分配給這m個狀態(tài);圖4所示的是每個NFA狀態(tài)的“活躍碼”,其中自循環(huán)狀態(tài)0、3、4在各自的兼容組中的“活躍碼”均為“1”,非自循環(huán)狀態(tài)1、2、5、6、7、8在它們的兼容組中的“活躍碼”分別為“皿”、“_”、“虹1”、“皿”、“皿”、“1迎”。在此處以及下文中,為表達清晰,狀態(tài)或狀態(tài)的
集合的編碼均以下劃線標注。
實施例三該實施例提供了一種對NFA同時活躍的狀態(tài)的集合進行編碼的方法,具體處理過程如下:NFA的每一個“活躍狀態(tài)子集”的編碼為一個長度統(tǒng)一的“活躍向量”,它由各個兼容組的編碼組成,每個兼容組都在“活躍向量”中依次占據(jù)一段編碼,若總共有k個兼容組,且第i(l < i < k)個兼容組中的狀態(tài)的編碼長度為Ii,則第i個兼容組在“活躍向量”中占據(jù)長度為Ii的第i段編碼,“活躍向量”的總長度為Ef=I I1-,在實施例一中,已經(jīng)為每個狀態(tài)分配了兼容組以及“活躍碼”,兼容組{0}、{3}、{4}和{1,2,5,6,7,8}依次在“活躍向量”中占據(jù)長度為1、1、1和3的一段編碼,“活躍向量”的長度為各個兼容組編碼的長度之和,即6 ;對于一個“活躍狀態(tài)子集”,它包含的狀態(tài)都分屬于不同的兼容組,遍歷其中每一個狀態(tài),若此狀態(tài)屬于第i個兼容組,則“活躍向量”中的第i段編碼設置為該狀態(tài)的“活躍碼”;對于無任何狀態(tài)出現(xiàn)在該“活躍狀態(tài)子集”中的兼容組,它在“活躍向量”中占據(jù)的編碼設置為全“O”;如“活躍狀態(tài)子集” {0,1,3}的“活躍向量”為“I I O 001”,兼容組{4}中沒有狀態(tài)在此“活躍向量”中出現(xiàn),故其在“活躍向量”中的第3段編碼用全“O”表示。實施例四該實施例提供了在TCAM中對NFA的狀態(tài)轉移進行編碼的方法,具體處理過程如下:為了方便說明,在下文的文 字說明和圖示中,字符域的值直接用字符本身表示,但字符域實際存儲的是由“ O ”、“ I”或“ * ”組成的編碼。圖5、圖6均為對“活躍狀態(tài)子集” {0}和{0,3}產(chǎn)生的狀態(tài)轉移進行編碼的TCAM條目,但在TCAM條目的表示上有差異。其特征如下:.NFA運行中的一次狀態(tài)轉移的過程是指一個“源活躍狀態(tài)子集”經(jīng)過某個輸入字符到達一個新的“目的活躍狀態(tài)子集”的過程;“源活躍狀態(tài)子集”{0}會產(chǎn)生如下狀態(tài)轉移:經(jīng)過字符a轉移到“目的活躍狀態(tài)子集”{0,1};經(jīng)過字符e轉移到“目的活躍狀態(tài)子集” {0,2};經(jīng)過除a和e以外的字符均轉移到“目的活躍狀態(tài)子集” 10};“源活躍狀態(tài)子集” {0,3}會產(chǎn)生如下狀態(tài)轉移:經(jīng)過字符a轉移到“目的活躍狀態(tài)子集” 10,3,1};經(jīng)過字符c轉移到“目的活躍狀態(tài)子集” {0,3,5};經(jīng)過字符e轉移到“目的活躍狀態(tài)子集” {0,3,2};經(jīng)過除以外的字符均轉移到“目的活躍狀態(tài)子集” {0,3};.TCAM物理上由一個TCAM存儲器和一個附屬的SRAM存儲器組成,TCAM邏輯上由若干個“TCAM條目”組成,每個TCAM條目由存儲在TCAM存儲器中的“匹配域”和存儲在附屬的SRAM存儲器中的“目的域”組成,“匹配域”可存儲“O”、“ I ”和三種比特,其中
表示“不關心”(即“O”或“ I ”均可匹配“*”),“目的域”存儲“O”和“ I ”兩種比特;.NFA的一次狀態(tài)轉移存儲在一個“TCAM條目”中;如圖5、圖6所示,左邊的TCAM存儲器中存儲的是TCAM條目的“匹配域”,右邊的SRAM存儲器中存儲的是TCAM條目的“目的域”;.TCAM條目的“匹配域”由“源狀態(tài)域”和“輸入字符域”組成,“源狀態(tài)域”存放的是“源活躍狀態(tài)子集”的“活躍向量”,“輸入字符域”存放的是輸入字符的ASCII編碼;如圖5、圖6所示,前三個條目編碼“源活躍狀態(tài)子集”{0}的狀態(tài)轉移,{0}的活躍向量為“I O O QM”,故這三個條目的“源狀態(tài)域”的值均為“I ο O 000”,實際上每個“源活躍狀態(tài)子集”對應256個輸入字符應有256個狀態(tài)轉移,因為空間限制,此處將除字符a和e以外的條目合并表示成一個條目表示,其“輸入字符域”用全表示,表示可以匹配任意字符;類似地,后四個條目編碼“源活躍狀態(tài)子集”{0,3}的狀態(tài)轉移,{0,3}的活躍向量為“I I O _”,故這四個條目的“源狀態(tài)域”的值均為“I I O 0M";.TCAM條目的“目的域”可分兩種方法表示:方法一,“目的域”僅由“目的狀態(tài)域”組成,“目的狀態(tài)域”存放的是“目的活躍狀態(tài)子集”的“活躍向量”;圖6所示,第一個條目表示“源活躍狀態(tài)子集” {0}經(jīng)過輸入字符a,到達的目的狀態(tài)為{0,1},對應存儲在“目的狀態(tài)域”的“活躍向量”為“I Q Q 001"; 方法二,成之為“異或編碼”的方法,“目的域”由“目的狀態(tài)域”和“掩碼域”組成,掩碼域的長度為自循環(huán)兼容組的數(shù)目,即為每個自循環(huán)兼容組依次分配一個比特;當?shù)趇個自循環(huán)兼容組的掩碼值為“ 1”,則該兼容組在“目的狀態(tài)域”中存儲該組在“目的活躍狀態(tài)子集”中的“活躍碼”與該組在“源活躍狀態(tài)子集”中的“活躍碼”的異或結果,否則該兼容組在“目的狀態(tài)域”中直接存儲該組在“目的活躍狀態(tài)子集”中的“活躍碼”;采用此方法可使得對于某些原本“目的域”的值不相同的TCAM條目,經(jīng)過“異或編碼”以后,它們的“目的域”變得相同;圖6所示的是對“活躍狀態(tài)子集” {0}和{0,3}產(chǎn)生的狀態(tài)轉移進行編碼的TCAM條目,其中“目的域”由“目的狀態(tài)域”和“掩碼域”組成;圖6中所有的條目的“掩碼域”的值均為全“1”,表示對所有的自循環(huán)狀態(tài)在“目的狀態(tài)域”中均存儲“目的活躍狀態(tài)子集”中的“活躍碼”與該組在“源活躍狀態(tài)子集”中的“活躍碼”的異或結果,如圖6中的第一個條目,表示“源活躍狀態(tài)子集”{0}(編碼為“I O O經(jīng)過輸入字符a,到達的目的狀態(tài)為{0,1}(編碼為“I O O m”),對所有的自循環(huán)狀態(tài)做異或操作,得到最終存儲在“目的狀態(tài)域”的編碼為"Q O O Mi”;類似地,圖5中的第四個條目表示“源活躍狀態(tài)子集”{0,3}(編碼為“I I O 0M")經(jīng)過輸入字符a,到達的目的狀態(tài)為{0,3,1}(編碼為“I丄OMT’),經(jīng)過“異或編碼”以后,“目的狀態(tài)域”實際存儲的編碼為“立O O m”;由此可以看出,原本圖5中“目的域”不相同的第一和第四個TCAM條目,采用“異或編碼”以后,它們的“目的域”變得相同了,均為O O Mi I I I”(后三位比特表示“掩碼域”的值);后面的實例都采用“異或編碼”的方法; 在TCAM中存儲NFA中所有的狀態(tài)轉移的方法可分為兩種:方法一,枚舉NFA中所有的狀態(tài)轉移并按照上述方案在TCAM中存儲;通過遍歷NFA并記錄所有可能出現(xiàn)的“活躍狀態(tài)子集”,然后將每個“活躍狀態(tài)子集”和每一個字符分別生成一個TCAM條目。實施例五 該實施例提供的一種基于有效集存儲NFA中所有狀態(tài)轉移的方法的處理過程主要包括:為每一個字符各自生成一組TCAM條目,本實施例以字符b為例進行說明,圖7所示的為編碼輸入字符為b的所有狀態(tài)轉移的TCAM條目; 定義字符b的有效集Eb,它是所有自循環(huán)狀態(tài)以及所有對字符b有轉移邊的NFA狀態(tài)的集合;對于字符b,Eb = {0,3,4,1}; 對當前字符 b,其步驟如下;步驟I計算Eb與NFA中每一個“活躍狀態(tài)子集”S的交集,這些交集組成的集合記為ib,即Ib = U s(Eb n s),將Ib中的這些交集按集合大小的非遞增順序進行排序;從起始的“活躍狀態(tài)子集” {0}出發(fā)遍歷NFA即可找到所有的“活躍狀態(tài)子集”,將它們與“有效集”一一取交集,即構成了集合 Ib,Ib = {{0,3,4,1}, {0,3,1}, {0,4,1}, {0,3,4},{0,1}, {0,3}, {0,4}, {0}},其中各交集按非遞增順序排序;步驟2依次處理排過序的Ib中的每一個交集Eb H S,為之生成一個新的TCAM條目,在TCAM中,后生成的條目放置于先生成的條目之后:如圖6所示,依次為Ib中的每一個交集生成一個TCAM條目;步驟2.1.這個新條目的“輸入字符域”存儲的是字符b的編碼;步驟2.2.這個新條目的“源狀態(tài)域”存儲的“活躍向量”按如下設置:對Eb H S中的每一個狀態(tài)S,設置S所在的兼容組的編碼為S的“活躍碼”,對每一個自循環(huán)狀態(tài)S,,若Sf e Eb但S7 g ^則設置S'所在的兼容組的編碼為“0”,其他的兼容組的編碼均設置為全 “*,,;這樣,對于任何一個對當前輸入字符有出邊的自循環(huán)狀態(tài),它在“源狀態(tài)域”中的編碼總是為“O”或“ I ”,不會為“*”,如此設置是為了實現(xiàn)在“目的域”的異或編碼;步驟2.3.若TCAM條目的“目的域”包含“掩碼域”,則對每一個自循環(huán)狀態(tài)s',若s'對存在一條邊經(jīng)過字符b轉移到自身,則在“掩碼域”中設置s'所在的兼容組的編碼為“1”,否則設置為“O” ;在步驟2.2中,保證了對字符b有出邊的自循環(huán)狀態(tài)的編碼都是“O”或“I”,對這樣的自循環(huán)狀態(tài)所對應的掩碼,標記為“I” ;步驟2.4.這個新條目的“目的狀態(tài)域”存儲的“活躍向量”按如下設置:對Eb H S中的所有狀態(tài),計算它們經(jīng)過字符b所轉移到的目的狀態(tài)的集合,記為D,在新條目的“目的狀態(tài)域”中存儲D的“活躍向量”;步驟2.5.若TCAM條目的“目的域”包含“掩碼域”,則對每一個自循環(huán)狀態(tài)s',若s'所在的兼容組在“掩碼域”中的值為“ I ”,則該兼容組在“目的狀態(tài)域”中改為存儲該組在“目的狀態(tài)域”中的編碼與該組在“源狀態(tài)域”中的編碼的異或結果。最終,圖7所示就是對NFA中所有對字符b狀態(tài)轉移的編碼,其“目的域”包含“掩碼域”。以上對狀態(tài)轉移的編碼方案保證對NFA中的每一個“活躍狀態(tài)子集”,其在TCAM中都會得到正確的匹配結果。對于任意字符C,以及任意“活躍狀態(tài)子集” S,一方面,S和c的編碼所組成的搜索關鍵詞必然會匹配為E。H S所生成的條目(記為Τ),并且根據(jù)“有效集”的含義可知,集合E。n s對應的目的狀態(tài)子集正好就是s對應的目的狀態(tài)子集,因此τ的“目的域”正確存儲了 S經(jīng)過字符C所到達的目的狀態(tài)子集的編碼;另一方面,S和C的編碼所組成的搜索關鍵詞不會匹配任何存儲在T之前的條目,假設該搜索關鍵詞匹配到了 T之前的條目τ'(不妨設τ'是編碼s'的條目,s'也是一個“活躍狀態(tài)子集”),則根據(jù)上述編碼算法按交集的大小非遞增順序逐個編碼可知,必有|e。n s' I ^ |ec n s|,這就意味著存在一個狀態(tài)V GE。,且V e Si但S7 ¢5,則V在!^中被設置V的“活躍碼”,但在由S和C的編碼所組成的搜索關鍵詞中,S'會被設置為全“O”,所以,該搜索關鍵詞無法匹配T'。由此證明了任意“活躍狀態(tài)子集”和任意字符都會在上述編碼方法中實現(xiàn)正確匹配。實施例六該實施例提供的一種對TCAM存儲空間(TCAM條目數(shù))進行壓縮的方法的處理過程主要包括:以圖7為例說明條目壓縮的算法,圖8為壓縮后的結果。 定義一個TCAM條目Ti “匹配”另一個TCAM條目Tj,是指對于Ti和Tj的“匹配域”中的沒一位比特,Ti在該比特位的值等于L在該比特位的值,或者L在該比特位的值為 “*,,;如圖7中的第一個條目可以“匹配”第四個條目; 定義兩個TCAM條目的“沖突”關系,TCAM條目Ti與TCAM條目Tj沖突,當且僅當:條目Ti和條目L的“目的域”不相同并且NFA中存在一個“活躍狀態(tài)子集”,使得由這個“活躍狀態(tài)子集”的“活躍向量”拼接上某個輸入字符的編碼所組成的搜索關鍵詞能夠同時匹配條目Ti和條目Tj ;如圖7中第三個條目和第七個條目是“沖突”的,因為存在一個“活躍狀態(tài)子集” {0,4,1},其“活躍向量”為“I O I m”,在輸入字符為b的條件下,搜索關鍵詞“I O IMi b”能同時匹配這兩個條目,且這兩個條目的“目的域”不相同,若交換或者合并這兩個條目,就可能造成TCAM語義改變, 使得某些搜索關鍵詞返回錯誤的“目的域”; 定義將一個TCAM條目Ti “合并到”另一個TCAM條目Tj的過程,即生成一個新條目T' j, Ti j初始化為Tj,然后在T' j的“匹配域”,將Ti和Tj之間相異的比特位的值置為“*”,然后在TCAM中用T' j代替Tj,并刪除條目Ti ;如圖7,若將第一個條目“合并到”第三個條目,則第三個條目的“匹配域”修改為“丄土 I M1”,即將它們相差的第二位比特的值置為“*”,然后刪除第一個條目; 判斷兩個TCAM條目Ti和Tj能否合并的步驟如下:步驟I如果Ti和Tj的“目的狀態(tài)域”的值相同,則繼續(xù)往下檢查確保Ti和Tj的合并不會改變TCAM的語義;否則不能合并,返回檢查結果,退出;步驟2檢查Ti和Tj之間的每一個條目,如果它們都不與Ti沖突,則可進入下述步驟繼續(xù)檢查Ti是否可以“合并到;如果它們都不與L沖突,則可進入下述步驟繼續(xù)檢查Tj是否可以“合并到;如果Ti和L之間存在一個條目Tk,它與Ti和L都沖突,則Ti和Tj不能合并,返回檢查結果,退出;圖7中判斷第四個條目能否與第八個條目合并時,這兩個條目之間的條目,故可以繼續(xù)進入下面的步驟檢查第四個條目能否“合并到”第八個條目;但反過來此步驟已可以判斷第八個條目不能“合并到”第四個條目,因為第八個條目與第五個條目沖突;步驟3假定檢查Ti是否可以“合并到” Tj,然后不妨假定Ti可以“合并到” Tj,即生成一個新條目T' j代替Tj,若1\和1的“匹配域”相差共m位比特,在T'」中,這m位比特全部都置“*”,可表示2m種不同的比特“O”和“I”的組合,依次對每一種組合,將T' j的這m位比特替換為這種組合,可得到一個新的條目T"」,下面檢查T"」是否會改變TCAM語乂:步驟3.1.如果T" j不能被任何由一個“活躍狀態(tài)子集”的“活躍向量”和輸入字符的編碼拼接而成的搜索關鍵詞所匹配,則T" J不會改變TCAM語義,跳過下面兩個步驟;步驟3.2.如果T" j匹配條目Tj或者Tj以上的任意條目,則T"」不會改變TCAM語義,跳過下一個步驟;步驟3.3.找到T" j下方第一個滿足如下條件的條目T1:T" j匹配T1,且T" j和T1的“目的狀態(tài)域”的值相同,再找到T" ^下方第一個滿足如下條件的條目T2:Τ" 0ΡΤ2沖突,如果T2在T1上方(包括T2存在但T1不存在的情形),則T" j會改變TCAM語義,返回檢查結果,退出;否則T" j不會改變TCAM語義;如果以上檢查發(fā)現(xiàn)所有的2-種不同的T" j都不會改變TCAM語義,則Ti確實可以“合并到” Ir返回檢查結果,退出;否則,交換Ti和L的角色,繼續(xù)執(zhí)行一次步驟3檢查Tj是否可以“合并到” Ti; 在TCAM中迭代判斷是否存在兩個條目能夠合并,如果能夠合并則將其中一個條目“合并到”另一個條目,迭代過程直至TCAM中再無任意兩個條目能夠合并時終止;圖8為圖7最后的壓縮結果; 若TCAM條目的“目的域”包含“掩碼域”,則編碼同一個字符的所有TCAM條目的“掩碼域”的值都相同,故只需為每一個字符存儲一份“掩碼域”的值。實施例七該實施例提供的一種利用TCAM實現(xiàn)正則表達式匹配的方法的處理過程主要包括:一次NFA狀態(tài)轉換只需要一次TCAM并行查找;將NFA的“源活躍狀態(tài)子集”的編碼和輸入字符編碼拼接作為TCAM的搜索關鍵詞,對于TCAM返回的匹配結果,若TCAM條目的“目的域”僅由“目的狀態(tài)域”組成,則返回的結果即為“目的活躍狀態(tài)子集”的編碼;否則,TCAM條目的“目的域”由“目的狀態(tài)域”和“掩碼域”組成,對匹配結果中掩碼值為“ I ”的每一個“自循環(huán)兼容組”,將其編碼與該組在搜索關鍵詞中的編碼做異或,異或的結果覆蓋該組在匹配結果中的編碼,最終得到的結果即為“目的活躍狀態(tài)子集”的編碼;一次TCAM查找得到的“目的活躍狀態(tài)子集”的編碼,繼續(xù)與下一個輸入字符的編碼拼接,作為新的搜索關鍵詞,進入下一次狀態(tài)轉移。圖9為使用本發(fā)明的編碼方法和壓縮方法,最終得到的用于匹配正則表達式ab.*cd的和ef.*gh的TCAM,對應的NFA (如圖2)共9個NFA狀態(tài),而TCAM僅需9個條目存儲這個NFA,在存儲空間上,沒有發(fā)生任何以往DFA方法所遇到的體積膨脹。下面結合輸入字符流為ab對用TCAM實現(xiàn)正則表達式匹配的過程予以說明,NFA開始運行的時候,“活躍狀態(tài)子集”為{0},其編碼(即“活躍向量”)為“I Q Q QM”,與輸入字符a的ASCII編碼組合成搜索關鍵詞, 在圖9的TCAM中,“I O O OM a”將會匹配第一個和最后一個條目,TCAM返回第一個條目,得到對應的“目的狀態(tài)域”的值為“O O O 001”和“掩碼域”為“I I1”,對“目的狀態(tài)域”中的所有“自循環(huán)兼容組”的編碼做異或,得到真實的“目的狀態(tài)子集”編碼為“I O O 001"(即{0,1}的“活躍向量”);接下來處理下一個字符,編碼“I O O 001"與下一個輸入字符為b的ASCII編碼組合成搜索關鍵詞,在圖9的TCAM中進行查詢,TCAM返回第二個條目的“目的狀態(tài)域”的值為I I O ■”和“掩碼域”為“I I 1”,經(jīng)過對自循環(huán)兼容組做異或,得到真實的“目的狀態(tài)子集”編碼為“I I O (即{0,3}的“活躍向
量,,nI
早./ O本例說明了一次NFA狀態(tài)轉換消化一個輸入字符,僅需要一次TCAM查詢。實施例八該實施例提供了一種基于TCAM的NFA的匹配裝置,其具體結構如圖10所示,包括如下的模塊:編碼處理模塊101,用于對非確定性有窮狀態(tài)自動機NFA的狀態(tài)和活躍狀態(tài)子集進行編碼;TCAM條目構造模塊102,用于將所述NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,所述匹配域包括:源狀態(tài)域、輸入字符域,所述目的域包括目的狀態(tài)域或者包括目的狀態(tài)域和掩碼域;搜索匹配模塊103,用于將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為所述NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在所述NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活 躍的狀態(tài)的集合。具體的,所述的編碼處理模塊101,還用于將所述活躍狀態(tài)子集編碼為一個活躍向量,該活躍向量由所述活躍狀態(tài)子集中包括的每個狀態(tài)所歸屬的兼容組中的活躍碼進行拼接得到,所述兼容組是由若干NFA狀態(tài)組成的集合,該集合中的狀態(tài)兩兩之間都不能同時活躍,每個自循環(huán)狀態(tài)單獨組成一個自循環(huán)兼容組,所述自循環(huán)狀態(tài)是NFA中轉移到自身的邊超過了一定閾值的狀態(tài),所述活躍碼為所述兼容組為組內(nèi)每個狀態(tài)各自分配的一個唯一的非全O的編碼。具體的,所述的TCAM條目構造模塊102,還用于將所述TCAM條目的目的域分兩種方法表示:方法一,所述目的域僅由目的狀態(tài)域組成,所述目的狀態(tài)域存放的是目的活躍狀態(tài)子集的活躍向量;方法二,所述目的域由目的狀態(tài)域和掩碼域組成,所述掩碼域的長度為自循環(huán)兼容組的數(shù)目,即為每個自循環(huán)兼容組依次分配一個比特;若所述自循環(huán)兼容組在所述掩碼域中的掩碼值為“ I ”,則在目的狀態(tài)域中存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼與所述自循環(huán)兼容組在源活躍狀態(tài)子集中的活躍碼的異或結果,否則直接存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼;所述編碼NFA中所有的狀態(tài)轉移的方法為:枚舉所述NFA中所有的狀態(tài)轉移,將每一個狀態(tài)轉移所對應的源狀態(tài)域、輸入字符域和目的域存儲在一個TCAM條目中,所述源狀態(tài)域中存儲源狀態(tài)的編碼,所述輸入字符域中存儲輸入字符的編碼,所述目的域中的目的狀態(tài)域中存儲目的狀態(tài)的編碼;或者;獲取所述NFA中的每個輸入字符c的有效集E。,該E。是所有自循環(huán)狀態(tài)以及所有對所述輸入字符有轉移邊的NFA狀態(tài)的集合,針對每個輸入字符計算E。與所述NFA中每一個活躍狀態(tài)子集S的交集,這些交集組成的集合記為I。,即I。= U s (Ec Π S),將I。中的各個交集按集合大小的非遞增順序進行排序;依次處理排過序的所述I。中的每一個交集Ε。η S,為每一個交集E。n S生成一個新的TCAM條目,在所述新的TCAM條目的輸入字符域中存儲輸入字符的編碼;所述E。n S的活躍向量按如下方式生成,對E。n S中的每一個狀態(tài)S,設置S所在的兼容組的編碼為S的活躍碼,對每一個自循環(huán)狀態(tài)s',若s' GE。但Yg1S,則設置S'所在的兼容組的編碼為“0”,其他的兼容組的編碼均設置為全“*”,將所有兼容組的編碼組合成活躍向量,在所述新的TCAM條目的源狀態(tài)域中存儲所述活躍向量;對E。n S中的所有狀態(tài),計算它們經(jīng)過所述輸入字符所轉移到的目的狀態(tài)的集合記為D,在所述新的TCAM條目的目的狀態(tài)域中存儲所述D的活躍向量;當所述目的域中包含掩碼域時,則對E。n S中的每一個自循環(huán)狀態(tài)s',在掩碼域中為s,分配一個比特,判斷s,是否存在一條邊經(jīng)過所述輸入字符轉移到自身,如果是,則在S'的掩碼域中設置s'所在的兼容組的編碼為I;否則,在S'的掩碼域中設置S'所在的兼容組的編碼為O ;當所述目的域包含掩碼域時,則對E。n S中的每一個自循環(huán)狀態(tài)s',若s'所在的兼容組在掩碼域中的值為1,則V的目的狀態(tài)域中存儲V在目的狀態(tài)域中的編碼與s'在源狀態(tài)域中的編碼的異或結果。進一步地,所述的裝置還包括:TCAM條目縮減模塊104 ,用于當所述NFA的一個TCAM條目Ti和另一個TCAM條目Tj的目的狀態(tài)域相同、匹配域相差共m位比特,生成一個新TCAM條目T' k,T' k初始化為Tj,在T' k的匹配域中將Ti和L之間相異的比特位的值置為“*”,若在TCAM中用T' k代替Tr并刪除Ti后不影響TCAM的語義正確性,則在TCAM中用T' k代替Ir并刪除凡。具體的,所述的搜索匹配模塊103,還用于按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行并行搜索,一次NFA狀態(tài)轉換只需要一次TCAM并行搜索,當TCAM條目的目的域僅由目的狀態(tài)域組成時,則搜索得到的所有目的狀態(tài)域的編碼的組合即為目的活躍狀態(tài)子集的編碼;當TCAM條目的目的域由目的狀態(tài)域和掩碼域組成時,對于源狀態(tài)域中的每一個自循環(huán)兼容組,當所述自循環(huán)兼容組在搜索得到的掩碼域中的值為I時,將搜索得到的目的狀態(tài)域的編碼與所述自循環(huán)兼容組的編碼做異或,將異或的結果作為最終搜索得到的目的狀態(tài)域的編碼,將最終搜索得到的所有目的狀態(tài)域的編碼的組合作為目的活躍狀態(tài)子集的編碼;將上一次TCAM并行搜索得到的目的活躍狀態(tài)子集的編碼,繼續(xù)與下一個輸入字符的編碼拼接,作為新的搜索關鍵詞,進入下一次TCAM并行搜索。應用本發(fā)明實施例的裝置進行NFA匹配的具體處理過程與前述方法實施例類似,此處不再贅述。本領域普通技術人員可以理解實現(xiàn)上述實施例方法中的全部或部分流程,是可以通過計算機程序來指令相關的硬件來完成,所述的程序可存儲于一計算機可讀取存儲介質中,該程序在執(zhí)行時,可包括如上述各方法的實施例的流程。其中,所述的存儲介質可為磁碟、光盤、只讀存儲記憶體(Read-Only Memory, ROM)或隨機存儲記憶體(Random AccessMemory, RAM)等。綜上所述,本發(fā)明實施例通過在TCAM中對NFA狀態(tài)和NFA的同時活躍的狀態(tài)子集進行合適的編碼,將NFA的每個狀態(tài)轉換用一個TCAM條目表示,使得NFA的一次狀態(tài)轉換僅需要一次TCAM并行查找就能完成,從而提高了 NFA的匹配速度和效果,實現(xiàn)了和基于DFA的正則表達式匹配技術一樣的匹配速度。本發(fā)明實施例利用TCAM的三態(tài)存儲能力,提出一種壓縮TCAM條目數(shù)的方法,使得NFA所需的TCAM存儲空間較小。本發(fā)明實施例實現(xiàn)了同時兼顧了正則表達式匹配技術的兩大關鍵性能指標一匹配速度和存儲空間。以上所述,僅為本發(fā)明較佳的具體實施方式
,但本發(fā)明的保護范圍并不局限于此,任何熟悉本技術領域的技術人員在本發(fā)明揭露的技術范圍內(nèi),可輕易想到的變化或替換,都應涵蓋在本發(fā)明的保護范圍之內(nèi)。因此,本發(fā)明的保護范圍應該以權利要求的保護范圍為準 。
權利要求
1.一種基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,其特征在于,包括: 對非確定性有窮狀態(tài)自動機NFA的狀態(tài)和活躍狀態(tài)子集進行編碼,將所述NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,所述匹配域包括:源狀態(tài)域、輸入字符域,所述目的域包括目的狀態(tài)域或者包括目的狀態(tài)域和掩碼域; 將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目的匹配域中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為所述NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在所述NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活躍的狀態(tài)的集合。
2.根據(jù)權利要求1所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,其特征在于,對所述NFA的狀態(tài)和活躍狀態(tài)子集進行編碼,包括: 將所述活躍狀態(tài)子集編碼為一個活躍向量,該活躍向量由所述活躍狀態(tài)子集中包括的每個狀態(tài)所歸屬的兼容組中的活躍碼進行拼接得到,所述兼容組是 由若干NFA狀態(tài)組成的集合,該集合中的狀態(tài)兩兩之間都不能同時活躍,每個自循環(huán)狀態(tài)單獨組成一個自循環(huán)兼容組,所述自循環(huán)狀態(tài)是NFA中轉移到自身的邊超過了一定閾值的狀態(tài),所述活躍碼為所述兼容組為組內(nèi)每個狀態(tài)各自分配的一個唯一的非全O的編碼。
3.根據(jù)權利要求1所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的將非確定性有窮狀態(tài)自動機NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,包括: 將所述TCAM條目的目的域分兩種方法表示:方法一,所述目的域僅由目的狀態(tài)域組成,所述目的狀態(tài)域存放的是目的活躍狀態(tài)子集的活躍向量;方法二,所述目的域由目的狀態(tài)域和掩碼域組成,所述掩碼域的長度為自循環(huán)兼容組的數(shù)目,即為每個自循環(huán)兼容組依次分配一個比特;若所述自循環(huán)兼容組在所述掩碼域中的掩碼值為“1”,則在目的狀態(tài)域中存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼與所述自循環(huán)兼容組在源活躍狀態(tài)子集中的活躍碼的異或結果,否則直接存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼; 所述編碼NFA中所有的狀態(tài)轉移的方法為: 枚舉所述NFA中所有的狀態(tài)轉移,將每一個狀態(tài)轉移所對應的源狀態(tài)域、輸入字符域和目的域存儲在一個TCAM條目中,所述源狀態(tài)域中存儲源狀態(tài)的編碼,所述輸入字符域中存儲輸入字符的編碼,所述目的域中的目的狀態(tài)域中存儲目的狀態(tài)的編碼; 或者; 獲取所述NFA中的每個輸入字符c的有效集E。,該E。是所有自循環(huán)狀態(tài)以及所有對所述輸入字符有轉移邊的NFA狀態(tài)的集合,針對每個輸入字符計算E。與所述NFA中每一個活躍狀態(tài)子集S的交集,這些交集組成的集合記為I。,即I。= U s (Ec Π S),將I。中的各個交集按集合大小的非遞增順序進行排序; 依次處理排過序的所述I。中的每一個交集Ε。η S,為每一個交集ε。n s生成一個新的TCAM條目,在所述新的TCAM條目的輸入字符域中存儲輸入字符的編碼; 所述ε。n s的活躍向量按如下方式生成,對ε。n s中的每一個狀態(tài)S,設置S所在的兼容組的編碼為S的活躍碼,對每一個自循環(huán)狀態(tài)s',若s' eE。但Yg1S,則設置s'所在的兼容組的編碼為“O”,其他的兼容組的編碼均設置為全“*”,將所有兼容組的編碼組合成活躍向量,在所述新的TCAM條目的源狀態(tài)域中存儲所述活躍向量; 對E。n S中的所有狀態(tài),計算它們經(jīng)過所述輸入字符所轉移到的目的狀態(tài)的集合記為D,在所述新的TCAM條目的目的狀態(tài)域中存儲所述D的活躍向量; 當所述目的域中包含掩碼域時,則對Ε。H S中的每一個自循環(huán)狀態(tài)s',在掩碼域中為s'分配一個比特,判斷s'是否存在一條邊經(jīng)過所述輸入字符轉移到自身,如果是,則在s'的掩碼域中設置s'所在的兼容組的編碼為I;否則,在s'的掩碼域中設置s'所在的兼容組的編碼為O ; 當所述目的域包含掩碼域時,則對E。n S中的每一個自循環(huán)狀態(tài)S',若S'所在的兼容組在掩碼域中的值為1,則V的目的狀態(tài)域中存儲V在目的狀態(tài)域中的編碼與V在源狀態(tài)域中的編碼的異或結果。
4.根據(jù)權利要求1所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的方法還包括: 當所述NFA的一個TCAM條目Ti和另一個TCAM條目Tj的目的狀態(tài)域相同、匹配域相差共m位比特,生成一個新TCAM條目T' k, Ti k初始化為Tj,在T' k的匹配域中將1\和1^之間相異的比特位的值置為“ * ”,若在TCAM中用T' k代替Ir并刪除Ti后不影響TCAM的語義正確性,則在TCAM中用T' k代替Ir并刪除凡。
5.根據(jù)權利要求1或2或3或4所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結 果,包括: 按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行并行搜索,一次NFA狀態(tài)轉換只需要一次TCAM并行搜索,當TCAM條目的目的域僅由目的狀態(tài)域組成時,則搜索得到的所有目的狀態(tài)域的編碼的組合即為目的活躍狀態(tài)子集的編碼; 當TCAM條目的目的域由目的狀態(tài)域和掩碼域組成時,對于源狀態(tài)域中的每一個自循環(huán)兼容組,當所述自循環(huán)兼容組在搜索得到的掩碼域中的值為I時,將搜索得到的目的狀態(tài)域的編碼與所述自循環(huán)兼容組的編碼做異或,將異或的結果作為最終搜索得到的目的狀態(tài)域的編碼,將最終搜索得到的所有目的狀態(tài)域的編碼的組合作為目的活躍狀態(tài)子集的編碼; 將上一次TCAM并行搜索得到的目的活躍狀態(tài)子集的編碼,繼續(xù)與下一個輸入字符的編碼拼接,作為新的搜索關鍵詞,進入下一次TCAM并行搜索。
6.一種基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,其特征在于,包括: 編碼處理模塊,用于對非確定性有窮狀態(tài)自動機NFA的狀態(tài)和活躍狀態(tài)子集進行編碼; TCAM條目構造模塊,用于將所述NFA的每個狀態(tài)轉移邊用一個三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由匹配域和目的域組成,所述匹配域包括:源狀態(tài)域、輸入字符域,所述目的域包括目的狀態(tài)域或者包括目的狀態(tài)域和掩碼域; 搜索匹配模塊,用于將所述NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為所述NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在所述NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活躍的狀態(tài)的集合。
7.根據(jù)權利要求6所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,其特征在于: 所述的編碼處理模塊,還用于將所述活躍狀態(tài)子集編碼為一個活躍向量,該活躍向量由所述活躍狀態(tài)子集中包括的每個狀態(tài)所歸屬的兼容組中的活躍碼進行拼接得到,所述兼容組是由若干NFA狀態(tài)組成的集合,該集合中的狀態(tài)兩兩之間都不能同時活躍,每個自循環(huán)狀態(tài)單獨組成一個自循環(huán)兼容組,所述自循環(huán)狀態(tài)是NFA中轉移到自身的邊超過了一定閾值的狀態(tài),所述活躍碼為所述兼容組為組內(nèi)每個狀態(tài)各自分配的一個唯一的非全O的編碼。
8.根據(jù)權利要求6所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,其特征在于: 所述的TCAM條目構造模塊 ,還用于將所述TCAM條目的目的域分兩種方法表示:方法一,所述目的域僅由目的狀態(tài)域組成,所述目的狀態(tài)域存放的是目的活躍狀態(tài)子集的活躍向量;方法二,所述目的域由目的狀態(tài)域和掩碼域組成,所述掩碼域的長度為自循環(huán)兼容組的數(shù)目,即為每個自循環(huán)兼容組依次分配一個比特;若所述自循環(huán)兼容組在所述掩碼域中的掩碼值為“1”,則在目的狀態(tài)域中存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼與所述自循環(huán)兼容組在源活躍狀態(tài)子集中的活躍碼的異或結果,否則直接存儲所述自循環(huán)兼容組在目的活躍狀態(tài)子集中的活躍碼; 所述編碼NFA中所有的狀態(tài)轉移的方法為: 枚舉所述NFA中所有的狀態(tài)轉移,將每一個狀態(tài)轉移所對應的源狀態(tài)域、輸入字符域和目的域存儲在一個TCAM條目中,所述源狀態(tài)域中存儲源狀態(tài)的編碼,所述輸入字符域中存儲輸入字符的編碼,所述目的域中的目的狀態(tài)域中存儲目的狀態(tài)的編碼; 或者; 獲取所述NFA中的每個輸入字符c的有效集E。,該E。是所有自循環(huán)狀態(tài)以及所有對所述輸入字符有轉移邊的NFA狀態(tài)的集合,針對每個輸入字符計算E。與所述NFA中每一個活躍狀態(tài)子集S的交集,這些交集組成的集合記為I。,即I。= U s (Ec Π S),將I。中的各個交集按集合大小的非遞增順序進行排序; 依次處理排過序的所述I。中的每一個交集Ε。η S,為每一個交集ε。n s生成一個新的TCAM條目,在所述新的TCAM條目的輸入字符域中存儲輸入字符的編碼; 所述ε。n s的活躍向量按如下方式生成,對ε。n s中的每一個狀態(tài)S,設置S所在的兼容組的編碼為S的活躍碼,對每一個自循環(huán)狀態(tài)S',若S' GE。但Yg1S,則設置S'所在的兼容組的編碼為“O”,其他的兼容組的編碼均設置為全“*”,將所有兼容組的編碼組合成活躍向量,在所述新的TCAM條目的源狀態(tài)域中存儲所述活躍向量; 對Ε。n s中的所有狀態(tài),計算它們經(jīng)過所述輸入字符所轉移到的目的狀態(tài)的集合記為D,在所述新的TCAM條目的目的狀態(tài)域中存儲所述D的活躍向量; 當所述目的域中包含掩碼域時,則對ε。n s中的每一個自循環(huán)狀態(tài)S',在掩碼域中為s'分配一個比特,判斷s'是否存在一條邊經(jīng)過所述輸入字符轉移到自身,如果是,則在s'的掩碼域中設置s'所在的兼容組的編碼為I;否則,在S'的掩碼域中設置S'所在的兼容組的編碼為O ; 當所述目的域包含掩碼域時,則對Ε。Π S中的每一個自循環(huán)狀態(tài)s',若s'所在的兼容組在掩碼域中的值為1,則V的目的狀態(tài)域中存儲V在目的狀態(tài)域中的編碼與V在源狀態(tài)域中的編碼的異或結果。
9.根據(jù)權利要求6所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,其特征在于,所述的裝置還包括: TCAM條目縮減模塊,用于當所述NFA的一個TCAM條目Ti和另一個TCAM條目L的目的狀態(tài)域相同、匹配域相差共m位比特,生成一個新TCAM條目T' k,T' k初始化STj,在T' k的匹配域中將Ti和L之間相異的比特位的值置為“*”,若在TCAM中用T' k代替Ir并刪除Ti后不影響TCAM的語義正確性,則在TCAM中用T' k代替Ir并刪除Ti。
10.根據(jù)權利要求6至9任一項所述的基于TCAM的非確定性有窮狀態(tài)自動機的匹配裝置,其特征在于: 所述的搜索匹配模塊,還用于按照所述搜索關鍵字在所述NFA的所有TCAM條目中進行并行搜索,一次NFA狀態(tài)轉換只需要一次TCAM并行搜索,當TCAM條目的目的域僅由目的狀態(tài)域組成時,則搜索得到的所有目的狀態(tài)域的編碼的組合即為目的活躍狀態(tài)子集的編碼; 當TCAM條目的目的域由目的狀態(tài)域和掩碼域組成時,對于源狀態(tài)域中的每一個自循環(huán)兼容組,當所述自循環(huán)兼容組在搜索得到的掩碼域中的值為I時,將搜索得到的目的狀態(tài)域的編碼與所述自循環(huán)兼容組的編碼做異或,將異或的結果作為最終搜索得到的目的狀態(tài)域的編碼,將最終搜索得到的所有目的狀態(tài)域的編碼的組合作為目的活躍狀態(tài)子集的編碼; 將上一次TCAM并行搜索得到的目的活躍狀態(tài)子集的編碼,繼續(xù)與下一個輸入字符的編碼拼接,作為新的搜索關鍵詞,進入下一次TCAM并行搜索。
全文摘要
本發(fā)明涉及一種基于TCAM(ternary content addressable memory,三態(tài)內(nèi)容尋址存儲器)的NFA(non-deterministic finite automaton,非確定性有限自動機)的匹配方法和裝置。該方法主要包括對NFA的狀態(tài)和同時活躍的狀態(tài)子集進行編碼,將NFA的每個狀態(tài)轉移邊用一個TCAM條目表示,將NFA的源活躍狀態(tài)子集的編碼和輸入字符的編碼的拼接作為搜索關鍵詞,按照所述搜索關鍵字在NFA的所有TCAM條目中進行搜索,將獲取的目的活躍狀態(tài)子集的編碼作為輸出結果,所述源活躍狀態(tài)子集為NFA當前所有同時活躍的狀態(tài)的集合,所述目的活躍狀態(tài)子集為在NFA中輸入所述輸入字符、進行狀態(tài)轉換后,得到的同時活躍的狀態(tài)的集合。本發(fā)明實施例使得NFA的一次狀態(tài)轉換僅需要一次TCAM并行查找就能完成,實現(xiàn)了和基于DFA的正則表達式匹配技術一樣的匹配速度,同時利用TCAM的三態(tài)存儲能力對NFA的TCAM條目進行壓縮,減少了NFA所需的TCAM存儲空間。
文檔編號G06F17/30GK103226551SQ20121002196
公開日2013年7月31日 申請日期2012年1月31日 優(yōu)先權日2012年1月31日
發(fā)明者董群峰, 彭坤楊 申請人:中國科學技術大學