亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于tcam的確定性有窮狀態(tài)自動機的匹配方法和裝置的制作方法

文檔序號:6444190閱讀:422來源:國知局
專利名稱:基于tcam的確定性有窮狀態(tài)自動機的匹配方法和裝置的制作方法
技術(shù)領(lǐng)域
本發(fā)明涉及計算機應(yīng)用技術(shù)領(lǐng)域,尤其涉及一種基于三態(tài)內(nèi)容尋址存儲器的DFA(deterministic finite automaton,確定性有窮狀態(tài)自動機)的匹配方法和裝置。
背景技術(shù)
從最早白勺 grep(global search regular expression and print out theline,全面搜索正則表達式并把行打印出來),到現(xiàn)在非常流行的PCRE(Perl CompatibleRegular Expressions, perl語言兼容正則表達式),正則表達式因其強大、便捷、高效的文本處理能力,得到了廣泛的使用。目前,幾乎所有主編程流語言都支持正則表達式;在軟件開發(fā)和日常數(shù)據(jù)處理工作中,正則表達式更是人們不可或缺的得力助手。正則表達式是一種“通用的模式語言”,它由兩種字符構(gòu)成特殊字符和普通字符。特殊字符稱為“元字符”,普通字符稱為“文字”?!拔淖帧本拖裾Z言中的單詞,“元字符”則像文法;把單詞按文法組織起來,就有了語義。正如文章由句子段落構(gòu)成一樣,一個完整的正則表達式也是由小的模塊單元組成的。雖然模塊單元各自都很簡單,但它們的組合卻千變?nèi)f化。正是這種簡單模塊的復(fù)雜組合,使得正則表達式具有了強大的表達能力。正則表達式的匹配是通過有窮狀態(tài)自動機來完成的。從正則表達式構(gòu)造NFA (Non-deterministic finite automaton,不確定性有窮狀態(tài)自動機)是一個非常經(jīng)典的問題,可以分三步完成第一步,用Thompson算法從正則表達式生成ε -NFA ;第二步,用子集構(gòu)造法從ε -NFA構(gòu)造DFA ;第三步,對第二步得到的DFA進行狀態(tài)最小化,從而得到最終的狀態(tài)數(shù)最少的DFA。DFA實現(xiàn)正則表達式匹配的原理如下從DFA的起始狀態(tài)出發(fā),每讀入一個字符就做一次狀態(tài)轉(zhuǎn)換。如果到達的狀態(tài)是接收狀態(tài),說明當(dāng)前輸入與正在檢查的正則表達式匹配,如果到達的狀態(tài)是死狀態(tài)(即所有的256邊全都轉(zhuǎn)移到自身的狀態(tài)),說明當(dāng)前輸入與正在檢查的正則表達式不匹配,否則繼續(xù)輸入字符,直至抵達某個接收狀態(tài)或死狀態(tài),或輸入字符被讀完。隨著正則表達式在互聯(lián)網(wǎng)絡(luò)中的應(yīng)用,因為互聯(lián)網(wǎng)絡(luò)具有流量大、速度快的特點,又對正則表達式提出了新的要求,需要能夠并行匹配多個正則表達式。正則表達式的并行匹配是這樣實現(xiàn)的先由一組多個正則表達式生成一個有限狀態(tài)自動機,正則表達式的匹配也就變成了自動機的狀態(tài)轉(zhuǎn)換。自動機的每個接收狀態(tài)對應(yīng)著一個或者若干個正則表達式。當(dāng)自動機到達某個接收狀態(tài),就可以確信數(shù)據(jù)流中存在與該接收狀態(tài)對應(yīng)的正則表達式匹配的數(shù)據(jù)。上述有限狀態(tài)自動機從本質(zhì)上說是一張二維表表上的一行代表自動機的一個狀態(tài),每一行由256個單元組成,每個單元存儲一個指針。例如,第i行第j列的單元,存儲的是當(dāng)自動機處在狀態(tài)i時,讀入ASCII碼為j的字符時應(yīng)該轉(zhuǎn)換到的目標(biāo)狀態(tài)的指針。如果有限狀態(tài)自動機有N個狀態(tài),這張表就有N行。這張大小為N· 256的表,記錄了有限狀態(tài)機自動機的所有信息。目前,由于上述有限狀態(tài)自動機的體量非常大,導(dǎo)致上述基于DFA的正則表達式匹配方法亟待改進。

發(fā)明內(nèi)容
本發(fā)明的實施例提供了一種基于TCAM的DFA的匹配方法和裝置,以提高基于DFA 的正則表達式匹配的速度。一種基于TCAM的確定DFA的匹配方法,包括將確定性有窮狀態(tài)自動機DFA的每個狀態(tài)用若干三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由出發(fā)狀態(tài)、輸入字符和到達狀態(tài)三個域組成,表示同一狀態(tài)的TCAM 條目的出發(fā)狀態(tài)相同;以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)作為輸出結(jié)果。一種基于TCAM的DFA的匹配裝置,包括TCAM條目構(gòu)造模塊,用于將確定性有窮狀態(tài)自動機DFA的每個狀態(tài)用若干三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由出發(fā)狀態(tài)、輸入字符和到達狀態(tài)三個域組成,表示同一狀態(tài)的TCAM條目的出發(fā)狀態(tài)相同;搜索匹配模塊,用于以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞, 按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)作為輸出結(jié)果。由上述本發(fā)明的實施例提供的技術(shù)方案可以看出,本發(fā)明實施例通過將正則表達式等構(gòu)造的DFA的每個狀態(tài)用若干TCAM條目表示,使得正則表達式的一次狀態(tài)轉(zhuǎn)換僅需要一次TCAM條目并行查找就能完成,從而提高了基于DFA的正則表達式匹配的速度。


圖1為本發(fā)明實施例一提供的一種基于TCAM的DFA的匹配方法的具體處理流程圖;圖2為本發(fā)明實施例一所提供的用于匹配正則表達式1
I [1-9]

