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