硬件路由轉發原理淺析


有人問我,對於路由轉發,硬件轉發表的性能真的要超出軟件查表比方Linux系統非常多嗎?
我怎么回答呢?給出數據嗎?我沒有數據,由於我的本職不是做這一塊的。

給出理論嗎?恐怕我也沒那口才。畫個圖?我發現我系統沒有安裝畫邏輯電路的工具。那怎么辦?這個問題的答案我真真在心里,僅僅是難於言表,於是乎。我採用手畫圖手機拍照的方式,展示一下硬件轉發表的威力,由於沒有實際數據。我採用相對照較的方式,讓諸位看一下軟件轉發為什么是個垃圾。也順便介紹一下專業的路由器交換機是怎么轉發數據包的。


       只是。手畫圖實在是不敢恭維,所以我就照着手畫圖用viso畫了一個。



我是一個送貨修路的

人生有多少十年?
我想成為一名送貨的,修路的。我送的是IP數據報,修的是全光網絡。
現在是一個浮躁的年代,大家都在爭先恐后往食物鏈頂端爬。搞什么Android app,iOS什么的,而我始終在我自己感興趣的領域,一混就是10年!

而這個領域,就是食物鏈的底端。

開始前的聲明

我假設你已經知道了主要的門電路的工作原理,比方與門,非門,或門,鎖存器。電容存儲單元,存儲陣列等基本概念。

接下來我用這些門來展示一下一個數據包實際的路由查詢過程究竟是個什么樣子。在繼續閱讀之前請注意,
對於專家:本文不適合你,由於這是我自己想的。我為剛開始學習的人着想,沒有遵循CAM,TCAM的規范,空間利用也不好。總之,跟你想象中的相比,我的做法非常垃圾。


對於不知情者:本文十分適合你。能夠讓你瞬間體會精髓。這也是我的心願。



step by step

首先給出一幅圖:




給定一個目標IPv4地址,經過幾個門就能夠找到下一跳的索引。是不是非常奇異啊。其實真的就是這樣。
       假設你細致看這個圖的話,你可能會發現。這有什么了不起的啊。你的譯碼器譯碼的是32bit的地址,也就是說32位的全集,4G個地址,每個前綴都必須有4G個entry的空間。這可怎能受得了啊,可是我要說的是。這里僅僅給出一個樣例,我當然知道用N路組相連的方式來組織,可是那樣會增加一些比較門電路。不直觀。所以我就直接用32位地址鍵了。或許你還會反駁。即便用軟件,我建立一個4G大小的hash表,用IPv4地址本身作為hash值,不更加簡單嗎?不比硬件實現更加優化嗎?我想說的是。NO。Why?請看一個CPU cache的普通命中過程,下面是圖示:




跟一個IPv4地址路由查找過程相比。少不了幾個門。

注意,這僅僅是在訪存之前的cache匹配的門電路,這還算是比較高效的,假設沒有命中。訪存的電路涉及到的電路自不必說,單單是CPU的運行單元這些電路就夠了。假設你了解微結構,那你就會知道。一條指令的運行也是一個極其復雜的過程。CPU內部有通用運行單元,流水線等。每個步驟都是要花費時鍾周期的,那么請問。下面的代碼須要多少門電路呢?
entry = bucket[destIP];
nexthop = entry->nexthop;
先把它翻譯成匯編然后再看吧。更何況,你不可能創建一個如此龐大的hash表。常規的看,TRIE樹查找法算是高效的了。比它更高效的是我自己的DxR Pro++結構,可是即便是DxR Pro++。和上述的硬件轉發相比,也是弱爆了的了。
       繼續看上面的硬件路由轉發原理圖,譯碼器后面的交叉網絡其實應該畫成黑盒子更加清爽些,可是我還是不由自主地畫成了不倫不類的樣子,每個交叉點上都存着1bit的數據,它非0即1。譯碼器譯碼的結果選擇一根字線,然后該字線上的全部與之交叉的位線由於字線電平拉高,交叉點上的1bit數據就稀里嘩啦掉下來了,這其實也是內存訪問的原理。

在第一個譯碼器后面。有一個比較重要的操作,那就是“最長前綴”的邏輯。我不知道標准的TCAM是怎么做的,可是我認為我的上述的方式也能說明問題。引入了兩個概念,反掩碼和消除位,當中反掩碼是掩碼按位取反的結果,而消除位是為了唯一取得匹配到的“最長前綴”那一項的。

終於,我們得到了匹配到的最長前綴的那一項相應的下一跳索引地址,然后再來一個譯碼過程。通過地址得到下一跳索引,取得勝利。
       注意,全部的操作都是同一時候進行的,在匹配28位前綴的同一時候。24位,16位。10位。8位前綴也在同步匹配,它們同一時候經過同一組門。

這就是優勢!

硬件轉發和CPU轉發

我們發現,上面我描寫敘述的那個電路差點兒不能干別的,它僅僅能為一個IPv4地址查詢下一跳(當然還有寫入,刪除等電路邏輯。我沒有畫出來),然而就是這樣一個電路,比CPU那個復雜的東西效率高多了,所謂它是專業的,而CPU僅僅是通用的。
       CPU作為一個通用運行單元。它全然是傻瓜的,卻又什么都能做。詳細要做什么,是通過從內存中獲取的“指令”來指示的,也就是說,指令本身就是數據的一種表現形式。編程的本質是什么?編程的本質就是從內存中獲取的指令對CPU內部電路的編程。
       然而。對於硬件轉發而言,它的輸入是一個IPv4地址,純粹一個數據!它沒有指令,指令就是電路本身。所以,它能夠同一時候進行這一切。就好像這條“指令”是從外部輸入的一樣。

CPU不能運行這種“指令”是由於這個指令它特殊了。現代處理器越來越多地向RISC發展,由程序猿和編譯器自己全然來決定要做什么。而不是處理器的設計者推測程序猿會用到什么功能那樣子。我能夠想得極端一點,假設在一款CISC處理器中,它為了對得起它的分類。它的設計者為其設計了一條“路由查詢”的指令,那么該通過CISC處理器內部的電路,真的有可能跟我上面的這個差點兒相同。
       眼睛有點睜不開了....


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM