1. 程式人生 > >路由配置與管理——OSPF路由配置與管理1

路由配置與管理——OSPF路由配置與管理1

OSPF路由配置與管理

Ospf(開放式最短路徑優先)是一個基於鏈路狀態進行路由計算的動態路由協議,主要用於大中型網路。AR G3系列路由器支援OSPFv2和OSPFv3兩種版本,OSPFv2僅支援IPv4,OSPFv3同時支援IPv4和IPv6。

OSPF顯著特點就是不僅可以在一臺路由器上執行多種OSPF路由程序,還可把一個AS(自治系統)劃分成多個不同的Area(區域),然後基於路由器的位置和功能劃分多種不同的OSPF路由器型別和OSPF路由型別,同時支援不同型別網路的連線。OSPF是一種IGP(內部閘道器協議)型別動態路由協議,所以OSPF路由也只用於一個AS內部。OSPF是通過LSA(鏈路狀態通告)報文進行路由資訊互動,通過5種報文(Hello、DBD、LSR、LSU、LSAck)進行鄰居和鄰接關係的建立以及同一區域內部各路由器間的LSDB(鏈路狀態資料庫)資訊的同步,最終形成統一的區域內拓撲資料庫。

OSPF基礎

OSPF(OpenShortest Path First,開放式最短路徑優先)協議是IETF開發的一個基於鏈路狀態的AS內部的IGP(內部閘道器協議),廣泛應用在接入網和都會網路中。

一、OSPF的幾個重要概念

OSPF幾個非常重要的基本概念:自治系統(AS)、區域(Area)、路由器型別和路由型別。首先,一臺執行OSPF協議路由器中的每個OSPF程序必須指定一個用於標識本地路由器的RouterID(路由器ID)。RouterID是一個32位元無符號整數。在一個AS中每個路由器ID必須唯一,但同一路由器的不同程序中的路由器ID可以相同

1、AS

AS(自治系統)也就是通常所講的“路由域”(Routing Domain),是由運行同一種路由協議並且被同一組織機構管理的一組路由器組成

同一個AS中的所有路由器必須執行相同的路由協議,且必須彼此相互連線(中間不能被其他協議路由域所間斷),分配相同的AS

在OSPF網路中,只有在同一AS中的路由器才會互相互動鏈路狀態資訊;在同一個AS中,所有的OSPF路由器都維護一個相同AS結構描述(就是AS中各區域間的連線關係)的資料庫。該資料庫中存放的是路由域中相應鏈路的狀態資訊,OSPF通過這個資料庫計算出其OSPF路由表。OSPF路由配置都是針對同一個AS內部的路由器之間進行配置的,不涉及不同AS之間的路由器間的路由。

2、Area

Area(區域)是OSPF的一個非常重要的特徵,就是在一個AS內部劃分的多個不同位置,或者不同角色的一組路由器單元,每個OSPF路由器只能在所屬區域內部學習到完整的鏈路狀態資訊

。在大型網路中,路由器非常多,如不進行區域劃分,則整個網路中的所有裝置都要彼此學習路由資訊,最終路由資訊資料庫會很龐大。區域的劃分也不是隨意進行的,是根據這些路由器在網路中承擔的作用和位置來劃分的


如上圖為Area與AS之間的關係示意圖,即一個AS中可以包括多個區域,不同的協議路由域使用不同的AS。但只有OSPF和IS-IS協議路由域中的AS可以劃分多個區域。不同路由域(也即不同AS)中的路由需經過BGP協議進行連線。

區域是從邏輯上將網路中的不同路由裝置劃分為不同的組,每個組用區域號(Area ID)來標識。要注意的是,OSPF的區域的邊界是裝置介面,而不是鏈路。即一個網段(鏈路)只能整個屬於同一個區域,即路由器間直接相連的鏈路兩端介面必須屬於同一個區域。如下圖:


劃分了區域後,可以在區域邊界路由器上進行路由聚合,不同區域之間僅向外通告其聚合路由,大大減少通告到其他區域的LSA(鏈路狀態通告)數量,還可以最小化由於網路拓撲變化帶來的影響。

    與OSPF同為鏈路狀態協議的IS-IS在區域邊界方面就與OSPF完全相反,IS-IS區域的邊界是鏈路,而不是裝置介面,即兩臺路由器相連的鏈路兩端介面是分屬於不同區域的

在OSPF中,除了可以劃分多個普通區域外,還可以配置多種特殊區域型別,如骨幹區域(固定為Area0)、Stub(末梢)區域、Totally Stub(完全末梢)區域、NSSA(非純末梢)區域和Totally NSSA(完全非純末梢)區域。

3、路由器型別

由於OSPF把一個AS劃分成多個區域,這就使得OSPF網路中不同路由器的角色可能會有所不同,根據路由器在AS中的不同位置,可以分為4類(見圖12-2):

①區域內路由器(InternalRouters,IR):該類裝置的所有介面都在同一個OSPF區域內。

②區域邊界路由器(Area BorderRouters,ABR):該類裝置介面可以分別屬於不同區域,但其中一個介面必須連線骨幹區域。ABR用來連線骨幹區域和非骨幹區域,它與骨幹區域之間既可以是物理連線,也可以是邏輯上的連線(“虛連線”)。

③骨幹路由器(BackboneRouters,BR):該類裝置至少有一個介面屬於骨幹區域。所有的ABR和位於骨幹區域的內部裝置都是骨幹路由器

④自治系統邊界路由器(ASBoundary Routers,ASBR):與其他AS中的裝置交換路由資訊的裝置成為ASBR。雖然ASBR通常是位於AS的邊界,但也可以是區域內裝置,也可以同時是ABR。只要一臺OSPF裝置引入了外部路由(包括直連路由、靜態路由、RIP、IS-IS路由、BGP路由,或者其他OSPF程序路由等)的資訊,它就成為ASBR。

4、路由型別

劃分區域的目的就是想減少LSA的數量,減少路由器上依據LSA形成的路由數量,這就自然會對在區域內部,或區域之間,甚至從其他AS外入的路由進行分類。OSPF中,把路由分為4類:

①區域內(Intra Area)路由:僅用於區域內IR路由器之間的路由,用於IR裝置間的互聯,不向區域外通告。

②區域間(Inter Area)路由:僅用於區域間ABR之間的路由,用於骨幹區域與其他區域相互通告路由資訊。