(am Ipm)的 DFA ;圖3為本發(fā)明實施例一提供的用于表示圖2中狀態(tài)1的部分TCAM條目;圖4為本發(fā)明實施例一提供的對圖3中的狀態(tài)1的TCAM條目應(yīng)用單狀態(tài)條目壓縮算法之后的結(jié)果;圖5為本發(fā)明實施例一提供的識別正則表達式(bd) * (ce) +和(ce) * (bd)+的 DFA ;圖6為本發(fā)明實施例一提供的識別正則表達式(bd) * (ce) +和(ce) * (bd)+的 TCAM條目;圖7為本發(fā)明實施例一提供的對應(yīng)于圖5的DFA的狀態(tài)號的編碼方案圖8為本發(fā)明實施例二提供的用于說明狀態(tài)間的“相似度”的定義的TCAM條目;圖9為本發(fā)明實施例二提供的用于說明狀態(tài)間的“模板”的定義的TCAM條目;圖10為本發(fā)明實施例二提供的根據(jù)狀態(tài)間的相似度為某個DFA構(gòu)建的最小生成樹;圖11為本發(fā)明實施例二提供的基于圖6中的最小生成樹對狀態(tài)號進行重編碼的過程;圖12為本發(fā)明實施例三提供的某DFA的四個狀態(tài)的TCAM條目;圖13為本發(fā)明實施例三提供的通過調(diào)整狀態(tài)號編碼后所需的某DFA的四個狀態(tài)的TCAM條目;圖14為本發(fā)明實施例三提供的用于說明狀態(tài)子集之間的“相似度”的定義的TCAM 條目;圖15為本發(fā)明實施例三提供的經(jīng)狀態(tài)內(nèi)最小化的有6個狀態(tài)的DFA的TCAM條目;圖16為本發(fā)明實施例三提供的為圖15中所示的DFA所構(gòu)建的遞歸劃分樹;圖17為本發(fā)明實施例三提供的圖16中刪去“核心集”的根節(jié)點的帶權(quán)圖,圖中權(quán)值為狀態(tài)間的相似度;圖18為本發(fā)明實施例三提供的劃分圖17的根節(jié)點時逐漸生長的狀態(tài)子集;圖19為本發(fā)明實施例三提供的圖16中刪去“核心集”的狀態(tài)子集{0,1,2}的帶權(quán)圖,圖中權(quán)值為狀態(tài)間的相似度;圖20為本發(fā)明實施例三提供的基于圖16的遞歸劃分樹,自底向上的重編碼過程示意圖;圖21為本發(fā)明實施例三提供的圖16中的狀態(tài)號的編碼方案;圖22為本發(fā)明實施例三提供的圖15最終經(jīng)過狀態(tài)號編碼后所需的TCAM條目;圖23為本發(fā)明實施例四提供的一種基于TCAM的DFA的匹配裝置的具體結(jié)構(gòu)圖。
具體實施例方式為使本發(fā)明實施例的目的、技術(shù)方案和優(yōu)點更加清楚,下面將結(jié)合附圖,以對本發(fā)明實施例進行清楚、完整地描述人員。實施例一該實施例提供的一種基于三態(tài)內(nèi)容尋址存儲器的正則表達式的匹配方法的具體處理流程如圖1所示,包括如下的處理步驟步驟SlOldf DFA的每個狀態(tài)用若干TCAM條目表示,每個TCAM條目由“出發(fā)狀態(tài)”、“輸入字符”和“到達狀態(tài)”三個域組成。TCAM(ternary content addressable memory,三態(tài)內(nèi)容尋址存儲器)是從 CAM (content addressable memory,內(nèi)容尋址存儲器)的基礎(chǔ)上發(fā)展而來的。一般的CAM 存儲器中每個bit位的狀態(tài)只有兩個,“0”或“1”,而TCAM中每個bit位有三種狀態(tài),除掉 “0,,和“ 1 ”外,還有一個“ don,t care,,狀態(tài),所以稱為“三態(tài),,,它是通過掩碼來實現(xiàn)的,正是TCAM的這個第三種狀態(tài)特征使其既能進行精確匹配查找,又能進行模糊匹配查找,并且具有查找速度快、操作簡單的優(yōu)點。本發(fā)明實施例將DFA的每個狀態(tài)用若干TCAM條目表示,每個TCAM條目由“出發(fā)狀態(tài)”、“輸入字符”和“到達狀態(tài)”三個域組成。表示同一狀態(tài)的TCAM條目的“出發(fā)狀態(tài)”相同。當(dāng)上述輸入字符采用ASCII字符時,因為ASCII字符有256個,所有每個狀態(tài)對應(yīng) 256個TCAM條目。在實際應(yīng)用中,上述“出發(fā)狀態(tài)”域和“輸入字符”域可以是由“ 0 ”、“ 1 ”和“*”組成的字符串,“到達狀態(tài)”域可以是“0”和“ 1,,組成的字符串。上述DFA可能是由正則表達式規(guī)則編譯得到,也可能是由字符串規(guī)則編譯得到, 甚至別的任何方式得到。步驟S102、利用單狀態(tài)條目壓縮算法來減少存儲單個狀態(tài)所需的TCAM條目數(shù)量。上述單狀態(tài)條目壓縮算法的處理過程主要包括遍歷所述DFA的任意狀態(tài)i的所有TCAM條目,找出出現(xiàn)頻率最高的“到達狀態(tài)”,記為D狀態(tài),刪除所述狀態(tài)i的到達狀態(tài)是狀態(tài)D的TCAM條目,添加一個特定TCAM條目到狀態(tài)i的TCAM條目列表的末尾,所述特定 TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是“********”,到達狀態(tài)是狀態(tài)D。兩兩相鄰地比較所述狀態(tài)i的剩余的TCAM條目,如果兩個相鄰的TCAM條目的到達狀態(tài)相同、輸入字符中只有第K個比特不同,則將所述兩個相鄰的TCAM條目中的任一個 TCAM條目的輸入字符的第K個比特以“*”代替,其余的比特保持不變構(gòu)成新的輸入字符;將所述兩個相鄰的TCAM條目刪除,增加一個所述狀態(tài)i的新的TCAM條目,所述新的TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是所述新的輸入字符,到達狀態(tài)是所述兩個相鄰的TCAM條目中的到達狀態(tài)。上述單狀態(tài)條目壓縮算法的具體處理過程包括如下幾個步驟步驟1、遍歷任意狀態(tài)i的256個TCAM條目,找出出現(xiàn)頻率最高的“到達狀態(tài)”,記為D狀態(tài)。比如,圖2是用于匹配正則表達式1
I [1-9]

