OSPF理論介紹

OSPF協議Open Shortest Path First是鏈路狀態協議。RIPEIGRP是距離矢量協議只知道鄰居,但鏈路狀態可知道全網信息,因此天然免疫環路。距離矢量協議和鏈路狀態協議最大的區別就是後者對全網瞭解的更多。同樣有鄰居表,拓撲表,路由表。OSPF傳遞的並不是路由,而是傳遞LSA,最終路由表是從LSA中獲取全網信息後通過SPF算法計算得出的,存放LSA的地方就是LSDB。處於同一區域的路由器內的LSDB都是一樣的。

先大致描述一下:OSPF是鏈路狀態協議,能知道全網的信息。是IGP。OSPF裏封裝的IP協議號是89。組播地址是224.0.0.5 / 224.0.0.6。定時30分鐘更新LSA(注意不是更新路由表),支持觸發更新。AD值是110。度量是帶寬,計算公式:10^8/接口帶寬,單位bps。EIGRP度量裏帶寬是取最小帶寬來計算,而OSPF度量是沿途每一段帶寬計算值之和。天然無環路。支持VLSM和CIDR。支持等價負載均衡。支持認證。

術語解釋

區域Area:

RIP和EIGRP沒區域概念,它們只知道自己的鄰居。但OSPF如果路由器數量多,全網絡的LSA條目將非常多耗內存,且任何一個路由器的LSA發生變化,整個網絡的LSDB都要更新,而且因爲路由器收到的是全網LSA再根據SPF算法算路徑,因此路由表是無法彙總的,導致路由表太大。因此OSPF要想用於大規模網絡需要分區域。分爲骨幹區域Area 0和普通區域。爲了防止區域環路,要求所有普通區域都要連接到骨幹區域,像魚骨圖一樣。所有普通區域間的路由必須經由骨幹區域來學習

ABR:(Area Border Router)

連接骨幹區域Area 0和普通區域的路由器稱爲區域邊界路由器ABR,因爲連接兩個區域因此它有兩張LSDB,分別包含兩個區域內的LSA。

ASBR:(Autonomous System Boundary Rotuer)

如果路由器還連接外部區域(即非OSPF協議)稱爲自治域系統邊界路由器ASBR

LSA:(Link State Advertisement)

LSA即鏈路狀態通告,裏面包含網絡拓撲信息和路由信息,比較複雜,下面會祥述。OSPF靠傳遞LSA使每臺路由器都能掌握整個網絡的拓撲結構和路由信息。LSA頭部信息包括:LSA的類型,LinkID就是該條LSA的名字,ADV Router是通告路由器的RouterID,更新時間Age,序號Seq等。

LSDB:(Link State Database )

LSDB即鏈路狀態數據庫,用於存放LSA。同一區域內的路由器有相同的LSDB。每個LSA在LSDB中都有一個序號,編號方案是0x80000001到0x7FFFFFFF(爲何是從大到小呢?其實0x80000001是-0x7FFFFFFF,從負數循環到正數)。每30分鐘LSA進行一次泛洪以保證LSDB同步,每次泛洪後序號+1。路由器收到LSA後,如果LSDB裏沒有,就馬上將該條LSA加入LSDB裏,回ACK並繼續泛洪該條LSA。如果LSDB裏已經有了,看序號,序號高就更新,序號低就反過來將自己序號高的LSA告訴對方,序號一樣就忽略,但仍舊會回覆ACK。如何判斷本地LSDB裏有沒有該條LSA呢?先看類型(LSA有1-11種類型),再看LinkID,最後看通告路由器的RouterID。3個都一樣說明本地有,3個任意一個不一樣就認爲本地沒有。例如R1->R2->R3,R1會通告和R2間的鏈路,R2也會通告和R1間的鏈路,這時R3收到兩條LSA,因爲是同一鏈路,所以類型一樣,LinkID一樣,但通告路由器RouterID不同,R3會認爲是兩條不同的LSA。

另外如果網絡比較大,爲防止其他路由器產生過度的LSA,LSDB的有超載防護功能,可以限制非本地產生的LSA的數目。超載就down鄰居,問題是不能選擇down哪個鄰居而是全down掉,因此以下情況下才有實際意義:R1連外網跑OSPF,R1在內網裏跑EIGRP,那超載後R1只會down掉和外網的鄰居關係,內網的鄰居關係不會被down掉。或與外網跑OSPF進程1,和內網跑OSPF進程2,那內網也不會被down掉。

SPF:

算法由Dijkstra發明,有時也被稱爲Dijkstra算法。將每臺路由器放置在樹的根節點,根據LSDB裏的LSA裏包含的路由信息,計算出到達目的地的累計開銷,將最佳路徑放入路由表。

RouterID:

每個運行OSPF的路由器都有一個RouterID,必須是全網唯一,在LSDB中使用RouterID來識別路由器。可以用router-id命令手動配置路由器ID,如果沒手動指定,環回口的IP地址將自動成爲RouterID。如果有多個環回口那麼最高IP地址將成RouterID。如果無環回口,路由器上活動的接口中最高IP地址將成爲RouterID。

DR:(Designated Router)

一個區域內,如果路由器間兩兩傳LSA會有的很多重複。因此區域內先選舉一個路由器爲DR,其他路由器將自己LSA通告給DR,這樣DR的LSDB裏就有了整個區域的LSA,再將自己的LSDB發給其他路由器,這樣效率高多了。DR用Hello包選,選舉期40秒,選舉期內Hello包裏優先級高的就是DR,次高的爲BDR。優先級相同RouterID高的就是DR,次高的就是BDR。一個路由不是DR就是BDR就是DRother。選舉期內不存在搶佔,即選舉期內你將某一路由器優先級改高也沒用。

BDR:(Backup Designate Router)

就是Backup的DR,參照上面。DR一旦失效,BDR自動成爲DR,區域內重新選舉BDR。選舉結束後,所有路由器會組播Hello包到224.0.0.5以便它們能跟蹤其他鄰居的信息。DRother只將LSU組播到224.0.0.6,該地址只能到達DR/BDR,DRother在二層就將224.0.0.6就丟棄。DR將自己的LSA從224.0.0.5組播發出來,該地址所有路由器都在監聽。BDR既能收到DR從224.0.0.5發的LSA組播,又能收到DRother從224.0.0.6發的LSU組播

OSPF報文

OSPF報文有5種:Hello,DBD(Database Description),LSR(Link-State Request),LSU(Link-State Update),LSAck(Link-State Acknowledgment)

Hello:

OSPF和EIGRP都用Hello包發現鄰居。EIGRP的Hello包裏會檢查AS號,K值,認證來確認是否真是鄰居。OSPF的Hello裏會檢查RouterId(兩邊必須不一致),區域一致,認證,特殊區域字段(如Stub)一致,Hello/Dead時間兩邊一致。

DBD(Database Description):

例如A->B->C,ABC都有全網路由,假設都有1000條路由。這時加一條A->C的路由,A和C成爲鄰居,如果是EIGRP,那A會將1001(加上這條新路由)條路由告訴C。顯然沒必要。OSPF改進了,A和C成爲鄰居後,A會將自己的DBD(好比倉庫將自己庫存單給對方)給C看,C看後發現只有這條A->C的新的路由本地沒有,就發LSR給A要求這條新路由,A再發LSU將這條路由告訴C,C收到後回LSAck。

LSR(Link-State Request),LSU(Link-State Update),LSAck(Link-State Acknowledgment):

參照上面DBD。

OSPF的8種接口狀態:

Down:是初始化狀態,等待進入Init。只有手動指定鄰居才能看到,自動指定鄰居是看不到該狀態的

Init:收到不帶自己信息的Hello包後進入該狀態

2way:收到帶自己信息的Hello包後進入該狀態。2way後開始選舉DR/BDR,選舉時間是以最晚no shutdown的路由器的時間開始計算40s

Exstart:鄰居起來後準備交互DBD,需要確定一下兩者間的主從關係。選DR/BDR先看優先級再看RouterID,而此處主從關係只看RouterID,高的爲主低的爲從。其實兩臺路由器間所謂的主從並無所謂,只不過是爲了交互DBD方便

Exchange:兩臺路由器確定主從關係後,開始交互DBD

Loading:收到並比較DBD後,向對方發送LSR請求新的LSA時,進入該狀態

Full:對方LSDB內的LSA全有了,就建立了adjacency鄰接關係。根據是否交互LSA可以判斷路由器間是鄰居還是鄰接關係。交互LSA的是鄰接,不交互LSA的是鄰居。因此Full表示鄰接,2way表示鄰居。DR/BDR選舉完後,DRother只和DR/BDR形成鄰接關係,DRother間是鄰居。

Attempt:僅存在NBMA環境中。鄰居關係未建立時拉長Hello時間(其實是用poll時間120秒代替Hello時間),拉長DR/BDR選舉時間(也延長至120秒),以減少帶寬佔用。鄰居關係起來後恢復30秒Hello時間

OSPF的5種網絡類型:

5種網絡類型:點到點P-to-P,Broadcast,NBMA,點到多點P-to-M,點到多點非廣播P-to-M-NB。它們與 二層概念的3種接口網絡類型無關,別搞混了。二層概念的3種接口類型:點到點P-to-P(HDLC,PPP,FR點到點子接口),Broadcast(Ethernet,Token Ring,FDDI),NBMA (FR主接口和多點接口,x.25,ATM)。它們間僅有默認的對應關係,即OSPF的點到點P-to-P,broadcast,NBMA默認對應二層的同名的接口類型,但僅僅是默認的對應關係,你可以手動隨意改。OSPF的點到多點P-to-M,點到多點非廣播P-to-M-NB無二層的對應的接口類型。

P-to-P:(點到點)

默認對應二層鏈路的P-to-P(HDLC,PPP,FR點到點子接口)。不選DR/BDR。所有OSPF報文都從224.0.0.5組播出去。Hello/Dead時間爲10/40s。自動建立鄰居。不產生32位主機路由。特殊類型字段是Stub。P-to-P網絡全是鄰接Full關係。

Broadcast:(廣播的多路訪問網絡)

默認對應二層鏈路的Broadcast(Ethernet,Token Ring,FDDI)。選DR/BDR。去往DR/BDR的報文用組播地址224.0.0.6,從DR去往BDR/DRother的報文用組播地址。224.0.0.5,支持單播。Hello/Dead時間爲10/40s。自動建立鄰居。不產生32位主機路由。特殊類型字段是Transit。

NBMA:(非廣播的多路訪問網絡)

默認對應二層鏈路的 (FR主接口和多點接口,x.25,ATM)。選DR/BDR。所有OSPF報文都用單播。Hello/Dead時間爲30/120s。手動建立鄰居。不產生32位主機路由。特殊類型字段是Transit。

P-to-M:(點到多點)

無默認對應二層鏈路類型。不選DR/BDR。僅Hello用224.0.0.5組播,其他報文都單播。Hello/Dead時間爲30/120s。自動建立鄰居。產生32位主機路由。特殊類型字段是Stub。

P-to-M-NB:(點到多點非廣播)

無默認對應二層鏈路類型。不選DR/BDR。所有OSPF報文都用單播。Hello/Dead時間爲30/120s。手動建立鄰居。產生32位主機路由。特殊類型字段是Stub。

總結:上面看起來挺複雜的,其實只要理解背後的原理不用死記硬背:P-to-P點到點網絡最簡單,一共就兩臺路由器,因此不用選舉DR/BDR。P-to-M / P-to-M-NB是P-to-P的集合,因此同樣不用選舉DR/BDR。不選DR/BDR的是Stub,選DR/BDR的是Transit。NBMA和P-to-M-NB不支持廣播,因此只能單播,且因爲不支持廣播因此無法自動發現鄰居,要手動建立鄰居。

什麼時候改OSPF的網絡類型?

OSPF應該根據不同的需求改變網絡類型。那什麼時候修改網絡類型呢?P-to-P一般不改。Broadcast看情況,如果就兩個路由器可以改成P-to-P,以避免選舉DR/BDR。NBMA基本一定會改,不改的話路由器用OSPF宣告後是學不到路由的,因爲NBMA不自動建立鄰居,要手動建立鄰居。建完鄰居後仍舊可能學不到路由,因爲要選舉DR/BDR,必須保證hub點被選爲DR。DR/BDR都OK後,仍舊可能學不到路由,必須還要保證二層有PVC鏈路。總之一整套配置非常煩瑣。因此常改成點到多點P-to-M(自動建鄰居,不選舉DR/BDR,二層PVC自動就有了)。另一種經驗是NBMA要根據實際網絡類型來改,如果FR網絡是Full-Mesh全互聯的(因費用較高不太常見),常改成Broadcast。如果是Star星型結構,常改成P-to-M。單獨的兩個節點間可以改成P-to-P。中間廣域網不讓通過組播報文的話可以改成P-to-M-NB(注意此時需要手動單播建鄰居)。

鄰居的建立和OSPF的網絡類型有何關係?