③第一類外部(Type1 External)路由:這是經由ASBR引入的外部路由,且通常是IGP型別(如直連路由、靜態路由、RIP、IS-IS路由或其他OSPF程序路由)的外部路由,它們的開銷值計算方法與OSPF的開銷值計算方法具有可比性,可信度較高。到第一類外部路由的開銷=本裝置到相應的ASBR的開銷+ASBR到該路由目的地址的開銷

④第二類外部(Type2 External)路由:這也是經由ASBR引入的外部路由,且通常是EGP型別(如EGP路由)的外部路由,它們的開銷值計算方法與OSPF不具可比性。OSPF協議認為,從ASBR到自治系統之外的開銷遠遠大於在自治系統之內到達ASBR的開銷,所以OSPF計算第二類外部路由的開銷時只考慮ASBR到自治系統之外的開銷,即到第二類外部路由的開銷=ASBR到該路由目的地址的開銷

二、OSPF網路的設計考慮

1、OSPF網路的設計規劃

(1)確定需執行OSPF協議的路由器

在設計OSPF網路時,首先要確定的是哪些路由器的介面要啟用OSPF路由程序。在一個自治系統內部各路由器上需執行相同的動態路由協議,所以絕大多數情況下自治系統內部的各個路由器上都要執行OSPF協議。

(2)合理劃分OSPF區域

當一個大型網路中的路由器都執行OSPF協議時,LSDB(鏈路狀態資料庫)會佔用大量儲存空間,並使得執行SPF(Shortest Path First,最短路徑優先)演算法的複雜度增加,CPU負擔增加。網路規模增大,拓撲結構變化概率增大,網路會經常處於“振盪”之中,造成大量OSPF協議報文傳遞,降低頻寬利用率。每次變化還導致路由器重新進行路由計算。OSPF協議通過將一個自治系統劃分為不同的區域來解決上述問題。按一般經驗,在一個區域內路由器的數量不要超過50臺,且當網路中路由器少於20臺,可以只劃分一個區域,即骨幹區域。

根據OSPF協議規定,所有的其他區域均必須與骨幹區域連線,所以應合理選擇骨幹區域的位置。通常將骨幹區域置於網路的中央,這樣可以使更多的其他區域與骨幹區域直接連線。實在有不能直接與骨幹區域連線的區域,則需要使用虛連線來解決。骨幹區域中的路由器要負責整個OSPF網路各個區域的路由資訊傳輸,負荷大,需要效能好的路由器承擔。

(3)注意ABR和ASBR的效能要求

每個ABR需要負責所連線的兩個或多個區域間的路由資訊傳輸工作,需要儲存每個連線區域的LSDB,而ASBR更是要負責兩個或多個自治系統間的路由資訊傳輸,儲存每個連線自治系統的LSDB,需要高效能路由器承擔。建議在一臺ABR上一般最多連線3個區域,即一個骨幹區域和兩個普通區域,ASBR類似,不要連線太多自治系統。

2、OSPF區域劃分原則

(1)按照地理區域或行政管理單位劃分

因為OSPF網路主要應用於廣域網系統,跨市、省、全國,最簡單就是根據地理區域或行政區域劃分。

(2)按照網路中的路由器效能來劃分

路由器也可分為接入層、匯聚層和核心層,效能從低到高,按效能來劃分

(3)按照IP網段來劃分

好處是便於在ABR上配置路由匯聚,減少路由資訊的數量。

(4)區域中路由器數量的考慮

一個區域中最好不要超過50臺路由器。

三、OSPF  LSA型別

OSPF是一種典型的鏈路狀態路由協議,採用OSPF的每個路由器通過向鄰居路由器傳送LSA(Link StateAdvertisement,鏈路狀態通告)來實現彼此交換並儲存整個網路的鏈路狀態資訊,從而掌握全網拓撲結構,並獨立計算路由。劃分區域後,OSPF路由器收集其所在網路區域上各路由器的鏈路狀態資訊,並生成鏈路狀態資料庫LSDB,也稱拓撲資料庫,它代表了對應區域中的網路拓撲結構。OSPF路由器根據自己的LSDB利用SPF(Shortest Path First)路由演算法獨立計算出到達任意目的地址的路由。LSA是OSPF計算路由的依據,在相當程度上代表了OSPF路由。

因為OSPF路由器按用途進行了分類,不同型別的OSPF路由器所傳送的LSA的用途和可以通告的範圍各不相同。OSPF將LSA分為以下幾類:

(1)Type1 LSA:路由器LSA(Router LSA)

每個OSPF路由器都會產生路由器LSA,描述了對應裝置物理介面所連線的鏈路或介面,並指明瞭各鏈路的狀態、開銷等引數。

(2)Type2 LSA:網路LSA(Network LSA)

網路LSA由DR(指定路由器)或者BDR(備份指定路由器)產生,描述了DR和BDR所在網段的鏈路狀態,也僅在所屬區域內傳播因為DR和BDR僅在廣播型別網路中存在,所以網路LSA也僅在廣播型別網路中存在

(3)Type2 LSA:網路聚合LSA(Networksummary LSA)

網路彙總LSA由ABR產生,描述所連線的某個區域內某個網段的聚合路由(包括預設路由),並通告非Totally Stub或NSSA區域(包括源網段所在區域,到達其他區域必須經過骨幹區域轉發該LSA),這樣區域通訊在到達區域邊界ABR後都是採用聚合路由進行的,可大大減少區域內部路由器的路由表項數量。

(4)Type4 LSA:ASBR聚合LSA(ASBR summaryLSA)

ASBR聚合LSA也由ABR產生,描述從該ABR到達OSPF路由域中各個ASBR的路由,通告給整個路由域。但僅可向普通區域中泛洪,不能進入Stub區域、Totally Stub區域、NSSA區域和Totally NSSA區域。

(5)Type5 LSA:自治系統外部LSA(Autonomoussystem external LSA)

自治系統外部LSA由ASBR產生,描述到達AS外部的路由,也僅可向普通區域中泛洪,不能進入Stub區域、Totally Stub區域、NSSA區域和Totally NSSA區域。

(6)Type7 LSA:NSSA外部LSA(NSSAExternal LSA)

NSSA外部LSA也由ASBR產生,內容幾乎和Type5LSA相同,但它專用於NSSA區域和Totally NSSA區域連線的ASBR向NSSA區域內泛洪外部AS的路由,然後經過NSSA區域ABR上轉換成Type5 LSA向OSPF路由域內其他區域中傳播。

