專利名稱::一種快速查找定位和匹配訪問控制列表的方法
技術(shù)領(lǐng)域:
:本發(fā)明提供一種快速查找定位和匹配訪問控制列表的方法,屬于計(jì)算機(jī)通訊
技術(shù)領(lǐng)域:
。
背景技術(shù):
:利用報(bào)文的一些特定域組成的規(guī)則(Rule),將報(bào)文區(qū)分成不同的流。比如我們可以將來自某一個(gè)網(wǎng)絡(luò)的報(bào)文(源IP地址)、并去往某一網(wǎng)絡(luò)的報(bào)文(以目的IP地址來標(biāo)識(shí))劃分成一個(gè)流。分成流之后,可以針對(duì)流進(jìn)行處理,比如提高優(yōu)先級(jí),保證帶寬,限制帶寬,丟棄等,這種處理稱為動(dòng)作。通常將一個(gè)規(guī)則加上對(duì)應(yīng)動(dòng)作稱為一個(gè)訪問控制列表(ACL:AccessControlList,下面統(tǒng)稱為A(X)。一般業(yè)界標(biāo)準(zhǔn)的組成規(guī)則的域有5個(gè),通常也稱5元組,這5個(gè)域是IP報(bào)文的源地址、IP報(bào)文的目的地址、IP報(bào)文的承載協(xié)議類型、TCP(或UDP)的源端口號(hào)、TCP(或UDP)的目的端口號(hào)。在具體實(shí)現(xiàn)中,使用的域還有許多擴(kuò)展C0S、T0S、DSCP、虛擬局域網(wǎng)索引(VLANID)、分段標(biāo)記、TCP同步標(biāo)記、源和目的MAC地址等,以上各個(gè)域可以任意組合,并且可以有范圍,比如一個(gè)規(guī)則可以是TCP端口10002000+IP地址1.1.1.*(*代表不關(guān)心的位)。目前數(shù)通領(lǐng)域的許多接入層設(shè)備以及核心設(shè)備,由于安全性、服務(wù)質(zhì)量和帶寬保證的需要,往往通過配置大量的ACL規(guī)則來實(shí)現(xiàn)業(yè)務(wù)要求。面對(duì)如此多的ACL規(guī)則,如何高效地進(jìn)行查找定位、添加和刪除操作以及對(duì)ACL規(guī)則的比較和匹配操作,都是影響這些設(shè)備性能的重要因素。ACL規(guī)則組在實(shí)際使用中,人們更希望使用一些有意義的字符串助記符來表示,而代替以往使用數(shù)字表示的方式。這樣就帶來了一些問題,給ACL規(guī)則組的查找定位、添加和刪除操作增加了工作量。以往對(duì)于基于數(shù)字表示的ACL,通常采用指針數(shù)組的方式來索引各個(gè)數(shù)值所對(duì)應(yīng)的ACL規(guī)則組,但對(duì)于基于名字方式表示的ACL,目前通常采用循環(huán)比對(duì)名字字符串的方式來實(shí)現(xiàn)ACL規(guī)則組的査找定位、添加和刪除操作。這樣要長(zhǎng)時(shí)間占用CPU和內(nèi)存資源,顯然效率是非常低下的,勢(shì)必要影響設(shè)備的使用性能。另外在配置ACL規(guī)則時(shí),通常需要進(jìn)行ACL規(guī)則的有效性和是否重復(fù)性的比較檢査,然而組成ACL規(guī)則的域除了業(yè)界標(biāo)準(zhǔn)的5元組還有許多擴(kuò)展的域,并且以上各個(gè)域可以任意組合,某些值域還可以表示為一個(gè)范圍。通常ACL規(guī)則的匹配和比較都是每個(gè)域進(jìn)行逐一比較匹配的,這樣對(duì)于對(duì)性能要求比較高的設(shè)備,這種方法顯然是不能滿足需求的。目前實(shí)現(xiàn)的快速ACL規(guī)則的匹配和比較方法,主要是通過構(gòu)建一個(gè)基于源和目的ip地址和地址掩碼的二叉樹,然后通過對(duì)這個(gè)二叉樹進(jìn)行搜索遍歷操作來提高ACL規(guī)則組的匹配效率。然而這種方法并不能很好地支持ACL規(guī)則中其他擴(kuò)展域的快速匹配,并且構(gòu)建這個(gè)二叉樹也需要不少時(shí)間。
發(fā)明內(nèi)容本發(fā)明所要解決的技術(shù)問題是提供一種實(shí)現(xiàn)快速査找定位和匹配訪問控制列表的方法,以通過對(duì)一個(gè)訪問控制列表的名字字符串的hash函數(shù)映射來實(shí)現(xiàn)快速查找定位。為了解決上述技術(shù)問題,本發(fā)明采用了下述技術(shù)方案本發(fā)明的一種快速査找定位和匹配訪問控制列表的方法,包括如下步驟步驟1、將要配置的ACL規(guī)則的所有匹配域信息字符串序列化,初始化hash—table[MAX—LEN]表;步驟2、將ACL規(guī)則字符串序列作為hash函數(shù)的鍵值key,將相應(yīng)字符串key和hash桶大小值prime帶入函數(shù)計(jì)算,得到此hash的函數(shù)散列值index;步驟3、根據(jù)計(jì)算結(jié)果index來索引本ACL規(guī)則在hash—table表中對(duì)應(yīng)表項(xiàng)。進(jìn)一步地,所述的hash一table表桶大小prime要滿足關(guān)系式1<^^"^,,目^且為素?cái)?shù)?!?prime4進(jìn)一步地,所述的prime值為ACL規(guī)則表項(xiàng)大小所對(duì)應(yīng)的數(shù)字區(qū)間中的素?cái)?shù)值。進(jìn)一步地,所述的函數(shù)計(jì)算具體為累加輸入關(guān)鍵字符串key中每個(gè)字符對(duì)應(yīng)的ascall碼和每個(gè)字符在字符串中的相對(duì)位置的乘積項(xiàng),對(duì)上述累加和對(duì)prime值進(jìn)行取模。進(jìn)一步地,還包括步驟給hash表維護(hù)一個(gè)鏈表,保存所有沖突的表項(xiàng)。本專利中的hash算法實(shí)現(xiàn)簡(jiǎn)單,效率較高,hash分布性比較好,另外通過給HASH表維護(hù)一個(gè)鏈表,保存所有沖突的表項(xiàng)的方法可以很好的平衡實(shí)際應(yīng)用中空間和時(shí)間的矛盾問題,在不必浪費(fèi)巨大空間的情況下很好地提高系統(tǒng)效率。但對(duì)于hash分布要求更高的情況可以參考Jenkinshash等其他hash算法,但缺點(diǎn)是相比本hash算法更耗時(shí)。采用本方案可以很大的提高系統(tǒng)的性能,快速査找定位和匹配訪問控制列表,理論上最壞的情況是所有的hash運(yùn)算結(jié)果都相同,即沖突率為100%,這時(shí)本方法的執(zhí)行效率僅僅是多增加了一個(gè)hash運(yùn)算的時(shí)間,其他的時(shí)間仍然為傳統(tǒng)査找定位和匹配訪問控制列表的時(shí)間,相當(dāng)于查找一個(gè)線性鏈表或二叉樹,但這種情況出現(xiàn)的概率幾乎為0。通過本專利所介紹的方法合理的選擇參數(shù)實(shí)現(xiàn)hash函數(shù)的設(shè)計(jì),可以使hash表分布比較均勻,減小hash表的沖突率,使hash表的查找復(fù)雜度可以近似0(1),同時(shí)摒棄了傳統(tǒng)線性查找方法效率低以及構(gòu)造二叉樹無法實(shí)現(xiàn)ACL擴(kuò)展域加速査找匹配的缺點(diǎn)。采用本專利方法可以在不升級(jí)硬件的條件下,僅僅通過軟件算法的改進(jìn)充分滿足高端數(shù)通產(chǎn)品在大量配置ACL后不會(huì)對(duì)系統(tǒng)效率和系統(tǒng)性能產(chǎn)生較大影響,降低產(chǎn)品成本,提高經(jīng)濟(jì)效益。圖1是本發(fā)明的方法的流程圖具體實(shí)施例方式根據(jù)hash原理,避免hash沖突的方法有三種第一,使hash表的桶容量比實(shí)際需要容納的表項(xiàng)大的多;第二,給hash表維護(hù)一個(gè)鏈表,保存所有沖突的表項(xiàng);第三,設(shè)計(jì)一種能夠一一對(duì)應(yīng)的hash函數(shù)。通常對(duì)于上述方法一,我們這樣選擇參數(shù),如果hash表鍵值空間為k,而實(shí)際鍵值的取值空間為a(^g《),hash表的桶大小空間為t,那么hash應(yīng)該滿足MH;ciri的關(guān)系,c表示比例因子。在實(shí)際應(yīng)用中,取比例因子c滿足關(guān)系式1/2〈c〈3/4并且盡量使hash表的桶大小T取素?cái)?shù)值,這樣可以使hash表均勻分布,較好地避免hash表沖突。對(duì)于ACL規(guī)則的匹配比對(duì)問題,由于ACL規(guī)則的匹配域非常多,而且可以任意組合,面對(duì)這么大的hash表鍵值空間K,盡管受實(shí)際應(yīng)用要求的限希ij(比如系統(tǒng)ACL規(guī)則數(shù)目的限制),但實(shí)際鍵值的取值空間A仍然是非常大的,我們僅僅通過增加hash表的桶大小空間T的值在實(shí)際應(yīng)用中是不現(xiàn)實(shí)的,這就勢(shì)必造成在一定的hash表桶大小空間T下可能發(fā)生沖突的概率是比較大的,簡(jiǎn)單的應(yīng)用避免hash沖突的方法一是不夠的,而方法三在理論上可行,但在實(shí)際構(gòu)造時(shí)構(gòu)造出這樣的hash函數(shù)是非常困難的,而采用方法二就可以比較有效的滿足需求。通過以上分析,本發(fā)明提供一個(gè)較佳實(shí)施例,具體方法如圖l所示首先,步驟1、將要配置的ACL規(guī)則的所有匹配域信息字符串序列化,初始化hash—table[MAX—LEN]表(根據(jù)實(shí)際需要可以在設(shè)計(jì)的時(shí)候,將hash表項(xiàng)大小MAX—LEN設(shè)置為大于等于桶的大小值prime,但設(shè)置差值不要太大了,否則會(huì)浪費(fèi)系統(tǒng)的內(nèi)存資源),每一個(gè)hash_table表項(xiàng)為一個(gè)結(jié)構(gòu)體(包括一個(gè)hash—table型單向鏈表指針list、一個(gè)布爾型標(biāo)識(shí)位status和一個(gè)字符型關(guān)鍵描述字符串指針descrip)。prime表示hash表的桶大小,prime值的選擇是非常重要的,這樣可以盡可能地降低Hash1最大ACL規(guī)則數(shù)目£表的沖突率。本具體實(shí)施例中hash表桶大小prime要滿足關(guān)系式2<MAX-LEN<4且為素?cái)?shù)或可以根據(jù)表1選擇相對(duì)應(yīng)的數(shù)字區(qū)間中的素?cái)?shù)值(比如ACL規(guī)則大小為100(100屬于區(qū)間段[27-28]),對(duì)應(yīng)的prime素?cái)?shù)值為193)。上述hash函數(shù)的桶大小可以依據(jù)下表1取值(其中[lwr,upr]表示實(shí)際表項(xiàng)大小所在的區(qū)間,prime是要選擇的hash表桶的大小,%err表示沖突的百分比)<table>complextableseeoriginaldocumentpage7</column></row><table>表1hash函數(shù)參數(shù)取值對(duì)照表該hash函數(shù)參數(shù)取值對(duì)照表可以非常直接、方便地滿足實(shí)際使用需要,并且通過測(cè)試統(tǒng)計(jì)出相應(yīng)的hash函數(shù)沖突率的百分比值以供參考。當(dāng)然在設(shè)計(jì)hash表時(shí),也可以通過關(guān)系式Ml〈ciri且cc[l/2<c<3/4],來計(jì)算得到相應(yīng)hash表桶大小prime的值。步驟2、然后將ACL規(guī)則字符串序列作為hash函數(shù)的鍵值key帶入函數(shù)計(jì)算,其中key表示hash函數(shù)的鍵值,對(duì)應(yīng)著ACL規(guī)則組名字字符串;具體的函數(shù)計(jì)算方法如下通過累加輸入關(guān)鍵字符串中每個(gè)字符對(duì)應(yīng)的ascall碼和每個(gè)字符在字符串中的相對(duì)位置的乘積項(xiàng),然后再將累加和對(duì)hash表桶大小prime進(jìn)行取模就可得到此hash函數(shù)的散列值index。這樣設(shè)計(jì)的hash函數(shù)可以較均勻地將關(guān)鍵字符串key映射到以桶大小為prime的hash表中。例如假設(shè)關(guān)鍵字符串為"hashkey",以上述情況為例取prime素?cái)?shù)值為193,那么計(jì)算過程就是字符'h'的ascall碼104乘以'h'在字符串中的相對(duì)位置7,然后加上字符'a'的ascall碼97乘以'a'在字符串中的相對(duì)位置6,依此類推得到累加和sum就等于2945(即104*7+97*6+115*5+104*4+107*3+101*2+121*1)。最后將累加和sum對(duì)prime取模得50,即得到關(guān)鍵字符串"hashkey"對(duì)應(yīng)桶大小為193的hash表的散列值index為50。步驟3、根據(jù)計(jì)算結(jié)果index來索引本ACL規(guī)則在hash一table表中對(duì)應(yīng)表項(xiàng),由hash—table[index]所指向的結(jié)構(gòu)體中整型標(biāo)識(shí)位status的狀態(tài)(默認(rèn)初始值為FALSE)可以判斷當(dāng)前ACL規(guī)則是否存在。當(dāng)status為FALSE表明現(xiàn)存的ACL中沒有重復(fù)規(guī)則即當(dāng)前配置ACL規(guī)則有效,同時(shí)將status置TRUE,生成的ACL規(guī)則字符串序列(或能唯一確定此ACL規(guī)則關(guān)鍵字)記錄到descrip中,標(biāo)識(shí)返回結(jié)果為未匹配到相同的ACL規(guī)則然后直接結(jié)束。當(dāng)status為TRUE時(shí)表明現(xiàn)存的ACL中可能存在有當(dāng)前所配置的ACL規(guī)則,需進(jìn)一步判斷,這時(shí)通過list單向鏈表逐一比較hash—table桶中descrip字符串序列或者通過前面所述的傳統(tǒng)ACL規(guī)則匹配比較方法進(jìn)行比較,如果匹配到相同的ACL規(guī)則,則標(biāo)識(shí)返回結(jié)果為匹配到相同的ACL規(guī)則然后結(jié)束;否則如果未匹配到,則將當(dāng)前ACL規(guī)則按照hash—table結(jié)構(gòu)構(gòu)造好后添加到list單向鏈表末尾并標(biāo)識(shí)返回結(jié)果為未匹配到相同的ACL規(guī)則后結(jié)束,表明當(dāng)前ACL規(guī)則無重復(fù)并添加至系統(tǒng)ACL規(guī)則組中,這樣就完成了訪問控制列表的匹配和比較操作。權(quán)利要求1、一種快速查找定位和匹配訪問控制列表的方法,其特征在于,包括如下步驟步驟1、將要配置的ACL規(guī)則的所有匹配域信息字符串序列化,初始化hash_table[MAX_LEN]表;步驟2、將ACL規(guī)則字符串序列作為hash函數(shù)的鍵值key,將相應(yīng)字符串key和hash桶大小值prime帶入函數(shù)計(jì)算,得到此hash的函數(shù)散列值index;步驟3、根據(jù)計(jì)算結(jié)果index來索引本ACL規(guī)則在hash_table表中對(duì)應(yīng)表項(xiàng)。2、根據(jù)權(quán)利要求1所述的快速査找定位和匹配訪問控制列表的方法,其特征在于,所述的hash—table表桶大小prime要滿足關(guān)系式2<^^°",^目<^且為素?cái)?shù)。2prime43、根據(jù)權(quán)利要求l所述的快速査找定位和匹配訪問控制列表的方法,其特征在于,所述的prime值為ACL規(guī)則表項(xiàng)大小所對(duì)應(yīng)的數(shù)字區(qū)間中的素?cái)?shù)值。4、根據(jù)權(quán)利要求2或3所述的快速查找定位和匹配訪問控制列表的方法,其特征在于,所述的函數(shù)計(jì)算具體為累加輸入關(guān)鍵字符串key中每個(gè)字符對(duì)應(yīng)的ascall碼和每個(gè)字符在字符串中的相對(duì)位置的乘積項(xiàng),對(duì)上述累加和對(duì)prime值進(jìn)行取模。5、根據(jù)權(quán)利要求l所述的快速査找定位和匹配訪問控制列表的方法,其特征在于,每一個(gè)hash—table表項(xiàng)為一個(gè)結(jié)構(gòu)體,包括一個(gè)hash_table型單向鏈表指針list、一個(gè)布爾型標(biāo)識(shí)位status和一個(gè)字符型關(guān)鍵描述字符串指針descrip。6、根據(jù)權(quán)利要求l所述的快速查找定位和匹配訪問控制列表的方法,其特征在于,給hash表維護(hù)一個(gè)鏈表,保存所有沖突的表項(xiàng)。7、權(quán)利要求6所述的快速査找定位和匹配訪問控制列表的方法,其特征在于,還包括如下步驟由hash—table[index]所指向的結(jié)構(gòu)體中整型標(biāo)識(shí)位status的狀態(tài),判斷當(dāng)前ACL規(guī)則是否存在。8、根據(jù)權(quán)利要求7所述的快速查找定位和匹配訪問控制列表的方法,其特征在于,還包括如下步驟當(dāng)status為FALSE表明現(xiàn)存的ACL中沒有重復(fù)規(guī)則即當(dāng)前配置ACL規(guī)則有效,同時(shí)將status置TRUE,生成的ACL規(guī)則字符串序列或能唯一確定此ACL規(guī)則關(guān)鍵字記錄到descrip中,標(biāo)識(shí)返回結(jié)果為未匹配到相同的ACL規(guī)則然后直接結(jié)束o9、根據(jù)權(quán)利要求8所述的快速査找定位和匹配訪問控制列表的方法,其特征在于,還包括如下步驟當(dāng)status為TRUE時(shí)表明現(xiàn)存的ACL中可能存在有當(dāng)前所配置的ACL規(guī)則,需進(jìn)一步判斷,這時(shí)通過list單向鏈表逐一比較hash_table桶中descrip字符串序列或者通過前面所述的傳統(tǒng)ACL規(guī)則匹配比較方法進(jìn)行比較,如果匹配到相同的ACL規(guī)則,則標(biāo)識(shí)返回結(jié)果為匹配到相同的ACL規(guī)則然后結(jié)束;否則如果未匹配到,則將當(dāng)前ACL規(guī)則按照hash—table結(jié)構(gòu)構(gòu)造好后添加到list單向鏈表末尾并標(biāo)識(shí)返回結(jié)果為未匹配到相同的ACL規(guī)則后結(jié)束。全文摘要本發(fā)明提供一種快速查找定位和匹配訪問控制列表的方法,包括如下步驟步驟1,將要配置的ACL規(guī)則的所有匹配域信息字符串序列化,初始化hash_table[MAX_LEN]表;步驟2,將ACL規(guī)則字符串序列作為hash函數(shù)的鍵值key,將相應(yīng)字符串key和hash桶大小值prime帶入函數(shù)計(jì)算,得到此hash的函數(shù)散列值index;步驟3,根據(jù)計(jì)算結(jié)果index來索引本ACL規(guī)則在hash_table表中對(duì)應(yīng)表項(xiàng)。本發(fā)明中的hash算法實(shí)現(xiàn)簡(jiǎn)單,效率較高,hash分布性比較好,另外通過給HASH表維護(hù)一個(gè)鏈表,保存所有沖突的表項(xiàng)的方法可以很好的平衡實(shí)際應(yīng)用中空間和時(shí)間的矛盾問題,在不必浪費(fèi)巨大空間的情況下很好地提高系統(tǒng)效率。文檔編號(hào)H04L12/56GK101345694SQ200710043670公開日2009年1月14日申請(qǐng)日期2007年7月11日優(yōu)先權(quán)日2007年7月11日發(fā)明者杰李,高守瑋申請(qǐng)人:上海未來寬帶技術(shù)及應(yīng)用工程研究中心有限公司