【★】路由環路大總結!


一。前言:

       "人類的創造力與破壞力同樣強大"。互聯網行業尤其是網絡構建這一領域,從根本上一直存在着一個無奈之處:網絡本可以設計的很簡單,只要實現網絡的連通性即可,甚至全互聯,但就是因為要fight against"天災人禍",尤其是人禍,互聯網才衍生出了紛繁復雜的路由協議和各種因特網服務,以及"網絡安全"這個龐大的領域。這也是為什么說當今所有的網絡通訊流量中,80%的資源都被浪費(用於承載路由消息,協議字段等信息),只有20%被用以有效數據的傳輸。

 

防環機制就是在這樣一個大背景下產生的。

       環路出現在互聯網的各個層面,不同環路的出現原因與解決方法也不同。通常網絡環路分為第二層環路和第三層環路,所有環路的形成都是由目的路徑不明確導致混亂而造成的。二層環路主要就是交換機廣播流的惡性循環。

       三層環路就復雜多了,通常由各種網絡故障導致!!!也是本文研究的重點。筆者將三層環路分成三類:單鏈路環路、跨結點環路、區域/AS間環路。

 

二。交換層廣播流與生成樹:

       眾所周知,交換網絡是一個小型的本地接入網(LAN),所以二層交換機默認允許轉發廣播流(路由器則默認丟棄)。除了廣播流,交換機查詢mac地址表無果時會將數據幀從除接收接口外的所有接口發送出去。

       所以最初,當三個交換機兩兩相連時,一個數據幀會在其中無限循環。生成樹就是為了讓交換網絡中防環而出現的。由於具體的生成樹工作原理過於復雜需另成文,在此只做介紹不做詳解。

       生成樹最原始的版本是802.1d,也就是STP(Spanning Tree Protocol),但這個版本的標准是所有VLAN共用一個生成樹,所以也叫CST(Common Spanning Tree)思科在此基礎上增強了一下,發布了PVST+(Per Vlan Spanning Tree)。

       802.1d的下一個版本是802.1w,也就是RSTP(Rapid STP),但還是共用生成樹,搞不懂IEEE不長點記性。於是思科又搞了一下,發布了PVRST+。

       IEEE又基於思科的MISTP的方案,發布了802.1s(MSTP),這個就比較強了,但凡是大一點的交換網絡都用MSTP,也是現在的主流。

 

三。RIP的5種防環機制:

       Rip作為一個古老的路由協議,雖然正逐漸被淘汰,還是有必要了解一番以理解路由協議的進化史。

       !!視角:僅限於自身。rip沒有鄰居表,不知道鄰居的信息,也沒有下一跳。

rip的局限性造致它有5種防環機制,且5種機制默認同時工作!!!

       先談一個易理解的的程序員邏輯,即路由器接從F0接口收到的某個路由條目A不應該從F0反發出去(水平分割),但是距離矢量路由協議的路由更新要向外發送完整的路由表,因此從F0發出之前將A路由的度量值改為15,這樣對方收到的A的度量值為16不可達(計數最大跳&毒性逆轉)。

       當路由器R1檢測到某網段的網絡故障(比如收到icmp報錯),它將要做兩件事,第一,告訴其他路由器:"你們無法從我這里到達這個子網",第二,尋找其他路徑到達這個子網。此時R1將抑制定時器,即在規定時間內不接收鄰居發來的關於該子網的路由。試想若沒有抑制定時器,這時鄰居正好發送該子網的路由,而這條路徑恰好經過R1,那么后果將不堪設想。

       在抑制時間內R1在做什么呢?當然是等待rip網絡中所有路由器都收到這條16跳的路由后更正自己的路由表,因此需要觸發更新,不必等時間到期再發路由表。此外當某接口的度量值被改動了也會觸發更新,防環原理相同。

       可以看出rip的5個防環機制中,設置最大跳才是終極武器,它配合抑制定時器,不僅能解決"單鏈路環路",更能防止"跨結點環路"。

 

四。EIGRP與DUAL算法:

視角:周圍可視/局部視角。

Eigrp的進步之處在於多了兩張表:鄰居表與拓撲表。

       鄰居表的建立直接避免了單鏈路環路:當在收到的路由更新中看到下一跳是自己,那沒得說了,這條更新定是來源於我的,拒收。

       Eigrp的核心算法叫DUAL(彌散更新),其中有一條公式專門用來防止跨結點環路:當鄰居通向一個網絡的報告距離(RD)比本地路由器通向同一個目的網絡的可行距離(FD)短時,即符合了可行性條件(FC),該路徑被寫進拓撲表。但這樣的算法可想而知也是有缺陷的,即很多高開銷的可行備份路徑也會被當做"環路"而拒絕收錄。