(7)Type9/Type10/Type11LSA:Opaque LSA

Opaque LSA是一個被提議的LSA類別,是在標準的LSA頭部後面加上特殊 應用的資訊組成,可以直接由OSPF協議使用,或者由其他應用分發資訊到整個OSPF域間接使用。Opaque LSA分為9、10、11三種類型,但是各自可泛洪的區域不同,Type9 LSA僅在介面所在網段範圍內傳播,Type10 LSA在區域內傳播,Type11 LSA在自治系統內傳播。

在OSPF中主要用到的就是Type1~Type5和Type7這6種LSA。

①在區域內部各路由器裝置通過Type1LSA來獲取彼此的路由資訊,實現互相路由通訊。

②在廣播型別網路中,區域內非DR、非BDR路由器與DR、BDR路由器之間是通過Type2LSA獲取路由資訊的,實現非DR、非BDR路由器與DR、BDR路由器之間的路由通訊;各非DR、非BDR路由器之間不相互獲取路由資訊,需全部通過DR或者BDR,以及該區域的ABR與其他區域進行通訊。

③在區域內部路由器與區域ABR之間,通過所在區域的ABR以Type3 LSA向內釋出本區域各網段聚合路由資訊,實現區域內路由器與對應區域的ABR路由通訊。

④在不同區域之間,通過各自區域的ABR以Type3 LSA向內、外發布的本區域和外部區域各網段聚合路由資訊(中間還需要骨幹區域進行LSA轉發),實現不同區域的路由器間的路由通訊。

⑤在區域內部路由器與外部AS之間,先通過各區域的ABR以Type4 LSA向內釋出到達ASBR的聚合路由資訊實現與ASBR的路由通訊,然後通過對應ASBR向普通區域內部發布的Type5LSA或者向NSSA區域和Totally NSSA區域釋出的Type7 LSA實現與外部AS的路由通訊。

四、幾種特殊的OSPF區域

在OSPF網路的區域中,除了Stub區域、TotallyStub區域、NSSA區域和Totally NSSA區域外,其他區域(包括骨幹區域)都稱為普通區域

1、骨幹區域

骨幹區域是普通區域中的一種特殊區域,它的區域號固定為0.0.0.0,也即區域0。骨幹區域是連續的,或者通過“虛連線”(Virtual Link)連線兩個或多個分離的骨幹區域,但這些分離的骨幹區域的區域號一樣,均為0。同時,要求其他區域必須與骨幹區域直接連線,或者通過“虛連線”虛擬連線。


如上圖,普通區域2沒有與骨幹區域0直接連線(中間隔了一個區域1),這時就可以在區域1連線骨幹區域0和普通區域2的兩端ABR中配置“虛連線”。“虛連線”被認為是屬於骨幹區域(相當於骨幹區域的延伸)的,在OSPF路由協議看來,虛連線兩端的兩個路由器被一個點對點的鏈路連在一起,這樣原來沒有與骨幹區域連線的區域就變成直接連線了,成為普通區域了。通過虛連線連線兩個非連續的骨幹區域0的方法一樣。

骨幹區域作為區域間通訊傳輸和分佈路由資訊的中心,在一個OSPF路由域中,無論有沒有劃分區域,總是至少有一個骨幹區域。區域間的通訊先要被路由到骨幹區域,然後再路由到目的區域,最後被路由到目的區域中的主機。在骨幹區域中的路由器(都是ABR)通告它們所連線的其他區域內的彙總路由到骨幹區域中的其他路由器中。彙總通告在骨幹區域內路由器傳播,使得在骨幹區域內部的每臺路由器都有一個到達所有連線的其他區域ABR的可用路由表。

2、Stub(末梢)區域

Stub區域是一種專門為那些由效能較低的路由器組成、與AS外部沒有太多路由通訊的AS邊緣區域簡化區域內部路由器上的路由表而採取的一種優化措施。只有處於AS邊緣,且只有一個連線其他區域的ABR,沒有ASBR,沒有虛連線穿越的非骨幹區域才可配置為Stub區域,因為只有這樣才能儘可能的減少區域內路由器的路由表項數量。

在Stub區域中是通過禁止與AS外部路由相關的Type4LSA和Type5 LSA通過ABR進入區域內泛洪來實現的,僅允許同一AS中其他區域的Type3 LSA通過ABR進入區域泛洪。這樣在Stub區域內部路由器中僅有Type1LSA、Type2 LSA(廣播網路中才有)和Type3 LSA存在,沒有Type4LSA和Type5 LSA(更沒有專用於NSSA和Totally NSSA區域的Type7 LSA),可在一定程度上減小區域內部路由器上的路由表規模。

在阻止了與AS外部相關的Type4LSA和Type5 LSA進入區域後,會代理啊一個問題,那就是Stub區域內部路由器不能獲知外部AS的路由資訊,不能與AS外部進行通訊。有時的確需要與外部AS進行通訊,於是新增了一條折中的解決方法,就是由Stub區域的ABR向本區域內部路由器泛洪一條指向自己的預設路由(0.0.0.0),使Stub區域ABR作為區域內部路由器與外部AS通訊的唯一出口

當一個OSPF的區域只存在一個區域出口點(只與一個其他區域連線)時,可以將該區域配置成為一個Stub區域。這時,該區域的ABR會對區域內通告預設路由資訊。需要注意的是,一個Stub區域中的所有路由器都必須知道自身屬於該區域(也就是需要在其中的路由器啟用這項功能),否則Stub區域的設定不會起作用。

3、Totally Stub區域

Totally Stub(完全末梢)區域是相對Stub區域的變形版本,也是為那些裝置效能相當低的邊緣區域而設計的,可以進一步減少區域內路由器的路由表項。Totally Stub區域所需滿足的條件與Stub區域一樣,即只有處於AS邊緣,且只有一個連線其他區域的ABR,沒有ASBR,沒有虛連線穿越的非骨幹區域才可配置為Totally Stub區域

在LSA的限制上,TotallyStub區域比Stub區域更加嚴格,除了不允許與AS外部路由相關的Type4LSA和Type5 LSA進入區域外,還不允許同一AS中其他區域的Type3LSA經由ABR向區域內部路由器泛洪。這樣一來,在Totally Stub區域內部路由器中僅有Type1LSA和Type2 LSA(廣播網路中才有),沒有Type3 LSA、Type4 LSA和Type5 LSA(同樣更沒有Type7LSA),可進一步減少區域內部路由器的路由表項數量。

