專利名稱:IPv6路由表快速查找和更新的方法
技術(shù)領(lǐng)域:
本發(fā)明涉及計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)領(lǐng)域,特別是一種基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法。
背景技術(shù):
路由表查找方法是路由器轉(zhuǎn)發(fā)系統(tǒng)中的關(guān)鍵技術(shù),查找效率的高低在很大程度上影響了路由器的轉(zhuǎn)發(fā)效率。路由表查找的基本思想是,給定一個(gè)地址關(guān)鍵字,需要在路由表中查找到匹配這個(gè)地址關(guān)鍵字的最長(zhǎng)的地址前綴,根據(jù)地址前綴的下一跳端口號(hào)進(jìn)行后續(xù)的處理。與傳統(tǒng)的只能完成對(duì)關(guān)鍵字精確匹配的查找相比,路由表查找的難度和復(fù)雜度大大增加。
目前針對(duì)IPv4路由器開(kāi)展研究的路由查找方法已有很多,最廣泛應(yīng)用的包括兩大類(lèi)查找方法,分別為基于trie樹(shù)的方法和基于地址前綴長(zhǎng)度的二分查找法。但是,隨著IPv6網(wǎng)絡(luò)的進(jìn)一步普及,這些路由表查找方法都遇到了各自的局限。
基于trie樹(shù)的查找方法是這樣的,trie是一種樹(shù)結(jié)構(gòu),它利用地址前綴中的每一位bit的值來(lái)構(gòu)造樹(shù)的分支。trie的一種優(yōu)化方法為多分支trie樹(shù),它采用地址前綴中的多個(gè)bit構(gòu)造樹(shù)的每一個(gè)節(jié)點(diǎn),這樣可以減小查找深度,卻也帶來(lái)了負(fù)面的影響。它的主要問(wèn)題集中在步寬的選擇上,步寬大,方法效率高,內(nèi)存占用大;步寬小,方法效率低,內(nèi)存占用少。人們雖然已經(jīng)使用了各種壓縮方法來(lái)試圖解決這個(gè)問(wèn)題,但是,在IPv4網(wǎng)絡(luò)中,由于地址位數(shù)少,步寬的選擇范圍有限,這個(gè)問(wèn)題還不是特別突出,IPv6 128位的網(wǎng)絡(luò)地址使得它的問(wèn)題凸顯出來(lái),造成該方法查找性能?chē)?yán)重下降。
相比較而言,基于地址前綴長(zhǎng)度的二分查找法在IPv6網(wǎng)絡(luò)中是性能效率比較好的一種查找方法,這個(gè)方法是在基于哈希表的線性查找方法基礎(chǔ)上發(fā)展起來(lái)的。它的基本思想是將路由表根據(jù)不同的前綴長(zhǎng)度進(jìn)行分類(lèi),將具有相同長(zhǎng)度的前綴組成一個(gè)哈希表,這樣整個(gè)路由表將由多個(gè)哈希表組成。之后根據(jù)地址關(guān)鍵字的長(zhǎng)度對(duì)這些哈希表進(jìn)行二分查找,再根據(jù)哈希查找法直接定位到最長(zhǎng)匹配的前綴。該方法的實(shí)施過(guò)程中會(huì)遇到一些細(xì)節(jié)的問(wèn)題,例如對(duì)于前綴表1*,00*,111*,如果要查找的地址關(guān)鍵字為111,首先二分查找11*,在2位的哈希表中只有00*,沒(méi)有11*,這時(shí)需要引入一個(gè)機(jī)制,在2位哈希表中添加一個(gè)marker 11*,這個(gè)marker不是實(shí)際的地址前綴,只是為了查找過(guò)程的需要。找到11*后,在前綴表的后面繼續(xù)查找,此時(shí)可以找到111*。雖然IPv6地址長(zhǎng)度的增加對(duì)該方法的影響不大,但是該方法的更新效率較差,由于前綴與前綴之間,前綴與marker之間的依賴關(guān)系較大,當(dāng)一個(gè)前綴遇到添加、刪除、更新等操作時(shí),需要改動(dòng)多個(gè)前綴或者marker的信息,如何找到這些需要改動(dòng)的前綴或者marker是非常困難的。此外,這些更新操作,即使是通過(guò)優(yōu)化,也需要在一段時(shí)間之后重構(gòu)整個(gè)hash表集合。
發(fā)明內(nèi)容
本發(fā)明所要解決的技術(shù)問(wèn)題在于提出一種適用于IPv6網(wǎng)絡(luò)路由器的路由表查找和更新方法,特別是在保證了路由表查找效率的同時(shí),有效的提高路由表的更新效率。該方法可以用于IPv6網(wǎng)絡(luò)路由器轉(zhuǎn)發(fā)系統(tǒng)中路由表的查找與更新。
本發(fā)明是這樣實(shí)現(xiàn)的一種基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于首先建立三種數(shù)據(jù)結(jié)構(gòu)(1)線性索引表,其中的每一個(gè)表項(xiàng)對(duì)應(yīng)了零個(gè)、一個(gè)或者多個(gè)長(zhǎng)度等于或者小于16的地址前綴;(2)HTL(Hash Table List,哈希表列表),將路由表中所有長(zhǎng)度小于等于16的前綴按照長(zhǎng)度分類(lèi)存儲(chǔ)在不同的hash表中,這些hash表的集合構(gòu)成了HTL;
(3)B-HTL(Binary tree-Hash Table List,基于二分查找樹(shù)組織的哈希表列表),將路由表中所有長(zhǎng)度大于16的前綴按照長(zhǎng)度分類(lèi)存儲(chǔ)在不同的hash表中,這些hash表通過(guò)二分查找樹(shù)組織起來(lái)構(gòu)成B-HTL;當(dāng)一個(gè)IPv6協(xié)議的數(shù)據(jù)分組進(jìn)入路由器之后,取出目的地址的高16bit,作為索引值定位到線性索引表的對(duì)應(yīng)表項(xiàng),如果該表項(xiàng)的標(biāo)志位為0,則直接取出表項(xiàng)中的下一跳端口作為轉(zhuǎn)發(fā)端口;否則,根據(jù)表項(xiàng)中存儲(chǔ)的信息,在對(duì)應(yīng)的B-HTL中利用二分查找樹(shù)進(jìn)行查找;利用HTL中存儲(chǔ)的數(shù)據(jù)對(duì)線性索引表進(jìn)行更新操作。
所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,所述線性索引表固定為64k個(gè)表項(xiàng),每一個(gè)表項(xiàng)長(zhǎng)度為3個(gè)字節(jié),劃分為3個(gè)部分,其中高16bit為第一部分,用來(lái)表示前綴長(zhǎng)度或者指向B-HTL的指針;接下來(lái)的一個(gè)bit為標(biāo)志位,用來(lái)表示第一部分所存儲(chǔ)內(nèi)容的含義;第三部分為最后7bit,表示該表項(xiàng)對(duì)應(yīng)的下一跳路由端口;每一個(gè)線性索引表的表項(xiàng)唯一的對(duì)應(yīng)了一個(gè)B-HTL。
所述線性索引表第一部分,當(dāng)用來(lái)表示前綴長(zhǎng)度時(shí),其16bit的長(zhǎng)度每一位都置1或者置0;當(dāng)一個(gè)長(zhǎng)度為n的地址前綴對(duì)應(yīng)到某個(gè)線性索引表項(xiàng)時(shí),該表項(xiàng)第一部分的第n位置1,否則置0。
在所述線性索引表中執(zhí)行更新操作時(shí),如果要更新的前綴長(zhǎng)度L小于等于16,先將表項(xiàng)第一部分中第L位置1,隨后判斷在高于L的位中是否存在為1的位,如果不存在,則根據(jù)標(biāo)記位將線性索引表表項(xiàng)的第三部分改寫(xiě)為要更新前綴的端口號(hào);在所述線性索引表中執(zhí)行刪除操作時(shí),如果要?jiǎng)h除的前綴長(zhǎng)度L小于等于16,先將表項(xiàng)第一部分中第L位置置0,隨后判斷高于L的位中是否存在為1的位,如果存在,則在HTL對(duì)應(yīng)前綴長(zhǎng)度的hash表中刪除該前綴;如果不存在,則在低于L的那些位中查找最高的值為1的位,并根據(jù)該位的位置在HTL中查找對(duì)應(yīng)的前綴,將線性索引表表項(xiàng)第三部分改寫(xiě)為所查找到前綴的端口號(hào)。
所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,執(zhí)行路由表查找的操作包括如下步驟5A、取出IPv6分組目的地址的前16bit作為索引值,在線性索引表中查找對(duì)應(yīng)的表項(xiàng);5B、如果該表項(xiàng)的標(biāo)記位為1,執(zhí)行5D;5C、取得該表項(xiàng)對(duì)應(yīng)的輸出端口,執(zhí)行5F;5D、取出IPv6分組目的地址的后112bit;5E、在線性索引表的表項(xiàng)中取得B-HTL指針,在對(duì)應(yīng)的B-HTL中利用后112bit地址執(zhí)行二分查找,取得對(duì)應(yīng)的輸出端口;5F、結(jié)束。
所述B-HTL的二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)都指向一個(gè)hash表;hash表中每一個(gè)表項(xiàng)包括以下幾個(gè)部分(1)長(zhǎng)度為16byte的IPv6地址;(2)長(zhǎng)度為7bit的下一跳端口號(hào);(3)長(zhǎng)度為1bit的標(biāo)記位,用于表示該表項(xiàng)是否對(duì)應(yīng)了一條長(zhǎng)度大于16的地址前綴;(4)長(zhǎng)度為1bit的標(biāo)記位,用于表示該表項(xiàng)是否對(duì)應(yīng)一個(gè)marker;(5)長(zhǎng)度為8bit的BMP(Best Matched Prefix,最長(zhǎng)匹配前綴),用于表示該表項(xiàng)對(duì)應(yīng)的的最長(zhǎng)地址前綴長(zhǎng)度;(6)長(zhǎng)度為16bit的marker計(jì)數(shù)器,用于統(tǒng)計(jì)該表項(xiàng)上疊加的marker數(shù)量;(7)expand指針,指向一個(gè)BMP_tree(最長(zhǎng)匹配地址前綴樹(shù))的根節(jié)點(diǎn);(8)next_level指針,指向BMP_tree中的下級(jí)節(jié)點(diǎn);(9)same_level指針,指向BMP_tree中的同級(jí)節(jié)點(diǎn)。
所述BMP_tree由B-HTL中hash表的表項(xiàng)組成,每一個(gè)表項(xiàng)的expand指針唯一對(duì)應(yīng)一棵BMP_tree,BMP_tree中的每一個(gè)節(jié)點(diǎn)都以該表項(xiàng)為前綴,并且根據(jù)節(jié)點(diǎn)中前綴的長(zhǎng)度由低到高設(shè)置該節(jié)點(diǎn)在BMP_tree中的層次,具有同樣前綴長(zhǎng)度的節(jié)點(diǎn)處于BMP_tree的同一層;當(dāng)對(duì)B-HTL進(jìn)行添加、刪除、更新操作時(shí),通過(guò)BMP_tree查找那些需要改變的hash表表項(xiàng)。
所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,對(duì)B-HTL添加一個(gè)前綴P2時(shí),執(zhí)行如下步驟
8A、在B-HTL中查找P2的最長(zhǎng)地址前綴節(jié)點(diǎn)P1;8B、在P1的BMP-tree中,遍歷所有層次高于P2的前綴節(jié)點(diǎn),分別執(zhí)行8C、8D、8E;8C、如果遍歷沒(méi)有結(jié)束,那么執(zhí)行8D,否則,執(zhí)行8F;8D、如果P2是該節(jié)點(diǎn)的前綴,那么執(zhí)行8E,否則遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行8C;8E、從P1的BMP-tree中取出該節(jié)點(diǎn),移動(dòng)到P2的BMP-tree中,遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行8C;8F、為P2在B-HTL中添加marker;8G、將P2添加到P1的BMP-tree中;8H、結(jié)束。
所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,對(duì)B-HTL刪除一個(gè)前綴P2時(shí),執(zhí)行如下步驟9A、在B-HTL中查找P2的最長(zhǎng)地址前綴節(jié)點(diǎn)P1;9B、在P1的BMP-tree中,遍歷所有層次高于P2的前綴節(jié)點(diǎn),分別執(zhí)行9C、9D、9E;9C、如果遍歷沒(méi)有結(jié)束,那么執(zhí)行9D,否則,執(zhí)行9F;9D、如果該節(jié)點(diǎn)是P2的前綴,那么執(zhí)行9E,否則遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行9C;9E、修改該節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的信息,遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行9C;9F、取出P2的BMP-tree,并入P1的BMP-tree;9G、刪除P2的前綴信息;9H、結(jié)束。
所述B-HTL中每一個(gè)hash表對(duì)應(yīng)了唯一的地址前綴長(zhǎng)度,B-HTL中所有的hash表對(duì)應(yīng)了一個(gè)地址前綴長(zhǎng)度區(qū)間;所述二分查找樹(shù)在這個(gè)前綴長(zhǎng)度區(qū)間范圍內(nèi)構(gòu)建,二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)覆蓋B-HTL的一部分地址前綴長(zhǎng)度區(qū)間,該節(jié)點(diǎn)對(duì)應(yīng)的hash表的前綴長(zhǎng)度也在這部分地址前綴長(zhǎng)度區(qū)間中,并且將這部分地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,該兩個(gè)子區(qū)間分別對(duì)應(yīng)該節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn);在任意一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的地址前綴長(zhǎng)度區(qū)間中,選擇表項(xiàng)數(shù)量最多的一個(gè)hash表作為所述任意節(jié)點(diǎn)對(duì)應(yīng)的hash表。
所述B-HTL中每一個(gè)hash表對(duì)應(yīng)了唯一的地址前綴長(zhǎng)度,B-HTL中所有的hash表對(duì)應(yīng)了一個(gè)地址前綴長(zhǎng)度區(qū)間;所述二分查找樹(shù)在這個(gè)前綴長(zhǎng)度區(qū)間范圍內(nèi)構(gòu)建,二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)覆蓋B-HTL的一部分地址前綴長(zhǎng)度區(qū)間,該節(jié)點(diǎn)對(duì)應(yīng)的hash表的前綴長(zhǎng)度也在這部分地址前綴長(zhǎng)度區(qū)間中,并且將這部分地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,分別對(duì)應(yīng)該節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn);在任意一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的地址前綴長(zhǎng)度區(qū)間中,選擇一個(gè)hash表,用這個(gè)hash表將地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,使得第一個(gè)子區(qū)間中hash表表項(xiàng)數(shù)量和與第二個(gè)子區(qū)間中hash表表項(xiàng)數(shù)量和最接近,則這個(gè)hash表作為該節(jié)點(diǎn)對(duì)應(yīng)的hash表。
本發(fā)明采用兩級(jí)查找和三種數(shù)據(jù)結(jié)構(gòu)的模式,通過(guò)一級(jí)線性索引,將整個(gè)地址空間劃分為64k個(gè)部分,在保證了原有的基于地址前綴的二分查找法效率的同時(shí),每一次路由表的更新操作只需要在64k個(gè)地址空間中的一個(gè)里面進(jìn)行,而無(wú)需改動(dòng)其它地址空間中的路由表,提高了路由表更新和重構(gòu)的效率。同時(shí),在基于地址前綴的二分查找法的數(shù)據(jù)結(jié)構(gòu)B-HTL中,增加了被稱為BMP_tree的數(shù)據(jù)組織方式,通過(guò)這種數(shù)據(jù)組織方式,減少了路由表更新操作中所需要訪問(wèn)的hash表表項(xiàng),進(jìn)一步提高了路由表更新的效率。
圖1是IPv6地址格式示意圖。
圖2是本發(fā)明所使用數(shù)據(jù)結(jié)構(gòu)的相互關(guān)系圖。
圖3是線性索引表表項(xiàng)結(jié)構(gòu)示意圖。
圖4是應(yīng)用本發(fā)明進(jìn)行路由表查找的流程圖。
圖5是本發(fā)明中BMP-tree結(jié)構(gòu)示意圖。
圖6(a)是在B-HTL中添加前綴P2的流程圖。
圖6(b)是在B-HTL中刪除前綴P2的流程圖。
圖7(a)是IPv4路由表中地址前綴按照長(zhǎng)度的分布統(tǒng)計(jì)圖。
圖7(b)是IPv6路由表中地址前綴按照長(zhǎng)度的分布統(tǒng)計(jì)圖。
具體實(shí)施例方式
下面結(jié)合附圖和實(shí)施例,對(duì)本發(fā)明做進(jìn)一步的詳細(xì)闡述.
在RFC2373、RFC2374中提出了可聚集的全球單播地址格式方案,該方案將IPv6地址劃分為若干段,其中前64位為網(wǎng)絡(luò)ID,后64位為接口ID。在網(wǎng)絡(luò)ID中,又劃分出若干網(wǎng)絡(luò)層次,不同的子網(wǎng)地址由不同的互聯(lián)網(wǎng)機(jī)構(gòu)負(fù)責(zé)分配。因此,本發(fā)明取路由表地址前綴的前16位,即頂極聚集標(biāo)識(shí)符所對(duì)應(yīng)的范圍,作為一級(jí)線性索引的索引值,并且構(gòu)建HTL,再根據(jù)剩余的112位地址組成B-HTL,在其中進(jìn)行二分法查找,如圖1所示數(shù)據(jù)結(jié)構(gòu)示意圖如圖2所示。其主要分為三種數(shù)據(jù)結(jié)構(gòu)線性索引表、HTL以及B-HTL。其中,B-HTL由一組hash表組成,每一個(gè)B-HTL對(duì)應(yīng)線性索引表中的一個(gè)表項(xiàng)。B-HTL來(lái)源于基于地址前綴空間的二分查找發(fā)所使用的數(shù)據(jù)結(jié)構(gòu),只不過(guò)它的hash表中存儲(chǔ)的地址前綴前16位都相同,都是對(duì)應(yīng)的線性索引表表項(xiàng)的索引值。
線性索引表每個(gè)表項(xiàng)的結(jié)構(gòu)如圖3所示,它有兩種格式當(dāng)標(biāo)記位為0時(shí),表示在路由表中不存在以這個(gè)16位地址前綴為起始的長(zhǎng)度大于16的其它的地址前綴,此時(shí)表項(xiàng)前16位用來(lái)表示掩碼長(zhǎng)度,即指示出有多少不同長(zhǎng)度的前綴都對(duì)應(yīng)到該表項(xiàng);表項(xiàng)后7位為輸出端口,也就是對(duì)應(yīng)到該表項(xiàng)中前綴長(zhǎng)度最長(zhǎng)的一個(gè)路由表前綴的輸出端口。
當(dāng)標(biāo)記位為1時(shí),表示存在長(zhǎng)度大于16的地址前綴,此時(shí)表項(xiàng)前16位用來(lái)作為指針指向一個(gè)B-HTL,以便在其中執(zhí)行基于地址前綴長(zhǎng)度的二分查找法查找最長(zhǎng)匹配前綴;表項(xiàng)后7位此時(shí)沒(méi)有意義,需置0。
由于線性索引表查找的效率遠(yuǎn)遠(yuǎn)大于hash查找,而且,如果能將該一級(jí)索引表放置于緩存中,其查找時(shí)間更可以忽略不計(jì)。最重要的是,線性索引表將地址前綴空間劃分為若干個(gè)子空間,對(duì)每一個(gè)子空間內(nèi)地址前綴的添加、刪除和重構(gòu)數(shù)據(jù)結(jié)構(gòu),都不會(huì)影響到其它子空間的地址前綴。
當(dāng)一個(gè)IPv6的分組進(jìn)入路由器之后,路由表查找方法流程圖如圖4所示。首先取出IPv6分組的目的地址的前16bit,用這16bit的內(nèi)容作為索引值,假設(shè)這個(gè)值為N,直接定位到線性索引表的第N個(gè)表項(xiàng)上。如果該表項(xiàng)的標(biāo)記位為0,說(shuō)明在路由表中,沒(méi)有以這16bit內(nèi)容開(kāi)頭的長(zhǎng)度大于16的前綴,此時(shí)直接取出該表項(xiàng)的第三部分輸出端口,作為這個(gè)IPv6分組的轉(zhuǎn)發(fā)端口,結(jié)束一次查找;如果該表項(xiàng)的標(biāo)記位為1,說(shuō)明在路由表中存在以這16bit內(nèi)容開(kāi)頭的長(zhǎng)度大于16的前綴,為了找到這個(gè)前綴,需要取出該表項(xiàng)的第一部分,當(dāng)標(biāo)記位為1時(shí),第一部分存放著B(niǎo)-HTL的指針,由這個(gè)指針定位到對(duì)應(yīng)的B-HTL,在B-HTL中根據(jù)IPv6目的地址的后112bit的內(nèi)容進(jìn)行二分法查找。此后與基于地址前綴長(zhǎng)度的二分查找方法類(lèi)似,直到找到最長(zhǎng)匹配的路由表前綴,取出對(duì)應(yīng)的下一跳端口號(hào),結(jié)束一次查找。
原始的基于地址前綴的二分查找法更新效率很低,時(shí)間復(fù)雜度達(dá)到了O(N*logW)。在路由表很大的情況下,由于網(wǎng)絡(luò)中路由表更新的頻繁發(fā)生,這樣的效率無(wú)法接受。原始查找方法中影響更新效率的關(guān)鍵因素在于如何找到那些需要進(jìn)行更新的marker。
對(duì)marker的更新包括如下幾種情況。
●替換一個(gè)地址前綴時(shí),由于不影響該前綴節(jié)點(diǎn)的marker,所以只需簡(jiǎn)單替換即可。
●插入一個(gè)地址前綴時(shí),需要為該前綴添加查找時(shí)需要的marker,同時(shí)需要將以該前綴作為BMP(Best Matched Prefix)的所有marker的BMP改寫(xiě)為該前綴。
●刪除一個(gè)前綴時(shí),需要?jiǎng)h除該前綴所對(duì)應(yīng)的marker,注意如果某個(gè)marker有復(fù)用的情況,則不能被刪除,同時(shí)需要將以該前綴作為BMP的所有marker的BMP改寫(xiě)為該前綴的BMP。
通過(guò)分析可知,更新一條地址前綴記錄p/l時(shí)(p為前綴地址,l為前綴長(zhǎng)度),原始查找方法需要更新兩類(lèi)marker,第一類(lèi)是長(zhǎng)度小于l的marker,這類(lèi)marker供二分查找時(shí)使用;第二類(lèi)是其BMP為p/l的marker,這類(lèi)marker的作用是為了避免回溯。對(duì)第一類(lèi)marker的更新較為簡(jiǎn)單,因?yàn)閜的地址是已知的,它所對(duì)應(yīng)的第一類(lèi)marker可以直接通過(guò)在對(duì)應(yīng)長(zhǎng)度的hash表中進(jìn)行hash查找獲得。而第二類(lèi)marker代表了p/l的前綴擴(kuò)展,由于并不知道p/l在路由表中有哪些前綴擴(kuò)展,因此需要遍歷所有長(zhǎng)度大于l的hash表,或者是在所有長(zhǎng)度大于l的hash表中對(duì)前綴為p/l的完備集合進(jìn)行hash查找,這個(gè)效率十分低下。
一個(gè)簡(jiǎn)單的方法是,在構(gòu)建數(shù)據(jù)結(jié)構(gòu)的時(shí)候,將每個(gè)前綴表項(xiàng)的第二類(lèi)marker通過(guò)線性鏈表鏈接起來(lái),這樣可以大大縮小查找的范圍。但是,這樣的查找方法執(zhí)行效率仍有提高的空間。因此,本發(fā)明使用樹(shù)型數(shù)據(jù)結(jié)構(gòu),BMP-tree,用來(lái)組織具有同樣BMP的表項(xiàng)。
并不是所有的marker都有最長(zhǎng)匹配前綴。為了一致性,在hash表中添加了兩個(gè)偽前綴hash表項(xiàng),在本實(shí)施例中,這兩個(gè)偽前綴表項(xiàng)添加在長(zhǎng)度為17的hash表中。假設(shè)這個(gè)hash表列表中所有的表項(xiàng)都有共同的前綴p/16,那么添加的兩個(gè)偽前綴表項(xiàng)分別為{p,0}/17和{p,1}/17。
如圖5(a)所示為BMP-tree數(shù)據(jù)結(jié)構(gòu)示意圖。其中圖5(a)是前綴P2刪除前(或添加后),圖5(b)是前綴P2刪除后(或添加前)。左邊為二分搜索樹(shù),表明了各hash表之間的關(guān)系。右邊為hash表列表以及hash表中各表項(xiàng)組成的BMP-tree,其中p表示該表項(xiàng)為純前綴,m表示該表項(xiàng)為純marker,b表示該表項(xiàng)既是一個(gè)前綴,也是一個(gè)marker,它們使用同一個(gè)hash表項(xiàng)。
對(duì)于一個(gè)hash表項(xiàng)而言,如果它代表了一個(gè)前綴,即標(biāo)記為p或者b,那么它有一個(gè)指針指向它所對(duì)應(yīng)的BMP-tree,BMP-tree中的每一個(gè)節(jié)點(diǎn)都是以該前綴作為BMP(最長(zhǎng)匹配前綴)的hash表項(xiàng)。對(duì)BMP-tree中每一個(gè)父節(jié)點(diǎn)來(lái)說(shuō),它的左子節(jié)點(diǎn)的前綴長(zhǎng)度大于父節(jié)點(diǎn)的前綴長(zhǎng)度,而它的右子節(jié)點(diǎn)的前綴長(zhǎng)度等于父節(jié)點(diǎn)的前綴長(zhǎng)度。將從根節(jié)點(diǎn)開(kāi)始,將所有左子節(jié)點(diǎn)組成的唯一一條路徑稱作該BMP-tree的主干,將主干上某一節(jié)點(diǎn)開(kāi)始所有右節(jié)點(diǎn)組成的路徑成為該BMP-tree的長(zhǎng)度為l的支干,其中l(wèi)為該支干上所有節(jié)點(diǎn)的前綴長(zhǎng)度。
圖中標(biāo)記為P1的表項(xiàng)對(duì)應(yīng)了一棵BMP-tree,用淺色節(jié)點(diǎn)表示。標(biāo)記為P2的表項(xiàng)對(duì)應(yīng)了另外一棵BMP-tree,用深色節(jié)點(diǎn)表示??芍?,P2的BMP是P1。刪除表項(xiàng)P2時(shí),首先更新P2的第一類(lèi)marker,如果該marker需要被刪除,則在P1的BMP-tree中搜索那些長(zhǎng)度小于P2的前綴長(zhǎng)度的支干。然后更新P2的第二類(lèi)marker,此時(shí)只需將P2的BMP-tree中所有節(jié)點(diǎn)的BMP都改寫(xiě)為P1,然后把P2的BMP-tree合并到P1的BMP-tree中即可,合并后的數(shù)據(jù)結(jié)構(gòu)如圖5(b)所示,其流程圖見(jiàn)圖6(a)。
添加路由前綴的操作與刪除操作類(lèi)似。例如在圖5(b)所示的數(shù)據(jù)結(jié)構(gòu)中添加前綴P2,首先要添加P2的第一類(lèi)marker,如果涉及到新增表項(xiàng)的操作,那么要在P2的BMP,也就是P1的BMP-tree中對(duì)應(yīng)長(zhǎng)度的支干上添加節(jié)點(diǎn)。然后要構(gòu)造P2的BMP-tree,在P1的BMP-tree中長(zhǎng)度大于P2的前綴長(zhǎng)度的支干中線性搜索,查找那些以P2為前綴的節(jié)點(diǎn),將其BMP改寫(xiě)為P2,并且把它們從P1的BMP-tree中剪切出來(lái),添加到P2的BMP-tree中即可。添加前綴的流程圖見(jiàn)圖6(b)。
通過(guò)引入BMP-tree,前綴表項(xiàng)的刪除操作變得十分快捷,如果使用雙向鏈表,那么刪除操作的時(shí)間復(fù)雜度可以控制在O(kWlogW),其中k為單次操作鏈表所需內(nèi)存訪問(wèn)次數(shù),比起原有的需要線性搜索的方法來(lái)說(shuō)效率大大提高。而添加路由表項(xiàng)的操作效率還不是太好,但是相比原有的方法來(lái)說(shuō),引入BMP-tree之后,可以根據(jù)地址前綴的長(zhǎng)度,排除大量的備選表項(xiàng),也在一定程度上提高了效率。
圖6(a)是在B-HTL中添加前綴P2的流程圖。圖7(a)所示為IPv4主干網(wǎng)路由器中路由前綴按照長(zhǎng)度分布的統(tǒng)計(jì)直方圖。在圖中可以看到,不同長(zhǎng)度的前綴在路由表中的數(shù)量是不同的,有特定的分布特征。如果充分利用這些特征,可以有效改善查找方法的平均效率。圖6(b)是在B-HTL中刪除前綴P2的流程圖。類(lèi)似的,如圖7(b)所示為IPv6主干網(wǎng)路由器的路由前綴按長(zhǎng)度分布統(tǒng)計(jì)直方圖(僅顯示了前64位網(wǎng)絡(luò)地址)。
為了簡(jiǎn)化說(shuō)明,以IPv4路由表為例來(lái)說(shuō)明采用不同的二分搜索樹(shù)對(duì)于查找效率的影響,如圖7所示,圖7(a)是IPv4路由表中地址前綴按照長(zhǎng)度的分布統(tǒng)計(jì)圖。
圖7(b)是IPv6路由表中地址前綴按照長(zhǎng)度的分布統(tǒng)計(jì)圖。如果使用平衡二分搜索樹(shù)進(jìn)行查找,雖然一些hash表的前綴數(shù)量占有優(yōu)勢(shì),但是它所處的位置位于搜索樹(shù)較深的層次,對(duì)于大部分的搜索任務(wù)來(lái)說(shuō),需要更多的內(nèi)存訪問(wèn)才能完成一次查找。而如果通過(guò)對(duì)二分搜索路徑進(jìn)行設(shè)計(jì),將擁有前綴數(shù)量較多的hash表置于較高的層次,雖然增加了樹(shù)的最大深度,使得最大搜索深度增加,但是改善了平均效率。
此外,傳統(tǒng)的基于地址前綴長(zhǎng)度的二分查找法對(duì)marker的引入必然帶來(lái)內(nèi)存的額外消耗。由于一些marker可以與真正的路由前綴信息復(fù)用同樣的內(nèi)存空間,marker對(duì)空間效率的影響在一定程度上是可以控制的。為此,本實(shí)施例使用了兩種不同的搜索樹(shù)結(jié)構(gòu)方案,盡量減少marker對(duì)內(nèi)存空間的占用。
方案一使用包含前綴數(shù)量較多的hash表構(gòu)成搜索樹(shù)的上層節(jié)點(diǎn),可以使marker有最大的可能與真正的路由前綴信息復(fù)用內(nèi)存空間;方案二出于這樣的考慮,對(duì)于二分搜索樹(shù)中的某個(gè)節(jié)點(diǎn),它的右子樹(shù)中的前綴信息會(huì)在這個(gè)節(jié)點(diǎn)生成一個(gè)marker,如果能夠盡量縮減右子樹(shù)的大小,會(huì)大大降低marker的數(shù)量。一個(gè)極限情況是這棵二叉樹(shù)中每一個(gè)節(jié)點(diǎn)只有左子節(jié)點(diǎn),這樣不需要額外的marker的存儲(chǔ),但是二叉樹(shù)退化到線性搜索。為此,方案二采用了平衡左右子樹(shù)的方法,在選擇父節(jié)點(diǎn)時(shí),其左右子樹(shù)中前綴的數(shù)量盡可能相等,最好是左節(jié)點(diǎn)中前綴數(shù)量略大于右節(jié)點(diǎn)中前綴數(shù)量。
兩種構(gòu)造搜索樹(shù)結(jié)構(gòu)的方案都在很大程度上提高了搜索方法的效率,并且減少了marker的存儲(chǔ)。
由上可知,本發(fā)明在基于地址前綴長(zhǎng)度的二分查找法基礎(chǔ)上,使用了兩級(jí)的查找模式,通過(guò)第一級(jí)的線性索引表分隔了地址前綴空間,減小了不同子空間內(nèi)地址前綴更新時(shí)的相互影響,也保證了查找的效率;在基于地址前綴長(zhǎng)度的二分查找法所使用的數(shù)據(jù)結(jié)構(gòu)中增加了一種數(shù)據(jù)組織方式BMP-tree,進(jìn)一步減少了路由表更新時(shí)的開(kāi)銷(xiāo);最后,本發(fā)明提供了兩種不同的二分查找樹(shù)組織方式,減小了存儲(chǔ)的開(kāi)銷(xiāo)。
權(quán)利要求
1,一種基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于首先建立三種數(shù)據(jù)結(jié)構(gòu)(1)線性索引表,其中的每一個(gè)表項(xiàng)對(duì)應(yīng)了零個(gè)、一個(gè)或者多個(gè)長(zhǎng)度等于或者小于16的地址前綴;(2)HTL,將路由表中所有長(zhǎng)度小于等于16的前綴按照長(zhǎng)度分類(lèi)存儲(chǔ)在不同的hash表中,這些hash表的集合構(gòu)成了HTL;(3)B-HTL,將路由表中所有長(zhǎng)度大于16的前綴按照長(zhǎng)度分類(lèi)存儲(chǔ)在不同的hash表中,這些hash表通過(guò)二分查找樹(shù)組織起來(lái)構(gòu)成B-HTL;當(dāng)一個(gè)IPv6協(xié)議的數(shù)據(jù)分組進(jìn)入路由器之后,取出目的地址的高16bit,作為索引值定位到線性索引表的對(duì)應(yīng)表項(xiàng),如果該表項(xiàng)的標(biāo)志位為0,則直接取出表項(xiàng)中的下一跳端口作為轉(zhuǎn)發(fā)端口;否則,根據(jù)表項(xiàng)中存儲(chǔ)的信息,在對(duì)應(yīng)的B-HTL中利用二分查找樹(shù)進(jìn)行查找;利用HTL中存儲(chǔ)的數(shù)據(jù)對(duì)線性索引表進(jìn)行更新操作。
2,根據(jù)權(quán)利要求1所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述線性索引表固定為64k個(gè)表項(xiàng),每一個(gè)表項(xiàng)長(zhǎng)度為3個(gè)字節(jié),劃分為3個(gè)部分,其中高16bit為第一部分,用來(lái)表示前綴長(zhǎng)度或者指向B-HTL的指針;接下來(lái)的一個(gè)bit為標(biāo)志位,用來(lái)表示第一部分所存儲(chǔ)內(nèi)容的含義;第三部分為最后7bit,表示該表項(xiàng)對(duì)應(yīng)的下一跳路由端口;每一個(gè)線性索引表的表項(xiàng)唯一的對(duì)應(yīng)了一個(gè)B-HTL。
3,根據(jù)權(quán)利要求2所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述線性索引表第一部分,當(dāng)用來(lái)表示前綴長(zhǎng)度時(shí),其16bit的長(zhǎng)度每一位都置1或者置0;當(dāng)一個(gè)長(zhǎng)度為n的地址前綴對(duì)應(yīng)到某個(gè)線性索引表項(xiàng)時(shí),該表項(xiàng)第一部分的第n位置1,否則置0。
4,根據(jù)權(quán)利要求1或3所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于在所述線性索引表中執(zhí)行更新操作時(shí),如果要更新的前綴長(zhǎng)度L小于等于16,先將表項(xiàng)第一部分中第L位置1,隨后判斷在高于L的位中是否存在為1的位,如果不存在,則根據(jù)標(biāo)記位將線性索引表表項(xiàng)的第三部分改寫(xiě)為要更新前綴的端口號(hào);在所述線性索引表中執(zhí)行刪除操作時(shí),如果要?jiǎng)h除的前綴長(zhǎng)度L小于等于16,先將表項(xiàng)第一部分中第L位置置0,隨后判斷高于L的位中是否存在為1的位,如果存在,則在HTL對(duì)應(yīng)前綴長(zhǎng)度的hash表中刪除該前綴;如果不存在,則在低于L的那些位中查找最高的值為1的位,并根據(jù)該位的位置在HTL中查找對(duì)應(yīng)的前綴,將線性索引表表項(xiàng)第三部分改寫(xiě)為所查找到前綴的端口號(hào)。
5,根據(jù)權(quán)利要求2所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于執(zhí)行路由表查找的操作包括如下步驟5A、取出IPv6分組目的地址的前16bit作為索引值,在線性索引表中查找對(duì)應(yīng)的表項(xiàng);5B、如果該表項(xiàng)的標(biāo)記位為1,執(zhí)行5D;5C、取得該表項(xiàng)對(duì)應(yīng)的輸出端口,執(zhí)行5F;5D、取出IPv6分組目的地址的后112bit;5E、在線性索引表的表項(xiàng)中取得B-HTL指針,在對(duì)應(yīng)的B-HTL中利用后112bit地址執(zhí)行二分查找,取得對(duì)應(yīng)的輸出端口;5F、結(jié)束。
6,根據(jù)權(quán)利要求1所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述B-HTL的二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)都指向一個(gè)hash表;hash表中每一個(gè)表項(xiàng)包括以下幾個(gè)部分(1)長(zhǎng)度為16byte的IPv6地址;(2)長(zhǎng)度為7bit的下一跳端口號(hào);(3)長(zhǎng)度為1bit的標(biāo)記位,用于表示該表項(xiàng)是否對(duì)應(yīng)了一條長(zhǎng)度大于16的地址前綴;(4)長(zhǎng)度為1bit的標(biāo)記位,用于表示該表項(xiàng)是否對(duì)應(yīng)一個(gè)marker;(5)長(zhǎng)度為8bit的BMP,用于表示該表項(xiàng)對(duì)應(yīng)的的最大地址前綴長(zhǎng)度;(6)長(zhǎng)度為16bit的marker計(jì)數(shù)器,用于統(tǒng)計(jì)該表項(xiàng)上疊加的marker數(shù)量;(7)expand指針,指向一個(gè)BMP_tree的根節(jié)點(diǎn);(8)next_level指針,指向BMP_tree中的下級(jí)節(jié)點(diǎn);(9)same_level指針,指向BMP_tree中的同級(jí)節(jié)點(diǎn)。
7,根據(jù)權(quán)利要求6所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述BMP_tree由B-HTL中hash表的表項(xiàng)組成,每一個(gè)表項(xiàng)的expand指針唯一對(duì)應(yīng)一棵BMP_tree,BMP_tree中的每一個(gè)節(jié)點(diǎn)都以該表項(xiàng)為前綴,并且根據(jù)節(jié)點(diǎn)中前綴的長(zhǎng)度由低到高設(shè)置該節(jié)點(diǎn)在BMP_tree中的層次,具有同樣前綴長(zhǎng)度的節(jié)點(diǎn)處于BMP_tree的同一層;當(dāng)對(duì)B-HTL進(jìn)行添加、刪除、更新操作時(shí),通過(guò)BMP_tree查找那些需要改變的hash表表項(xiàng)。
8,根據(jù)權(quán)利要求6或7所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于對(duì)B-HTL添加一個(gè)前綴P2時(shí),執(zhí)行如下步驟8A、在B-HTL中查找P2的最長(zhǎng)地址前綴節(jié)點(diǎn)P1;8B、在P1的BMP-tree中,遍歷所有層次高于P2的前綴節(jié)點(diǎn),分別執(zhí)行8C、8D、8E;8C、如果遍歷沒(méi)有結(jié)束,那么執(zhí)行8D,否則,執(zhí)行8F;8D、如果P2是該節(jié)點(diǎn)的前綴,那么執(zhí)行8E,否則遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行8C;8E、從P1的BMP-tree中取出該節(jié)點(diǎn),移動(dòng)到P2的BMP-tree中,遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行8C;8F、為P2在B-HTL中添加marker;8G、將P2添加到P1的BMP-tree中;8H、結(jié)束。
9,根據(jù)權(quán)利要求6或7所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于對(duì)B-HTL刪除一個(gè)前綴P2時(shí),執(zhí)行如下步驟9A、在B-HTL中查找P2的最長(zhǎng)地址前綴節(jié)點(diǎn)P1;9B、在P1的BMP-tree中,遍歷所有層次高于P2的前綴節(jié)點(diǎn),分別執(zhí)行9C、9D、9E;9C、如果遍歷沒(méi)有結(jié)束,那么執(zhí)行9D,否則,執(zhí)行9F;9D、如果該節(jié)點(diǎn)是P2的前綴,那么執(zhí)行9E,否則遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行9C;9E、修改該節(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)的信息,遍歷到下一個(gè)節(jié)點(diǎn),執(zhí)行9C;9F、取出P2的BMP-tree,并入P1的BMP-tree;9G、刪除P2的前綴信息;9H、結(jié)束。
10,據(jù)權(quán)利要求1或6所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述B-HTL中每一個(gè)hash表對(duì)應(yīng)了唯一的地址前綴長(zhǎng)度,B-HTL中所有的hash表對(duì)應(yīng)了一個(gè)地址前綴長(zhǎng)度區(qū)間;所述二分查找樹(shù)在這個(gè)前綴長(zhǎng)度區(qū)間范圍內(nèi)構(gòu)建,二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)覆蓋B-HTL的一部分地址前綴長(zhǎng)度區(qū)間,該節(jié)點(diǎn)對(duì)應(yīng)的hash表的前綴長(zhǎng)度也在這部分地址前綴長(zhǎng)度區(qū)間中,并且將這部分地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,該兩個(gè)子區(qū)間分別對(duì)應(yīng)該節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn);在任意一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的地址前綴長(zhǎng)度區(qū)間中,選擇表項(xiàng)數(shù)量最多的一個(gè)hash表作為所述任意節(jié)點(diǎn)對(duì)應(yīng)的hash表。
11,根據(jù)權(quán)利要求1或6所述的基于IPv6地址實(shí)現(xiàn)快速路由表查找和更新的方法,其特征在于所述B-HTL中每一個(gè)hash表對(duì)應(yīng)了唯一的地址前綴長(zhǎng)度,B-HTL中所有的hash表對(duì)應(yīng)了一個(gè)地址前綴長(zhǎng)度區(qū)間;所述二分查找樹(shù)在這個(gè)前綴長(zhǎng)度區(qū)間范圍內(nèi)構(gòu)建,二分查找樹(shù)的每一個(gè)節(jié)點(diǎn)覆蓋B-HTL的一部分地址前綴長(zhǎng)度區(qū)間,該節(jié)點(diǎn)對(duì)應(yīng)的hash表的前綴長(zhǎng)度也在這部分地址前綴長(zhǎng)度區(qū)間中,并且將這部分地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,分別對(duì)應(yīng)該節(jié)點(diǎn)的左右兩個(gè)子節(jié)點(diǎn);在任意一個(gè)節(jié)點(diǎn)對(duì)應(yīng)的地址前綴長(zhǎng)度區(qū)間中,選擇一個(gè)hash表,用這個(gè)hash表將地址前綴長(zhǎng)度區(qū)間劃分為兩個(gè)子區(qū)間,使得第一個(gè)子區(qū)間中hash表表項(xiàng)數(shù)量和與第二個(gè)子區(qū)間中hash表表項(xiàng)數(shù)量和最接近,則這個(gè)hash表作為該節(jié)點(diǎn)對(duì)應(yīng)的hash表。
全文摘要
本發(fā)明涉及計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)領(lǐng)域,提供一種對(duì)IPv6路由表進(jìn)行快速查找和更新的方法。其中路由表快速查找的方法包括使用一級(jí)線性索引表和二級(jí)的由二分查找樹(shù)組織的hash表集合,進(jìn)行兩階段的查找;路由表快速更新的方法包括使用BMP-tree重新組織數(shù)據(jù)結(jié)構(gòu)中各前綴之間關(guān)系,改善更新效率;為了減小存儲(chǔ)空間,設(shè)計(jì)了兩種二分查找樹(shù)構(gòu)建方法;本發(fā)明與傳統(tǒng)的多重查找表以及基于地址前綴長(zhǎng)度的二分查找法相比,具有更加適用于IPv6網(wǎng)絡(luò)、更快的查找和更新效率等優(yōu)點(diǎn)。
文檔編號(hào)H04L29/06GK1964311SQ20051008684
公開(kāi)日2007年5月16日 申請(qǐng)日期2005年11月10日 優(yōu)先權(quán)日2005年11月10日
發(fā)明者孫慶南, 魯士文 申請(qǐng)人:中國(guó)科學(xué)院計(jì)算技術(shù)研究所