!有一個特例:手動匯總導致的環路。

       其實匯總本身是有"缺陷"的,當路由器把匯總的主類網路由更新傳給對端時就相當於讓對端生成了一些關於那些"不存在"的子類網路由指向自己。這樣就不合理了,如果該路由器有一個默認路由指向對端的話,環路就形成了,一個以不存在的子網ip為目的地址的惡意數據包就會在兩個路由器之間無限循環,直到跳數壽命終結。

       解決方法(默認開啟)是利用null0接口。本地生成的匯總路由指向這個邏輯空接口,這里要提一下路由查詢的先后順序:收到數據包先查看普通的單播路由條目,再查看本地匯總路由條目,最后才看默認路由。如圖,這樣就可以識別出那些數據包是惡意數據包,並且從null0口丟棄。

 【★】路由環路大總結!

五。Link state路由協議與SPF算法:

!視角:全局(整個區域)視角/上帝視角。

       除了擁有鄰居表,Ospf有一張很強悍的表,叫LSDB(鏈路狀態數據庫)(同is-is)。在每個ospf區域中,通過互發lsa(跨網段傳輸的鏈路通告),每個路由器都能夠獲悉所在的整個區域的拓撲和鏈路狀態。這樣一來在區域內選路就可以從全局的視角鎖定最佳路徑,並且百分百無環路,無論是單鏈路環路還是跨結點環路都可避免,這是鏈路狀態路由協議的創新之處。

   OSPF區域間路由環路的避免又是通過哪種方式實現的?答案是:分層結構的拓撲實現。Ospf規定所有常規區域都要鏈接到骨干層,即使物理上與骨干層分隔,也要有條邏輯鏈路(虛鏈路)連接到骨干區域。這種樹形結構從根本上就摒棄了環路。因此ospf也是天然無環的。

   與ospf相似的IS-IS,則不要求L1層必須連接到L2層,因而有兩個獨特的防環機制:第一,非L2區域的通信都要通告L2區域轉發;第二,L2區域路由默認不會進入L1(除了路由泄露)。因而實現了防環。附圖:SPF樹。

 

六。BGP的高層防環機制:

   談到Bgp就要有關AS自治系統,bgp的防環主要分為AS內防環與AS間防環(可以類比ospf的區域內和區域間)。

   AS間:路由更新的as-path字段包含所經過的所有AS號,當bgp路由器看到路由更新中有自己的AS號就會果斷放棄這條更新(但在特殊情況下可以用命令取消這個特性)。這就是距離向量與距離矢量之間的區別:距離矢量路由協議(如rip)只記錄到達目的地經過多少步,而距離向量路由器則記錄了途中經過的路徑。看來學好思科還得咬文嚼字啊。

   Ibgp的水平分割原則是:IBGP鄰居所收到的路由信息,不會傳遞給其它的IBGP鄰居,但可以傳遞給EBGP鄰居。注意這和rip的水平分割不大一樣。水平分割是為了防止3個及以上的ibgp peer圍繞成環,造成自治系統內部的跨結點環路。

   除了網絡故障帶來的路由環路,網絡的不合理規划也會造成環路。比如在BGP中如果讓ibgp間的中轉路徑路由器處於另一個AS內的話就會造成環路。當然這只是其中一個例子,意在說明人為的環路是很難避免的,但思科想的還真周到,提供了next-hop-unchange這條命令來處理上面那個環路。

   注意,通常使用路由反射器(RR)來解決水平分割帶來的路由不學習的問題,但搞笑之處在於,水平分割用來防環,路由反射器用來防水平分割,因而反射器又產生了環。后來RR經過改進,增加了一個特性叫插入簇ID與起源ID。默認情況下RR會在路由更新中加入自己的router-id以及路由更新的起源路由器的router-id,這也是一種路徑向量的機制。

附言:

   有一句古話叫"存在即合理"。路由協議中有一些機制或者說小的細節特性,雖然看似很多余且無用,但卻始終存在着。據我多年的學習經驗,我想這有兩種原因:一,從直覺上感覺它"合情合理",比如bgp宣告路由發更新時打上自己的RID以標注起源信息;二,它的開銷很小,比如RR發送更新包中攜帶一個短消息告訴鄰居自己是RR,這與復雜的數據頭部和各種周期消息比起來根本微不足道。


免責聲明!

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



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