人類的創造力與破壞力同樣強大。
網路互通,同樣也衍生出紛繁複雜的路由協議和各種因特網服務,以及"網路安全"這個龐大的領域。
這也是為什麼說當今所有的網路通訊流量中,80%的資源都被浪費,只有20%被用以有效資料的傳輸。
防環機制就是在這樣一個大背景下產生的
環路出現在網際網路的各個層面,不同環路的出現原因與解決方法也不同。
通常網路環路分為第二層環路和第三層環路,所有環路的形成都是由目的路徑不明確導致混亂而造成的。
二層環路主要就是交換機廣播流的惡性迴圈。
三層環路就複雜多了,通常由各種網路故障導致,也是本文研究的重點。
本文將三層環路分成三類:單鏈路環路、跨結點環路、區域/AS間環路。
交換層廣播流與生成樹
除了廣播流,交換機查詢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作為一個古老的路由協議,雖然正逐漸被淘汰,還是有必要了解一番以理解路由協議的進化史。
先談一個易理解的的程式設計師邏輯,即路由器接從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(除了路由洩露)。
因而實現了防環。
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,這也是一種路徑向量的機制。