OSPF LSA詳解node
OSPF V2版本中經常使用的主要有6類LSA,分別是Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA、AS-External-LSA、NSSA-LSA,接下來我將一步一步爲你們解析。算法
Type 1:Router-LSA數據庫
每一個設備都會產生,描述了設備的鏈路狀態和開銷,在所屬的區域內傳播。網絡
談到1類LSA,你們必然會想到它的鏈路類型,鏈路類型分爲4類:P2P、Stub、Transit、Vritual link。ide
Link Type |
Link ID |
Link Data |
P2P | 鄰居的RID | 本身的IP |
Stub | 網絡號 | 掩碼 |
Transit | DR的接口地址 | 本身的IP |
Vritual link | 鄰居的RID | 本身的IP |
經過上述表格你們是否能明白什麼意思?oop
經過MA網絡抓包能夠看到學習
這是我隨機截的一個1類LSA的包,10.1.12.2爲互聯IP地址,2.2.2.2/3.3.3.3爲loopback口地址,能夠看到loopback的鏈路類型爲Stub類型,爲最末端,也沒法再繼續添加任何接口。互聯接口的鏈路類型爲Transit類型,因爲此時的網絡類型爲Broadcast。測試
當我把R1和R2的網絡類型更改成P2P以後,能夠看到以下現象;更改網絡類型命令:在接口下ospf network-type p2p來實現spa
能夠發現互聯鏈路類型爲P2P,10.1.12.2的link-id爲對端的RID,此接口已變爲Stub鏈路類型。3d
測試Virtual Link鏈路類型:
模擬方法以下:
拓撲:
虛鏈路配置方法以下:
R1:
在area模式下配置:vlink-peer R2的router-id
R2:
在area模式下配置:vlink-peer R1的router-id
R1和R2之間創建Virtual-Link,創建完成後在R1-R2之間的鏈路抓包以下:
能夠發現R1-R2之間的鏈路類型爲Virtual Link。
注:虛鏈路在現實環境中用到的不多,只能說在個人職業生涯中還沒碰到過,不過Vlink是一個解決區域隔離的有效方法。
總結:每種鏈路類型在什麼狀況下會出現?
P2P:非MA link上會有P2P link state。(OSPF網絡類型:P2P P2MP)
Stub:僅當有stub link,如沒有鄰居的ethernet ,or secondary address 網絡,loopback 接口網絡or P2P link上的網絡號都是以stub形式出現。
Transit:MA網絡中每臺路由器都會產生transit類型的LSA1。
Virtual Link:在創建了虛鏈路的狀況下會產生Virtual link的LSA1。
Type 2:Network-LSA
由DR(Designated Router)產生,描述本網段的鏈路狀態,在所屬的區域內傳播。
根據報文來查看,不少段1類LSA裏也存在,就像LS Age、LS ID、AR 、LS seq等等。那我就根據這些段簡單的聊聊吧。
LS age:LSA的老化時間,範圍是0~3600s,一個路由器在始發一個LSA時,會把LS Age設置爲0,通過一臺路由器,LSA的老化時間就會增長一個infTransDelay設定的時間,默認爲1s。
當一條LSA通告的老化時間達到最大生存時間時,LSA將被從新泛洪擴散,而且隨後會從LSDB中清除該條LSA。當一臺路由器須要從全部路由的數據庫中清除一條LSA時,它會提早把這條LSA的老化時間設置爲最大生存時間並重慶泛洪擴散這個LSA。在這裏,只有始發這條LSA的路由器才能夠提早使這條LSA老化。
問:在什麼狀況下,OSPF會在LSDB中存在大量未老化的LSA?
答:當設備剩餘內存下降時,SOCK會優先上送隊列優先級較高的報文,當剩餘內存很低時,除了Hello報文以外的其餘協議報文均不上送,形成LSA沒法獲得更新,Age值達到3600s以後,OSPF沒法計算出路由,而且因爲ACK報文也不上送,形成LSDB沒法老化。#摘自Hedex文檔
至於Link state ID、Link-state Advertisement Type、Advertising Router、LS seq、LS Checksum、Length等信息,相信你們能夠看懂,只要對OSPF LSA有點了解,這些也就是字面意思。
下面給你們分析一下option字段:
DN位:全稱Downbit,主要出如今MPLS ×××環境中。
O位:O比特被定義使用在OSPF的option字段中,用來講明路由器是否有能力發送和接收opaque LSA。
當咱們部署MPLS TE且使用OSPF做爲TE的時候,OSPF就須要擴展以便支持MPLS TE,這時候就能夠看到Obit位的置位了,並且只可以在這種環境下的DBD報文中看到相應的option的obit置位,而其餘報文中的option裏obit仍然爲0。
NP位:其中N/P位爲1位,N位及P位分別只出如今HELLO及LSA報文中:
在Hello報文中:N bit指示該路由器爲NSSA區域路由器,當N bit被置1時E bit就必須被清零。
在LSA報文中:P bit僅在7類LSA中出現。
MC位:該位描述是否組播擴展OSPF。
E位:當始發路由器具備接受AS外部LSA的能力時,該位將被設置。
在全部的AS外部LSA和全部始發於骨幹區域以及非末梢區域的LSA中,該位將設置爲1。而在全部始發於末梢區域的LSA當中,該位設置爲0。另外,能夠在Hello數據包中使用該位來代表一個接口具備接收和發送類型5的LSA的能力。E位配置錯誤的鄰居路由器將不能造成鄰接關係,這個限制能夠確保—個區域的全部路由器都一樣地具備支持末梢區域的能力。
Type 3:Network-summary-LSA
由ABR產生,描述區域內某個網段的路由,並通告給發佈或接收此LSA的非Totally STUB或NSSA區域。
徹底末梢區域是不存在3類LSA的,NSSA區域沒有5類和3類LSA,多了7類LSA。
若是在OSPF中執行了Area間彙總,那麼LSA3中通告的就是彙總路由而不是明細的,其實這裏就應該說成時「路由」而不是「鏈路」,由於LSA3自己通告的就是各網絡如何可達,接受路由器並不明瞭該Area的拓撲結構,只是以DV的思想,將LSA3中通告的鏈路加上本身到ABR的開銷就放進路由表了。
經過實驗來查看3類LSA,拓撲以下:
咱們在ABR上的Area 1裏面作彙總,命令以下:abr-summary 3.1.0.0 255.255.0.0
你查看路由能夠發如今R2上看到的是兩條明細路由分別爲3.1.1.0/24和3.1.2.0/24,在R1上查看到的是一條彙總路由3.1.0.0/16。這是因爲在ABR上面作了彙總,能夠經過命令display ospf lsdb summary查看3類LSA的明細。以下:
經過查看,能夠發現這條3類LSA的始發路由器爲R2,並非原路由器R3了。當作了路由彙總以後,這條彙總路由的通告路由器即是作彙總的這個ABR。
Type 4:ASBR-summary-LSA
由ABR產生,描述到ASBR的路由,通告給除ASBR所在區域的其餘相關區域。
LSA3和LSA4都由ABR始發,報文格式是相同的,只不過有幾處字段內容不同。在「鏈路狀態ID」這個字段中,LSA3通告的是網絡或子網的IP地址,而LSA4通告的是ASBR的路由器ID;而「網絡掩碼字段」對LSA4沒什麼意義,設置爲0.0.0.0。
一臺Router成爲ABR的前提是必須有運行OSPF進程的接口與Area 0直連,不然不會產生LSA3和LSA4,也就沒法完成ABR的任務,解決辦法通常是經過虛鏈路。
LSA3和LSA4都只能在單Area內泛洪。具體來看,LSA4就是在Area0內泛洪讓ABR都知道ASBR在哪;而LSA3這裏要注意,好比Area1和ABR將Area1的路由信息通告進Area0,成爲一個LSA3,由於不只要加上本身到那個ABR的鏈路開銷,並且ADV Router也要改成本身,新的LSA3會進入到Area2並泛洪開來,因此仍是遵照了LSA3的泛洪原則。從一個側面也能夠看出,OSPF進行Area間路由是典型的距離矢量的行爲。
如上拓撲,我在R3上新建loopback 3和loopback 4引入,這樣R3便成爲了ASBR。
咱們在R1上查看4類LSA的詳細信息:
經過能夠看到LS id爲R3(ASBR)的router-id,通告路由器爲R2(ABR)的router-id。固然有4類LSA存在的話,必然有5類LSA或7類LSA。由於4類LSA是通告到ASBR的路由,從其餘區域到ASBR的路由。
Type 5:AS-External-LSA
由ASBR產生,描述到AS外部的路由,通告到全部的區域(除了STUB區域和NSSA區域)。
LSA5通告了ASBR直連的其餘AS的路由信息,不一樣於BGP中AS的概念,這裏指IGP區域。LSA5被Flooding至除Stub、Totally Stub、NSSA之外的全部Area,是惟一的一個不與任何Area相關連的LSA通告。
LSA5造成的路由條目以Type1或Type2表示,經過命令改成Type1類型。在ospf進程下,配置命令import direct|static|rip|ospf|isis|bgp type 1 便可改成Type 1 方式計算Cost。
Type1 Cost=本地到ASBR的Cost+ASBR到AS外部目的網絡的Cost
Type2 Cost=ASBR到AS外部目的網絡的Cost
當OSPF路由器得到一條LSA5,在裝進路由表以前會檢查「轉發地址(Forwarding Address)」是否能夠經過Area內或Area間路由到達,若不可達,不會裝進路由表。
Type 7:NSSA-LSA
由ASBR產生,描述到AS外部的路由,僅在NSSA區域內傳播。
談到7類LSA,必然會牽扯出NSSA區域。到底何爲NSSA區域呢?
OSPF規定STUB區域是不能引入外部路由的,這樣能夠避免大量外部路由對STUB區域路由器帶寬和存儲資源的消耗。對於既須要引入外部路由又要避免外部路由帶來的資源消耗的場景,STUB區域就再也不知足需求了。所以產生了NSSA區域。
OSPF NSSA區域(Not-So-Stubby Area)是OSPF新增的一類特殊的區域類型。
NSSA區域和STUB區域有許多類似的地方。二者的差異在於,NSSA區域可以將自治域外部路由引入並傳播到整個OSPF自治域中,同時又不會學習來自OSPF網絡其它區域的外部路由。
還記得在上一章談鄰接關係的時候談到DD報文,DD報文裏有一個字段NP-bit就關係到NSSA區域,當NP-bit置位時,表示此區域爲NSSA區域。
而7類LSA是爲了支持NSSA區域而新增的一種LSA類型,用於描述引入的外部路由信息,Type7 LSA由NSSA區域的自治域邊界路由器(ASBR)產生,其擴散範圍僅限於ASBR所在的NSSA區域。NSSA區域的區域邊界路由器(ABR)收到Type7 LSA時,會有選擇地將其轉化爲Type5 LSA,以便將外部路由信息通告到OSPF網絡的其它區域。
爲了將NSSA區域引入的外部路由發佈到其它區域,須要把Type7 LSA轉化爲Type5 LSA以便在整個OSPF網絡中通告。在Type7 LSA中有一個P-bit(Propagate bit),用於告知轉化路由器該條Type7 LSA是否須要轉化,只有P-bit置位而且FA(Forwarding Address)不爲0的Type7 LSA才能轉化爲Type5 LSA;若不置位,將不會轉化爲5類LSA。缺省狀況下,轉換路由器的是NSSA區域中Router ID最大的區域邊界路由器(ABR)。區域邊界路由器產生的Type7 LSA不會置位P-bit。
在NSSA區域中,咱們可能同時存在多個ABR,當出現多個ABR後,都計算彼此之間的路由,可能會產生環路,因此爲了防止環路的產生,定義邊界路由器之間不計算對方發佈的缺省路由。
Forwarding Address
關於FA,它有爲0或非0兩種狀況,我從下面實驗來幫你們認識FA。
場景:此環境爲MA環境,R1和R2之間屬於OSPF Area0,R3不屬於OSPF。在R2上創建指向3.3.3.3/24的靜態路由,並引入OSPF中。
而此時R2屬於ASBR,咱們在R2上查看display ospf lsdb ase能夠發現,R2爲3.3.3.3的通告路由,FA地址爲10.1.1.3。
一樣在R1上看3.3.3.3 5類LSA的內容也是如此。當存在FA時,此時路由器不會再去找ASBR,而是會根據FA地址來轉發到3.3.3.3。在R1上trecert便可發現。
經過追蹤3.3.3.3的ping包能夠發現,數據包根本不會到達ASBR,根據FA地址,就直接丟過去了。
總結:當FA爲非0時,OSPF區域內路由器不會再去尋找ASBR,直接根據FA地址轉發。
那什麼時候FA爲0呢?如今咱們作一點小小的更改。
將OSPF網絡類型更改成P2P模式,在接口模式下配置ospf network-type p2p便可。
此時在R2上查看5類LSA內容,發現FA此時爲0
當FA爲0時,它的數據包該如何轉發呢?因爲R2爲ASBR,爲了查看效果咱們在R1上tracert 3.3.3.3測試。
此時你會發現,R1到3.3.3.3走了兩跳,先到達R2 ASBR,再到達R3。
結論:當FA爲0時,OSPF區域內路由首先找到ASBR,再從ASBR到目的地址。這樣你就會發現產生了次有路徑,因此FA還能解決次優路徑。
接下來爲你們總結一下,FA什麼時候爲0什麼時候爲非0。
若是外部路由的下一跳地址知足,在asbr上。
一、下一跳地址所對應的網絡發佈到ospf內
二、下一跳所在的link沒有slient
三、下一跳地址所在的link的網絡類型不是P2P或P2MP
知足上述條件,LSA5 Forwarding Address是非0.0.0.0,等於下一跳地址;
若是不知足,則LSA5 Forwarding Address是0.0.0.0 。
固然FA在7類LSA中也存在,可是在7類LSA中FA始終爲非0。
緣由:在NSSA區域,會產生多個ABR,這樣若是FA爲0時,容易產生次優路徑或環路。從下面FA的做用的場景中能夠看出。
剛纔也說過,FA能避免次優路徑,這提到了FA的做用,FA有兩大做用:
一、避免次優路徑
二、避免環路
一樣以場景來爲你們解釋:
一、避免次優路徑
根據上面拓撲來分析:
當FA地址爲非0時,在R4上查看FA=10.1.12.1,數據包路徑:R4->R2->R1
當FA地址爲0時,數據包路徑:R4->R3->R1(次優路徑)
分析:這樣就產生了次優路徑,爲啥會走R3呢?那是由於在NSSA區域中若出現多個ABR,由router-id大的那個ABR作轉發,這是爲了不環路的發生。若是LSA5不攜帶FA地址或7/5轉換時把FA地址抑制掉,R3上進行7/5轉換後,生成的LSA5中的FA爲0,R4收到這條LSA5時,尋找到ASBR最短路徑,經過計算下一跳爲R3,這樣次優路徑就產生了。
二、避免環路
就將上面環境作一下小小的更改
R2和R3之間直連一根線,在Area 1內,刪除了R1-R2之間的互聯。而且將R2的router-id改的比R3大。
此時,咱們來分析一下:
當FA爲非0時,數據包路徑:R4->R3->R1
當FA爲0時,數據包路徑:R4->R2->R3->R4(環路產生)
分析:當FA爲非0時,數據包固然會根據FA來轉發,最終到R1。但FA爲0時,此時R4須要找到ASBR,因爲把R2的router-id改大了,此時R2爲ASBR。這樣R4->R2。固然對於R3來講,此時R3在NSSA區域會收到一條關於1.1.1.1/24的7類LSA,而在R2上進行7/5轉換以後,5類LSA會在非STUB、NSSA區域內泛洪,這樣R3也會收到一條關於1.1.1.1/24的5類LSA。收到兩條相同的LSA,此時R3會進行cost比較,因爲R4傳來的5類LSA開銷更小,因此R3到達1.1.1.1/24的下一跳爲R4,這樣就產生了路由環路。
這裏可能會糾結一個問題:就是R3爲何會選擇R4,而不會根據接口G0/0/2到達ASBR-R2?
R2產生的LSA5只能在Area 0泛洪,不能再NSSA區域泛洪。那對於R3來講,它經過R2在Area0和Area 1內產生的LSA1得知R3是ASBR,從Cost上來講應該選擇直連鏈路到達R2,可是由於R3是在Area 0獲得的LSA 5,因此只會使用本區域的LSA1計算到達ASBR的路由,也是最終R2去往外部路由的下一跳是R4的緣由。
咱們在操做的時候,能夠經過nssa suppress-forwarding-address將FA地址抑制。記得在Area下配置哦。
那以上這幾種LSA是如何放環的呢?
Type1 LSA/Type2 LSA
區域內LSA1/LSA2,根據LSA1/LSA2而畫出的區域內的graph可經過dijkstra算法構建出SPF樹。SPF tree是從執行計算的當前節點,即root node到全部其餘節點的最短路徑成本樹,建樹的過程就消除了環路。
Type3 LSA
Type 3是在區域間傳遞網絡路由信息的,特定區域結構(非0 Area圍着Area 0)及區域邊界處的水平分割規則限制從一個區域出來的LSA3不會流回到源區域,避免LSA3路由所致的環路。
Type4 LSA
放環的方式和LSA3一致;區別於LSA3的地方在於LSA3傳達的是到目標網段的路徑信息;而LSA4傳達的是到目標路由器的路徑cost信息
Type5 LSA
依賴於LSA3和LSA4來防止環路和選擇最優路徑。
LSA5在OSPF Domain內Flooding時,沒有區域邊界的限制,因此LSA類型3的放環規則對LSA5不適用。但LSA5可否進入路由表並致使環路,得依賴於類型3或類型4。
LSA5有Forwarding-Address字域,非0.0.0.0值參看對應的LSA3的選路信息;0.0.0.0值則根據LSA4來選路。只要LSA3和LSA4不致環路出現,LSA5就不致環路出現。