與Stub區域類似,為了解決有時TotallyStub區域內部路由器需要與其他區域或AS外部進行通訊的問題,由ABR向區域內泛洪一條預設路由。

4、NSSA區域

Stub區域因為只存在於網路邊緣,利用率不高,於是提出了一種新的概念NSSA(Not-So-Stubby Area,非純末梢區域)。NSSA區域是對Stub區域概念的延伸,在必備條件方面有所放寬,即NSSA區域可以位於非邊緣區域,可以有多個ABR(Stub區域僅允許有一個ABR),可以有一個或多個ASBR(Stub區域不允許有ASBR)。在LSA的限制方面:

允許從其直接連線的ASBR上引入的AS外部路由以Type7LSA進入NSSA區域中泛洪,然後在ABR上轉換為Type5 LSA後以自己的身份釋出到區域之外,因為Type7 LSA是專門為NSSA區域新定義的,非NSSA區域裝置不可識別。

②與Stub區域一樣,允許區域間的Type3 LSA進入區域內部泛洪,不允許與其他區域中ASBR連線的AS外部路由相關的Type4 LSA和Type5 LSA進入NSSA區域內泛洪

NSSA區域也限制了由其他區域中的ASBR所引入的AS外部路由進入區域內,但同樣NSSA區域內部路由器有可能需要與其他區域連線的外部AS進行通訊。為解決這一問題,NSSA區域仍採用預設路由的方式來解決,就是在該區域的其中一個ASBR上(NSSA區域中可以有多個ASBR)向區域內部路由器泛洪一條指向自己的預設路由,使該ABR作為區域內部路由器與其他區域所連線的外部AS進行通訊的唯一路由。

在NSSA區域總存在Type1LSA、Type2 LSA(廣播網路中才有)、Type3 LSA和Type7 LSA,但沒有Type4 LSA和Type5 LSA

5、Totally NSSA區域

Totally NSSA區域可以說是TotallyStub區域和NSSA區域的結合體:

與NSSA區域一樣,可以位於非邊緣區域,可以有多個ABR和ASBR

與NSSA區域一樣,允許區域中ASBR引入的AS外部路由以Type7 LSA進入區域內部泛洪,然後經由該區域內的ABR將轉換成Type5 LSA向OSPF路由域中其他所有區域進行釋出。但不允許其他區域中的ASBR引入的路由進入區域內部,即不允許Type4 LSA和Type5 LSA進入區域內部泛洪

與Totally Stub區域一樣,不允許Type3 LSA進入區域內部泛洪(NSSA區域是允許的),這可進一步減少區域內部路由器的路由表規模。

Totally NSSA區域禁止了其他區域的Type3LSA和其他區域中ASBR連線的外部AS相關Type4 LSA和Type5 LSA進入區域內,Totally NSSA區域也採用預設路由的方式,在區域中選擇一個ABR和ASBR,在其中配置一條指向自己的預設路由,然後在Totally NSSA區域內泛洪,使該ABR或ASBR作為區域內部路由器與其他區域或者其他區域中連線的外部AS進行通訊的唯一出口。


五、OSPF的網路型別

OSPF協議支援多種不同型別的網路,當然必須都是執行IP協議的。根據鏈路層協議型別的不同將這些可支援的網路分為4種類型(不同型別網路的報文傳送方式不一樣)。

1、廣播(Broadcast)型別

當鏈路層協議是Ethernet、FDDI時,OSPF預設網路型別是廣播(Broadcast)型別。在這種網路中,OSPF的各種報文傳送方式如下:

①以組播形式(224.0.0.5,是執行OSPF裝置的預留IP組播地址)傳送Hello報文及所有源自DR(指定路由器)的選舉報文。

②以組播形式(224.0.0.6,是OSPF DR的預留IP組播地址)向DR傳送LSU(鏈路狀態更新)報文,然後DR將該LSU報文傳送到224.0.0.5。

③以單播形式傳送DD(資料庫描述)報文、LSR(鏈路狀態請求)報文和所有重傳報文。

④正常情況下,以組播形式(224.0.0.5)傳送LSAck(鏈路狀態應答)報文。當裝置收到重複的LSA或達到最大生存時間的LSA被刪除時,LSAck以單播形式傳送。

2、NBMA(Non-BroadcastMulti-Access)型別

當鏈路層協議是幀中繼、X.25時,OSPF預設網路型別是NBMA。在該型別的網路中,以單播形式傳送協議報文(Hello報文、DD報文、LSR報文、LSU報文、LSAck報文)。

3、點到多點(point-to-multipoint,P2MP)型別

因為鏈路層協議中沒有Point-to-Multipoint的概念,所以P2MP必須是由其他的網路型別強制更改的。在該型別的網路中,以組播形式(224.0.0.5)傳送Hello報文,以單播形式傳送DD報文、LSR報文、LSU報文、LSAck報文。

4、點到點P2P(point-to-point)型別

當鏈路層協議是PPP、HDLC和LAPB時,OSPF預設網路型別是P2P。在該型別的網路中,以組播形式(224.0.0.5)傳送各種OSPF協議報文。


OSPF報頭及各種報文格式

OSPF把自治系統劃分成邏輯意義上的一個或多個區域,通過LSA的形式釋出路由資訊,然後依靠在OSPF區域內各裝置間各種OSPF報文的互動來達到區域內路由資訊的統一,最終在區域內部路由器中構建成完全同步的LSDB,因為OSPF是專為TCP/IP網路設計的路由協議,所以OSPF的各種報文是封裝在IP報文內的,可以採用單播或組播的形式傳送。

一、OSPF協議報頭格式

OSPF報文主要有5種:Hello報文、DD(DatabaseDescription,資料庫描述)報文、LSR(LinkState Request,鏈路狀態請求)報文、LSU(LinkState Update,鏈路狀態更新)報文和LSAck(LinkState Acknowledgment,鏈路狀態應答)報文。它們使用相同的OSPF報頭格式(以OSPFv2版本為例):


①Version:版本欄位,佔1個位元組,指出所採用的OSPF協議版本號,OSPFv2值為2,即0000 0010。

