徹底理解Cisco/
linux/Windows的IP路由
-1.只要理解實質,名稱并不重要!
很多使用
linux的網絡高手在面對Cisco管理員的諸如管理距離,路由度量等詞匯時,還沒有PK就自覺敗下陣來了。我覺得這實在太可惜了,大家本是一家,為何這么為難對方呢?如果理解了實質,如何描述就不是那么重要了。如果一個Cisco設備管理員對你說一些你不懂的名詞,或者對你描述一些Cisco上有但是基于
linux的網關設備上沒有的特性,而且那個人因為擁有了CCIE證書而目中無人,你要怎么面對?如果你是一個熟悉且精通
linux的人(比如我),你首先就要明白,
linux是無所不能的,只要你愿意,你下班回家就能寫一個基于Netfilter的模塊,實現所有的Cisco IOS的特性,如果你認為自己做不到,那么就看完本文,給自己一些信心。(注:我并不貶低以Cisco為業的哥們兒,某種意義上,我也是其中一員,當年只是因為沒錢才沒有考CCIE,因為太TM貴了,因為沒錢,我轉到了一個草根平臺,不高貴,但卻自由。背叛的意義在我這里成了類似“出埃及記”的東西...)
0.要讀一些歷史
一位IT人員,在這里談歷史,有點不妥,但是我請各位關注一下理查德.費曼,一位全才,在關注一下更猛的沃納·卡爾·海森堡,一位歷史系科班出身的頑童。讀一點歷史能讓你知道一些常識,更能讓你明白事情為什么會成現在這個樣子。任何事情都是一點一滴積累的,我們現在的即便再發達的科學技術,都是從原始人發明弓箭(并不是常規認為的發明火開始的,如有疑問,私信)開始的。你可能看不起原始人,因為他們沒有iPad,沒有手機,動不動就咬人...但是我們確實不比他們強多少,我們有iPad,因為蘋果做了它,我們有手機,因為有人賣,我們不咬人,不隨意打人殺人,因為我們害怕法律的制裁...
任何事情一開始都不是復雜的,其基礎理念都是極其簡單的。這是我的信條!然后逐步堆積,就成了現在這個樣子,然后學子們開始背誦,雖然他們不知道為何如此,但是還是在背誦,然后考試成績非常好,被認為是高才生,然后,突然有個機會,聚餐,或者年會,抑或相親,突然聽到了重金屬搖滾樂,...他們不知所措了,...生活不能自理,...唉,總之,我們是復活的魔鬼,而撒旦就是歷史!
1.有類IP和無類IP
IP之初,并無此分類,當時的概念全部是“有類”的。只是到了后來,為了解決逐步發現的問題,才引入“無類”的概念,于是就有了這個分類。不用再強調的是,任何事情一開始是都是無法發現問題和不足的,導致到了后來發現時才能彌補,因此技術上的進化都是逐步堆砌而成的,也造成了一項技術會發展進化得越來越復雜。
當人們在實驗環境下使用IP可以聯網的時候,下一步的計劃就是制定一套如何將這些IP地址分發給需要聯網的機構的方案,這其實也是當時唯一的問題,因為實驗環境中發現的問題都在實驗環境中解決了,真實世界的問題只有將IP地址分配出去并且大家都使用了之后才能發現!鑒于此,美國短視且一廂情愿地將IP地址空間分成了5個類,每一個IP地址的“網絡號”標示了該IP地址的歸屬方的規模,其中A類地址的規模最大,C類地址的規模最小,僅僅能承載254臺主機。
1.1.子網劃分
然而使用A類地址的機構并不是很多,A類地址的數量卻是如此之多,以至于出現了地址浪費問題,于是分級就成了唯一的解決方案,畢竟地址空間已經劃分好,不能推倒重來,那么只能靠分級劃分子網了,于是在一個機構的所有IP地址的主機部分,還可以拉出去一部分用來作為子網網絡號,這就叫基于分類IP地址的子網劃分。于是一個機構中可以承載多個規模相同的子機構,注意是規模相同的!然而這僅僅是裂變的第一步...
1.1.1.問題:為何子網規模必須相同?
子網劃分規模必須相同的言外之意就是子網掩碼必須一致,這成了有類IP子網劃分的硬性規定,但是為何會這樣呢?這就不得不從IP路由的另一個維度,即IP管理平面的路由通告上作一番解釋。
在有類年代,給出一個IP地址,你就能得到所有的信息,你能得到其主類網段,即x.0.0.0/8的A類網段,y.z.0.0/16的B類網段等,進而你就知道該IP屬于什么機構...但是子網劃分就是機構內部的事情了,外界并不知道你的機構內部的子網是怎么劃分的,對于全局的路由通告而言,當然也不能帶有任何子網的信息,也就是說,路由通告只能通告主類網段的路由,并不攜帶子網掩碼!比如RIPv1協議就不能通告1.2.3.0/24這樣的路由!那咋辦捏?畢竟一個子網就是一個小的網段,在IP路由層次上來講就是一個真正的三層網段,172.16.1.0/24和172.16.2.0/24雖然都是屬于172.16.0.0/16這個主類,但是由于有了子網劃分這個操作,它們畢竟不是一個網段!怎么識別并區分它們呢?好辦(此時我這么說并不是意味著我就是上帝,我站在一個后來人的角度,采用一種歷史的眼光來評述這件事)!就配置在接口上的IP地址的掩碼來識別。由于IP地址的配置是獨立的,即使現在,IP地址的自動配置也不是常見的事,自動配置大多在端系統!為了不丟失被掩碼掩掉的網段,必須要求所有同網段的接口配置相同的掩碼,實話說,這是上帝的要求,你可以不遵循,但是你要付出某些主機不可達的代價,,比如,某個接口A配置了172.16.1.0/24的地址,和它通過二層交換機直連的某個接口B配置了172.16.1.128/25的IP地址,那么請問,它們能達到共識嗎?對于接口B而言,172.16.1.0/25的就不是同一個網段的,但是對于A而言,所有172.16.1.0/24都是一個網段的,雖然在如今的無類環境中,這完全沒有問題,完全可以通過路由的方式解決可達性問題,在有類IP環境中,完全按照主類和“通過配置在接口上IP上的掩碼”來識別子網,任何路由協議通告的路由都不會攜帶掩碼,這就成了問題,因此這有類環境中,必須要求子網掩碼一致!
這讓我想起了小說《猴爪》和基于史蒂芬.金的小說拍成的電影《寵物公墓》(又名《夜半鬼敲門》,有兩部)。你希望得到一些逝去的補償,但是你的代價就是更多的逝去!
為何這么復雜?因為有類IP年代,“IP類”隱含了很多的隱性信息,信息高度的不凝聚!你可以從類中得到很多東西...這并不是上帝的方式。
1.2.無類以及VLSM
子網在每個機構被不同程度地劃分著,然而僅僅如此劃分子網是不夠的,第一,一個機構中的子機構不一定規模相同;第二,規模比較大的機構的子機構可能還有子機構,現有的IP地址分配方案無法真實反映實際機構的組織架構關系。
一個分類IP段(即分類IP地址的網絡號標示的部分)已經被分配給了一個機構,那么如何來分配該段內的地址是機構內部的事情,為何還要遵循硬性的子網劃分規定(劃分為規模相同的子王,即子網掩碼相同)呢?由于當時做出來的網絡設備都是按照當時的“有類”標準執行的,所以其結果阻礙了人們靈活地使用IP地址!
終于,有人大膽地要求取消地址分類,VLSM被提出。如此標準提出后,在無類環境中,子網掩碼成了VL(變長)的了,不再是固定的“IP地址的類別指定的掩碼+同分類地址段內相同的子網掩碼”的了,于是你可以寫成IP/mask的形式,IP不再按照基于第一個字節的頭幾位二進制值而分類,mask也不再遵循8,16,24等基于分類地址的固定劃分,事實上,IP可以是任意的符合規定的IP地址,mask如果寫成prefix前綴形式(指示多少連續的1)的話,可以是0到32的任意值!實際上,到此為止,裂變已經發生了!
1.3.合并成超網和CIDR
取消分類帶來了超猛的效果!其中最猛烈的效果就是改變了路由查找的算法,另外改變了人們解讀IP地址的方式。對于路由查找算法的改變就是將路由查找進化到了“最長掩碼匹配年代”,這個后面要說,對于人們解讀IP地址方式的改變,則是在無類環境中,一個塊IP地址段不再和唯一的機構關聯了,它包含的所有IP地址原則上可以屬于任何人,任何機構,可以處在任何物理位置。當然,這也帶來了不少的問題,實際上是將IP地址的分配任務交給了實施人員,一旦出現地址空間碎片,將會導致無法匯聚,從而最終導致路由表的條目增加。
有點跑題!正說著無類的好呢,又扯到它的缺點了...言歸正傳。無類編址的提出實際上最開始是為了解決機構內部分配地址的問題的,然而它事實上卻帶來了一種副作用,那就是將一塊本屬于一個機構的地址段可以延伸到該機構之外,也即,機構和地址塊不再關聯!既然在機構內,一系列的連續子網可以合并成一個主類網絡段,那么現在已經是不再在意機構界限的無類環境了,是否可以將連續的VLSM子網合并成一個大一級的網絡呢?這是肯定可以的,是為超網。取消了分類是解除了一種束縛,隨之解放的就是人們分配IP地址的權力,分配過程變得自由了,因此雖然連續的VLSM子網可以合并成超網,但是你卻并不能假設一定可以這么做。完全有可能1.2.40.0/24在美國,而1.2.41.0/24卻在阿富汗,你當然不能將其合并成1.2.40.0/23,因為它們真的不屬于任何交集內!結果是什么呢?結果就是路由查找算法的改變,可以說是簡化。這個進化的誘因就是:可以合并成超網的若干子網由于允許不屬于同一個分支機構內而無法合并,因此也就不能假設分類環境中的屬于子網的IP地址一定屬于它們合并成的超網中。
擺脫了分類的限制,去除了諸多的假設,路由查找算法就變成了“最長掩碼匹配”算法了,路由查找和IP地址的分配完全沒有關系,一直找到一個所有路由表項中和目標網絡最接近的,將目標鎖定在一個最小的范圍內。這遍可以用一種更加統一的方式來實現查找算法了。而分類IP路由查找的實現則不能做到統一。
1.4.有類IP路由查找算法
有類IP路由查找算法是兩個步驟,可以簡稱為,目標地址分類和子網查找。首先將目標地址分類得到主類網段,然后看系統路由表中有沒有此主類網段的路由,如果沒有則直接丟棄,如果有則看是否有劃分子網,如果沒有劃分子網,則取出下一跳發包,如果有子網劃分則查找該目標地址是否處于其中一個子網內部,如果沒有發現這樣的子網,則丟棄,如果找到了,說明該目標IP屬于該子網,取出下一跳發包。
這個算法在現代網絡人看來,有點奇怪,為何這么查找呢?實際上,在IP分類的年代,如果從一個IP地址中取出了其主類網段,那么它必然處在該主類網段所直接連接的網絡內或者其直連的路由器所承載的子網內,這也是最初IP地址分配的首要原則,IP地址空間只能按機構進行劃分,不能打散!如果沒有找到主類路由或者找到了帶有子網的主類路由但是沒有找到對應的子網,難道你能指望目標在另一個地方嗎?分類IP的分配就是機構和IP地址主類的對應關系,一個蘿卜一個坑,在這種情況下,設置默認路由的唯一意義就是在“找不到主類路由的情況下”進行默認轉發。只要找到了主類路由,轉發還是丟棄就已經確定了!算法如下:
Network=確定主類地址(DST)
Route Entry=Search該主類
if (Route Entry)
if (包含完整的下一跳信息)
轉發
else //僅僅是一個Level 2子網路由的Entry
Route Entry=Search該主類的Level 2路由
if (Route Entry)
轉發
else
丟棄
else if(存在默認路由)
轉發
else
丟棄
典型但不絕對的一種實現方法就是:保存N張路由表(N為IP地址類別數量),添加路由表項的時候,根據目標地址將其置于特定的類別的路由表中,轉發時,根據目標IP地址計算出IP地址類,然后就在該類路由表中進行查詢。
1.5.無類IP路由查找算法
無類IP路由查找算法其實就是“全局最長掩碼匹配”算法,這個在如今已經成了大家認為的那樣唯一一種查找算法,雖然很多網管都知道,分類環境中,并不使用這個算法。最長掩碼匹配的具體內容就不多說了。
算法比較簡單,典型的
linux實現有HASH和TRIE兩種,不管哪一種都是從32位掩碼到0位掩碼的單掩碼查找,找到最先匹配到的。
1.6.現狀
現在主流的
操作系統linux,Windows的路由查找都是無類的,但是Windows的IP地址卻保留了一個有類特性,那就是保留了新添加IP地址主類的廣播地址。對于一種網絡設備OS,比如Cisco 以及H3C VRP,分類IP以及分類路由還是可以啟用的。說實話,隨著IP管理平面的發展,無類IP將逐步取代有類IP,然而不可否認,現如今,某種特定的人工干預情況下,使用分類IP會提高效率,特別是管理員對IP地址分布了然于胸并且路由表項數目很大的時候。
2.動態路由以及路由的管理距離
在網絡的原始社會,靜態路由是唯一的選擇,實際上有它就夠了,因為那時的互聯網也不過超不出兩縱兩橫的規模,節點最大出度入讀不會超過4,甚至只有2。管理員一般都可以把這張網絡完全記在心里或者本子上。但是隨著網絡規模的擴展,靜態路由便成了牽一發而動全身的瓶頸,在一個大型網絡中,如果更改一個IP地址或者斷掉一條鏈路,需要多么高強度的人工干預啊,事實上,即便出動一個團,也無法監控網絡拓撲的更改。動態路由就是這么被呼喚出來的。
動態路由是來幫管理員忙的,減輕他們配置靜態路由的負擔!動態路由有多種,它們使用了不同的路由協議,目的只有一個,可以動態算出到達連通網絡中任意節點的最短距離。不同的算法基本可以分為距離矢量算法和鏈路狀態算法。
2.1.距離矢量算法
這種算法就是在這個網絡的所有路由器節點之間進行運算的,是一種分布式算法??梢栽O想每一個路由器是一個點,連接路由器的鏈路是連接點的邊,所有節點一起開始計算,直到一個穩定的狀態。計算的方法就是信息不斷在節點間通過邊來傳遞,所使用的是分布式Dijkstra算法,因為每一個節點都不是根據自己所掌握的信息自己算出最短路徑的,而是通過別人給自己的信息計算最短路徑的。
由于每一個節點都參與了計算-僅僅是與相鄰節點交互,在相鄰節點的計算結果基礎上,且互相依賴,因此一旦有拓撲變更,信息依賴鏈斷裂,就不得不重來開始一次運算,因此距離矢量算法的收斂速度是比較慢的。
2.2.鏈路狀態算法
這種算法是在每一臺路由器節點上獨立計算的,是一種集中式算法。但是要想進行集中運算,必須要事先有必要的且完整的信息,因此在計算開始之前,必須進行信息同步,當所有節點掌握的信息達到一致后,計算在各個節點分別獨立地進行。發生拓撲變更時,只需要檢測到且同步一下發生改變的部分即可,重新計算僅僅在必要時進行,且無需全體參與。
由于每一個節點獨立運算,和信息(鏈路狀態)的同步分離,相關節點的計算可以在鏈路狀態信息同步后一起同時進行,而不像距離向量那種分布式算法那樣必須依賴鄰居的計算結果,那種情況算法本身就要同步,在前一個節點計算完成前,后一個節點無法計算。因此鏈路狀態協議收斂比較快。
2.3.可信度與可依賴性
存在多種多樣的動態路由協議。如果多種協議同時發現了到達同一目標的多條路徑怎么辦?根據對算法的評估結果,引出一個管理距離的概念。對算法進行評估要比直接設置路由優先級要好,如果說到達網絡A使用RIP生成的路由,到達網路B使用OSPF生成的路由,那一定是極其的混亂,所以就分離出了管理距離。某種動態路由協議生成的路由就是比別的協議生成的要好,這是對算法進行評估的結果,評估點包括但不限于收斂速度。
管理距離是一種硬性的優先級,也就是說,管理距離偏高的路由只是一種備選路由,只要低管理距離的路由存在,高管理距離的路由將永遠不會被使用。同樣的,路由優先級也是這樣一種硬性優先級。
使用設計良好的用戶態程序,可以將管理距離和路由優先級統一成路由項的一個字段。
3.路由的度量和優先級
剛說過管理距離,現在看路由優先級。如果查到了同一目標的多個路由,首先應用管理距離低的,如果管理距離低的有多條,那么就用優先級高(數值低的)的。路由優先級只是和管理距離不同的優先級層次而已。管理距離標示生成該路由的程序的可信度,而此處的路由優先級標示路由的度量,即該條路由的代價或者路由的好壞,也稱做Metric值。
linux在添加路由時,如果目標相同,就會基于你設置的Metric值來排序,這樣,Metric比較小的路由就會排在前面,而的路由查找是在最長掩碼匹配的基礎上進行第一次匹配,即只要有符合的就會跳出來輸出結果。
3.1.關于“躍點”
如果man一下
linux的route命令,就會出現:
Metric The 'distance' to the target (usually counted in hops). It is not used by recent kernels, but may be needed by
routing daemons.
是的,如今的
linux內核上已經沒有“躍點”了,但是Windows上有,就在你配置網卡IP地址的時候,在“高級”里面有一個“自動躍點計數”的選框,自動躍點計數一般就是20,你也可以手工寫入一個值。這個值的含義其實就是你配置的IP地址生效的時候,內核生成的直連路由的Metric值,
linux內核將這個配置去掉了,也就是說,直連路由的Metric為默認值0。“躍點”這個翻譯實在是不太好,叫做接口代價或許更加好一點吧。
最后有一個
linux路由配置的問題。內核結構體fib_info中的字段名字真的在誤導人??!其中的fib_priority其實對應的是iproute2中的metric,而其中的fib_metrics(注意復數)實際上和常規意義上理解的路由metric沒有關系,它僅僅指示的是該條路由的某些特征計數值,比如該條路由的MTU。一條路由指的是到達目的地的路徑,因此fib_info里面的fib_metrics數組都是該條路徑的計數值,比如fib_metrics[RTAX_MTU-1]代表的就是該條路徑的MTU,使用它就省去了MTU發現的過程了,也可以直接在端系統指導分片。這些計數值目的在于告訴行路者,即數據包這條路上的一些特征,以使端系統或者中間系統可以直接根據這些計數值初始化一些協議字段,如果沒有這些計數值,可能需要協議來執行某種動作來“發現”這些值。
5.關于翻譯
route,這個詞無論如何都不宜翻譯成“路由”,這么翻譯太神秘了,實際上,google翻譯的結果更好一些:路線,路徑,航線。“路由”這個結果有點民國的意味,類似“記憶體”,“網路”一樣。如果翻譯為“路線”,“路徑”的話,我想很多人就會明白“下一跳”的概念了?,F在單說“下一跳”,即nexthop,注意hop這個詞尾用的很妙,它直接“隱藏了下面的鏈路層”,就像飛過去了一樣,如果寫做next station,那么你就會想到“經過一段路”,一段好長好坎坷的路,到了下一站,公交車或者火車都可能鉆山洞...實際上對于IP路由而言,這是事實!所以,我覺得,既然確定了nexthop這個詞,那么route就應該翻譯成“航線”才更加信,達,雅。