鏈路狀態協議的排序和老化
鏈路狀態協議具備了很多復雜的過程。我們今天就來對這個狀態的泛洪擴散解釋一下。首先我們需要對這個狀態的基本情況有一個正題概括,那么還是常規地,先來對這個概念了解一下。鏈路狀態泛洪擴散(Flooding),在建立了鄰接關系之后,路由器開始發送LSA給每個鄰居,同時,每個鄰居保存接收到的LSA并依次向它的每個鄰居轉發,除了發送該LSA的鄰居之外,在這里優于距離矢量的一個特點是:LSA幾乎是立即被轉發的!因此,當網絡拓撲發生變化時,鏈路狀態協議的收斂速度要遠遠快于距離矢量協議;
路由選擇協議中的泛洪擴散過程是鏈路狀態協議中最復雜的一部分,有幾種方式可以使泛洪擴散更高效和更可靠,如使用單播和多播地址、校驗和以及主動確認,其中有兩個過程是極其重要的:排序和老化;
1、序列號
假設這樣一種情況:路由器C先從B收到了A發出的一個LSA并保存到自己的拓撲數據庫中,接著又通過路由器F收到了同樣的這個由A發出的LSA,路由器C發現數據庫中已經存在了該LSA(知道是從B收到的),那么路由器C從路由器F接收到的這個LSA是否應該向路由器B轉發?答案是不轉發!因為路由器B已經收到了這個LSA,由于路由器C從路由器F接收到的LSA的序列號與早先從路由器B接受的LSA序列號相同,所以路由器C也知道這一情況,于是將該LSA丟棄;
當路由器A發送LSA時,在每個拷貝中的序列號都是相同的,此序列號和LSA的其他部分一起被保存在路由器的拓撲數據庫中,當路由器收到數據庫中已存在的LSA且序列號相同時,路由器將丟棄這些信息;如果信息相同但序列號更大,那么接收的信息和新序列號被保存到數據庫中,并且泛洪擴散該LSA;
因為序列號被攜帶在LSA中的一個固定字段內,所以序列號一定有上限,那么當序列號到達上限時會發生什么呢?
1)線性序列號空間
一種辦法是使用一個非常大的線性序列號以至于根本不可能到達上限,如使用32位長字段(IS-IS就是這樣);如果一個鏈路狀態路由選擇進程用完了所有序列號,那么它在重新使用***序列號之前必須停止(重新啟動),并等待它所發出的LSA在所有數據庫中都不再使用。假如***的時間是1個小時或者更長,那么這種方法是不可行的。
2)循環序列號空間
這種方法數字是循環使用的,在32位空間內緊跟在4294967295后面的是0;它在重新啟動路由器后也可能會遇到同線性序列號一樣的問題!
3)棒棒糖序列號空間
這種方法是線性序列號空間和循環序列號空間的綜合,它有一個線性組件和一個圓形組件;性線空間的缺點是不能循環使用序列號,即序列號是有限的,而圓形空間的缺點是不存在一個數小于其他所有的數。
2、老化(Aging)
LAS包格式中有一個年齡字段,當LSA被創建時,路由器將該字段設置為0,隨著數據包的擴散,每臺路由器都會增加通告中的年齡。當然,另一個選項是從某個***年齡開始,然后遞減,OSPF是遞增,IS-IS是遞減;
鏈路狀態協議老化過程為泛洪擴散增加了可靠性,該協議為網絡定義了一個***年齡差距(MaxAgeDiff)值。路由器可能接收到一個LSA的多個副本,其中序列號相同,年齡不同。如果年齡的差距小于MaxAgeDiff,那么認為是由于網絡的正常時延造成了年齡的差異,因此數據庫原有的LSA繼續保存,新收到的LSA(年齡更大)不被擴散;如果年齡差距超過MaxAgeDiff,那么認為網絡發生異常,因為新被發送的LSA的序列號值沒有增加。在這種情況下,較新的LSA會被記錄下來,并將數據包擴散出去。典型的MaxAgeDiff值為15min(用于OSPF);
若LSA駐留在數據庫中,則LSA的年齡會不斷增加。如果鏈路狀態記錄的年齡增加到某個***值(MaxAge)-由特定的路由選擇協議-那么一個帶有MaxAge值的LSA被泛洪擴散到所有鄰居,鄰居隨即從數據庫中刪除相關記錄;
當LSA的年齡到達MaxAge時,將被從所有的數據庫中刪除,這需要有一種機制來定期地確認LSA并且在達到***年齡之前將它的計時器復位。鏈路狀態刷新計時器(LSRefeshTimer)就是做此用途的;一旦計時器超時,路由器將向所有鄰居泛洪擴散新的LSA,收到的鄰居會把有關路由器記錄的年齡設置為新接收到的年齡。OSPF定義MaxAge為1小時,LSRefreshTime為30min。