②Package Type:報文型別欄位,標識對應報文的型別,取值為1~5的整數,分別對應Hello報文、DD報文、LSR報文、LSU報文、LSAck報文這5種OSPF報文。

③Package Length:包長度欄位,佔2位元組,標識整個報文(包括OSPF報頭部分和後面各報文內容部分)的位元組長度。

④Router ID:路由器ID欄位,佔4個位元組,指定傳送報文的源路由器ID。

⑤Area ID:區域ID欄位,佔4位元組,指定傳送報文的路由器介面所在的OSPF區域號。

⑥Checksum:校驗和欄位,佔2位元組,是對整個報文(包括OSPF報頭和各報文具體內容,但不包括下面的Authentication欄位)的校驗和,用於對端路由器校驗報文的完整性和正確性。

⑦AuType:驗證型別欄位,佔2位元組,指定在進行OSPF報文互動時所需採用的驗證型別,0為不驗證,1為進行簡單驗證,2為採用MD5方式驗證。

⑧Authentication:驗證欄位,佔8個位元組,具體值根據不同驗證型別而定。驗證型別為不驗證時,此欄位沒有資料;驗證型別為簡單驗證時,此欄位為驗證密碼;驗證型別為MD5驗證時,此欄位為MD5摘要訊息。

二、OSPF Hello報文及格式

OSPF協議使用Hello報文來建立和維護相鄰鄰居路由器之間的鄰接關係。Hello報文僅用來向鄰居路由器證明自己的存在,就像人與人之間打招呼一樣。RIP鄰居路由器之間的鄰居關係建立和路由更新都是通過傳送Hello報文進行的,顯然OSPF的這種Hello報文更簡單,可大大減少網路中的報文傳輸流量。

在P2P和廣播型別網路中,Hello報文是以HelloInterval為週期(預設10s),以組播方式向224.0.0.5組播組傳送一次;在P2MP和NBMA型別網路中,OSPF路由器是以PollInterval為週期(預設60s),以單播方式向狀態為Down的鄰居傳送一個Hello報文(其他型別的網路是不會把Hello報文傳送給狀態為Down的路由器的)。如果在設定的DeadInterval時間(通常至少是Hello報文傳送時間間隔的4倍)內沒有收到對方OSPF路由器傳送來的Hello報文,則本地路由器會認為該對方路由器無效。

Hello報文內容包括一些定時器設定、DR、BDR以及本路由器已知的鄰居路由器。



在OSPF路由器上可以配置Hello報文的傳送時間間隔(是基於介面來配置的)。

三、OSPF DD報文及格式

DD報文用來描述本地路由器的鏈路狀態資料庫(LSDB),即在本地LSDB中包括哪些LSA。在兩個OSPF路由器初始化連線時要交換DD報文,以便進行資料庫同步。

DD報文內容部分包括DD報文序列號和LSDB中每一條LSA的頭部等。對端路由器根據所收到的DD報文中的OSPF報頭就可以判斷出是否已有這條LSA。由於資料庫的內容可能相當長,所以可能需要多個DD報文的互動來完成雙方LSDB的同步。所以有三個專門用於標識DD報文序列的位元位,即DD報文格式中的I、M和M/S這三位。接收方對接收到的連續DD報文重新排序,使其能還原所接收的DD報文。



DD交換過程按詢問/應答方式進行,在DD報文交換中,一臺為Master(主)角色,另一臺為Slave(從)角色。Master路由器向Slave路由器傳送它的路由表內容,並規定起始序號,每傳送一個DD報文,序號加1,Slave路由器則使用Master路由器的序號進行確定應答。顯然,主、從之間的關係會因每個DD交換的不同而不同,因為雙方可能都有對方沒有的LSA,網路中的所有路由器會在不同時刻擔當不同的角色。

四、OSPF LSR報文及格式

LSR報文用於請求相鄰路由器鏈路狀態資料庫中的一部分資料。當兩臺路由器互相交換完DD報文後,知道對端路由器有哪些LSA是本LSDB所沒有的以及哪些LSA是已經失效的,則需要傳送一個LSR報文,向對方請求所需的LSA。

LSR報文內容包括所需的LSA摘要。



五、OSPF LSU報文及格式

LSU報文是LSR請求報文的應答報文,用來向對端路由器傳送所需的真正LSA內容,可以是多條LSA完整內容的集合。LSU報文內容部分包括此次一共傳送的LSA數量和每條LSA的完整內容。


LSU報文在支援組播和多路訪問的鏈路上是以組播方式將LSA泛洪出去的,並且對沒有收到對方確認應答(即LSAck報文)的LSA進行重傳,但重傳時的LSA是直接送到沒有收到確認應答的鄰居路由器上,而不是泛洪。

六、OSPF LSAck報文及格式

LSAck報文是路由器在收到對端發來的LSU報文後發出的確認報文,內容是需要確認的LSA頭部(LSA Headers)。LSAck報文根據不同鏈路以單播或組播形式傳送。


OSPF工作原理

OSPF中涉及許多具體技術原理,如OSPF路由計算原理、OSPF區域間的路由原理、OSPF路由更新原理,還有在廣播網路中要進行的DR和BDR選舉以及OSPF報文的驗證原理等。

一、OSPF狀態機

OSPF是一種鏈路狀態路由協議,鄰居裝置間交換的是鏈路狀態資訊,OSPF路由也是依據由鏈路狀態資訊構成的鏈路狀態資料庫(LSDB)形成的。在OSPF中,建立裝置間的鄰居關係,交換彼此的LSDB顯得格外重要。鄰居關係建立的流程體現在OSPF介面的狀態轉換過程中。在OSPF中共有8種狀態機,分別是:Down、Attempt、Init、2-way、Exstart、Exchange、Loading、Full。

①Down:鄰居會話的初始階段,表明沒有在鄰居失效時間間隔(DeadInterval)內收到來自鄰居路由器的Hello報文。

②Attempt:該狀態僅發生在NBMA網路中,表明在鄰居失效時間間隔超時後仍然沒有對端發來的Hello應答報文。此時路由器依然會以輪詢Hello報文傳送時間間隔(PollInterval)向對端傳送Hello報文。

③Init:收到不包含自己路由器ID的Hello報文後狀態轉換為Init。

④2-way:收到包含有自己的路由器ID的Hello報文後則狀態轉換為2-way。

⑤Exstart:在進行DR、BDR選舉後形成鄰居關係,則從Init狀態轉換到Exstart狀態,通過不帶LSAHeader欄位內容的DD報文協商主、從關係,並確定DD報文的序列號。

