進行計算,將Hash計算結(jié)果映射到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針上,將Hash計算結(jié)果與Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針的映射關(guān)系保存到Level7的Hash映射表中;最終,Level 7的Hash映射表保存了 ul條Hash計算結(jié)果與Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針的映射關(guān)系;
[0194]其中,該Sub_Trie節(jié)點的IPv6地址的高105bit,即該Sub_Trie節(jié)點的128bitIPv6地址中的最高105bit。
[0195]圖10為本申請另一實施例提供的基于Multibit Trie的IPv6路由查找方法流程圖,本實施例以圖7所示實施例建立的Multibit Trie為基礎(chǔ),其具體步驟如下:
[0196]步驟1001:當(dāng)對一 VPN內(nèi)的一 IPv6地址進行LPM路由查找時,先根據(jù)VPN標識和該IPv6地址的高33bit、高57bit、高81bit、高105bit構(gòu)造四個輸入Key,分別為:keyl:VPN標識+該IPv6地址的高33bit,key2:VPN標識+該IPv6地址的高57bit,key3:VPN標識+該IPv6地址的高81bit,key4:VPN標識+該IPv6地址的高105bit ;采用Level 4的Hash函數(shù)對keyl進行計算,得到Hash計算結(jié)果1,同時采用Level 5的Hash函數(shù)對key2進行計算,得到Hash計算結(jié)果2,同時采用Level 6的Hash函數(shù)對key3進行計算,得到Hash計算結(jié)果3,同時采用Level 7的Hash函數(shù)對key4進行計算,得到Hash計算結(jié)果4。
[0197]步驟1002:同時在Level 4的Hash映射表中查找Hash計算結(jié)果1,在Level 5的Hash映射表中查找Hash計算結(jié)果2,在Level 6的Hash映射表中查找Hash計算結(jié)果3,在Level 7的Hash映射表中查找Hash計算結(jié)果4,判斷是否命中任一或任多個Hash計算結(jié)果,若是,執(zhí)行步驟1003 ;否則,執(zhí)行步驟1004。
[0198]步驟1003:采用最長的Hash命中結(jié)果作為最終的命中結(jié)果,根據(jù)最終命中結(jié)果對應(yīng)的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針,查找到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,根據(jù)該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息以及該IPv6地址在本Level中的bit,查找LPM路由,本流程結(jié)束。
[0199]例如:若在Level 7的Hash映射表中查找到了 Hash計算結(jié)果4,則將Hash計算結(jié)果4作為最終的命中結(jié)果,根據(jù)Hash計算結(jié)果4對應(yīng)的Subjrie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針查找到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,然后根據(jù)該IPv6地址的低23bit在Level 7中查找到LPM路由;
[0200]若在Level 7的Hash映射表中未查找到Hash計算結(jié)果4,但在Level 6的Hash映射表中查找到了 Hash計算結(jié)果3,則將Hash計算結(jié)果3作為最終的命中結(jié)果,根據(jù)Hash計算結(jié)果3對應(yīng)的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針查找到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,然后根據(jù)該IPv6地址的次低24bit在Level 6中查找到LPM路由;
[0201]若在Level 7的Hash映射表中未查找到Hash計算結(jié)果4,同時在Level 6的Hash映射表中也未查找到Hash計算結(jié)果3,但在Level 5的Hash映射表中查找到了 Hash計算結(jié)果2,則將Hash計算結(jié)果2作為最終的命中結(jié)果,根據(jù)Hash計算結(jié)果2對應(yīng)的Subjrie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針查找到該Subjrie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,然后根據(jù)該IPv6地址的次次低24bit在Level5中查找到LPM路由;
[0202]若在Level 7的Hash映射表中未查找到Hash計算結(jié)果4,同時在Level 6的Hash映射表中也未查找到Hash計算結(jié)果3,在Level 5的Hash映射表中也未查找到Hash計算結(jié)果2,但在Level 4的Hash映射表中查找到了 Hash計算結(jié)果1,則將Hash計算結(jié)果I作為最終的命中結(jié)果,根據(jù)Hash計算結(jié)果I對應(yīng)的Subjrie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針查找到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,然后根據(jù)該IPv6地址的次次高24bit在Level 4中查找到LPM路由;
[0203]若在Level 7的Hash映射表中未查找到Hash計算結(jié)果4,同時在Level 6的Hash映射表中也未查找到Hash計算結(jié)果3,在Level 5的Hash映射表中也未查找到Hash計算結(jié)果2,在Level 4的Hash映射表中也未查找到Hash計算結(jié)果1,則執(zhí)行步驟1004。
[0204]步驟1004:讀取該IPv6地址的高9bit,先計算該IPv6地址的高6bit對應(yīng)的十進制值,設(shè)該值為V,在步驟707維護的該VPN的Multibit-Trie的VRB Table中查找第vbit。
[0205]IPv6地址的高6bit對應(yīng)的十進制值V的取值范圍為:0?(26_1),S卩,O?63。
[0206]步驟1005:判斷該第V bit的取值為O還是1,若為0,執(zhí)行步驟1006 ;若為1,執(zhí)行步驟1007。
[0207]步驟1006:將DRAM的固定位置處存儲的默認路由作為本次LPM路由查找結(jié)果,本流程結(jié)束。
[0208]步驟1007:計算該IPv6地址的高9bit中的低3bit對應(yīng)的十進制值,設(shè)該值為W,則確定應(yīng)該在該VPN的VRB Table的第V bit對應(yīng)的8個Branch_Tree中的第w個Branch_Tree的Level I?3中進行LPM路由查找,則根據(jù)CNP查找到該Branch_Tree的數(shù)據(jù)結(jié)構(gòu)信息,根據(jù)該Branch_Tree的Level I?3的數(shù)據(jù)結(jié)構(gòu)信息查找該IPv6地址的LPM路由。
[0209]IPv6地址的高9bit的低3bit對應(yīng)的十進制值w的取值范圍為:0?(23_1),即,O?7。
[0210]本步驟1007執(zhí)行完后,若仍未在確定的Branch_Tree的Level I?3中查找到該IPv6地址的LPM路由,則在步驟703存儲的DRAM的固定位置中查找到/0級地址的默認路由,將該默認路由作為該IPv6地址的LPM路由。
[0211]在實際應(yīng)用中,針對IPv6前綴,對于每個VPN對應(yīng)的Multibit Trie,除Level O之外的其它Level中的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息都存儲在外部DRAM中,Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)的大小直接影響DRAM的訪問性能。本實施例中,一個Sub_Trie節(jié)點的步長為8或7,Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)包括:
[0212]Internal Tree Bitmap (設(shè)長度為 255bit)
[0213]Extending Paths Bitmap (設(shè)長度為 256bit)
[0214]Result Array Pointer (設(shè)長度為 24bit)
[0215]Child Node Pointer (設(shè)長度為 24bit)
[0216]則一個Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)共559bit。
[0217]為了進一步減少Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)所占用的存儲空間,本實施例對除Level O之外的其它Level中的每個Sub_Trie節(jié)點進行如下優(yōu)化:
[0218]步驟01:對于每個Sub_Trie,采用前綴擴展的方式將該Sub_Trie的/0、/1、/2級前綴的路由擴展到/3級前綴上。
[0219]圖11中的Sub_Trie節(jié)點即將一個Sub_Trie的/0、/1、/2級前綴的路由擴展到/3級-1J綴上后的不例圖。
[0220]步驟02:將每個Sub_Trie節(jié)點均勾劃分成8個Segmented Sub_Trie節(jié)點,將每個Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息保存在DRAM中,其中,每個Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息以該SegmentedSub_Trie節(jié)點的高3bit IPv6地址為索引,如圖11所不O
[0221]如圖11 中的 Segmented Sub_Trie 節(jié)點 O ?7,其中 -Segmented Sub_Trie O 的索引為 000,Segmented Sub_Trie I 的索引為 001,Segmented Sub_Trie 2 的索引為 010,Segmented Sub_Trie 3 的索引為 011,Segmented Sub_Trie 4 的索引為 100,SegmentedSub_Trie 5 的索引為 101,Segmented Sub_Trie 6 的索引為 110,Segmented Sub_Trie 7的索引為111。
[0222]從圖11可以看出,每個Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)的大小為原Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)的1/8。
[0223]步驟1003中,當(dāng)根據(jù)該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息以及該IPv6地址在本Level中的bit,查找LPM路由時,根據(jù)該IPv6地址在本Level中對應(yīng)的24bit,依次根據(jù)高8bit、中間8bit、低8bit或7bit進行LPM路由查找,其中,針對每8bit或7bit,先根據(jù)該8bit或7bit的高3bit在對應(yīng)Sub_Trie節(jié)點中索引到對應(yīng)的Segmented Sub_Trie節(jié)點,然后根據(jù)該Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息進行后續(xù)LPM路由查找過程??梢?,大大提高了 LPM路由查找速度。
[0224]步驟1007中,當(dāng)在確定的該Branch_Tree的Level I?3中查找該IPv6地址的LPM路由時,當(dāng)查找到一 Level時,根據(jù)該IPv6地址在本Level中對應(yīng)的8bit,先根據(jù)該8bit的高3bit在本Level中索引到對應(yīng)的Segmented Sub_Trie節(jié)點,然后根據(jù)該Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息進行后續(xù)LPM路由查找過程??梢?,大大提高了LPM路由查找速度。
[0225]本實施例中,對最后一個Level (Level 7)內(nèi)的最后一級Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)同樣進行如下優(yōu)化:
[0226]首先,為了將最后一個Level內(nèi)的最后一級Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)與其它Sub_Trie節(jié)點進行區(qū)分,將最后一個Level內(nèi)的最后一級Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)稱為:Compressed (壓縮)Sub_Trie節(jié)點數(shù)據(jù)結(jié)構(gòu),其主要包括如下兩部分:
[0227]1)4 個 Prefix Key:每個 Prefix key 代表最后一個 Level 的該 Sub_Trie 節(jié)點中一個有路由分布的前綴。
[0228]一個 Prefix Key 的長度為 8bit,4 個 Prefix Key 共 32bit。
[0229]可見,PrefixKey 取代了通常的 Internal Tree Bitmap。
[0230]2) Result Array ptr(24bit)
[0231]可見,一個Compressed Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)共56bit。
[0232]步驟1003中,當(dāng)根據(jù)該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息以及該IPv6地址在本Level中的bit,查找LPM路由時,若本Level為Level 7,且查找到該IPv6地址的低7bit時,則直接將該IPv6地址的低7bit與Level 7的各Compressed Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)中的Prefix Key匹配即可,若匹配上,則根據(jù)對應(yīng)的Result Array ptr直接確定LPM路由??梢姡琇PM路由查找速度進一步提高了。
[0233]步驟1007中,當(dāng)在確定的該Branch_Tree的Level I?3中查找該IPv6地址的LPM路由時,當(dāng)查找到Level 3時,根據(jù)該IPv6地址在本Level中對應(yīng)的8bit,先根據(jù)該8bit的高3bit在本Level中索引到對應(yīng)的Segmented Sub_Trie節(jié)點,然后根據(jù)該Segmented Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息進行后續(xù)LPM路由查找過程。
[0234]為了盡量避免Hash沖突,本實施例中可以采用cuckoo Hash算法,且預(yù)先為每個Level設(shè)置三個Hash函數(shù),例如:為Level 4設(shè)置Hash函數(shù)11、Hash函數(shù)12、Hash函數(shù)13,為Level 5設(shè)置Hash函數(shù)21、Hash函數(shù)22、Hash函數(shù)23,為Level 6設(shè)置Hash函數(shù)3 K Hash 函數(shù) 32、Hash 函數(shù) 33,為 Level 7 設(shè)置 Hash 函數(shù) 41、Hash 函數(shù) 42、Hash 函數(shù) 43 ;每個Hash函數(shù)對應(yīng)一張Hash表,每張Hash表中包含預(yù)設(shè)數(shù)目個位置,每個位置唯一代表一個Hash計算結(jié)果,每個位置上存儲了該位置代表的Hash計算結(jié)果對應(yīng)的輸入Key及該輸入Key對應(yīng)的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針。
[0235]步驟708 中,針對 Level Level 5、Level 6、Level 7 中的每個 Sub_Trie 節(jié)點,分別以當(dāng)前VPN標識+本Sub_Trie節(jié)點的IPv6地址在本Level之前的所有bit作為輸入Key,執(zhí)行如下過程:
[0236]a、采用本Level的三個Hash函數(shù)對該輸入Key進行計算,針對得到的每個Hash計算結(jié)果,在對應(yīng)的Hash表中查找到對應(yīng)的位置,若在三個Hash表中查找到的三個位置中有任一個位置為空,則將當(dāng)前輸入key以及本Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針放入該位置;若在三個Hash表中查找到的三個位置都不為空,則在該三個位置中任選一個位置,將該位置上的原有輸入Key和Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針取出,將當(dāng)前輸入key以及本Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針放入該位置,且,對于取出的輸入Key,重新執(zhí)行步驟a ;
[0237]需要注意的是,在步驟a中,在執(zhí)行對于取出的輸入Key,重新執(zhí)行步驟a之前,要先判斷是否已連續(xù)取出預(yù)設(shè)數(shù)目個輸入key,若是,則直接將當(dāng)前取出的輸入key和對應(yīng)的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針放入取出key列表中,否則,對于該當(dāng)前取出的輸入Key,重新執(zhí)行步驟a。
[0238]且,步驟1001中,當(dāng)對一 VPN內(nèi)的一 IPv6地址進行LPM路由查找時,先根據(jù)VPN標識和該IPv4地址的高33bit、高57bit、高81bit、高105bit構(gòu)造四個輸入Key,分別為:keyl:VPN 標識 + 該 IPv4 地址的高 33bit,key2:VPN 標識 + 該 IPv4 地址的高 57bit,key3:VPN標識+該IPv4地址的高81bit,key4:VPN標識+該IPv4地址的高105bit ;同時采用Level 4的三個Hash函數(shù)對keyl進行計算,得到3個Hash計算結(jié)果,同時采用Level 5的三個Hash函數(shù)對key2進行計算,得到3個Hash計算結(jié)果,同時采用Level 6的三個Hash函數(shù)對key3進行計算,得到3個Hash計算結(jié)果,同時采用Level 7的三個Hash函數(shù)對key4進行計算,得到3個Hash計算結(jié)果。
[0239]步驟1003中,分別在Level 4的3個Hash表中查找對應(yīng)的Hash計算結(jié)果,若查找到,將對應(yīng)位置上的輸入Key與keyl進行匹配,若匹配上,則命中,若未匹配上,則繼續(xù)在Level 4的取出key列表中查找keyl,若查找到,則命中;
[0240]同時,分別在Level 5的3個Hash表中查找對應(yīng)的Hash計算結(jié)果,若查找到,將對應(yīng)位置上的輸入Key與key2進行匹配,若匹配上,則命中,若未匹配上,則繼續(xù)在Level 5的取出key列表中查找key2,若查找到,則命中;
[0241]同時,分別在Level 6的3個Hash表中查找對應(yīng)的Hash計算結(jié)果,若查找到,將對應(yīng)位置上的輸入Key與key3進行匹配,若匹配上,則命中,若未匹配上,則繼續(xù)在Level 6的取出key列表中查找key3,若查找到,則命中;
[0242]同時,分別在Level 7的3個Hash表中查找對應(yīng)的Hash計算結(jié)果,若查找到,將對應(yīng)位置上的輸入Key與key4進行匹配,若匹配上,則命中,若未匹配上,則繼續(xù)在Level 7的取出key列表中查找key4,若查找到,則命中;
[0243]采用最長的Hash命中結(jié)果作為最終的命中結(jié)果,根據(jù)最終命中結(jié)果對應(yīng)的Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息指針,查找到該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息,根據(jù)該Sub_Trie節(jié)點的數(shù)據(jù)結(jié)構(gòu)信息以及該IPv6地址在本Level中的bit,查找LPM路由。
[0244]例如:采用Level 4的三個Hash