路由器中的硬件IP路由表應用解析
1. 路由器的體系結構
圖1給出了一般路由器的邏輯體系結構。它主要由下面幾部分組成 :路由引擎、轉發引擎、 路由表、網絡適配器和相關的邏輯電路等。轉發引擎負責把從一個網絡適配器來的數據包轉發到另一個網絡適配器出去。IP協議,包括對路由表的查找,構成了轉發引擎中最主要的部分。由于每個通過路由器并需要其轉發的數據包都要對路由表進行查找,所以路由表的查找效率如何往往決定了整個路由器的性能。路由引擎則包括了高層協議,特別是路由協議,它負責對路由表的更新。由于路由引擎不涉及通過路由器的數據通路,故它可用通用的CPU代替。
2.硬件路由表的數據結構設計
一般路由器中路由表的每一項至少有這樣的信息:目標地址、網絡隱碼、下一跳地址。如果對每一個IP地址都要一個表項,那么需要占用很大的2323*4字節的存儲器,而且其中必定有很多的表項沒有被使用,這就會造成極大的資源浪費。
為了用硬件實現路由表的查找,查找算法需要滿足如下的條件:
1) 實時的實現路由表的查找;
2) 有效的實現路由表的插入和刪除;
3) 提供有效的最長前綴匹配;
4) 具有良好的可擴展性;
5) 支持廣播和組播;
6) 有效的對Memory進行利用;
7) 硬件上容易實現,并具有良好的性能 。
我們考慮,如果在對路由表的查找中,把子網隱碼和IP地址結合起來,對IP地址進行相應的分段,并把它們相連。這樣在路由表的表項中,只有IP地址的一部分及其相應的隱碼部分,可以實現良好的可擴展性,只要對Memory進行有效的管理,可以靈活的動態的實現對路由的插入和刪除。鑒于此,我們設計該表的結構(如下面的表一所示 ):
它的思想是:把32位IPv4地址主要分成4部分,每部分8位。在該結構中,Address-part[0-4]是IP地址中的一部分,Mask-part[0-4]是相應的掩碼部分。Hit-next[0-4]是需要查找的目標IP地址與掩碼部分相與后,與Address-part一致時所要查找的下一路由項所在地址的指針。,Miss-hit[0-4]則是相互不一致時,下一路由項所在地址的指針。Shift位則用于判斷是否需要對IP地址中的下8位進行查找和判斷。它只有在當前的8位IP地址與目標地址中相應的8位一致時,才會被置位。Stop位用于判斷是否還需進行查找。它在IP地址查找結束時被置位,或沒有比當前項所對應的IP地址更長的路由表項時被置位。
圖2就是一個表1的例子 :
在該例子中,每一方框中上面一行表示相應的IP地址部分和隱碼部分。下面一行表示相關的隱碼部分的二進制表示。 相應的查找算法如下:
- /*查找算法開始 */
- search = TRUE ;
- WHILE ( search ) {
- masked_key = key & ( entry ->mask_part ) ;
- result = ( entry ->address_part ) = = masked_key
- IF ( result = = TRUE ) {
- best_match = entry ;
- entryentry = entry ->hit_next;
- }ELSE{
- entryentry = entry ->miss_next;
- IF ( entry ->stop = = TRUE ) search = FALSE;
- }
- }
- RETURN best_match ;
- /*查找算法結束 */
為了實現有效的插入和刪除,我們還要在路由表的數據結構中再另外添加幾個域 :parent指針(指向本結點的父結點),路由信息(routeinfo)等。它們的用途是在路由表的查找過程中,特別是在指針的回溯(pointer reversal)中,可以大大的節省查找時間。由于IP路由的插入和刪除比較復雜。我們只是粗略得說明一下。
IP路由的插入:
- /*插入算法開始 */
- /* 先用上面提到的查找算法找出best-match */
- best_match = search ( new_entry );
- /* 確定需要加入的路由中沒有被best-match包括的那幾位 */
- for ( count = first_unmatched_bit ; count <= sizeof ( new_entry) ;
- count+= sizeof ( address_part ) {
- /* 創建新的結點 */
- create new node ;
- /* 將該結點連入best_match的hit_next */
- link node into hit branch of best_match ;
- }
- /*插入算法結束 */
IP路由的刪除要分幾種情況討論 。如 best_match 是葉子結點 ,best_match的hit_next指針為空, best_match的miss_next指針為空 和hit_next指針和miss_next指針都不為空等四種情況。這里就不再討論。
#p#
3.路由表查找的硬件實現:
圖3就是對應與上面提及的路由表結構的IP路由表查找的硬件實現(簡稱為路由卡)的系統框圖。
在路由卡中,主要有IP地址,狀態機,路由信息,Memory,譯碼器,掩碼器,比較器,地址寄存器組成。IP地址用于保存所要查找的目標地址。狀態器用于控制IP路由表的查找。路由信息就是我們所要查找的信息。它的工作原理是這樣的:
當路由器從某一個網絡適配器中接受到一個需要轉發的數據包后,在需要進行IP路由表的查找時,把IP包的目的地址送到IP地址寄存器中,同時給狀態機發一個指令。狀態接到這一指令后,從Memory中讀出路由表的相應的表項,并和IP地址寄存器中的相應幾位經譯碼器,掩碼器后,進行比較,把比較的結果反饋給狀態機。再由狀態機來控制下一輪的比較。當比較結束后,把比較的結果放在路由信息寄存器中,供路由器(如轉發引擎)讀取。同時狀態機在特定的某一端口設置標志,來通知CPU查找是否已經結束或還在進行當中。下面對其性能進行分析。
4.性能分析
由于路由表項中,地址掩碼的引入,使得路由結構變得非常靈活。但相應的,由此產生的內存的開銷也相當的大。這是性能和硬件開銷一對矛盾的必然體現。
該路由卡原型的實現是利用微機上的ISA總線,采用存取時間為70ns 的SRAM存儲器(所需容量為6*123k*8bit)。除了使用ISA總線上提供的總線外,本身還帶了33M的晶振。對某一路由表項的查找,最多只需32步查找。
在最壞情況下,共需32次查找,查找時間為:
32* 1 /(33*106) ≈ 9.7 * 10 -7秒
此時每秒可查找 1/(9.7 * 10 -7)≈ 1.03 * 106次
雖然該路由卡是基于ISA總線,但平均來說,該路由卡的查找速率為每秒8百萬次。這也從另一方面說明該路由卡的設計是可行的。
針對網絡流量的增加,及對路由器性能要求的提高,本文從硬件的角度對IP路由查找算法用硬件實現做了一系列的分析,并提出了相應的便于用硬件實現的IP路由表的數據結構。同時對該路由卡的性能進行了分析。
同時也該看到:為了更快的提高路由表的查找速率,基于ISA總線是不可能滿足要求的。由此,使用FPGA芯片不可避免。由于VHDL語言固有的靈活性和可編程性,可以更為靈活和高效的實現路由查找。所以,使用FPGA芯片來實現路由查找,是未來的趨勢。
路由器中的硬件IP路由表應用的全部內容就呈現給了大家,文章內容較多,但是敘述比較詳細,方便讀者理解和閱讀,希望你能從中學習到你想要的知識。
【編輯推薦】