文章出處:http://blog.csdn.net/dog250/article/details/6596135
1. 路由表
路由資訊最終要儲存在用於路由器的主機或者專業路由器上,存放這些資訊的地方稱為路由表。其中包含三元素:目標地址、掩碼、下一跳。
1.1 查詢路由表的開銷
有人認為查詢路由表是一件和交換器查詢MAC地址一樣的事,那就大錯特錯了,查詢MAC地址 / 連接埠對是一種固定的資料尋找,MAC地址都是固定的48位元組,而IP地址呢,自從CIDR出現以後,地址成了“無類”的了,因此任意位的掩碼都能成為正確的掩碼。另外,聰明的管理員想出了路由匯聚,這些傢伙將負擔轉嫁給了系統的實現者,從而系統實現者必須實現“最長掩碼”匹配,既然掩碼是不固定的,因此查詢就是不固定的,這是很麻煩的事。
2. 轉寄表
資料包到達路由器的時候,要根據“指示”前往特定的連接埠,類似交換器的地址資訊表,路由器上存放這個“指示”的地方叫做轉寄表。
3. 兩個表的關係
3.1 聯絡
轉寄表直接作用於資料包,而路由表是轉寄表產生的依據,轉寄表通過路由表產生。一個特定的進程可以通過使用路由表中的資訊,加上自身主機方面的資訊 --- 比如網卡等資訊 --- 加以綜合,得到一張轉寄表。路由資訊和主機是沒有任何關係的,它只描述網路鏈路狀態和方向。
3.2 區別
兩表格儲存體的資訊是不同的。路由表只儲存三元素 --- 目標、掩碼、下一跳;而轉寄表格儲存體更詳細的資訊,比如輸出連接埠資訊,比如標記資訊等。轉寄表描述了主機方面的資訊,在主機內部將一個資料包從一個連接埠導向另一個連接埠。而路由表描述網路資訊,將資料包從一個機器導向另一機器。
4. 誤區
當前很多人都懂一個系統的實現。這些人不外乎3類,第一類精通linux核心,第二類精通Cisco裝置的配置,第三類精通Windows網路編程以及NDIS。三類人一般的交集很少,因此大部分熟悉Linux核心的人都不會去區分路由表和轉寄表,因為Linux核心本身就不區分這兩個表,每到一個資料包都會查路由表(當然,前面還有一個緩衝。。。但這不是轉寄表);熟悉Cisco的傢伙會認為這兩個表是一定要區分的,否則MPLS怎麼實現?熟悉Windows核心的人呢?可能並不關心這些,因為Windows幾乎不用於路由器。
5. 區分二表的好處之執行個體
MPLS是區分路由表和轉寄表的一個明顯例子。首先聲明,MPLS是一個網路,而不是運行特定協議的一個節點。在MPLS中,完全通過標籤進行資料包轉寄,在MPLS網路可用於資料業務之前(中間也可以通過標籤分發協議動態調整),MPLS轉寄表就建好了,它的表項包含三元素:來來源資料內建標籤 / 轉寄到的連接埠 / 轉寄出去攜帶的標籤。這個表項是通過路由表建立的,我們將之視為轉寄表。實現MPLS需要在入口路由器上為資料包單獨打上一個標籤,這樣直到出去MPLS網路,資料包就可以快速被轉寄了,省去了直接查詢路由表的開銷。
6. Linux通過NAT原理配置轉寄表
如果管理員能事先“打通一條路”,那麼就可以在每一個路由器的入口上配置DNAT,然後在其出口配置SNAT,從而實現一個標準的點對點的IP鏈路,每一個節點都以為資料要發往“下一跳”,而不是越過下一跳的“遠端機器”。由於NAT基於串連,它為無方向的IP網路增加了方向性,因此配置SNAT後就無需再配置反向路由了。
鑒於上述的方式,如果我們能在DNAT資訊中識別標籤資訊然後直接確定輸出連接埠,同時在輸出連接埠的SNAT中封裝上新的出口標籤,無需在進入路由模組,這就是一個MPLS實現。然而目前的標準linux核心的Netfilter中並沒有如此實現。
7. 優勢
除了可以實現MPLS等特定的專用線路網路之外,轉寄表和路由表分開的最大好處在於其可以使用硬體實現轉寄表,從而實現高速鏈路轉寄,而路由表很難用硬體實現,原因就是它不是精確匹配的,而是“最長首碼”匹配,這裡面充滿了變數。