⑥Exchange:主、從關係協商完畢後,主裝置開始向從裝置正式傳送帶有LSA Header欄位內容的DD報文,此時雙方狀態轉換為Exchange。

⑦Loading:DD報文交換完成後從裝置狀態轉換為Loading。此時,通訊雙方可以LSR報文向對方請求LSA更新,而以LSU報文對對方請求進行應答。

⑧Full:當裝置收到對端發來的,由自己所請求的LSA報文後向對端傳送LSAck報文,同時發給對端的LSA後也收到了來自對端的LSAck報文,之後,則本地裝置自動切換為Full狀態。

二、OSPF鄰接關係建立流程

OSPF鄰居關係的建立和維持都是依靠Hello報文互動來實現的,OSPF鄰接關係的建立則需要一個比較複雜的流程,也是鄰居裝置介面的狀態機轉換過程。

整個OSPF裝置間鄰接關係的建立過程分為4個主要階段:鄰居發現階段、主從關係確立階段、資料庫同步階段、完全鄰接階段。4個階段中每個階段都包含一種或多種狀態機的轉換。初始狀態下,所有OSPF介面的鄰居狀態均為Down狀態,表明沒有與任何裝置建立鄰居關係,更沒有與任何裝置建立鄰接關係鄰居關係不等於鄰接關係)。

以P2P和廣播型別網路中的兩臺OSPF路由器為例學習建立雙向鄰接關係的流程,以及對應的OSPF狀態機遷移過程(假設R1路由器先啟動了OSPF程序)。


1、鄰居發現階段

①首先,當R1的OSPF介面啟動路由程序後,會以組播方式(目的地址為組播地址224.0.0.5)向所連線的同網段所有直接連線的OSPF裝置傳送一個Hello報文。此時,因為R1還沒有與其他任何裝置建立鄰居關係,不知道其他裝置的路由器ID,所以在此Hello報文的RouterID欄位中僅封裝了本地OSPF路由器的路由器ID,在Neighbor欄位中沒有封裝任何路由器ID。

②當R2收到來自R1的Hello報文後,將接收來自R1的Hello報文的介面轉換成Init狀態。同時R2從接收到的Hello報文中獲取R1的路由器ID,新增到鄰居列表中。然後在DeadInterval超時前,以組播方式向所連線的網段中的所有直接連線的OSPF裝置傳送一個在RouterID欄位中封裝本地裝置R2的路由器ID,在Neighbor欄位中封裝R1的路由器ID的Hello報文。

③當R1收到來自R2的Hello報文,且發現裡面有自己的路由器ID後,將接收來自R2的Hello報文的介面轉換成2-way狀態,同時R1從接收到的Hello報文中獲取R2的路由器ID,新增到鄰居列表中,然後在DeadInterval超時前,以組播方式向所連線的網段中的所有直接連線的OSPF裝置傳送一個在RouterID欄位中封裝了本地裝置R1的路由器ID,在Neighbor欄位中封裝R2的路由器ID的Hello報文。

④當R2再次收到來自R1的Hello報文,且發現裡面有自己的路由器ID後,將接收來自R1的Hello報文的介面轉換成2-way狀態。這時R1和R2就建立了雙向的2-way鄰居關係。

通過以上4步(其實是一個兩次握手過程),R1和R2間就建立起了鄰居關係,進入主從關係確立階段。

2、主從關係確立階段

①在雙方都進入2-way狀態後,R1和R2通過先前各自獲取的Hello報文的資訊進行DR、BDR選舉,選舉完成後雙方都進入ExStart狀態。

DR和BDR是由同一網段中所有路由器根據路由器優先順序和路由器ID選舉出來的,只有Hello報文中Rtr Pri(優先順序)欄位大於0的路由器才具有選舉資格。具體的選舉過程如下:

★在與一個或多個鄰居之間的雙向通訊建立起來之後,本地路由器對每個鄰居傳送來的Hello包中的優先順序、DR和BDR域進行檢查。此時所有路由器都宣稱自己為DR(將它們自己的介面地址置於Hello包的DR欄位中);同時,所有路由器都宣稱自己為BDR(將它們自己的介面地址置於Hello包的BDR欄位中)。

★如果一個或多個備選路由器將它(們)自身的介面地址置於DR欄位中,擁有最高優先順序的鄰居將被宣告為DR。如果路由器優先順序一樣,擁有最高路由器ID的鄰居將被選舉出來。

★然後將自身的介面地址置於BDR欄位中的路由器中選擇擁有最高優先順序的路由器作為BDR。如果這些宣稱自己為BDR路由器的優先順序相等,則擁有最高路由器ID的鄰居將被選舉作為BDR。

★如果沒有任何路由器被宣告為BDR,則擁有最高優先順序的非DR鄰居路由器將被宣告為BDR;如果有多個優先順序相同的路由器,則擁有最高路由器ID的鄰居將被選舉為BDR。

②進入ExStart狀態後,雙方路由器開始以DD報文進行互動,確定雙方的主從關係,確定用於資料交換的初始的DD報文的序列號,以保證路由器得到的永遠是最新的鏈路狀態資訊。

在開始互動時,R1和R2雙方都是在M/S欄位設為1(代表自己為主裝置),在DDSequence Number欄位加上各自當前DD報文的序列號(每傳送一次序列號加“1”),LSA Header欄位為空的DD報文進行互動的。最終會根據雙方的路由器ID來確定雙方的主從關係,路由器ID大的成為主裝置(此處假設為R2)。

確認好主從關係後,從裝置R1以主裝置R2的DD報文序列號向主裝置傳送DD報文,並且置M/S欄位值為0(代表自己為從裝置),同樣裡面的LSA Header欄位為空,並轉換自己接收DD報文的介面為Exchange狀態。主裝置R2在收到從裝置R1的DD報文後也將自己接收DD報文的介面轉換為Exchange狀態。

通過以上兩步,R1和R2鄰接關係建立流程進入了資料庫同步階段。

3、資料庫同步階段

①主裝置R2開始連續向從裝置R1傳送帶有LSA Header欄位的報文(其中第一個DD報文的I欄位值為1,代表為連續DD報文中的第一個報文,其餘連續DD報文的I欄位值均為0),M欄位為1(代表後面還有報文)對從裝置R1進行資料庫更新。但每傳送一次DD報文,其序列號都要加“1”。從裝置R1每次收到來自主裝置R2的DD報文後均以收到的DD報文序列號進行響應(但裡面的LSA Header欄位為空)。