上面介紹Hello時介紹過建立鄰居時檢查的字段,並沒有要求檢查網絡類型(況且Hello包里根本就沒有網絡類型這個字段),因此網絡類型和建立鄰居無關。但網絡類型決定了Hello時間的默認值,時間不一致不能建立鄰居,這個意義上講網絡類型和建立鄰居有關。但Hello時間可以手動修改,因此又無關。比如一端是P-to-P,另一端是Broadcast,Hello時間都是10可以建立鄰居,如另一端是P-to-M,就不能建立鄰居,除非修改Hello時間一致後,可以建立鄰居。但最好不要這樣,比如一端是P-to-P,另一端是Broadcast,Hello時間相同可以建立鄰居,但建立鄰居後仍舊學不到路由。因爲P-to-P是Stub,Broadcast是Transit,類型不同,因此該段就無法互相學習路由。(具體原因是:P-to-P端發出的1類LSA裏有point-to-point,Broadcast端是Transit需要選舉DR/BDR,選舉結果自然是自己成爲DR,而DR是無法識別point-to-point的LSA的。反之P-to-P端收到的LSA裏有Transit Network也是無法識別的。所以就算能起鄰居,能交互LSA,能同步LSDB,但由於LSA無法識別無法通過SPF算法計算最優路徑,無法學習到路由)

OSPF的11種LSA類型:

OSPF傳遞的是LSA而非路由表,因此理解LSA是理解OSPF的關鍵。共分11種類型:

1類:路由器LSA(Router Link States)

只在本區域內泛洪,不穿越ABR。每個運行OSPF的路由器都會生成一個1類的LSA。LinkID爲路由器的RouterId。內容包括路由信息和拓撲信息。如果是Stub網絡,路由信息裏有前綴掩碼和去往這條路由的開銷。如果是Transit Network網絡(即Broadcast和NBMA)有DR的IP地址和自己的IP地址,但沒有BDR和DRother的信息,也沒有自己IP的掩碼,因此要結合2類LSA一起分析。拓撲信息裏有對方的RouterID和自己的IP地址。

2類:網絡LSA(Network Link States)

由DR產生,即只在選舉DR/BDR的Broadcast和NBMA網絡中才有。只在本區域泛洪,不穿越ABR。LinkID爲DR接口的IP。內容需聯合1類的LSA共同描述出網絡的拓撲與路由。(只有1類和2類LSA裏除路由信息外,還包含網絡拓撲信息)

3類:彙總LSA(Summary Net Link States)

泛洪整個自治系統。負責將一個區域的信息給另一個區域,即將區域內的1/2類LSA變成3類LSA通過ABR告訴給別的區域。每經過一個ABR通告路由器會發生變化。LinkID就是這條路由的前綴。內容就是路由信息。 默認不自動彙總,且3類LSA通告每一個子網,因此通常會手動彙總,否則不便管理。區域內的1類2類LSA不傳給其他區域,區域間將1類2類LSA彙總成3類LSA像距離矢量協議那樣通告,這樣全網信息都知道了。

4類:ABR彙總LSA(Summary ASB Link States)

4類是爲5類服務的,通過ABR將ASBR的位置泛洪整個自治系統。LinkID爲ASBR的RouterID。和3類一樣,每經過一個ABR通告路由器會發生變化。內容就是ASBR的位置。

(每條LSA的LinkID命名規則還不太一樣,其實就是爲了保證唯一性,防止產生二意。1類的LinkID就是路由器的RouterId,不必解釋。2類的LinkID是DR接口的IP,因爲一個路由器可能會被多個區域選爲DR,只有用接口的IP纔不會重複。3類的LinkID是路由的前綴。4類的目的是通告ASBR,因此LinkID就是ASBR的RouterID。)

5類:自治系統外部LSA(Type-5 AS External Link States)

由ASBR產生,通過ASBR將外部的信息泛洪整個自治系統。通告路由器是不變的(3/4類中會變)。LinkID就是這條路由的前綴。如果和ASBR在同一區域,那路由器通過1/2類LSA就能知道ASBR。如果和ASBR不在同一區域,路由器需要結合4類LSA才能找到ASBR。內容是外部網絡。默認不自動彙總,通常會手動彙總,否則不便管理。

7類:NSSA外部LSA

只存在於NSSA區域中,由連接NSSA區域的ASBR產生的關於NSSA的信息,在NSSA區域內泛洪,並且可以被ABR轉換爲5類LSA。LinkID爲路由的前綴。

6類:組播LSA

表示OSPF組播中的成員,但基本不用

8類:外部屬性LSA for BGP

(未被實現)

9類:非透明LSA(本地鏈路範圍)

10類:非透明LSA(本地區域範圍)

11類:非透明LSA(自治系統範圍)

9/10/11類在MPLS流量工程中用

OSPF的4種路由類型:

OSPF區域內交互LSA後,區域內同步LSDB。之後通過ABR/ASBR跨區域交互LSA後,再同步LSDB。這樣每臺路由器均有了整個網絡的拓撲信息和路由了。但並不是所有路由都會被加入路由表。RIP和EIGRP先比較AD值再比較開銷來決定哪條路由可以被加入路由表。OSPF多了步比較類型,即先比較AD值,再比類型(O>OiA>OE1>OE2),最後比開銷,都一樣就負載均衡。4種路由類型如下,優先級從高到低:

O:同一區域內的路由,即1/2類LSA

O IA:同一自治系統中不同區域內的路由,即3類LSA

O E1:外部路由,加上沿途開銷

O E2:外部路由,不加上沿途開銷(通常如果不必考慮內部網絡帶寬的話用OE2方便,需要考慮內外帶寬的話用OE1。如果用OE2,內部多條路徑開銷相同時不會負載均衡,而是選距離ASBR近的路徑)

OSPF的4種區域類型:

OSPF普通區域(非骨幹區域Area0)可指定爲4種特殊類型:Stub,Totally Stub,NSSA,Totally NSSA。區域指定特殊分類型的目的是拒絕掉一部分LSA以便簡化網絡,但要保證被拒絕掉的LSA內包含的路由可達。

Stub Area:

不接受自治系統外部的LSA,即拒絕5類(這樣也拒絕了4類),ABR自動產生3類的默認路由去往被拒絕掉的外部路由。Stub Area內的路由器都要被配置成stub,否則路由器的Hello包裏的特殊區域字段不一致的話,會導致區域內建立不了鄰居。

Totally Stub Area:

在Stub Area的基礎上再進一步拒絕掉自治系統內部其他區域的LSA。等於不接受任何非本區域的LSA,即拒絕5類(這樣也拒絕了4類)和3類。同樣ABR自動產生3類的默認路由去往被拒絕掉的外部路由。區域內的路由器都要被配置成stub,ABR上配置成Totally Stub。是Cisco特有的類型。

NSSA:(Not So Stubby Areas)

在Stub Area基礎上,允許接收以7類LSA發送的外部路由信。因此允許區域內存在ASBR。ASBR向NSSA區域發送7類LSA來描述外部路由。ABR將區域內收到的7類LSA轉換成5類LSA向別的區域做通告。因爲可以將外部網絡的路由重發布進OSPF進程,所以ABR不會自動產生默認路由,要手動配置

Totally NSSA:

在NSSA基礎上進一步拒絕掉自治系統內部其他區域的LSA,即拒絕5類(這樣也拒絕了4類)和3類。由於沒有去往其它區域的路由,ABR自動產生3類的默認路由去往被拒絕掉的外部路由。

總結:如果外部的明細比較多,而本區域路由器性能又比較低,且只有一個ABR或一個ASBR,那特別適合配置成Stub或Tolly Stub。Stub和Totally Stub區域內不能存在ASBR,虛鏈路是不能穿越Stub 區域的。Stub和Totally Stub區域內至少要有一個ABR,最好只有一個ABR,如有多個ABR時,可能會選擇次優路徑。非Totally區域的ABR會過濾掉5類LSA,Totally區域的ABR還會進一步將3類LSA過濾掉。

OSPF的內部和外部彙總:

在普通區域上設置特殊類型可以拒絕掉3/5類路由,縮小路由表。還可以用匯總將掩碼變短來實現縮小路由表的目的。OSPF分內部彙總和外部彙總,命令稍有不同。

內部彙總:

在ABR上做,將區域間的路由彙總。命令:R1(config-router)#area 1 range 前綴 掩碼

外部彙總:

在ASBR上做,將自治系統外部的路由彙總。命令:R1(config-router)#summary-address range 前綴 掩碼

虛鏈路:

虛鏈路即在兩個區域間建立一條虛擬的鏈路,目的是爲了解決區域分隔和骨幹區域分割的問題。這裏只介紹一下概念,具體實現虛鏈路放在實驗部分。

區域分隔:OSPF規定普通區域必須和骨幹區域相連,經由骨幹區域來交換區域間路由信息,但由於網絡規劃不妥或歷史原因,有些普通區域沒有與骨幹區域相連,導致學不到其他區域的路由,這就是區域分隔問題。通過虛鏈路可以將普通區域和骨幹區域連接起來

骨幹區域分割:OSPF規定只能有一個骨幹區域。但由於網絡規劃不妥或歷史原因,一個自治系統內出現了多個骨幹區域,導致路由學習出現問題。通過虛鏈路可以將多個骨幹區域連接起來成爲一個骨幹區域

虛鏈路應該作爲一種不得已而爲之的解決問題的方案,最好應該是規劃好網絡避免出現這種問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章