(am|pm)的DFA,該正則表達式識別12小時制的時刻,例如11:59am。狀態(tài)9和狀態(tài)10是接收狀態(tài)。用TCAM 存儲該DFA,在不經(jīng)過任何壓縮的情況下,每個狀態(tài)需要256個TCAM條目,因此總共需要 11X256 個 TCAM 條目。圖3是表示圖2中狀態(tài)1的若干TCAM條目(因空間有限,狀態(tài)1的256個TCAM條目不能盡數(shù)列出)。每個TCAM條目由“出發(fā)狀態(tài)”、“輸入字符”和“到達狀態(tài)”三個域組成。 對狀態(tài)1,當(dāng)“輸入字符”為其余245個未在圖3中列出的ASCII字符時,“到達狀態(tài)”都是死狀態(tài)。對于說明書附圖中出現(xiàn)的“出發(fā)狀態(tài)”、和“到達狀態(tài)”,為方便說明,它們的值用狀態(tài)ID或狀態(tài)ID的編碼表示,“輸入字符”的值用輸入字符的ASCII編碼表示,TCAM中實際存儲的是它們的編碼。針對圖3中的狀態(tài)1,上述出現(xiàn)頻率最高的D狀態(tài)是死狀態(tài)(dead)。步驟2、刪除狀態(tài)i的“到達狀態(tài)”是狀態(tài)D的TCAM條目。針對圖3中的狀態(tài)1,則刪除“到達狀態(tài)”是死狀態(tài)的所有TCAM條目。步驟3、添加一個條目到狀態(tài)i的TCAM條目列表的末尾,其“出發(fā)狀態(tài)”是狀態(tài)i, 其“輸入字符”是8個“不關(guān)心狀態(tài)(*) ( “********”),其“到達狀態(tài)”是狀態(tài)D。針對圖3中的狀態(tài)1,上述添加的一個條目為圖4中的最后一個條目。步驟4、針對上述狀態(tài)i的剩余的TCAM條目,對“到達狀態(tài)”相同、而且“輸入字符” 可以被一個前綴覆蓋的若干TCAM條目,用“輸入字符”是前綴的TCAM條目來代替。具體處理過程為成對地、兩兩相鄰地比較狀態(tài)i的剩余的TCAM條目如果兩個相鄰的TCAM條目的“到達狀態(tài)”相同、而且“輸入字符”的海明距離為1,即它們的“輸入字符”只有1個(第 k個)比特不同,那么把這兩個相鄰的TCAM條目刪除,代之以一個新的TCAM條目,該新的TCAM條目中除了 “輸入字符”的第k個比特變作“*”之外,其余的7個比特保持不變。圖3中列出的前兩個條目滿足上述條件,它們都是圖3中狀態(tài)1的條目,“到達狀態(tài)”都是狀態(tài)2,并且它們的“輸入字符”只相差最后一個比特(“00110000”和“00110001”), 所以在圖4中用一個新條目即第一個條目取代它們。步驟S103、利用不同狀態(tài)共享TCAM條目的方法減少存儲整個DFA所需的TCAM條
目數(shù)量。通過不同狀態(tài)共享TCAM條目的方法來減少不同狀態(tài)共享的TCAM條目的拷貝數(shù), 從而減少存儲整個DFA所需的TCAM條目數(shù)量。上述不同狀態(tài)共享TCAM條目的方法包括 基于“模板”關(guān)系的共享TCAM條目和基于“狀態(tài)分組”的共享TCAM條目。步驟S104、以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)對應(yīng)的正則表達式作為輸出結(jié)果。在所述用TCAM存儲DFA的方法的基礎(chǔ)上,本發(fā)明實施例又提出了用TCAM的并行查找實現(xiàn)基于DFA的正則表達式匹配的方法,使得狀態(tài)轉(zhuǎn)換可以通過TCAM的并行查找來完成,而且一次狀態(tài)轉(zhuǎn)換僅需要一次并行查找。以上述DFA的當(dāng)前狀態(tài)作為“出發(fā)狀態(tài)”,將上述“出發(fā)狀態(tài)”對應(yīng)的編碼字符串和當(dāng)前的“輸入字符”對應(yīng)的編碼字符串拼接作為TCAM條目的搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的“到達狀態(tài)”作為TCAM條目的輸出值,將所述搜索得到的“到達狀態(tài)”對應(yīng)的正則表達式作為輸出結(jié)果。圖5是識別正則表達式(bd) * (ce) +和(ce) * (bd) +的DFA,其中狀態(tài)4是接收規(guī)則 (bd) * (ce) +的接收狀態(tài),狀態(tài)5是接收規(guī)則(ce) * (bd) +的接收狀態(tài),為表示清晰,圖5中省略顯示所有到達狀態(tài)為狀態(tài)0的轉(zhuǎn)移邊。圖6是對圖5中原始的DFA應(yīng)用單狀態(tài)條目壓縮算法、按“狀態(tài)分組”對TCAM條目進行縮減、對狀態(tài)號進行重編碼之后得到的結(jié)果,狀態(tài)號的編碼方案在圖7中給出。用存儲在TCAM上的DFA實現(xiàn)正則表達式匹配,以當(dāng)前活躍狀態(tài)的狀態(tài)號和當(dāng)前讀入字符的拼接作為搜索關(guān)鍵詞輸入TCAM,TCAM返回下一跳的狀態(tài)號。例如,對輸入字符串 ce,正則表達式匹配是如下進行的當(dāng)前活躍狀態(tài)是狀態(tài)0,其狀態(tài)號是“100”,以“100”拼接字符c的編碼 “01100011”作為搜索關(guān)鍵詞輸入TCAM,該關(guān)鍵詞與圖6中的第3個TCAM條目匹配,因此輸出下一跳狀態(tài)號是“010”;當(dāng)前讀入字符是e,以“010”拼接字符e的編碼“01100101”作為搜索關(guān)鍵詞輸入 TCAM,該關(guān)鍵詞與圖6中的第2個TCAM條目匹配,因此輸出下一跳狀態(tài)號是“ 110” ;與“110”對應(yīng)的是狀態(tài)4,該狀態(tài)是接收狀態(tài),到達該狀態(tài)時匹配的正則表達式是 (bd) * (ce) +,所以輸入ce匹配正則表達式(bd) * (ce) +。實施例二本實施例提供了一種基于“模板”關(guān)系的共享TCAM條目的方法的具體處理過程包括定義狀態(tài)i和狀態(tài)j的“相似度”,用符號sim(i,j)表示,它的取值是狀態(tài)i和狀態(tài)j的相同的TCAM條目的數(shù)目(所謂“相同”,要求“輸入字符”和“到達狀態(tài)”都相同)
計算所述DFA的任意兩個狀態(tài)狀態(tài)i和狀態(tài)j的相似度sim (i,j),當(dāng)所述狀態(tài) i以狀態(tài)j為模板,將所述狀態(tài)i和狀態(tài)j的讀入字符和到達狀態(tài)都相同的TCAM條目從所述狀態(tài)i的TCAM條目中刪除,在所述DFA的所有TCAM條目列表中將所述狀態(tài)i的剩下的 TCAM條目排列在所述狀態(tài)j的TCAM條目之前,對所述狀態(tài)i和狀態(tài)j對應(yīng)的編碼字符串進行重新設(shè)定,使所述狀態(tài)j對應(yīng)的編碼字符串能夠通配所述狀態(tài)i對應(yīng)的編碼字符串。比如,針對圖8中狀態(tài)0和狀態(tài)1分別只有4個TCAM條目,按“相似度”的定義, 則 sim(0,l) = 3。上述“模板”關(guān)系是一種狀態(tài)間的、單向的關(guān)系比如,狀態(tài)i以狀態(tài)j為模板(即狀態(tài)j是狀態(tài)i的模板),那么在TCAM條目列表中,狀態(tài)i應(yīng)該存儲在狀態(tài)j之前;而且, 狀態(tài)i只需要存儲它和狀態(tài)j不一樣的256-sim(i,j)個TCAM條目,狀態(tài)j則依然要存儲 256個TCAM條目。如果圖8中的狀態(tài)0以狀態(tài)1為模板,那么存儲圖8中的狀態(tài)0和狀態(tài) 1這兩個狀態(tài)時,只需要圖9所示的5個TCAM條目就夠了。針對一個完整的DFA,可以采用圖論中的“最小生成樹”問題來確定DFA的狀態(tài)間的模板關(guān)系。上述“最小生成樹”是這樣構(gòu)建的構(gòu)建一個帶權(quán)完全圖,所述帶權(quán)完全圖中的每個頂點代表自動狀態(tài)機的一個狀態(tài),在頂點間兩兩地連上一條帶權(quán)重的邊,邊的權(quán)重值是256-sim(i,j)(只有權(quán)值非零的邊被標(biāo)出)。根據(jù)所述帶權(quán)完全圖構(gòu)建一個帶權(quán)最小生成樹,樹根可以是樹中任意狀態(tài),所述生成樹決定了狀態(tài)間的模板關(guān)系,樹中的父結(jié)點就是它的所有孩子的模板狀態(tài),樹根本身沒有模板狀態(tài)。比如,對某個只有8個狀態(tài)的DFA,假設(shè)圖10是該DFA用于確定狀態(tài)間的模板關(guān)系的最小生成樹。圖10中狀態(tài)0被取作“根模板”。圖10中有向邊的起點狀態(tài)以有向邊的終點狀態(tài)為模板。上述最小生成樹給出了狀態(tài)間的模板關(guān)系,下一步就是按模板關(guān)系對狀態(tài)號進行重新編排。遍歷每一個父節(jié)點,在一個父節(jié)點處,如果它只有一個孩子,那么一個比特就足以區(qū)分孩子節(jié)點和父節(jié)點了,如果它有N(N> 1)個孩子,那么為了區(qū)分這些孩子和父節(jié)點, 至少需要「log2(N+l)l個比特。這樣每一個父節(jié)點都給它所有的孩子節(jié)點分配了一段“子編碼”。樹中任意狀態(tài)i的編碼初始為空,從樹根出發(fā)到達所述狀態(tài)i,將沿途所有的狀態(tài)的子編碼拼接起來作為狀態(tài)i的編碼。由于這樣得到的狀態(tài)編碼的長度不一,需要將所有的狀態(tài)編碼補齊到相同的長度。取最長的編碼的長度作為統(tǒng)一的狀態(tài)編碼長度,在現(xiàn)有的狀態(tài)編碼后面補齊。當(dāng)狀態(tài)作為源狀態(tài)存儲在TCAM中時,在其現(xiàn)有的狀態(tài)編碼后面補“*”,當(dāng)狀態(tài)作為目的狀態(tài)存儲在TCAM時,在其現(xiàn)有的狀態(tài)編碼后面補上補充一段尚未分配的由“0” 和“1”組成的編碼。圖11展示了按“層序”自底向上遍歷圖10中的最小生成樹、對狀態(tài)號進行重編碼的過程。例如狀態(tài)3,它只有一個孩子節(jié)點,所以它需要為孩子節(jié)點分配一個長度為 「10&(1+1)1 =1的子編碼,即子編碼“0”。例如狀態(tài)2,它有3個孩子,所以它需要依次為孩子節(jié)點分配一個長度為「log2(3+l)l=2的子編碼,即子編碼“00”,“01”和“10”。最終,每個狀態(tài)的編碼為從根節(jié)點到該狀態(tài)的子編碼的拼接。例如狀態(tài)3,從根節(jié)點到狀態(tài)3的子編碼的拼接是“000”。例如狀態(tài)5,從從根節(jié)點到狀態(tài)3的子編碼的拼接是“0101”。最終,為統(tǒng)一狀態(tài)編碼長度,取所有狀態(tài)編碼中最長的編碼長度4。例如狀態(tài)3現(xiàn)有的編碼是“000”, 最終它作為源狀態(tài)的編碼是“000*”,它作為目的狀態(tài)的編碼是“0000”。例如狀態(tài)2的現(xiàn)有的編碼是“01”,最終它作為源狀態(tài)的編碼是“01**”,它作為目的狀態(tài)的編碼是“0111”。實施例三本實施例提供了一種基于“狀態(tài)分組”的共享TCAM條目的方法的具體處理過程包括將所述DFA的所有狀態(tài)構(gòu)成第一層狀態(tài)子集,從所述DFA的所有TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目刪除掉;若所述剩余的TCAM條目數(shù)不為零,則將所述第一層狀態(tài)子集劃分成兩個或兩個以上的第二層狀態(tài)子集;分別從所述每一個第二層狀態(tài)子集的TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的 TCAM條目刪除掉;若所述第二層狀態(tài)子集中剩余的TCAM條目數(shù)不為零,則將所述第二層狀態(tài)子集劃分成兩個或兩個以上的第三層狀態(tài)子集;依次類推,直到下一層次的狀態(tài)子集中刪去讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目后剩余的TCAM條目數(shù)為零,將所述下一層次的狀態(tài)子集作為最底層的狀態(tài)子集;根據(jù)每個狀態(tài)子集中包括的狀態(tài)的個數(shù)給每個狀態(tài)子集分配一定數(shù)量的比特位, 利用所述一定數(shù)量的比特數(shù)對每個狀態(tài)子集對應(yīng)的編碼字符串進行設(shè)定,并對所述DFA的每個狀態(tài)對應(yīng)的編碼字符串進行設(shè)定;在所述DFA的所有TCAM條目列表中,將所述每個層次的狀態(tài)子集中的核心集保留下來,所述狀態(tài)子集中的核心集是讀入字符和到達狀態(tài)針對狀態(tài)子集中的所有狀態(tài)都相同的TCAM條目,并將所述核心集中的出發(fā)狀態(tài)修改為所述核心集所屬的狀態(tài)子集對應(yīng)的編
碼字符串;當(dāng)所述狀態(tài)子集i是狀態(tài)子集j的子集時,所述狀態(tài)子集j對應(yīng)的編碼字符串能夠通配所述狀態(tài)子集i對應(yīng)的編碼字符串,且在所述DFA的所有TCAM條目列表中將所述狀態(tài)子集i的核心集排列在所述狀態(tài)子集j的核心集之前。比如,圖12是某DFA的四個狀態(tài)的TCAM條目。其中sim(4,6) =2,sim(5,7)= 2。表中,通過調(diào)整狀態(tài)號的編排順序,原先需要8個TCAM條目的信息現(xiàn)在僅用3個TCAM 條目就能記錄了,如圖13所示。首先定義兩個概念“狀態(tài)子集的相似度”和“核心集”。定義狀態(tài)子集的“相似度”,用符號Sim(S)表示,它的取值,是狀態(tài)子集s中的所有狀態(tài)共有的TCAM條目的數(shù)量。比如,在圖14中,sim(l,2) =2,sim(l,3) =2,sim({l,2, 3}) = 1。雖然狀態(tài)1分別和狀態(tài)2、狀態(tài)3共有2個TCAM條目,但這三個狀態(tài)共有的TCAM 條目卻只有一條,即“輸入字符”為“********”并且“到達狀態(tài)”為狀態(tài)0的條目。定義狀態(tài)子集的“核心集”,用符號core (s)表示,它是一組TCAM條目,它們是狀態(tài)子集s中的所有狀態(tài)所共有的TCAM條目;圖14中,C0re({l,2,3})只包含一個TCAM條目, 即“輸入字符”為“********”并且“到達狀態(tài)”為狀態(tài)0的條目。通過構(gòu)建一棵遞歸劃分樹來對DFA的狀態(tài)進行分組,此遞歸劃分樹具有如下特征樹根是DFA的所有狀態(tài)的集合;樹上的每一個節(jié)點記錄了其狀態(tài)集合的“核心集”;任意父節(jié)點的狀態(tài)集合是它的所有孩子節(jié)點的狀態(tài)集合的并。上述遞歸劃分樹按如下步驟從“根"開始構(gòu)建步驟1、把待劃分的狀態(tài)集合的“核心集”中的TCAM條目,從該狀態(tài)集合的各狀態(tài)
11的TCAM條目列表中刪除;步驟2、如果狀態(tài)集合中所有狀態(tài)都沒有TCAM條目了,就到達了遞歸劃分樹的葉子節(jié)點,算法應(yīng)該在此回溯(結(jié)束);否則執(zhí)行下面的步驟;步驟3、構(gòu)建一個圖,用頂點代表DFA的狀態(tài)。在任意頂點i和頂點j之間連上一條帶權(quán)邊,邊的權(quán)值是sim(i,j)(只有權(quán)值非零的邊被標(biāo)出);步驟4、每次找出上述圖中權(quán)值最大的一條邊(記為max),以這條邊的兩個端點組成的狀態(tài)子集S作為起始狀態(tài)集合S,逐個的往這個起始狀態(tài)集合S中加入元素(其它狀態(tài))。隨著S的不斷增大,Sim(S)的值會逐漸減小,限制Sim(S)的值不能小于閾值k,k的取值從max遞減到1,閾值k每遞減變化一次,就會相應(yīng)得到一個狀態(tài)子集S。這樣本步驟將得到至多max個可能被劃分出去的狀態(tài)子集;步驟5、對步驟4得到的每個狀態(tài)子集Si,記狀態(tài)子集s的大小為I Si I,計算這樣一個指標(biāo)值(|s」-l) · Sim(Si),該指標(biāo)值最大的那個狀態(tài)子集就作為這次構(gòu)造出來的孩子節(jié)點;步驟6、如果當(dāng)前狀態(tài)集合沒有被完全劃分,重復(fù)上述步驟4和步驟5,否則執(zhí)行下面的步驟;步驟7、對父節(jié)點的所有孩子節(jié)點依次執(zhí)行上述所有步驟。按遞歸劃分樹對狀態(tài)號進行編排的過程自底向上的進行對每個葉子節(jié)點,如果它包含1個或者2個狀態(tài),那么這些狀態(tài)需要長1比特的ID段;如果它包含的狀態(tài)數(shù)是N(N > 2),那么它們需要長「log2Nl比特的ID段。對每個父節(jié)點,假設(shè)它有k個孩子,每個孩子
需要長ni比特的ID段,那么父節(jié)點需要長2 Xl比特的ID段,使得從所述
父節(jié)點到其任意葉子節(jié)點的任意狀態(tài),沿途經(jīng)過的狀態(tài)子集或狀態(tài)的ID段的拼接的長度為η。比如,圖15是一個有6個狀態(tài)的DFA對應(yīng)的TCAM條目,圖16是利用上述算法從這個DFA得到的遞歸劃分樹。具體操作如下所有狀態(tài)共有的TCAM條目是“輸入字符”為“********”并且“到達狀態(tài)”為狀態(tài) 0的TCAM條目,把它從各狀態(tài)的TCAM條目中刪除。此時,用帶權(quán)圖表示的狀態(tài)間關(guān)系如圖 17所示。圖17中權(quán)值最大的邊是狀態(tài)0和狀態(tài)2之間的邊。令狀態(tài)子集s從{0,幻開始生長,不斷向狀態(tài)子集s中加入元素(其它狀態(tài)),但又要保證Sim(S)不小于閾值k。k的取值范圍是1 4,因此在k取值不同的情況下,分別從狀態(tài)子集{0,2}開始生長。如圖18 所示,當(dāng)k = 4時,最終生長得到的狀態(tài)子集為{0,2};當(dāng)k = 3時,最終生長得到的狀態(tài)子集為{0,1,2};當(dāng)k = 2時,最終生長得到的狀態(tài)子集為{0,1,2};當(dāng)k= 1時,最終生長得到的狀態(tài)子集為{0,1,2}。指標(biāo)值最大的狀態(tài)子集是{0,1,2},因此我們構(gòu)造一個孩子節(jié)點,其狀態(tài)集合是{0,1,2}。至此,待劃分的狀態(tài)集合縮小為{3,4,5}。按同樣的步驟,我們分別劃分出{3,4}和{1}。根節(jié)點的狀態(tài)集合被完全劃分,下面依次對它的孩子節(jié)點進行劃分。對根的三個孩子,我們按“層序”從左到右進行劃分。節(jié)點{0,1,2}的核心集有三個TCAM條目,把它們從各狀態(tài)的TCAM條目中刪去。此時,狀態(tài)1已經(jīng)沒有TCAM條目了,狀態(tài)0和狀態(tài)2還共享一個條目,帶權(quán)圖如圖19所示。圖19中權(quán)值最大的邊是狀態(tài)0和狀態(tài)2之間的邊。閾值k只能取1,因此把狀態(tài)子集{0,2}劃分出去。剩下的狀態(tài)1單獨構(gòu)成一個子集{1},因為狀態(tài)1的TCAM條目被刪盡了,所以該狀態(tài)子集是葉子節(jié)點,算法在此停止。對剩余的節(jié)點,按同樣的步驟進行劃分,最終得到圖20所示的遞歸劃分樹。可以從遞歸劃分樹得到狀態(tài)號重新編排的方案。對每個葉子節(jié)點,如果它包含1 個或者2個狀態(tài),那么這些狀態(tài)需要長1比特的ID段;如果它包含的狀態(tài)數(shù)N(N > 2),那么它們需要長
權(quán)利要求
1.一種基于TCAM的確定性有窮狀態(tài)自動機的匹配方法,其特征在于,包括將確定性有窮狀態(tài)自動機DFA的每個狀態(tài)用若干三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由出發(fā)狀態(tài)、輸入字符和到達狀態(tài)三個域組成,表示同一狀態(tài)的TCAM條目的出發(fā)狀態(tài)相同;以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)作為輸出結(jié)果。
2.根據(jù)權(quán)利要求1所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配方法,其特征在于當(dāng)所述輸入字符采用ASCII字符時,所述DFA的每個狀態(tài)對應(yīng)256個TCAM條目,所述出發(fā)狀態(tài)和輸入字符為“0”、“ 1 ”和“*”組成的字符串,所述到達狀態(tài)為“0”和“ 1 ”組成的字符串。
3.根據(jù)權(quán)利要求1或2所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的方法還包括遍歷所述DFA的任意狀態(tài)i的所有TCAM條目,找出出現(xiàn)頻率最高的到達狀態(tài),記為D狀態(tài),刪除所述狀態(tài)i的到達狀態(tài)是狀態(tài)D的TCAM條目,增加一個所述狀態(tài)i的新的TCAM條目,所述新的TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是“********”、到達狀態(tài)是狀態(tài)D ;兩兩相鄰地比較所述狀態(tài)i的剩余的TCAM條目,如果兩個相鄰的TCAM條目的到達狀態(tài)相同、輸入字符中只有第K個比特不同,則將所述兩個相鄰的TCAM條目中的任一個TCAM條目的輸入字符的第K個比特以“*”代替,其余的比特保持不變構(gòu)成新的輸入字符;將所述兩個相鄰的TCAM條目刪除,增加一個所述狀態(tài)i的新的TCAM條目,所述新的TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是所述新的輸入字符,到達狀態(tài)是所述兩個相鄰的TCAM條目中的到達狀態(tài)。
4.根據(jù)權(quán)利要求1或2所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的方法還包括計算所述DFA的任意兩個狀態(tài)狀態(tài)i和狀態(tài)j的相似度,所述相似度為所述狀態(tài)i和狀態(tài)j的讀入字符和到達狀態(tài)都相同的TCAM條目的數(shù)目;構(gòu)建一個帶權(quán)完全圖,所述帶權(quán)完全圖中的頂點為所有DFA狀態(tài),所述帶權(quán)完全圖中邊的權(quán)重為256減去該邊所連通的兩個狀態(tài)的相似度,根據(jù)所述帶權(quán)完全圖構(gòu)建一個帶權(quán)最小生成樹,樹根可以是樹中任意狀態(tài),所述帶權(quán)最小生成樹決定了狀態(tài)間的模板關(guān)系,樹中的父結(jié)點就是它的所有孩子的模板狀態(tài),樹根本身沒有模板狀態(tài);當(dāng)指定所述狀態(tài)i以狀態(tài)j為模板,將所述狀態(tài)i和狀態(tài)j的讀入字符和到達狀態(tài)都相同的TCAM條目從所述狀態(tài)i的TCAM條目中刪除,在所述DFA的所有TCAM條目列表中將所述狀態(tài)i的剩下的TCAM條目排列在所述狀態(tài)j的TCAM條目之前,對所述狀態(tài)i和狀態(tài)j對應(yīng)的編碼字符串進行重新設(shè)定,使所述狀態(tài)j對應(yīng)的編碼字符串能夠通配所述狀態(tài)i對應(yīng)的編碼字符串。
5.根據(jù)權(quán)利要求1或2所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配方法,其特征在于,所述的方法還包括將所述DFA的所有狀態(tài)構(gòu)成第一層狀態(tài)子集,從所述DFA的所有TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目刪除掉;若所述剩余的TCAM條目數(shù)不為 2零,則將所述第一層狀態(tài)子集劃分成兩個或兩個以上的第二層狀態(tài)子集;分別從每一個所述第二層狀態(tài)子集的TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目刪除掉;若所述第二層狀態(tài)子集中剩余的TCAM條目數(shù)不為零,則將所述第二層狀態(tài)子集劃分成兩個或兩個以上的第三層狀態(tài)子集;依次類推,直到下一層次的狀態(tài)子集中刪去讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目后剩余的TCAM條目數(shù)為零,將所述下一層次的狀態(tài)子集作為最底層的狀態(tài)子集;根據(jù)每個狀態(tài)子集中包括的狀態(tài)的個數(shù)給每個狀態(tài)子集分配一定數(shù)量的比特位,利用所述一定數(shù)量的比特數(shù)對每個狀態(tài)子集對應(yīng)的編碼字符串進行設(shè)定,并對所述DFA的每個狀態(tài)對應(yīng)的編碼字符串進行設(shè)定;在所述DFA的所有TCAM條目列表中,將所述每個層次的每個狀態(tài)子集中的核心集保留下來,所述狀態(tài)子集中的核心集是讀入字符和到達狀態(tài)針對狀態(tài)子集中的所有狀態(tài)都相同的TCAM條目,并將所述核心集中的出發(fā)狀態(tài)修改為所述核心集所屬的狀態(tài)子集對應(yīng)的編碼字符串;當(dāng)所述狀態(tài)子集i是狀態(tài)子集j的子集時,所述狀態(tài)子集j對應(yīng)的編碼字符串能夠通配所述狀態(tài)子集i對應(yīng)的編碼字符串,且在所述DFA的所有TCAM條目列表中將所述狀態(tài)子集i的核心集排列在所述狀態(tài)子集j的核心集之前。
6.一種基于TCAM的確定性有窮狀態(tài)自動機的匹配裝置,其特征在于,包括TCAM條目構(gòu)造模塊,用于將確定性有窮狀態(tài)自動機DFA的每個狀態(tài)用若干三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由出發(fā)狀態(tài)、輸入字符和到達狀態(tài)三個域組成,表示同一狀態(tài)的TCAM條目的出發(fā)狀態(tài)相同;搜索匹配模塊,用于以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)作為輸出結(jié)果。
7.根據(jù)權(quán)利要求6所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配裝置,其特征在于TCAM條目構(gòu)造模塊,還用于當(dāng)所述輸入字符采用ASCII字符時,將所述DFA的每個狀態(tài)對應(yīng)256個TCAM條目,將所述出發(fā)狀態(tài)和輸入字符用“0”、“1”和“*”組成的字符串來表示,將所述到達狀態(tài)用“ 0,,和“ 1”組成的字符串來表示。
8.根據(jù)權(quán)利要求6或7所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配裝置,其特征在于,所述的裝置還包括TCAM條目縮減模塊,用于遍歷所述DFA的任意狀態(tài)i的所有TCAM條目,找出出現(xiàn)頻率最高的到達狀態(tài),記為D狀態(tài),刪除所述狀態(tài)i的到達狀態(tài)是狀態(tài)D的TCAM條目,增加一個所述狀態(tài)i的新的TCAM條目,所述新的TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是“ ********”、到達狀態(tài)是狀態(tài)D ;兩兩相鄰地比較所述狀態(tài)i的剩余的TCAM條目,如果兩個相鄰的TCAM條目的到達狀態(tài)相同、輸入字符中只有第K個比特不同,則將所述兩個相鄰的TCAM條目中的任一個TCAM條目的輸入字符的第K個比特以“*”代替,其余的比特保持不變構(gòu)成新的輸入字符;將所述兩個相鄰的TCAM條目刪除,增加一個所述狀態(tài)i的新的TCAM條目,所述新的TCAM條目的出發(fā)狀態(tài)是狀態(tài)i、輸入字符是所述新的輸入字符,到達狀態(tài)是所述兩個相鄰的TCAM條目中的到達狀態(tài)。
9.根據(jù)權(quán)利要求1或2所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配裝置,其特征在于所述的TCAM條目縮減模塊,還用于計算所述DFA的任意兩個狀態(tài)狀態(tài)i和狀態(tài)j的相似度,所述相似度為所述狀態(tài)i和狀態(tài)j的讀入字符和到達狀態(tài)都相同的TCAM條目的數(shù)目;構(gòu)建一個帶權(quán)完全圖,所述帶權(quán)完全圖中的頂點為所有DFA狀態(tài),所述帶權(quán)完全圖中邊的權(quán)重為256減去該邊所連通的兩個狀態(tài)的相似度,根據(jù)所述帶權(quán)完全圖構(gòu)建一個帶權(quán)最小生成樹,樹根可以是樹中任意狀態(tài),所述帶權(quán)最小生成樹決定了狀態(tài)間的模板關(guān)系,樹中的父結(jié)點就是它的所有孩子的模板狀態(tài),樹根本身沒有模板狀態(tài);當(dāng)指定所述狀態(tài)i以狀態(tài)j為模板,將所述狀態(tài)i和狀態(tài)j的讀入字符和到達狀態(tài)都相同的TCAM條目從所述狀態(tài)i的TCAM條目中刪除,在所述DFA的所有TCAM條目列表中將所述狀態(tài)i的剩下的TCAM條目排列在所述狀態(tài)j的TCAM條目之前,對所述狀態(tài)i和狀態(tài)j對應(yīng)的編碼字符串進行重新設(shè)定,使所述狀態(tài)j對應(yīng)的編碼字符串能夠通配所述狀態(tài)i對應(yīng)的編碼字符串。
10.根據(jù)權(quán)利要求1或2所述的基于TCAM的確定性有窮狀態(tài)自動機的匹配裝置,其特征在于所述的TCAM條目縮減模塊,還用于將所述DFA的所有狀態(tài)構(gòu)成第一層狀態(tài)子集,從所述DFA的所有TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目刪除掉;若所述剩余的TCAM條目數(shù)不為零,則將所述第一層狀態(tài)子集劃分成兩個或兩個以上的第二層狀態(tài)子集;分別從每一個所述第二層狀態(tài)子集的TCAM條目中,將讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目刪除掉;若所述第二層狀態(tài)子集中剩余的TCAM條目數(shù)不為零,則將所述第二層狀態(tài)子集劃分成兩個或兩個以上的第三層狀態(tài)子集;依次類推,直到下一層次的狀態(tài)子集中刪去讀入字符和到達狀態(tài)針對所有狀態(tài)都相同的TCAM條目后剩余的TCAM條目數(shù)為零,將所述下一層次的狀態(tài)子集作為最底層的狀態(tài)子集;根據(jù)每個狀態(tài)子集中包括的狀態(tài)的個數(shù)給每個狀態(tài)子集分配一定數(shù)量的比特位,利用所述一定數(shù)量的比特數(shù)對每個狀態(tài)子集對應(yīng)的編碼字符串進行設(shè)定,并對所述DFA的每個狀態(tài)對應(yīng)的編碼字符串進行設(shè)定;在所述DFA的所有TCAM條目列表中,將所述每個層次的每個狀態(tài)子集中的核心集保留下來,所述狀態(tài)子集中的核心集是讀入字符和到達狀態(tài)針對狀態(tài)子集中的所有狀態(tài)都相同的TCAM條目,并將所述核心集中的出發(fā)狀態(tài)修改為所述核心集所屬的狀態(tài)子集對應(yīng)的編碼字符串;當(dāng)所述狀態(tài)子集i是狀態(tài)子集j的子集時,所述狀態(tài)子集j對應(yīng)的編碼字符串能夠通配所述狀態(tài)子集i對應(yīng)的編碼字符串,且在所述DFA的所有TCAM條目列表中將所述狀態(tài)子集i的核心集排列在所述狀態(tài)子集j的核心集之前。
全文摘要
本發(fā)明涉及一種基于TCAM(ternary content addressable memory,三態(tài)內(nèi)容尋址存儲器)的DFA(deterministic finite automaton,確定性有窮狀態(tài)自動機)的匹配方法和裝置。該方法主要包括將DFA的每個狀態(tài)用若干三態(tài)內(nèi)容尋址存儲器TCAM條目表示,每個TCAM條目由出發(fā)狀態(tài)、輸入字符和到達狀態(tài)三個域組成,表示同一狀態(tài)的TCAM條目的出發(fā)狀態(tài)相同;以具體的所述出發(fā)狀態(tài)和輸入字符的拼接作為搜索關(guān)鍵詞,按照所述搜索關(guān)鍵字在所述DFA的所有TCAM條目中進行搜索,將搜索得到的到達狀態(tài)作為輸出結(jié)果。本發(fā)明實施例通過將DFA的每個狀態(tài)用若干TCAM條目表示,利用單狀態(tài)條目壓縮算法、不同狀態(tài)共享TCAM條目、共享狀態(tài)轉(zhuǎn)換的方法大大減少存儲整個DFA所需的TCAM條目數(shù)量。
文檔編號G06F17/30GK102591958SQ201110451648
公開日2012年7月18日 申請日期2011年12月29日 優(yōu)先權(quán)日2011年12月29日
發(fā)明者彭坤楊, 董群峰, 陳敏 申請人:中國科學(xué)技術(shù)大學(xué)
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1