路由表存儲(chǔ)與查找方法
【技術(shù)領(lǐng)域】
[0001] 本發(fā)明涉及計(jì)算機(jī)網(wǎng)絡(luò)技術(shù)領(lǐng)域,以及更具體地,涉及一種路由表存儲(chǔ)與查找方 法。
【背景技術(shù)】
[0002] 路由器是因特網(wǎng)的核心設(shè)備,路由器的轉(zhuǎn)發(fā)性能直接影響到整個(gè)因特網(wǎng)的性能。 路由器轉(zhuǎn)發(fā)的主要時(shí)間耗費(fèi)在路由表的查找上,因此路由表的查找技術(shù)成為了一個(gè)經(jīng)典的 研宄問題。
[0003] 現(xiàn)有的路由表查找方法非常之多,分為軟件方法和硬件方法。其中一些經(jīng)典方 法包括Lulea算法、PBF算法、Linux內(nèi)核采用的LC-trie算法和思科路由器采用的Tree Bitmap算法。然而,現(xiàn)有的軟件方法為加速查找而犧牲更新,或者只專注于算法更新而無法 滿足骨干鏈路查找速度需求;現(xiàn)有的硬件方法雖然可以實(shí)現(xiàn)高速查找,但往往難以支持快 速更新,更重要的是硬件的高功耗和高成本嚴(yán)重制約了硬件算法的實(shí)際部署。
[0004] 此外,路由器現(xiàn)存的一個(gè)重要問題是老化,隨著路由表的飛速增長(zhǎng)(年增長(zhǎng)約 15% ),已部署的路由器或者無法容納現(xiàn)有的路由表,或者查找速度越來越慢,所以不得不 定期對(duì)路由器進(jìn)行硬件升級(jí)或者更新?lián)Q代。具體來說,所有路由表查找算法都會(huì)主動(dòng)或者 被動(dòng)地將精心設(shè)計(jì)的數(shù)據(jù)結(jié)構(gòu)分開存放在片內(nèi)內(nèi)存和片外內(nèi)存。然而,隨著路由表的飛速 增長(zhǎng),片內(nèi)能存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)越來越少,如果不升級(jí)片內(nèi)內(nèi)存,那么查找速度將越來越慢。
[0005] 只有同時(shí)實(shí)現(xiàn)0(1)的查找時(shí)間和0(1)的片內(nèi)內(nèi)存,才能使得路由器的性能與路 由表的變化無關(guān),才可以避免定期對(duì)路由器進(jìn)行升級(jí)或者更新?lián)Q代。然而,現(xiàn)有技術(shù)都無法 同時(shí)實(shí)現(xiàn)0(1)的查找時(shí)間和0(1)的片內(nèi)內(nèi)存。
【發(fā)明內(nèi)容】
[0006] 為解決上述問題,本發(fā)明提供一種路由表存儲(chǔ)方法,包括:
[0007] 將路由表trie樹第0到n層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)放在片內(nèi)內(nèi)存;
[0008] 將第0到m層的用于查找下一跳的數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存;以及
[0009] 將第n+1到m層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存;其中,m+1為路由 表trie樹層數(shù),n〈m,n與m為正整數(shù)。
[0010] 上述方法中,對(duì)于IPv4路由表trie樹,n= 24。
[0011] 上述方法中,路由表trie樹第0到n層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)為n+1個(gè) 位圖,每個(gè)位圖與路由表trie樹的其中一層相對(duì)應(yīng);以及,路由表trie樹第0到n層的用 于查找下一跳的數(shù)據(jù)結(jié)構(gòu)為n+1個(gè)數(shù)組,每個(gè)數(shù)組與路由表trie樹的其中一層相對(duì)應(yīng)。其 中,與路由表trie樹第0到n層中的每層對(duì)應(yīng)的位圖指示路由表trie樹中該層對(duì)應(yīng)的前 綴信息,并且指示該前綴信息對(duì)應(yīng)的下一跳信息在該層對(duì)應(yīng)的數(shù)組中的位置。
[0012] 上述方法中,與第i層對(duì)應(yīng)的位圖和數(shù)組分別有2位,且i= 0,…,n,在第i層對(duì) 應(yīng)的位圖中,每個(gè)1的位置分別指示路由表trie樹中該層的每個(gè)前綴信息,其余位置為0 ; 在第i層對(duì)應(yīng)的數(shù)組中,與第i層對(duì)應(yīng)的位圖中指示前綴信息的位置相同的位置指示該前 綴信息對(duì)應(yīng)的下一跳端口號(hào)。
[0013] 上述方法中,還包括根據(jù)以下步驟對(duì)第n層的內(nèi)部節(jié)點(diǎn)進(jìn)行關(guān)鍵層層推:
[0014] 對(duì)于路由表trie樹中第n層的具有下一跳信息的內(nèi)部節(jié)點(diǎn),如果其只有一個(gè)孩子 節(jié)點(diǎn),則生成其在第n+1層的另一個(gè)孩子節(jié)點(diǎn),并將該內(nèi)部節(jié)點(diǎn)的下一跳信息作為生成的 孩子節(jié)點(diǎn)的下一跳信息;如果其有兩個(gè)孩子節(jié)點(diǎn),則將任何一個(gè)下一跳為空的孩子結(jié)點(diǎn)的 下一跳信息賦值為該內(nèi)部節(jié)點(diǎn)的下一跳信息;將該內(nèi)部節(jié)點(diǎn)的下一跳置空;
[0015] 對(duì)于路由表trie樹中第n層的沒有下一跳信息的內(nèi)部節(jié)點(diǎn),得到其具有下一跳信 息的最近祖先節(jié)點(diǎn)的下一跳信息,如果其只有一個(gè)孩子節(jié)點(diǎn),則生成其在第n+1層的另一 個(gè)孩子節(jié)點(diǎn),并將該祖先節(jié)點(diǎn)的下一跳信息作為生成的孩子節(jié)點(diǎn)的下一跳信息;如果其有 兩個(gè)孩子節(jié)點(diǎn),則將任何一個(gè)下一跳為空的孩子結(jié)點(diǎn)的下一跳信息賦值為該祖先節(jié)點(diǎn)的下 一跳彳目息。
[0016] 上述方法中,對(duì)于在關(guān)鍵層層推之后路由表trie樹中第n層的內(nèi)部節(jié)點(diǎn)或葉子節(jié) 點(diǎn),第n層對(duì)應(yīng)的位圖中的對(duì)應(yīng)位置為1,其他位置為0 ;對(duì)于第n層的內(nèi)部節(jié)點(diǎn)指示的前綴 信息,將第n層對(duì)應(yīng)的數(shù)組中的對(duì)應(yīng)位置設(shè)置為0,該層對(duì)應(yīng)的數(shù)組中的其他位置與關(guān)鍵層 層推之前相同。
[0017] 上述方法中,對(duì)于IPv4路由表trie樹,將該trie樹推到第6、12、18、24和32層; 以及對(duì)第24層的內(nèi)部節(jié)點(diǎn)進(jìn)行關(guān)鍵層層推。
[0018] 上述方法中,對(duì)于IPv4路由表trie樹,將該trie樹推到第16和24層,并進(jìn)行葉 推。
[0019] 上述方法中,對(duì)于多個(gè)IPv4路由表trie樹,合并該多個(gè)路由表trie樹并進(jìn)行葉 推,得到疊加trie樹;以及將疊加trie樹推到第16和24層,并進(jìn)行葉推。
[0020] 上述方法中,第n+1到m層的用于判斷前綴長(zhǎng)度以及用于查找下一跳的數(shù)據(jù)結(jié)構(gòu) 為哈希表格或者偏移數(shù)組。
[0021] 根據(jù)本發(fā)明的一個(gè)實(shí)施例,還提供一種基于上述路由表存儲(chǔ)方法的路由表查找方 法,包括:
[0022] 步驟1)、從第n層對(duì)應(yīng)的位圖開始,根據(jù)IP的前n位定位位圖中的位置,如果該位 置為〇,則令n=n-1并重復(fù)該定位過程,直到定位的位圖中的位置為1,根據(jù)該位置查找當(dāng) 前層對(duì)應(yīng)的數(shù)組以獲得下一跳端口號(hào);如果該位置為1則執(zhí)行步驟2);
[0023] 步驟2)根據(jù)該位置查找第n層對(duì)應(yīng)的數(shù)組,如果對(duì)應(yīng)位置為非零則獲得下一跳端 口號(hào);否則,查找片外偏移數(shù)組或哈希表格以獲得下一跳端口號(hào)。
[0024] 對(duì)于單表查找來說,本發(fā)明同時(shí)實(shí)現(xiàn)了 0(1)的查找時(shí)間和0(1)的片內(nèi)內(nèi)存;對(duì)于 虛擬路由表查找來說,本發(fā)明不但保證了 0(1)的查找時(shí)間和0(1)的片內(nèi)內(nèi)存,而且與虛擬 路由表的個(gè)數(shù)、特征、大小無關(guān),從而可以避免定期對(duì)路由器進(jìn)行升級(jí)或更新?lián)Q代。
【附圖說明】
[0025] 以下附圖僅對(duì)本發(fā)明做示意性說明和解釋,并不用于限定本發(fā)明的范圍,其中:
[0026] 圖1是根據(jù)本發(fā)明一個(gè)實(shí)施例的路由表二維分割示意圖;
[0027] 圖2是根據(jù)本發(fā)明一個(gè)實(shí)施例的SAIL_B方法的示意圖;
[0028] 圖3是根據(jù)本發(fā)明一個(gè)實(shí)施例的SAIL_L方法的示意圖;
[0029] 圖4是根據(jù)本發(fā)明一個(gè)實(shí)施例的SAIL_M*法的示意圖。
【具體實(shí)施方式】
[0030] 為了對(duì)本發(fā)明的技術(shù)特征、目的和效果有更加清楚的理解,現(xiàn)對(duì)照【附圖說明】本發(fā) 明的【具體實(shí)施方式】。
[0031] 根據(jù)本發(fā)明的一個(gè)實(shí)施例,提供一種路由表存儲(chǔ)方法。
[0032] 概括而言,該方法包括:將路由表trie樹第0到第n層的用于判斷前綴長(zhǎng)度的數(shù) 據(jù)結(jié)構(gòu)放在片內(nèi)內(nèi)存;將第〇到第m層的用于查找下一跳的數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存;以及, 將第n+1到第m層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存。其中,n〈m且n為正整 數(shù),m+1為路由表trie樹的層數(shù)。
[0033] 下文將結(jié)合圖1對(duì)該路由表存儲(chǔ)方法進(jìn)行更詳細(xì)的描述,該方法包括以下步驟:
[0034] 第一步:對(duì)路由表進(jìn)行二維分割。
[0035] 1.第一維度分割
[0036] 第一維度的分割是對(duì)路由表查找過程進(jìn)行分割:即先找到匹配的前綴的長(zhǎng)度,則 最長(zhǎng)前綴匹配就變成了精確匹配;接著根據(jù)匹配的前綴長(zhǎng)度查找下一跳。
[0037] 2.第二維度分割
[0038] 第二維度的分割是對(duì)根據(jù)路由表構(gòu)建的trie樹(如m+1層trie樹)進(jìn)行分割, 也就是將trie樹在第n層和第n+1 (0〈n〈m)層之間進(jìn)行分割。
[0039] 在一個(gè)實(shí)施例中,對(duì)于第0~32層的IPv4路由表trie樹,優(yōu)選在第24層和第25 層之間進(jìn)行分割,得到第0~24和第25~32層。選擇在第24層和第25層之間分割的原 因在于:根據(jù)發(fā)明人對(duì)真實(shí)流量和路由表的測(cè)試,幾乎100%的流量都命中第〇~24層。
[0040] 如沒有特別說明,后文的實(shí)施例均是以在第24層和第25層之間分割的IPv4路由 表trie樹為例。
[0041] 第二步:分別在片內(nèi)內(nèi)存和片外內(nèi)存中存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)。
[0042] 在二維分割之后,將第0~n層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)放在片內(nèi)內(nèi)存,將 其他數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存。
[0043] 如圖1所示,在IPv4路由表trie樹的實(shí)施例中,將第0~24層的用于判斷前綴長(zhǎng) 度的數(shù)據(jù)結(jié)構(gòu)放在片內(nèi)內(nèi)存;將第〇~32層的用于查找下一跳的數(shù)據(jù)結(jié)構(gòu),以及將第25~ 32層的用于判斷前綴長(zhǎng)度的數(shù)據(jù)結(jié)構(gòu)放在片外內(nèi)存。
[0044] 對(duì)于片內(nèi)和片外數(shù)據(jù)結(jié)構(gòu),下面將結(jié)合圖2至圖4分別描述四種實(shí)施方式,文中分 別稱作SAIL_B方法、SAIL_U方法、SAIL_L方法和SAIL_M方法:
[0045] I. SAIL_B方法
[0046] i)、片內(nèi)數(shù)據(jù)結(jié)構(gòu)
[0047] 對(duì)于SAIL_B方法,片內(nèi)的數(shù)據(jù)結(jié)構(gòu)是n+1 (例如,在上述IPv4路由表trie樹的實(shí) 施例中,n= 24)個(gè)位圖(Bitmap),路由表trie樹中第0~n層中的每一層對(duì)應(yīng)有一個(gè)位 圖,第i層的位圖有21位。
[0048]路由表中每一個(gè)具有下一跳信息的前綴對(duì)應(yīng)該路由表trie樹某一層的一個(gè)節(jié)點(diǎn) (即圖2中的實(shí)心節(jié)點(diǎn)),且與該層對(duì)應(yīng)的Bitmap中的一個(gè)1相對(duì)應(yīng)。其中,該實(shí)心節(jié)點(diǎn) 在所屬層的位置指示該層對(duì)應(yīng)的Bitmap中對(duì)應(yīng)的1的位置。在路由表trie樹的每一層 中,具有下一跳信息的前綴節(jié)點(diǎn)可能有多個(gè),因此每一層對(duì)應(yīng)的Bitmap中可包括多個(gè)1,而 Bitmap中的其他位置都為零。
[0049] 參考圖2給出的例子,其中,具有下一跳信息的前綴為001和111的路由表項(xiàng)對(duì)應(yīng) trie樹第3層的兩個(gè)實(shí)心節(jié)點(diǎn),第3層對(duì)應(yīng)的Bitmap共23= 8位。本領(lǐng)域技術(shù)人員應(yīng)理 解,在路由表trie樹中,前綴001對(duì)應(yīng)該trie樹中第3層(在該層滿節(jié)點(diǎn)的情況下)左起 第2個(gè)節(jié)點(diǎn),前綴111對(duì)應(yīng)trie樹中第3層左起第8個(gè)節(jié)點(diǎn),因此第3層對(duì)應(yīng)的Bitmap為 01000001。
[0050] ii)、片外數(shù)據(jù)結(jié)構(gòu)
[0051]①路由表trie樹中第0~n層的用于查找下一跳的數(shù)據(jù)結(jié)構(gòu)可采用滿數(shù)組,即對(duì) 于第i(0< i< n)層,建立長(zhǎng)度為21的數(shù)組(或稱端口數(shù)組),對(duì)于該層對(duì)應(yīng)的路由表項(xiàng), 如果有下一跳,則數(shù)組中相應(yīng)位置的元素指示下一跳信息,否則是0。具體而言,在每一層對(duì) 應(yīng)的端口數(shù)組中,根據(jù)該層對(duì)應(yīng)的Bitmap中1的位置,在端口數(shù)組的相同位置插入相應(yīng)的 路由表項(xiàng)中的下一跳信息。
[0052] 例如,在圖2所示的示例中,第3層對(duì)應(yīng)的Bitmap為01000001,第3層對(duì)應(yīng)的端口 數(shù)組為03000007,其中3是前綴001對(duì)應(yīng)的下一跳信息,7是前綴111對(duì)應(yīng)的下一跳信息。 3與7在端口數(shù)組中的位置,分別與其相應(yīng)前綴001和111在Bitmap中的位置一致。
[0053]②對(duì)于路由表trie樹第n+1~m(