②當主裝置R2向從裝置R1傳送最後一個DD報文時,將M欄位置為0,代表為最後一個DD報文,同時LSA Header欄位為空,並將接收到DD報文的介面轉換為Loading狀態。當從裝置R1收到主裝置R2帶有M欄位為0的DD報文後便知道這是最後一個DD報文了,此時也將接收DD報文的介面轉換為Loading狀態。

③當主裝置R2傳送完DD報文後,從裝置R1開始依據所接收的DD報文中的LSA Header欄位檢查自己的LSDB,如果發現有些LSA在自己的LSDB中沒有,則從裝置R1會以LSR報文向主裝置R2發出更新請求。當主裝置R2收到LSR報文後會以LSU報文向從裝置R1傳送對應的LSA。從裝置R1在收到來自主裝置R2的LSU報文後,會以LSAck報文進行確認。

因為雙方都可能有對方沒有的LSA,或者一方的LSA版本更新,所以在DD報文互動中,主從角色不是固定的,雙方都可以向對方傳送LSR報文請求更新。

通過以上兩步完成了鏈路狀態資料庫的同步,進入最後的完全鄰接階段。最終實現同一區域中每臺OSPF區域內部路由器的LSDB是完全一致的,實現了整個區域內的拓撲結構同步。

4、完全鄰接階段

當雙方的LSDB完全同步後,雙方均轉為Full狀態,雙方OSPF介面間正式建立了完全鄰接的關係。

三、OSPF路由計算基本過程

OSPF網路是在一個AS中以區域為單位的分層結構,而且在區域中又分為兩種不同角色:骨幹區域和普通區域。這就決定了OSPF的路由也必定是分層的,分為區域內路由和區域間路由,而不像RIP路由那樣是扁平的。

整個OSPF路由計算過程是在OSPF裝置間建立了完全的鄰接關係後進行的,依據的就是路由器為所連線的各個區域所儲存的LSDB(每個連線區域都有一個專門的LSDB)。具體的路由計算中,又分割槽域內路由和區域間路由兩個方面。

1、OSPF區域內路由計算

當網路重新穩定下來後,OSPF路由器會根據其各自的LSDB採用SPF(最短路徑優先)演算法——具體為Dijkstra演算法)獨立地計算到達每一個目的網路的路徑,並將路徑存入路由表中。路由表中包含該路由器到每一個可到達目的地址、開銷和下一跳(next-hop)。OSPF區域內路由是由OSPF內部路由器使用最小開銷的路徑到達目的網路,且區域內的路由不被聚合。

在Dijkstra演算法中,為了在一對給定的路由器節點之間選擇一條最短(鏈路開銷最小)路由路徑,只需在通訊子網拓撲圖中找到在這起始和結束節點之間的中間節點串連起來後鏈路開銷最短的路徑即可。把最短路由的節點標識為工作節點,並且是永久性的節點,其到達源節點的距離值是不能改變的,其他的標識為臨時性的節點,其到達源節點的距離可能隨工作節點的不同而改變。

如下圖,每個節點代表一臺OSPF路由器,每條線段代表一條通訊鏈路,線段上的數字代表對應鏈路的開銷。現要使用Dijkstra演算法計算節點A到節點D之間的最短路徑。

在網路中路由器啟動時,首先需要初始化,測量每條鏈路的開銷。從A節點到達D節點的路由確定步驟如下:

①首先將源節點A標記為永久性工作節點(用箭頭來特別標識),然後依次檢查每一個與A節點直接連線的相鄰節點,並且把它們與A節點之間的距離重新以(n,N)的方式進行標識,其中的n為與A節點相距的鏈路開銷,N為最近的工作節點。

本示例中與節點A直接相鄰的節點只有B和G,所以僅需要標識這兩個節點與A節點之間距離。此時工作節點為A,B節點的標識為(2,A),G節點的標識為(6,A),其他與A節點不相鄰的節點的距離標識為無窮遠。如下圖:


②比較B和G這兩個節點與A節點之間距離,B節點的距離更短,於是把B節點改為工作節點(箭頭移到B),同時變為永久性節點,其他節點(包括G節點)標註為臨時節點。然後以B節點為工作節點,標記直接相鄰的節點到源節點A的距離,對於前面已經計算過的節點將略過,如源節點A和G節點。

與B節點直接相鄰的節點中,除了A節點外還有C、E兩個節點。C節點到達A節點的距離就是C節點到B節點的鏈路開銷7,加上B到A的鏈路開銷2,所以C到A的距離為2+7=9,標識為(9,B)。同理E到A的距離為2+2=4,標識為(4,B)。其他節點仍為無窮遠。


③同樣經過比較得出,E到A的距離(4),比C到A的距離(9)近,所以把E改為工作節點(箭頭移到E),同時標註E為永久性節點,其他節點(包括C)標註為臨時節點。

同樣標記與E節點直接相鄰的節點(B、G、F)到E節點的距離,但對於前面已經計算過的永久性B節點不再重新計算,對原來已計算過,但為臨時性節點的G以及F需重新計算。最終G標識為(5,E)(在此步以前為(6,A)),F標識為(6,E)。如下圖


④同樣的方法比較G節點和F節點到達A節點之間的距離,可以得出G節點更近,把G改為工作節點(箭頭移到G),同時標註G為永久性節點,其他節點(包括F)標註為臨時節點,如下圖


再看G直接相鄰的節點,包括A、E、H,但是A、E已經標識為永久性節點了,標識是不能更改的,這裡只需對H節點計算到達A節點的距離,經計算得出為(9,G)。

這裡要出問題了,按上面的計算,此時應該把H標識為下一個工作節點,但事實上,由H經G到達E的距離(4+1=5)要長於由H經F到達E的距離(2+2=4),前面把G標識為永久性節點是錯誤的,這時要把F節點標識為工作節點(箭頭移到F),撤消G節點永久工作節點的資格,


⑤再檢查與F相連線的相鄰節點,除了已標識為永久性節點的E外,其餘就是C和H,重新計算得到的值分別為9和8。這裡要注意一個現象,對於C,本來屬於臨時節點,需重新計算距離值,可是經過F到A的距離與原來計算所得的經過B到達A的距離是一樣的,所以距離值不需要改變。此時包H標識為工作節點(箭頭移到H)和永久性節點。如下圖:


因為H是直接與目的節點D相連的,無需再進行選舉,直接標識D的距離為(10,H)。即從源節點A到D的最短距離為10,即2+2+2+2+2,如上圖連線:A——>B——>E——>F——>H——>D。以上可以看到,Dijkstra演算法雖然能得出最短路徑,但遍歷計算的節點很多,效率低,而且有些節點還不能一次標識正確。

2、OSPF區域間路由計算

OSPF路由器的ABR連線多個OSPF區域,所以它儲存了多個區域的LSDB。但是在ABR,與所連區域內部路由器以及其他區域內路由器的通訊都不是象區域內部那樣是以具體的明細路由進行的,而是採用聚合路由進行。

在ABR上會以Type3  LSA(即網路聚合LSA)的方式向所連區域內以及其他區域通告所連區域的網路聚合路由,其他區域的路由也是以Type3 LSA方式向所連區域內通告的。所以區域內路由器與ABR以及ABR與其他區域的通訊都是以網路聚合路由進行的。但要注意,兩個非骨幹區域之間是不能直接進行路由通訊的,必須藉助骨幹區域進行轉發,同樣,兩個非骨幹區域之間是不能直接進行路由通訊的,必須藉助骨幹區域的路由轉發。所以在區域間的路由路徑中一定會包括到達骨幹區域對應路由器所連線網段的路由

OSPF區域間的路由將按照以下過程進行:

①在源區域內部的路由器按照到達最近ABR的開銷最小的網路聚合路由進行通訊。

②骨幹區域按照到達連線到包含目的主機IP地址所在區域最近ABR的開銷最小的網路聚合路由進行通訊。

③包含目的主機IP地址的ABR按照到達目的主機的開銷最小網路聚合路由進行通訊。


如上圖,由Area1中IP地址為192.168.1.10/26的HostA發往位於Area2中的IP地址為172.16.2.10/24的HostB的資料報文最先從Area1中的內部路由器以一個網路聚合地址(可以由管理員在R1上配置,假設為192.168.1.0/24)到達R1(ABR/骨幹路由器),然後資料報文再通過骨幹區域Area0中的路由器轉發至R2。最後,資料報文通過聚合路由(也可以由管理員在R2上配置,假設為172.16.0.0/16)轉發,然後通過Area2中的內部路由器到達目的主機。.

3、OSPF路由維護

當鏈路狀態發生變化時,OSPF通過泛洪過程廣播給網路上的其他路由器。OSPF路由器接收到包含新資訊的鏈路狀態更新報文,將更新自己的鏈路狀態資料庫,然後用SPF演算法重新計算路由表。在重新計算過程中,路由器繼續使用舊路由表,直到SPF完成新的路由表計算。新的鏈路狀態資訊將傳送給其他路由器。要注意的是,即使鏈路狀態沒有發生改變,OSPF路由資訊也會自動更新,預設時間為30min。

四、理解OSPF程序

在動態路由協議中有一個路由程序的概念,一個路由器可以建立多個路由程序,多個程序有什麼用?不同程序之間又有什麼區別和聯絡

1、不同程序之間不相互交換路由資訊,預設是不通的

可以簡單的把同一路由器上多個不同OSPF程序理解為多個不同的動態路由協議的程序不同路由協議下的路由資訊是不能直接進行交換的,最終也造成通過不同路由協議學習到的動態路由都是不通的。OSPF上的不同程序也是如此,不同程序各自有不同的LSDB(鏈路狀態資料庫),彼此之間是不交換路由資訊的,當然彼此之間的網路也就不會直接相通了。這相當於把一個物理網路劃分成多個虛擬網路。但是不同OSPF程序的路由是可以引入的

假設有以下OSPF網路,R1、R2和R3均會執行OSPF協議,但R2上配置了10和20兩個程序,如果沒有配置兩個OSPF程序互相進行路由引入的話,R1上連線的192.168.1.0/24網路是不能與R3上連線的192.168.4.0/24網路相通的,因為R2路由器的S1介面所學習到的R1路由器上的192.168.1.0/24網路路由是不會向R3路由器通告的,同樣R2路由器的S0介面所學習到的R3路由器上的192.168.4.0/24網路路由是不會向R1路由器通告的。但是在R2上連線的兩個網路還是可以直接通訊的,因為它們在R2路由器上是直連路由,優先順序最高,不需要OSPF協議的支援。


如果在R2路由器上將位於OSPF程序10的S1介面學習到的OSPF路由和直連路由引入到OSPF程序20,則R3路由器將學習到路由192.168.1.0/24和192.168.2.0/24網路。同理,如果在R2路由器上將位於OSPF程序20的S0介面學習到的OSPF路由和直連路由引入到OSPF程序10,則R1路由器將學習到路由192.168.3.0/24和192.168.4.0/24網路。

2、路由程序僅對本地路由器有意義,相連路由器的程序可以不同

理解OSPF程序的另一個重點是,不同的OSPF程序僅對本地路由器有意義,也就是它僅將本地路由器劃分成多個虛擬網路。把各路由器介面劃分到不同的路由程序後,對應介面只與相連路由器介面所在的OSPF程序中的各路由交換路由資訊,但一定要注意的是,相連的兩個路由器介面的路由程序號可以不一樣,當然也可以一樣,因為程序號僅對本地路由器有意義。如上圖,R1路由器的S0介面的OSPF程序號可以與R2路由器的S1介面的OSPF程序號一樣,即都是10,也可以不是10,如20、30等都可以。同理,R3路由器的S1介面OSPF程序號可以與R2路由器的S0介面的OSPF程序號一樣,即都為20,也可以不一樣。

3、同一個網路可以配置在多個OSPF程序中

在OSPF協議中,同一個直連網路可以釋出在多個不同的路由程序中,也就是一個路由器介面所連線的網路可以在多個不同的OSPF程序中釋出。這樣做目的主要出於路由備份的考慮,使得在某一個程序下的網路不通時,對應的路由器介面所連線的網路仍然可以通過其他程序在網路中進行通訊。如上圖,R2路由器S0介面可以同時釋出在10和20的程序中,這樣當R3路由器失效時,它仍可以與R1路由器通訊,或者通過R1路由器所連線的網路最終訪問R3路由器所連線的網路。