OSPF詳解之三:OSPF LSA詳解
OSPF LSA詳解
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。
Link Type | Link ID | Link Data |
P2P | 鄰居的RID | 自己的IP |
Stub | 網絡號 | 掩碼 |
Transit | DR的接口地址 | 自己的IP |
Vritual link | 鄰居的RID | 自己的IP |
通過上述表格大家是否能明白什麽意思?
通過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來實現
可以發現互聯鏈路類型為P2P,10.1.12.2的link-id為對端的RID,此接口已變為Stub鏈路類型。
測試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 VPN環境中。
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上。
1、下一跳地址所對應的網絡發布到ospf內
2、下一跳所在的link沒有slient
3、下一跳地址所在的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有兩大作用:
1、避免次優路徑
2、避免環路
同樣以場景來為大家解釋:
1、避免次優路徑
根據上面拓撲來分析:
當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,這樣次優路徑就產生了。
2、避免環路
就將上面環境做一下小小的更改
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就不致環路出現。
本文出自 “網工小白” 博客,請務必保留此出處http://xiaojiejt.blog.51cto.com/12536455/1941362
OSPF詳解之三:OSPF LSA詳解