專利名稱::快速路由查找的方法和系統(tǒng)的制作方法
技術(shù)領(lǐng)域:
:總的來說,本發(fā)明涉及在路由表里查找IP(因特網(wǎng)協(xié)議)路由,從而確定IP數(shù)據(jù)報(bào)要發(fā)往什么地方的方法和系統(tǒng),該路由表包括任意長度前綴條目,這些條目有下一跳表中有關(guān)的下一跳信息。現(xiàn)有技術(shù)因特網(wǎng)是相互連接的網(wǎng)絡(luò)的集合,其中所有組成網(wǎng)都保持它自己的獨(dú)立性,在多個網(wǎng)絡(luò)之間進(jìn)行通信需要特殊的機(jī)制。這些組成網(wǎng)叫做子網(wǎng)。因特網(wǎng)中每一個子網(wǎng)都支持跟這一個子網(wǎng)連接的裝置之間進(jìn)行通信。叫做互通單元(IWU)的裝置又將這些子網(wǎng)相互連接。路由器是一種特殊的IWU,用來連接兩個網(wǎng)絡(luò),這兩個網(wǎng)絡(luò)可以相同,也可以不同。路由器和這一網(wǎng)絡(luò)中的每一個主機(jī)都采用因特網(wǎng)協(xié)議(IP)。IP在站點(diǎn)之間提供無連接或者數(shù)據(jù)報(bào)業(yè)務(wù)。路由選擇一般都是通過在每一個站點(diǎn)和每一個路由器中都保存一份路由選擇表來實(shí)現(xiàn)的,這些路由表為每一個可能的目的地網(wǎng)絡(luò)都說明IP數(shù)據(jù)報(bào)下一步應(yīng)當(dāng)發(fā)往哪一個路由器。IP路由器在一個路由選擇表里查找路由,從而確定IP數(shù)據(jù)報(bào)要發(fā)往哪里。查找所得就是路徑上朝著目的地的下一跳。從概念上來說,路由表里的一個條目是一個有下一跳信息的任意長度的前綴。路由查找必須找出具有最長相同前綴的路由條目。由于非常慢和非常復(fù)雜是IP路由查找的固有特性,因此在現(xiàn)有技術(shù)中,出現(xiàn)了越來越多的技術(shù)用來避免使用它們。IP以下的各種鏈路層交換技術(shù)、IP層旁路方法(公開于計(jì)算機(jī)通信會議(IEEEInfocom)論文集,加利福尼亞舊金山,1996年3月;千兆位網(wǎng)絡(luò)專題討論會論文集,波斯頓,1995年4月;以及ACMSIGCOMM(美國計(jì)算機(jī)協(xié)會數(shù)據(jù)通信專業(yè)組)’95論文集,第49~58頁,劍橋,馬薩諸塞州,1995年8月),以及象ATM(異步傳輸模式)這樣的虛電路技術(shù)基礎(chǔ)上發(fā)展起來的各種網(wǎng)絡(luò)層,在某種程度上就是避免IP路由查找這一努力的結(jié)果。在IP層以下使用交換鏈路層以及流或者標(biāo)簽交換體系結(jié)構(gòu)增加了網(wǎng)絡(luò)的復(fù)雜性和冗余度。當(dāng)前的多數(shù)IP路由器都采用高速緩存技術(shù),其中多數(shù)最近使用過的目的地地址的路由選擇條目都保存在一個高速緩存里。這項(xiàng)技術(shù)依賴于通信信號有良好的局域性,從而使高速緩存的命中率足夠高,路由查找的代價能夠降低到幾個數(shù)據(jù)包的程度。在過去,這些高速緩存方法工作得很好。但隨著因特網(wǎng)的迅速擴(kuò)大,地址高速緩存所需要的容量大大增加,硬件高速緩存變得非常不經(jīng)濟(jì)。傳統(tǒng)的路由選擇表采用一種帕特利夏(Patricia)樹(由1968年10月第15卷第4期的ACM[美國計(jì)算機(jī)協(xié)會]雜志第514~534頁公開),它幾乎是三十年以前發(fā)明的一種數(shù)據(jù)結(jié)構(gòu),只是為了適應(yīng)最長的前綴匹配對它進(jìn)行了一些修改。用于查找路由的帕特利夏樹的直接實(shí)施方案,例如在NetBSD1.2中,在樹葉和內(nèi)部節(jié)點(diǎn)采用24個字節(jié)。具有40000個條目的這種樹結(jié)構(gòu)就有大約2兆字節(jié),在一個理想的平衡樹里,必須經(jīng)過15或者16個節(jié)點(diǎn)才能找到一個路由選擇條目。在某些情形中,由于采用了最長匹配前綴規(guī)則,因此需要經(jīng)過其它的節(jié)點(diǎn)才能找到適當(dāng)?shù)穆酚尚畔ⅲ驗(yàn)椴荒鼙WC最初的搜索能夠找出正確的樹葉。可以進(jìn)行優(yōu)化,從而降低帕特利夏樹的大小,提高查找速度。然而,這一數(shù)據(jù)結(jié)構(gòu)非常龐大,搜索的時候需要太多昂貴的存儲器引用。當(dāng)前因特網(wǎng)的路由表太大,無法裝進(jìn)片上高速緩存,而對DRAM的片外存儲器的引用則速度太慢,無法滿足路由選擇對速度的要求。通過避免完整的路由查找來改善IP路由選擇性能的早期努力(公開于計(jì)算機(jī)通信會議論文集(IEEEInfocom),路易斯安那,新奧爾良,1988年3月)發(fā)現(xiàn),一個很小的目的地地址高速緩存至少可以改善路由查找性能的65%。使命中率超過90%只需要10個以下的時隙。這種較小的目的地地址高速緩存無法用于當(dāng)今因特網(wǎng)上的高強(qiáng)度通信量和主機(jī)臺數(shù)。ATM(異步傳輸模式)通過采用一種信令協(xié)議來避免路由查找,這種信令協(xié)議在建立連接的時候就將地址傳送給網(wǎng)絡(luò)。在建立連接的時候,連接路徑上的交換機(jī)就安裝了由虛擬電路標(biāo)識符(VCI)訪問的轉(zhuǎn)發(fā)狀態(tài)。ATM信元中有這樣的VCI,可以將它直接用作轉(zhuǎn)發(fā)狀態(tài)表的下標(biāo),或者作為散列函數(shù)的關(guān)鍵字。對于ATM來說,路由決策要簡單一些。但如果數(shù)據(jù)包的長度超過48個字節(jié),就要做出更多的ATM路由選擇決策。標(biāo)簽交換和流交換(公開于計(jì)算機(jī)通信會議論文集(IEEEInfocom),加尼福尼亞,舊金山,1996年3月)是打算用于ATM的兩種IP旁路方法。總的思想是讓IP控制進(jìn)行實(shí)際數(shù)據(jù)轉(zhuǎn)發(fā)的鏈路層ATM硬件。在路由器之間需要專用協(xié)議(公開于請求注解(RFC),1953,因特網(wǎng)工程特別工作組,1996年5月),從而使它們在采用什么樣的ATM虛電路標(biāo)識符以及那些數(shù)據(jù)包應(yīng)當(dāng)使用那些VCI這些問題上達(dá)成一致。IP/ATM體系結(jié)構(gòu)采用了另一種方法以實(shí)現(xiàn)避免IP處理這同一個目標(biāo)(公開于千兆位網(wǎng)絡(luò)專題討論會論文集,波斯頓,1995年4月;以及ACMSIGCOMM’95論文集,第49~58頁,劍橋,馬薩諸塞州,1995年8月),其中一個ATM底板連接了許多線路卡和路由選擇卡。路由選擇卡中的IP處理部件對IP報(bào)頭進(jìn)行處理。當(dāng)數(shù)據(jù)包流到達(dá)時,只檢查第一個IP報(bào)頭,后面的數(shù)據(jù)包選擇跟第一個數(shù)據(jù)包一樣的路由。這些簡化的主要目的似乎是降低IP處理許多數(shù)據(jù)包的代價。IP路由器可以采用專用硬件來完成IP處理,就象在IBM(國際商業(yè)機(jī)器公司)路由器里一樣(公開于高速網(wǎng)絡(luò)雜志,第1卷,第4期,第281~288頁,1993年)。可以說這是一個不太靈活的解決方案。IP格式也就是協(xié)議的任何改變,都會使這種設(shè)計(jì)實(shí)效。軟件的靈活性和通用處理器性能的迅速提高使得這種軟件解決方案頗受歡迎。另一種硬件方法使用CAM來進(jìn)行路由查找(公開于計(jì)算機(jī)通信會議論文集(IEEEInfocom),第3卷,第1382~1391頁,舊金山,1993年)。這一解決方案速度很快,但價格高昂。BBN當(dāng)前正在制作一對數(shù)千兆位的路由器,它們采用通用處理器作為轉(zhuǎn)發(fā)引擎。到現(xiàn)在為止還沒有公布多少信息。但是它的主要思想似乎是采用阿爾法處理器作為轉(zhuǎn)發(fā)引擎,并用軟件來完成所有的IP處理。出版物千兆位聯(lián)網(wǎng)技術(shù),Addison-Wesley,Reading,馬薩諸賽州,1993年,說明了可以用不超過200條的指令完成IP處理,假定在路由高速緩存中命中一次。阿爾法處理器的第二個高速緩存被用作目的地地址的大型LRU(最近最少使用的)高速緩存。該方法預(yù)先假設(shè)通信信號具有局域性。如果局域性不太好,命中率就會變得太低,性能會下降。發(fā)明簡述因此本發(fā)明的一個目的是提供一種改善了的IP路由查找方法和系統(tǒng),用于為每一個高達(dá)千兆位速度的IP數(shù)據(jù)包完成完整的路由查找,這種方法和系統(tǒng)克服了前面介紹的方法的缺點(diǎn)。本發(fā)明的另一個目的是用一個普通微處理器提高路由查找速度。再一個目的是將轉(zhuǎn)發(fā)表中的查找時間縮到最短。本發(fā)明還有一個目的就是提供一種適配于普通微處理器的高速緩存的數(shù)據(jù)結(jié)構(gòu)。因此,跟數(shù)據(jù)結(jié)構(gòu)是儲存在由例如相對較慢的DRAM(動態(tài)隨機(jī)存取存儲器)組成的存儲器里相比,這種情況下的存儲器訪問速度將提高幾個數(shù)量級。為了達(dá)到這些目的,本發(fā)明提供了IP路由查找方法和系統(tǒng),這里的系統(tǒng)是一種數(shù)據(jù)結(jié)構(gòu),它能用一種非常緊湊的形式表示很大的路由選擇表,幾乎不用什么存儲器引用就可以快速地搜索這種數(shù)據(jù)結(jié)構(gòu)。附圖簡述為了更詳細(xì)地說明本發(fā)明以及本發(fā)明的優(yōu)點(diǎn)和特征,下面將詳細(xì)介紹優(yōu)選實(shí)施方案,同時參考以下附圖,其中圖1是一種路由器結(jié)構(gòu)的原理圖,圖2是生成整個IP地址空間的二叉樹示意圖,圖3說明的是定義IP地址范圍的路由選擇條目,圖4說明的是將前綴樹擴(kuò)展成滿二叉樹的步驟,圖5說明本發(fā)明的三層數(shù)據(jù)結(jié)構(gòu),圖6說明的是直達(dá)前綴樹深度16的一部分分割,圖7說明的是如何在第一層內(nèi)搜索數(shù)據(jù)結(jié)構(gòu),圖8中的表給出的是用各種路由表構(gòu)成的轉(zhuǎn)發(fā)表數(shù)據(jù),圖9中的表給出的是處理器和高速緩存數(shù)據(jù),圖10是阿爾法21164的查找時間分布圖,和圖11是高能奔騰的查找時間分布圖。發(fā)明詳述參考圖1,一種路由器包括許多網(wǎng)絡(luò)入站接口1、許多網(wǎng)絡(luò)出站接口2、許多轉(zhuǎn)發(fā)引擎3和一個網(wǎng)絡(luò)處理器4,一根連接光纖5將它們?nèi)窟B接起來。入站接口1通過連接光纖5發(fā)送數(shù)據(jù)包報(bào)頭給轉(zhuǎn)發(fā)引擎3。轉(zhuǎn)發(fā)引擎3則判斷應(yīng)當(dāng)將這一數(shù)據(jù)包發(fā)送給哪一個出站接口2。將這一信息發(fā)回入站接口1,入站接口1則將這一數(shù)據(jù)包發(fā)送給出站接口2。轉(zhuǎn)發(fā)引擎3的唯一任務(wù)是處理數(shù)據(jù)包的報(bào)頭。需要額外注意力的所有其它任務(wù),例如參與路由協(xié)議、資源預(yù)約、處理數(shù)據(jù)包以及其它的管理職能,都交給網(wǎng)絡(luò)處理器4來處理。每一個轉(zhuǎn)發(fā)引擎3都使用從網(wǎng)絡(luò)處理器4下載,儲存在轉(zhuǎn)發(fā)引擎3的存儲裝置里的一個本地版路由選擇表和一個轉(zhuǎn)發(fā)表,用來進(jìn)行它自己的路由選擇。沒有必要為每一次路由更新下載一次新的轉(zhuǎn)發(fā)表。路由更新可以非常頻繁,但由于路由選擇協(xié)議需要一些時間來收斂,因此路由表可以略微陳舊些,更新次數(shù)不必多于每秒鐘一次(由斯坦福大學(xué)高速路由選擇和交換專題討論會公開,1996年12月;http/tiny-tera.stanford.edu/Workshop_Dec96/)。網(wǎng)絡(luò)處理器4需要一個動態(tài)路由選擇表,該選擇表是為快速更新和快速生成轉(zhuǎn)發(fā)表而設(shè)計(jì)的。另一方面,轉(zhuǎn)發(fā)表可以按照最快查找速度進(jìn)行優(yōu)化,而不必是動態(tài)的。為了使查找時間最短,在轉(zhuǎn)發(fā)表的數(shù)據(jù)結(jié)構(gòu)中至少要讓兩個參數(shù)同時最小查找時需要訪問存儲器的次數(shù)和數(shù)據(jù)結(jié)構(gòu)的大小。減少查找時需要對存儲器的訪問次數(shù)是非常重要的,因?yàn)榇鎯ζ髟L問相對較慢,通常是查找過程的瓶頸。如果數(shù)據(jù)結(jié)構(gòu)足夠小,就可以全部裝入普通微處理器的高速緩存中。也就是說,存儲器訪問將比數(shù)據(jù)結(jié)構(gòu)需要駐留在由相對較慢的DRAM構(gòu)成的存儲器里這種情況,就象帕特利夏樹這種情形一樣,要快幾個數(shù)量級。如果轉(zhuǎn)發(fā)表不能全部裝入高速緩存,那么只要大部分表能夠駐留在高速緩存中,這種方案仍然非常好。通信量模式的局域性會把數(shù)據(jù)結(jié)構(gòu)中最常用的部分保存在高速緩存中,因此大多數(shù)查找過程將非???。此外,所需少量的外部存儲器還可以很靈活地采用快速SRAM(靜態(tài)隨機(jī)存取存儲器)。SRAM很貴,速度越快越貴。對于給定的價錢,需要的SRAM越少速度越快。作為第二個設(shè)計(jì)目標(biāo),查找這種數(shù)據(jù)結(jié)構(gòu)需要的指令應(yīng)當(dāng)盡可能地少,而且這些實(shí)體應(yīng)當(dāng)盡可能地按照自然順序排列,以避免昂貴的指令和不方便的位提取運(yùn)算。為了給這一數(shù)據(jù)結(jié)構(gòu)確定定量設(shè)計(jì)參數(shù),研究了許多大型路由選擇表,下面將詳細(xì)介紹。在這些表中,有40000個路由條目。如果下一跳相同,那么剩下的路由信息也相同,這樣,指定的下一跳相同的所有路由選擇條目都共享相同的信息。路由器中路由表里不同下一跳的數(shù)目受限于一跳所能到達(dá)的其它路由器或者主機(jī)的個數(shù),因此即使是大型的干線路由器這些數(shù)目非常小并不令人驚奇。但如果一個路由器跟例如一個很大的ATM網(wǎng)連接,那么下一跳的個數(shù)將多得多。在這一實(shí)施方案里,將轉(zhuǎn)發(fā)表數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)成能夠容納214或者16k個不同的下一跳,多數(shù)情況下這就足夠了。如果不同的下一跳個數(shù)少于256個,從而使下一跳表的下標(biāo)可以儲存在一個字節(jié)里,就可以修改這里介紹的轉(zhuǎn)發(fā)表,使它在另一個實(shí)施方案里占用少得多的空間。轉(zhuǎn)發(fā)表本質(zhì)上是一棵有三層的樹。搜索一層需要訪問存儲器1到4次。因此,訪問存儲器的最多次數(shù)為12。但對于普通路由表,大多數(shù)查找只需要搜索一到兩層,因此,多數(shù)情況下存儲器的訪問次數(shù)為8以下。為了理解這一數(shù)據(jù)結(jié)構(gòu),想象一棵生成整個IP地址空間的二叉樹6,見圖2。它的深度是32,樹葉數(shù)是232,每一片樹葉都對應(yīng)一個可能的IP地址。路由表?xiàng)l目的前綴給出了樹上終止于某一節(jié)點(diǎn)的一條路徑。因此以這一節(jié)點(diǎn)為樹根的子樹上的所有IP地址(樹葉)都應(yīng)該將路由選擇到這一條目。通過這種方式,每一個路由表?xiàng)l目都規(guī)定了一個具有相同路由信息的IP地址范圍。如果幾個路由選擇條目都有相同的IP地址,就采用最長匹配規(guī)則;也就是說,對于給定的IP地址,應(yīng)當(dāng)選用具有最長匹配前綴的路由選擇條目。圖3說明了這種情況;對于范圍r內(nèi)的地址,路由條目e1被e2所隱藏。轉(zhuǎn)發(fā)表是二叉樹6的一個表示,被所有路由選擇條目也就是前綴樹7所生成。要求這一前綴樹是滿二叉樹,也就是說,樹上的每一個節(jié)點(diǎn)要么有兩個孩子,要么沒有孩子。只有一個孩子的節(jié)點(diǎn)必須擴(kuò)展為有兩個孩子;用這種方式添加的孩子總是樹葉,它們的下一跳信息跟最近的有下一跳信息的祖先的下一跳信息相同,或者如果沒有這樣的祖先存在,跟有“未定義”下一跳信息的祖先的下一跳信息相同。圖4所示的過程增加了前綴樹7的節(jié)點(diǎn)數(shù),卻使得轉(zhuǎn)發(fā)表較小。然而,為了構(gòu)造轉(zhuǎn)發(fā)表沒有必要真的去構(gòu)造這一前綴樹。前綴樹只是用于簡化描述。轉(zhuǎn)發(fā)表可以在一次遍歷所有路由條目后構(gòu)造好。一組路由選擇條目將IP地址空間分成許多組IP地址。找到合適的路由選擇信息的問題類似于區(qū)段集合成員問題(intervalsetmembershipproblem)(由SIAM計(jì)算雜志第17卷第1期,第1093~1102頁,1988年12月,公開)。在這種情況下,每一個間隔都由前綴樹里的一個節(jié)點(diǎn)定義,因此,它的一些特性能夠用于壓縮轉(zhuǎn)發(fā)表。例如,每一IP地址范圍都有一個等于2的冪的長度。如圖5所示,數(shù)據(jù)結(jié)構(gòu)的第一層覆蓋了前綴樹,直到深度16,第二層覆蓋了深度17到20,第三層覆蓋了深度25到32。不管什么時候,只要一部分前綴樹延伸到了第16層以下,就用第二層的字節(jié)片(chunk)來描述這一部分樹。同樣,第三層的字節(jié)片描述深度大于24的那些前綴樹部分。搜索一層數(shù)據(jù)結(jié)構(gòu)的結(jié)果或者是到下一跳表的一個下標(biāo),或者是到下一層的字節(jié)片數(shù)組的一個下標(biāo)。例如,在圖5中數(shù)據(jù)結(jié)構(gòu)的第一層里,在深度16前綴樹有一個分割(acutthroughtheprefixtree)7。這一分割儲存在一個位矢量里,在深度16處每一個可能的節(jié)點(diǎn)都有一位。因此,需要216位=64kb=8kB。為了找到對應(yīng)于IP地址最初部分的那一位,將地址的高16位用作到位矢量的一個下標(biāo)。如果在前綴樹的深度16上有一個節(jié)點(diǎn),就設(shè)置矢量中對應(yīng)的位。還有,如果在深度16以下這棵樹有一片樹葉,就設(shè)置這片樹葉覆蓋的間隔里的最低位。于是位矢量中的一位可以是1,表示這一前綴樹在這一分割以下繼續(xù);根頭(roothead)(圖6中的第6、12和13位),或者1,表示深度16或以下的一片樹葉;真頭(genuinehead)(圖6中的第0、4、7、8、14和15位),或者0,這意味著這一個值是深度小于16的一片樹葉覆蓋范圍的一個成員(圖6中的第1、2、3、5、9、10和11位)。成員的下一跳跟小于這一成員的最大頭的相同。對于真頭,必須儲存下一跳表的下標(biāo)。成員將利用這同一個下標(biāo)作為小于這一成員的最大頭。對于根頭,必須儲存第二層字節(jié)片的下標(biāo),它表示對應(yīng)的子樹。頭信息被編碼成16位指針儲存在一個數(shù)組里。指針的兩位表示指針的類型,其余14位或者表示下一跳表的下標(biāo),或者是包含第二層字節(jié)片的一個數(shù)組下標(biāo)。為了找到合適的指針,將位矢量分成長度為16的位掩碼,它們總共有212=4096個。此外,數(shù)組中一個指針的位置是通過添加三個實(shí)體來獲得的一個基址下標(biāo)、一個6位偏移和一個4位偏移?;废聵?biāo)加6位偏移決定了對應(yīng)于某一位掩碼的指針儲存在哪里。4位偏移規(guī)定了要檢索這些指針中的哪些指針。圖7說明如何找到這些實(shí)體。下一段專門說明這一過程。由于位掩碼是由一棵滿前綴樹生成的,因此不是所有的16位組合都是可以的。長度為2n的非零位掩碼可以是長度為n的兩個位掩碼或者值等于1的位掩碼的任意組合。令a(n)是長度為2n的可能的非零位掩碼的個數(shù)。a(n)由以下遞歸算法定義a(0)=1,a(n)=1+a(n-1)2于是長度為16的所有可能位掩碼的個數(shù)為a(4)+1=678,其中加上一個是因?yàn)槲谎诖a可以取0值。因此到每一個位掩碼都有一個條目的表的下標(biāo)只需要10位。儲存這樣一個表也就是變換表的目的是將一個位掩碼內(nèi)的位數(shù)變換成4位偏移。這一偏移說明了要跳過多少個指針才能找到所需要的那一個,因此它等于下標(biāo)小于這一位的下標(biāo)的那些位的個數(shù)。對所有轉(zhuǎn)換表來說這些偏移都相同,而不考慮這些指針取什么值。這一變換表是不變的,它只需生成一次。這些可能的位掩碼有一個特性,也就是長度是2的偶數(shù)次冪,開始于這同一個2的冪的倍數(shù)的一個位下標(biāo)的所有位間隔,或者1)包括所有的零或者2)最低位被置位。從位掩碼和位,變換到變換表提供的偏移,以及使前綴樹完整并使轉(zhuǎn)換可用的前綴擴(kuò)展,是壓縮轉(zhuǎn)換表的關(guān)鍵。實(shí)際上不需要位掩碼,我們保存一個16位代碼字?jǐn)?shù)組而不是位掩碼,這16位代碼字?jǐn)?shù)組由變換表的一個10位下標(biāo)加一個6位偏移構(gòu)成。6位偏移可以覆蓋64個指針,因此每四個代碼字需要一個基址下標(biāo)。最多可以有64k個指針,因此基址下標(biāo)最多需要16位(216=64k)。在圖7所示的過程中需要以下偽碼步驟來搜索數(shù)據(jù)結(jié)構(gòu)的第一層,其中代碼字?jǐn)?shù)組叫做“code”,基地址數(shù)組叫做“base”,“ix”是代碼字?jǐn)?shù)組中IP地址的第一個下標(biāo)部分,“bit”是變換表中IP地址的列下標(biāo)部分,“ten”是這一變換表一個代碼字的行下標(biāo)部分,“bix”是基地址數(shù)組IP地址的第二個下標(biāo)部分,“pix”是指向指針數(shù)組的一個指針,包括下一跳表的下標(biāo)和到第二層字節(jié)片的下標(biāo)。ix=IP地址的高12位bit=IP地址代碼字高16位的低4位=code[ix]ten=從第6個代碼字開始的10位=代碼字中的6位bix=IP地址的高10位pix=base[bix]+6+轉(zhuǎn)換表[ten][bit]指針=第一層指針[pix]這樣,只需要提取少許位,引用少許數(shù)組,進(jìn)行少許加法運(yùn)算。除了計(jì)算數(shù)組的下標(biāo)時隱含了乘法運(yùn)算外,不需要任何乘法或者除法指令。搜索第一層時總共需要訪問7個字節(jié)一個雙字節(jié)代碼字,一個雙字節(jié)基地址,轉(zhuǎn)換表中的一個字節(jié)(實(shí)際上是4位),以及一個雙字節(jié)指針。代碼字?jǐn)?shù)組第一層的大小是8k字節(jié),基址下標(biāo)數(shù)組第一層的大小是2k字節(jié),再加上許多指針。變換表所需要的5.3k字節(jié)由所有三層所共享。當(dāng)位掩碼是零或者其中有一位被置位時,指針必須是指向下一跳表的一個下標(biāo)??梢詫⑦@些指針直接編碼成代碼字,這樣,變換表就不必包含位掩碼0和1的條目。這樣變換表的條目就減少到了676個(下標(biāo)0~675)。當(dāng)代碼字(ten以上)里的ten位大于675時,這一代碼字就表示到下一跳表的一個直接下標(biāo)。代碼字中的6位被用作下標(biāo)的低6位,以及(ten~676)是下標(biāo)的較高位。這種編碼方法最多能夠給出(1024-676)x26=22272個下一跳下標(biāo),它比我們要設(shè)計(jì)的16k多。當(dāng)一個路由條目位于深度12或者更高的深度時,這種優(yōu)化消除了三個存儲器引用,并大大地減少了指針數(shù)組中指針的數(shù)量。代價是進(jìn)行一次比較和一次有條件分支。這種變換由以下C編程語言中的數(shù)據(jù)和函數(shù)實(shí)現(xiàn)。這些代碼的重要特征在于從一個位掩碼到一個偏移數(shù)組的變換。一些變化,例如置換mtable(和mt),將得到同樣的變換。表示偏移數(shù)組的其它方法也是這樣,例如,用兩個32為字代替4個16位字。/*maptable*/#defineMAPVECLEN4typedefunit16MAPVEC[MAPVECLEN];typedefMAPVECMCOMPACT;MCOMPACTmt[TMAX]/*mt是查找過程中使用的變換表。是從mtable初始化的,在構(gòu)造的時候使用它。<prelisting-type="program-listing"><![CDATA[ */ typedefstructmentry{ unit16mask;/*16位模式(最低位總是被置位!)*/ unit16len;/*8位長度(值1~16)*/ MAPVECmap;/*4組中16個4位偏移*/ }MENTRY,*MP; voidmentry2mcompact(MENTRY*from,MCOMPACT*to) /*將變換部分從“from”存入“to”*/ { inti; for(i=0;i<MAPVECLEN;i++){ (*to)[i]=from->map[i]; } } externvoidmtable_compact() /*從mtable對mt初始化*/ { registerinti;for(i=0;i<TMAX;i++){ mentry2mcompact(&mtable[i],&mt[i]); } }]]></pre>數(shù)據(jù)結(jié)構(gòu)的第二層和第三層包括字節(jié)片。一個字節(jié)片覆蓋高度為8的一棵子樹,最多可以包括28=256個頭。第n-1層的一個根頭指向第n層的一個字節(jié)片。有三種字節(jié)片,依賴于想象的位矢量包含幾個頭。有1~8個頭時,字節(jié)片是稀疏的(sparse),用頭的8位下標(biāo)數(shù)組,再加上8個16位指針表示,總共有24位。有9~64個頭時,字節(jié)片是稠密的(dense)。它同樣用第一層表示,基址下標(biāo)號除外。差別是所有16個代碼字只需要一個基址下標(biāo),因?yàn)?位偏移可以覆蓋所有64個指針??偣残枰?4個字節(jié),再加上給指針的18~128個字節(jié)。有65~256個頭時,字節(jié)片非常稠密(verydense)。同樣用第一層表示。16個代碼字和4個基址下標(biāo)總共40個字節(jié)。此外,這65~256個指針需要130~512個字節(jié)。稠密和非常稠密的字節(jié)片都用第一層搜索。用一個專用于8個單元的專用對分搜索來搜索稀疏的字節(jié)片。這比線性搜索和通用對分搜索要快得多。另外,實(shí)現(xiàn)這一搜索可以不用處理器體系結(jié)構(gòu)上的條件轉(zhuǎn)移,這一條件轉(zhuǎn)移指令有一個條件傳送指令。<prelisting-type="program-listing"><![CDATA[ /*系數(shù)字節(jié)片的搜索函數(shù)*/ staticinlineunit16findsparse(SPARSECHUNK*chu,unit32val) /*chu->vals是一個排好序的8位指數(shù)組0~7 chu->rinfo是指針的對應(yīng)數(shù)組0~7 val是搜索關(guān)鍵字*/ { unit8*p,*q; p=q=&(chu->vals); p+=(*(p+3)>val)<<2; p+=(*(p+1)>val)<<1; p+=(*p>val); return(chu->rinfo[p-q]); }]]></pre>如上所述,稠密和非常稠密的字節(jié)片都用第一層進(jìn)行優(yōu)化。在稀疏字節(jié)片中,如果下一跳相同,兩個連續(xù)的頭就可以合并,用較小的一個表示。判斷一個字節(jié)片是稀疏字節(jié)片還是稠密字節(jié)片的時候,要將這一合并考慮在內(nèi),這樣,當(dāng)合并的頭數(shù)是8或者更少時,這一字節(jié)片肯定是稀疏的。為了使這棵樹成為滿二叉樹而添加的許多樹葉將按順序出現(xiàn),而且它們的下一跳都相同。對應(yīng)于這些樹葉的頭將合并到系數(shù)字節(jié)片中去。這一優(yōu)化過程將字節(jié)片分布從較稠密的字節(jié)偏移向較稀疏的字節(jié)片。對于很大的表,轉(zhuǎn)發(fā)表的大小一般都能縮減5~15%。這種數(shù)據(jù)結(jié)構(gòu)能夠支持路由條目數(shù)顯著增長。當(dāng)前設(shè)計(jì)中有兩個極限1.每一層中每一種字節(jié)片的個數(shù)最多為214,也就是16384。表1說明這比當(dāng)前采用的要多大約16倍。如果超過這一極限,就可以修改這一數(shù)據(jù)結(jié)構(gòu),采用另一種方式對指針編碼從而給下標(biāo)更多的空間,或者增大指針的尺寸。2.第二層和第三層的指針數(shù)受到基址下標(biāo)大小的限制。當(dāng)前的實(shí)施方案使用16位基址下標(biāo),可以支持的增長系數(shù)為3~15。如果超過了極限,就將基址指針的大小直接增加到3個字節(jié)。此時對于稠密字節(jié)片,字節(jié)片的尺寸增加3%,對于非常稠密的字節(jié)片來說增加10%。稀疏字節(jié)片不受影響。顯然路由選擇條目增加很多時這種數(shù)據(jù)結(jié)構(gòu)仍然可以使用。它的大小將隨著路由條目的個數(shù)幾乎線性地增長。為了研究轉(zhuǎn)發(fā)表的性能,收集了許多IP路由選擇表。當(dāng)前可以從因特網(wǎng)性能測量和分析(IPMA)計(jì)劃站點(diǎn)(http//www.ra.net/statistics/)獲得因特網(wǎng)路由選擇表,在此以前由現(xiàn)在已經(jīng)終止了的路由判定器計(jì)劃提供(http//www.ra.net/statistics/)。收集的這些路由表是各種大型因特網(wǎng)互連點(diǎn)使用的路由表的每日快照。這些表的路由條目中有一些有多個下一跳。在這種情況下,轉(zhuǎn)發(fā)表從它們中間隨機(jī)地選擇一個作為下一跳使用。圖8中的表1給出的是從多個路由選擇表構(gòu)成的轉(zhuǎn)發(fā)表里的數(shù)據(jù)。對于每一個站點(diǎn),它給出了產(chǎn)生最大轉(zhuǎn)發(fā)表的路由選擇表的數(shù)據(jù)和結(jié)果?!奥酚蓷l目”是路由選擇表中路由選擇條目的個數(shù),“下一跳”是從表中找到的不同的下一跳個數(shù)。“樹葉”是添加了樹葉使它成為一棵滿二叉樹后前綴樹中的樹葉數(shù)。表1中“建立時間”是從路由表二叉樹的存儲器表述生成轉(zhuǎn)發(fā)表所需要的時間。時間是在一臺運(yùn)行DECOSF1的330MHz阿爾法21164上測得的。隨后的那些列是生成的表中稀疏、稠密和非常稠密字節(jié)片的總個數(shù),以及數(shù)據(jù)結(jié)構(gòu)最低層里字節(jié)片的個數(shù)。從表1可以看出,新的轉(zhuǎn)發(fā)表可以很快地生成。在1Hz的再生成頻率下,只占用了阿爾法容量的不到十分之一。如上所述,比1Hz更高的再生成頻率是不必要的。表1中較大的表無法全部裝入阿爾法的96kB二級高速緩存。但是,可以很靈活地將無法裝進(jìn)二級高速緩存的那部分裝入三級高速緩存中非??斓腟RAM的一小部分中,從而減少二級高速緩存中出現(xiàn)故障的代價。對于局域性的通信量模式,多數(shù)存儲器引用都是針對二級高速緩存進(jìn)行的。一個有趣的現(xiàn)象是這些表的大小可以跟所有前綴都存入一個數(shù)組相比。對于這些較大的表,每一個前綴只需要5.6字節(jié)以下。這些字節(jié)中有一半以上是由指針占用的。在Sprint表中,有33469個指針,需要65kB以上的存儲空間。顯然,進(jìn)一步縮小轉(zhuǎn)發(fā)表的尺寸可以通過減少指針個數(shù)來實(shí)現(xiàn)。對查找例行程序的測量是用一個C函數(shù)進(jìn)行的,這一C函數(shù)是用GNUC-編譯器gcc編譯的(由“使用和一致gnucc.手冊”公開,免費(fèi)軟件基金會,1995年11月,ISBN1-882114-66-3)。報(bào)告的時間不包括函數(shù)調(diào)用和對下一跳表進(jìn)行存儲器訪問的時間。gcc產(chǎn)生一個程序,在最壞情況下,它使用大約50條阿爾法指令來搜索數(shù)據(jù)結(jié)構(gòu)的一層。在一塊高能奔騰芯片上,gcc產(chǎn)生一段程序,最壞的情況下,它每一層使用35~45條指令。下面的C函數(shù)給出了測量過程中使用的查找函數(shù)的程序。第一層代碼字?jǐn)?shù)組叫做int1,基址下標(biāo)數(shù)組叫做base1。第一層里的指針儲存在數(shù)組htab1中。字節(jié)片儲存在數(shù)組cis、cid、cidd中,其中的i是層數(shù)。稠密和非常稠密字節(jié)片的基地址和指針都分別儲存在數(shù)組baseid、baseidd和htabid、htabidd中。<prelisting-type="program-listing"><![CDATA[ /*轉(zhuǎn)發(fā)表的查找函數(shù)*/ #include“conf.h” #include“forward.h” #include“mtentry.h” #include“mtable.h” #include“bit2index.h” #defineTABLE_LOOKUP #include“sparse.h” #include“timing.h” #include“l(fā)ookup.h” /*只有在ip是一個32位的無符號整數(shù)(uint32)時這些宏才會工作*/ #defineEXTRACT(start,bits,ip)(((ip)<<(start))>>(32-(bits))) #defineGETTEN(m)(((m)<<22)>>22)#defineGETSIX(m)((m)>>10)#definebit2o(ix,bit)((mt[(ix)][(bit)>>2]>>(((bit)&0x3)<<2))&0xf)/*lookup(ipaddr)--ipaddr得到路由表?xiàng)l目的下標(biāo)*/unsignedintlookup(unit32ipaddr){uint32ix;/*代碼字?jǐn)?shù)組的下標(biāo)*/uint32code;/*16位代碼字*/int32diff;/*跟TMAX的差*/uint32ten;/*mt的下標(biāo)*/uint32six;/*六個“額外的”代碼位*/int32nhop;/*指向下一跳的指針*/uint32off;/*指針偏移*/uint32hbase;/*散列表(hashtable)的基址*/uint32pntr;/*散列表?xiàng)l目*/int32kind;/*pntr的種類*/uint32字節(jié)片;/*字節(jié)片下標(biāo)*/uint8*p,*q;/*搜索稀疏字節(jié)片的指針*/uint32key;/*搜索稀疏字節(jié)片里的關(guān)鍵字*//*從這里開始計(jì)時*/ix=EXTRACT(0,12,ipaddr);code=int1[ix];ten=GETTEN(code);six=GETSIX(code);if((diff=(ten-TMAX))>=0){nhop=(six|(diff<<6));gotoend;}off=bit2o(ten,EXTRACT(12,4,ipaddr));hbase=base1[ix>>2];pntr=htba1[hbase+six+off];if((kind=(pntr&0x3))){chunk=(pntr>>2);if(--kind){if(--kind){ key=EXTRACT(16,8,ipaddr); p=q=c2s[chunk].vals; if(*(p+3)>key){ P+=4; }; while(*p>key){ p++; } pntr=c2s[chunk].rinfo[p-g]; }else{ ix=EXTRACT(16,4,ipaddr); code=c2dd[chunk][ix]; ten=GETTEN(code); six=GETSIX(code); if((diff=(ten-TMAX))>=0){ nhop=(six|(diff<<6)); gotoend; } hbase=htab2ddbase[(chunk<<2)|(ix>>2)]; off=bit2o(ten,EXTRACT(20,4,ipaddr)); pntr=htab2dd[hbase+six+off];}}else{ix=EXTRACT(16,4,ipaddr);code=c2d[chunk][ix];ten=GETTEN(code);six=GETSIX(code); if((diff=(ten-TMAX))>=0){ nhop=(six|(diff<<6)); gotoend; }hbase=htab2dbase[chunk];off=bit2o(ten,EXTRACT(16,4,ipaddr)); pntr=htab2d[hbase+six+off];}if((kind=(pntr&0x3))){ chunk=(pntr>>2);if(--kind){ if(--kind){ key=EXTRACT(24,8,ipaddr); p=q=c3s[chunk].vals); if(*(p+3)>key){ p+=4; }; while(*p>key){ p++; }; pntr=c3s[chunk].rinfo[p-q]; }else{ ix=EXTRACT(24,4,ipaddr); code=c3dd[chunk][ix]; ten=GETTEN(code);six=GETSIX(code); if((diff=(ten-TMAX))>=0){ nhop=(six|(diff<<6); } off=bit2o(ten,EXTRACT(28,4,ipaddr)); hbase=htab3ddbase[(chunk<<2)|(ix>>2)]; pntr=htab3dd[hbase+six+off]; } }else{ ix=EXTRACT(24,4,ipaddr); code=c3d[chunk][ix]; ten=GETTEN(code); six=GETSIX(code); if((diff=(ten-TMAX))>=0){ nhop=(six|(diff<<6)); gotoend; } off=bit2o(ten,EXTRACT(28,4,ipaddr)); hbase=htab3dbase[chunk]; pntr=htab3d[hbase+six+off]; } } } nhop=(pntr>>2); end; /*在這里停止計(jì)時*/ returnnhop; }]]></pre>讀取阿爾法和高能奔騰時鐘周期計(jì)數(shù)器的當(dāng)前值是可能的。這一裝置用來高精度地測量查找時間在200MHz時一個時鐘周期是5ns,在333MHz時是3ns。理想情況下,將把整個轉(zhuǎn)發(fā)表裝入高速緩存中,這樣查找時將使用不受干擾的高速緩存。這將能夠模仿專用轉(zhuǎn)發(fā)引擎高速緩存的性能。但測量只是在普通的通用工作站上完成的,在這種系統(tǒng)里很難控制高速緩存的內(nèi)容。無論什么時候,只要有輸入/輸出、發(fā)生中斷或者另一個過程開始運(yùn)行,高速緩存就會受到干擾。在不干擾高速緩存的情況下,甚至無法打印出測量數(shù)據(jù),也無法從一個文件中讀出新的IP地址。采用的這一方法對每一查找進(jìn)行兩次,并測量第二次查找的查找時間。這樣,第一次查找時使用的是受到干擾的高速緩存,而進(jìn)行第二次查找時所有必需的數(shù)據(jù)已經(jīng)被第一次查找逼進(jìn)了主高速緩存中。然后將每一對查找測量數(shù)據(jù)打印出來,取出一個新地址,這一過程又一次干擾了高速緩存。第二次查找比轉(zhuǎn)發(fā)引擎里的查找進(jìn)行得更好,因?yàn)閿?shù)據(jù)和指令已經(jīng)搬入最靠近處理器的主高速緩存。為了得到查找時間的上限,測量時間必需加上對二級高速緩存進(jìn)行存儲器訪問所需要的額外時間。為了測試轉(zhuǎn)發(fā)表中的所有路徑,針對路由表中的每一個條目,包括為了擴(kuò)展成一棵滿二叉樹而添加的條目,測量了查找時間。從這些實(shí)驗(yàn)得不到平均查找時間,因?yàn)檎鎸?shí)通信中訪問每一個路由選擇條目的概率都一樣是不可能的。此外,通信量模式中的局域性將會使數(shù)據(jù)結(jié)構(gòu)中頻繁訪問的部分保留在主高速緩存中,從而減少平均查找時間。下面計(jì)算出來的性能數(shù)據(jù)是比較保守的,因?yàn)槠渲屑俣嗽谥鞲咚倬彺胬锏乃写鎯ζ髟L問都失敗了,而且最壞的情況總是發(fā)生。真實(shí)的查找速度應(yīng)當(dāng)更快。表1說明在數(shù)據(jù)結(jié)構(gòu)的第三層上很少有字節(jié)片。這使得大多數(shù)查找都只需要搜索不超過兩層就能找到下一跳。因此,計(jì)算了8次而不是最壞的12次存儲器訪問中對二級高速緩存進(jìn)行存儲器訪問的額外時間。如果大部分查找都要訪問那些很少的字節(jié)片,它們就會遷移到主高速緩存中來,所有12次存儲器訪問都不會再那么費(fèi)時。在時鐘頻率為333MHz的一臺阿爾法21164上進(jìn)行了一次實(shí)驗(yàn);一個時鐘周期有3ns。對8kB數(shù)據(jù)高速緩存的訪問在2個時鐘周期內(nèi)完成,對96kB二級高速緩存的訪問則需要8個時鐘周期。見圖9中的表2。圖10給出了從1月1日起在阿爾法計(jì)算機(jī)上對Sprint路由選擇表進(jìn)行第二次查找所經(jīng)歷的時鐘周期的分布情況。觀察到的最快查找速度為17個時鐘周期。這是第一層里的代碼字直接給出了下一跳表的下標(biāo)這種情況。這種路由條目非常少。但由于每一個這種路由條目覆蓋了許多IP地址,實(shí)際的通信量可能會包含許多這種目的地地址。一些查找用了22個時鐘周期,這肯定跟前一種情況一樣。實(shí)驗(yàn)證明當(dāng)讀取時鐘周期計(jì)數(shù)器需要兩條連續(xù)指令時,這種差別有時是5個時鐘周期,而不是預(yù)期的0個。圖10中下一個尖峰出現(xiàn)在41個時鐘周期處,在這種情況中,在第一層找到的指針就是下一跳表的一個下標(biāo)。傳統(tǒng)的B類地址就屬于這一類型。52~53、57、62、67和72個時鐘周期處的尖峰對應(yīng)于在稀疏第二層字節(jié)片中檢查了1、2、3、4或者5個值以后才找到指針。75和83個時鐘周期處出現(xiàn)很高的尖峰,分別是因?yàn)樗阉鞒砻芎头浅3砻艿淖止?jié)片需要許多時鐘周期。少部分查找超過83個時鐘周期,這種現(xiàn)象對應(yīng)于搜索了一個稀疏第三層字節(jié)片以后才找到指針,也許是因?yàn)閳?zhí)行時間的變化。二級高速緩存中出現(xiàn)的高速緩存沖突,或者在查找之前管線和高速緩存系統(tǒng)的狀態(tài)之間的差別,都會導(dǎo)致這種變化。超過100個時鐘周期的那部分分布或者是因?yàn)檫@種變化,或者是因?yàn)楦咚倬彺婀收?。?dāng)所有數(shù)據(jù)都在主高速緩存中時,300ns足以完成一次查找。主高速緩存中的數(shù)據(jù)訪問跟二級高速緩存中的訪問的差別是8-2=6個時鐘周期。因此在最壞的情況下搜索數(shù)據(jù)結(jié)構(gòu)中的兩層需要比圖10所示的多8×6=48個時鐘周期。也就是說當(dāng)兩層足夠時,在最壞的情況下,完成查找最多需要100+48=148個時鐘周期,也就是444ns。這樣,利用二級高速緩存,阿爾法每秒鐘至少能夠完成2200000次路由查找。在時鐘頻率為200MHz的高能奔騰上進(jìn)行了另一次實(shí)驗(yàn);一個時鐘周期為5ns。8kB的主高速緩存有2個時鐘周期的等待時間,256kB的二級高速緩存有6個時鐘周期的等待時間。見表2。圖11給出了采用跟阿爾法21164一樣的轉(zhuǎn)發(fā)表時,利用高能奔騰進(jìn)行第二次查找經(jīng)歷的時鐘周期的分布情況。讀取時鐘周期計(jì)數(shù)器的指令序列需要33個時鐘周期。當(dāng)兩次讀取接連進(jìn)行時,計(jì)數(shù)器值的差別是33。因此,所有報(bào)告的時間都減去了33。觀察到的最快查找時間是11個時鐘周期,這跟阿爾法21164的速度差不多。這一尖峰對應(yīng)于第一層出現(xiàn)在25個時鐘周期以后就立即找到下一跳下標(biāo)這種情形。對應(yīng)于稀疏第二層字節(jié)片的那些尖峰集中在36~40個時鐘周期的范圍內(nèi)。處理線性掃描時,高能奔騰中不同的高速緩存結(jié)構(gòu)似乎比阿爾法的高速緩存結(jié)構(gòu)要快。如果第二層字節(jié)片是稠密的和非常稠密的,完成查找就分別需要48和50個時鐘周期。一直到69個時鐘周期,另外還有一些不規(guī)則的尖峰,在69個時鐘周期以上,則很少見到。顯然,當(dāng)所有數(shù)據(jù)都在主高速緩存中時,69個時鐘周期(345ns)足以完成查找。訪問主高速緩存和二級高速緩存的時間差是20ns(4個時鐘周期)。于是,需要查找兩層時,最壞情況下高能奔騰的查找時間是69+8×4=101個時鐘周期,也就是505ns。轉(zhuǎn)發(fā)表在二級高速緩存中時,高能奔騰每秒鐘至少能進(jìn)行二百萬次路由查找。顯然,本發(fā)明提供了一種改進(jìn)了的IP路由查找方法和系統(tǒng),它能完全實(shí)現(xiàn)前面給出的目標(biāo)優(yōu)點(diǎn)。雖然是針對具體的實(shí)施方案來介紹本發(fā)明的,但對于本領(lǐng)域里的技術(shù)人員來說,顯然可以對以上實(shí)施方案進(jìn)行替換、改進(jìn)。在上述實(shí)施方案里,查找功能是用C編程語言實(shí)現(xiàn)的。對于編程這一領(lǐng)域里的技術(shù)人員來說,顯然可以采用其它的編程語言?;蛘撸梢圆捎脴?biāo)準(zhǔn)的數(shù)字設(shè)計(jì)技術(shù)用硬件來實(shí)現(xiàn)查找功能,對于硬件設(shè)計(jì)這一領(lǐng)域里的技術(shù)人員來說,這也是顯而易見的。例如,本發(fā)明還可以用于除了阿爾法21164和高能奔騰以外的其它計(jì)算機(jī)系統(tǒng)結(jié)構(gòu),可以采用其它的方式來分割前綴樹,樹中可以有不同的層數(shù),可以采用其它的方式來表述變換表,采用其它的方式對代碼字編碼。此外,本發(fā)明還可以用于防火墻路由查找。權(quán)利要求1.在路由選擇表中查找IP路由的一種方法,包括任意長度前綴的條目,這些條目有下一跳表中有關(guān)的下一跳信息,用來確定IP數(shù)據(jù)報(bào)要轉(zhuǎn)發(fā)往什么地方,其特征在于以下步驟在存儲裝置里儲存路由表的一個表達(dá),其形式是一棵完整的前綴樹(7),由所有路由選擇表?xiàng)l目的前綴定義,這棵樹是完整的,其中每一個節(jié)點(diǎn)要么沒有孩子,要么有兩個孩子,添加的所有孩子都是樹葉,它們跟最接近的有下一跳信息的祖先一樣有相同的下一跳信息,或者一個未定義的下一跳,如果沒有這樣的祖先存在,在一個存儲裝置里儲存位矢量(8)的一個表達(dá),在當(dāng)前深度處(D),這一位矢量包括前綴樹(7)的一個分割的數(shù)據(jù),在這一當(dāng)前深度處每一個可能的節(jié)點(diǎn)都有一位,其中當(dāng)前綴樹(7)里有一個節(jié)點(diǎn)時,就將這一位置位,在所述存儲裝置中儲存一個指針數(shù)組,對于真頭,它們是指向下一跳表的一個下標(biāo),對于根頭,它們是下一層字節(jié)片的一個下標(biāo),將所述位矢量(8)分成特定長度的位掩碼,在所述存儲裝置里儲存一個轉(zhuǎn)換表中可能的位掩碼的一個表示,在所述存儲裝置里儲存一個代碼字?jǐn)?shù)組,每一個代碼字都表示指向轉(zhuǎn)換表的一個行下標(biāo),和一個指針偏移,在所述存儲裝置里儲存一個基地址數(shù)組,訪問代碼字?jǐn)?shù)組中對應(yīng)于IP地址第一個下標(biāo)部分(ix)的位置處的代碼字,訪問轉(zhuǎn)換表中對應(yīng)于IP地址的一個列下標(biāo)部分(bit)和代碼字的一個行下標(biāo)部分(ten)的位置上的轉(zhuǎn)換表?xiàng)l目部分,訪問基地址數(shù)組中IP地址的第二個下標(biāo)部分(bix)的位置上的基地址,以及訪問對應(yīng)于代碼字的基地址加指針偏移(six)的位置上的指針加上指針數(shù)組里的轉(zhuǎn)換表?xiàng)l目部分。2.在路由選擇表里查找IP路由的一種系統(tǒng),包括任意長度前綴的條目,這些條目有下一跳表中有關(guān)的下一跳信息,用來確定IP數(shù)據(jù)報(bào)要轉(zhuǎn)發(fā)往什么地方,其特征在于一個路由選擇表,其形式是一棵完整的前綴樹(7),由所有路由選擇表?xiàng)l目的前綴定義,每一個節(jié)點(diǎn)要么沒有孩子,要么有兩個孩子,添加的所有孩子都是樹葉,它們跟最接近的有下一跳信息的祖先一樣有相同的下一跳信息,或者有一個未定義的下一跳,如果沒有這樣的祖先存在,位矢量(8)的一種表達(dá),在當(dāng)前深度處(D),這一位矢量包括前綴樹(7)一個分割的數(shù)據(jù),在這一當(dāng)前深度處每一個可能的節(jié)點(diǎn)都有一位,其中當(dāng)前綴樹(7)里有一個節(jié)點(diǎn)時,就將這一位置位,一個指針數(shù)組,對于真頭,它是下一跳表的下標(biāo),對于根頭,它是下一層字節(jié)片的一個下標(biāo),將所述位矢量(8)分成特定長度的位掩碼,包括可能的位掩碼一個表示的一個轉(zhuǎn)換表,一個代碼字?jǐn)?shù)組,每一個代碼字都表示轉(zhuǎn)換表的一個行下標(biāo),和一個指針偏移,以及一個基地址數(shù)組。全文摘要從路由選擇表查找IP路由的一種方法,包括有任意長度前綴的條目,這些條目有下一跳表中有關(guān)的下一跳信息,以確定IP數(shù)據(jù)報(bào)要發(fā)往哪里,儲存了路由選擇表的一個表示,其形式是一棵完成的前綴樹(7),由所有路由選擇表?xiàng)l目的前綴定義。此外,儲存了在當(dāng)前深度(D)處位矢量(8)的一個表示,包括前綴樹(7)的一個分割,和一個指針數(shù)組,包括到下一跳表和下一層字節(jié)片的下標(biāo)。所述位矢量(8)被分成位掩碼并將位掩碼的一個表示儲存在一個轉(zhuǎn)換表里。然后,儲存一個代碼字?jǐn)?shù)組,每一個都表示指向這一轉(zhuǎn)換表的一個行下標(biāo)和一個指針偏移,以及一個基地址數(shù)組。最后,完成查找。文檔編號H04L12/56GK1270728SQ9880914公開日2000年10月18日申請日期1998年5月11日優(yōu)先權(quán)日1997年9月15日發(fā)明者A·布洛德尼克,M·德格馬克,S·卡爾松,S·平克申請人:埃弗內(nèi)特集團(tuán)股份有限公司