OSPF協議原理詳解

一.鏈路狀態路由協議 (Link Status Protocol)基本概念

OSPF的概念

鏈路狀態路由選擇協議又被稱爲最短路徑優先協議,它基SPF(shortest path first )算法。他比距離矢量協議複雜的多。路由器的鏈路狀態的信息稱爲鏈路狀態,包括:接口的IP地址和子網掩碼,網絡類型,(如以太網鏈路或串行點對點鏈路),該鏈路的開銷,該鏈路上的所有的相鄰路由器。

OSPF特點

鏈路狀態路由協議是層次式的,網絡中的路由器並不向鄰居傳遞“路由項”,而是通告給鄰居一些鏈路狀態。鏈路狀態協議只是通告給鄰居的一些鏈路狀態。運行該路由協議的路由器不是簡單地從相鄰的路由器學習路由,而是把路由器分成區域,收集區域的所有的路由器的鏈路狀態信息,根據狀態信息生產網絡拓撲結構,每一個路由器再根據拓撲結構計算出路由。

OSPF工作過程

(1)瞭解直連網絡
(2)向鄰居發送hello包(鄰居指啓用了相同鏈路狀態路由協議的其他任何路由器)
(3)建立鏈路狀態數據包
(4)將鏈路狀態數據包泛洪給鄰居 路由器將其鏈路狀態信息泛洪到路由區域內的其他所有鏈路狀態路由器,他一旦收到來自鄰居的LSP,不經過中間計算,立即將這個LSP從除接收該LSP口以外的所有接口發出,此過程在整個路由區域內的所有路由器上形成LSP的泛洪效應。LSP在路由器初始啓動期間,或路由協議啓動過程期間,或在每次拓撲發生更改(包括鏈路接通和斷開)時,或是鄰接關係建立,破裂時發送,並不需要定期發送。

PS:距離矢量路由協議則不同,她必須首先運行貝爾曼-福特算法來處理路由更新,然後纔將他們發送至其他路由器,而鏈路狀態協議則是再泛洪完成後在計算SPF算法,因此到達收斂的速度比距離矢量路由協議速度要快。

(5)每臺路由器使用數據庫建立一個完整的拓撲圖並計算通向每個目的網絡的最佳路徑。

OSPF的網絡類型

點到點連接

將一對路由器連接起來的網絡,使用的是PPP HDLC協議
使用組播224.0.0.5來發送各種數據包
沒有DR/BDR的選舉,直接形成full鄰接關係,不用手動指鄰居
在這裏插入圖片描述

廣播

多路訪問網絡,如以太網,需要DR和BDR的選舉,不用手動指鄰居
通常以組播發送HELLO報文,LSU報文,和LSACK報文,以單播形式發送DD和LSR報文
DR和BDR給非指定路由器發送消息使用的是組播224.0.0.5
非指定路由器給DR和BDR發送消息使用的是組播224.0.0.6

在這裏插入圖片描述

非廣播多路訪問(NBMA, Non-Broadcast Multiple Access)

連接的路由器超過兩臺但是沒有廣播功能,幀中繼網絡和ATM網絡
所有數據包均單播發送,有DR的選舉,需要手動指定鄰居
在這裏插入圖片描述

點到多點

Hello包以組播形式發送,其他類型數據包由單播發送
不選舉DR,不用手動指鄰居
在這裏插入圖片描述

OSPF報文

OSPF報頭格式

OSPF直接封裝在IP數據包中

OSPF數據包

Hello包

作用:建立鄰居關係
各字段功能:
Network Mask :發送數據包的源IP地址對應的子網掩碼
Hellointerval:Hello時間間隔,默認10S,失效間隔默認爲Hello間隔的3倍
Rtr Pri:路由器優先級用於選舉DR和BDR
DR:指定路由器的IP地址,開始時爲空
BDR:備份指定路由器的IP地址,開始是也爲空
Neighbor:裏面標識了鄰居的路由器ID,可以表示多個鄰居
Stub and Flag :末節標識符
鄰居關係建立條件:HELLO和失效間隔要一致,區域號要相同,區域末節標識符要相同,有認證的話,認證要相同,區域ID要相同,子網掩碼要一致

DBD包(Datebase Description)

作用:在OSPF鄰居關係建立之後,DBD包負責描述本地的LSDB,接收到的路由器通過和自己的LSDB做比對,進而同步區域中的LSDB
各字段功能
I:該位置1表示這是發送的第一個數據包,開啓了LSDB同步過程
M:該位置1表示之後還有DD包要發送,若置0則表示沒有數據包要發送了
MS:用來表示誰是主(Master)誰是從(Slave)由主路由器引導進行LSDB的同步
DD Sequence Number:利用序號來確保傳輸的完整性和可靠性
LSA Headers:LSA頭部信息摘要,可以有多個LSA頭部摘要信息

LSR包(Link-State Request)

作用:用來查詢本LSDB中沒有或者哪些LSA是已經失效的
各字段功能:
LS type:指定所請求的LSA類型,一共有7類
Link State ID:用來表示LSA,根據LSA種類的不同,有不同的含義
Advertising Router:用來表示產生此LSA的路由器ID

LSU(Link-State Update)

作用:對LSR進行迴應,或者定時發送LSU來更新區域中的LSDB,發送的是真正需要的LSA的內容
各字段功能:
Number of LSA:指定此報文中共發送的LSA數量
LSAs:一條條具體的LSA完整的信息,可以有多個LSA的信息

LSAck

作用:用來在收到對端發送的LSU之後返回的確認報文,內容是需要確認的LSA頭部
各字段功能:
LSA Headers:LSA頭部信息
一個ACK可以確認多個LSA

OSPF鄰居建立過程(重!)

首先對鄰居關係,和鄰接關係要區分開,兩臺路由器互相之間的狀態是2-way則表明鄰居關係建立,當鄰居關係爲FULL是表明鄰接關係建立

關係變化過程

down->init->2-way->exstart->exchange->loading->full
down:表示還沒有建立起鄰接關係,沒有檢測到活動鄰居
init:表示從對端收到的HELLO包中,沒有自己的路由器ID信息
2-way:表示從對端收到的HELLO包中,已經有自己的路由器ID信息了,已建立鄰居關係可以共享鏈路狀態數據
exstart:表示正在確定主從關係,即誰先發送DBD
exchange:在主的帶領下開始交換DBD
loading:請求更詳細的信息
full:已建立完全鄰接關係 完成更新過程 其數據庫與鄰居完全相同

過程詳解

鄰居建立過程(down->init->2-way)

希望建立完全OSPF鄰居鄰接關係的路由器之間交換OSPF HELLO包(組播224.0.0.5),雙方的鄰居此時都處於down狀態,這是鄰居會話的初始狀態,當路由器從鄰居收到了一個Hello包,但是沒有在鄰居Hello包中看到自己的路由器ID時,他將轉化爲INIT狀態,當路由器從鄰居收到Hello包中看到自己的路由器ID時,他將轉爲2-Way狀態。表示鄰居之間已經建立了雙向通信

交換LSDB過程(exstart->exchange)

路由器開始準備交換彼此的LSDB,正式交換LSDB前,會選舉出主/從路由器,這個階段即爲exstart狀態
首先一條鏈路上的路由器都會認爲自己是主路由器,此時將鄰居視爲exstart狀態,發送空的DBD包(不含LSA的索引,含有RID,MS(主)標記位,M(多),1(初始)標記位都會標記爲1),來比較他們的RID,RID大的將成爲主路由器。被認爲從路由器的那一方需要再發送一個DBD包(MS置爲0,I置爲0,序列號爲主路由器發來的DBD中存在的序列號)來響應。這樣主從關係就確定下來
隨後,路由器都進入EXCHANGE狀態,開始互換LSDB中的信息,這個過程總是由主路由器來引導,有以下兩條規則
1.主路由器發送的DBD包,從路由器總要做出響應(主路由器發送的DBD包與從路由器發送的DBD包相同)-------如果從路由器沒有LSA需要通告了,那麼就會響應回空的DBD
2.從路由器發送的DBD包,只能用作對主路由器發送的DBD包的響應(從路由器無法自主的發送DBD包)-------如果主路由沒有LSA需要通告了,而從路由器有LSA需要通告,那麼此時從路由器發回的響應的DBD包中的M位(MORE)置爲1,即告訴主路由我還有LSA要發送,這樣主路由器就會繼續發送DBD,直到從路由器將所有LSA都通告完(這時M位就爲0了)。
路由器會將收到的DBD中的信息而自己LSDB中不存在的LSA頭部加入到鏈路請求列表中,進入LOADING狀態後會根據這個列表來發送請求信息。

同步鏈路狀態數據庫過程(Loading->Full)

這時路由器就有了鄰居的LSA索引列表,路由器都將進入LOADING狀態,來請求自己LSDB中還沒有的LSA的信息。路由器會發送LSR來請求一個或者多個LSA的信息,對端會發送回LSU來告訴路由器他想要的信息。OSPF有以下兩種機制來確認對端收到了數據包。
1.對端發送回相同的LSU,即可表明對端收到了信息
2.對端發送回LSACK表明已經收到了LSU(LSACK中帶有LSA頭部的信息
不再發送和接收LSU和LSR,路由器就進入了FULL狀態,此時他們的LSDB是相同的,就可以進行SPF算法來計算路徑了。

OSPF 鄰居關係不能正常建立的原因和解決方法

  1. 接口上沒有激活 ospf
  2. 物理層或者是數據鏈路層協議 down.
  3. 建立鄰居的接口被 passive掉
  4. OSPF的 hello 組播地址被 ACL Block
  5. 在 broadcast鏈路上的子網掩碼不匹配
  6. Hello/dead 間隔不匹配
  7. 認證方式或者是認證密碼不匹配
    使用 debug ip ospf adj 來查看,可以自己使用不同的情況來驗證
  8. 兩臺路由器處於不同的 AREA
  9. Stub/transit/NSSA 區域類型不匹配

DR和BDR的選舉

DR,BDR存在意義

DR BDR存在於多路訪問網絡中,作用是減少區域內的同步次數,降低路由器的內存消耗,減少了路由流量更新,確保同一區域內的路由器擁有相同的LSDB

選舉過程

選舉可能出現的時刻:整個網絡剛搭建好,SW開啓之後,LAN因故障失效之後,DR,BDR失效之後都存在選舉的過程
OSPF priority 最高者爲DR(缺省所有OSPF路由器爲1,通過ip ospf priority 接口配置命令更改,priority爲0表示不參與選舉),如果priority相同,則具有最高的Router-ID的路由器被選舉爲DR

LSA(重!!)

LSA基本概念

Link State Advertisement,鏈路狀態通告,路由器發出的關於網絡結構的通告,描述了鏈路或接口的狀態及每條鏈路的成本
LSA是一種數據結構,保存在LSDB中,承載在LSU中然後發送出去,LSDB中會存儲與網絡有關的一系列屬性。
LSA只能由發起這個LSA的路由器進行操作和更新或者是撤銷,別的路由器不得對其進行操作,只能對其進行泛洪,不能阻塞這個LSA,也不能在這個LSA的最大時長計時器前丟棄這個LSA。

最新LSA的判定

·更高的序列號:每30(1800S)分鐘擴散一次
·校驗和:每隔五分鐘重新校驗 除Age字段之外 進行校驗, 越大越新
·老化時間:默認60分鐘 時間計數,每經過一臺路由器時間+1

LSA類型

圖片出處:https://blog.csdn.net/jinzheng069/article/details/12916877
在這裏插入圖片描述
LSA1 路由器LSA(Router LSA)
LSA2 網絡LSA(Network LSA)
LSA3 網絡彙總LSA(Network summary LSA)
LSA4 ASBR彙總LSA(ASBR summary LSA)
LSA5 自治系統外部LSA (Autonomous system external LSA)
LSA6 組成員LSA (Group membership LSA) *目前不支持組播OSPF (MOSPF協議)
LSA7 NSSA外部LSA (NSSA External LSA)

類型1:路由器LSA Router Link States

鏈路狀態ID(LSID):源路由器ID
通告範圍:只在特定區域內泛洪
通告內容:
1.路由器在區域內的接口和接口所連接的鄰居(包含鏈路的開銷)路由器鏈路狀態。直連鏈路信息
2.網絡連接類型
點到點的連接,描述的是鄰居路由器ID
中轉網絡的連接,描述的是DR接口的地址
末節網絡的連接,描述的是IP網絡的子網
虛鏈路,描述的是鄰居路由器ID
3.鏈路開銷
4.是否爲ABR

類型2LSA:網絡LSA Net Link States

鏈路狀態ID:DR的IP接口地址
通告範圍:在特定的區域內泛洪,只有在存在DR和BDR的網絡中才會存在
通告內容:列出了構成中轉網絡的所有路由器,包括鏈路的子網掩碼,鏈路狀態等信息

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

鏈路狀態ID:目的網絡的地址
通告範圍:區域間通告,由一個區域通告到另一個區域
通告者:ABR
通告內容:ABR將從一個區域中學習到的信息彙總成鏈路狀態通告。

與3類LSA有關的計算

(1)區域內開銷出現變化時
假設區域1內某鏈路開銷出現了變化,該區域內的路由器重新進行SPF算法來更改路徑。再次重新收斂後,該區域的ABR(假設該區域只有一個ABR)會向區域0發送一個更新的LSA來通告這一變化,此時區域0和其他收到這個彙總LSA的區域不會重新進行SPF算法,只會將這個LSA放入自己的LSDB中去,將去往目的網絡的開銷更改
(2)類型3LSA的生成和傳播規則
·ABR只會將來自骨幹區域的 3類LSA,進行SPF算法,得出路由表從而再創建3類LSA發送到非骨幹區域中,而不會對來自非骨幹區域的LSA進行操作(一個區域中有兩個ABR,兩個ABR都會通告3類LSA,這樣ABR就會得到另一個ABR發送的三類LSA)。但這些LSA會存在與非骨幹區域的LSDB中,並且在非骨幹區域中泛洪(保證LSDB的同一性)
·當ABR創建並泛洪3類LSA,想要將這個區域內的網絡通告到另一個區域時,如果是從非骨幹區域通告到骨幹區域,ABR只會考慮區域內的路由(路由表中不帶IA的),如果是從骨幹區域通告到非骨幹區域,會同時考慮區域內的路由和區域間的路由(即會告訴非骨幹區域去往其他區域的信息)所有路由器都會有相同的LSDB,根據LSDB來構建自己的路由表

類型4LSA:ASBR彙總LSA

鏈路狀態ID:ASBR的路由器ID
通告範圍:除了末節區域的整個OSPF域中
通告內容:如何到達ASBR
通告者:ABR

與4類LSA有關的計算

(1)4類LSA在區域中的泛洪
有外部路由接入的區域的ABR生成最原始的類型4LSA,將這個LSA通告入骨幹區域,其中的開銷是這個ABR到達ASBR的開銷,類似於三類LSA,骨幹區域內的ABR路由器接收到這個類型的LSA後,會將這個類型的LSA加入到SPF算法中,生成新的4類LSA,通告到非骨幹區域中去,這個類型4的LSA聲明的開銷爲LSDB中的LSA的開銷加該路由器到原始ABR的距離,非骨幹區域內路由器計算去往ASBR的距離時,就是該路由器到ABR的距離,加上收到的類型4LSA中通告的距離

類型5LSA:自治系統LSA

鏈路狀態ID:外部網絡號
通告範圍:除了末節區域的整個OSPF自治系統中
通告內容:如何通過ASBR到達外部網絡
通告者:ASBR的路由器ID
PS:LSA 5的通告路由器在穿越ABR的時候是不會改變的

類型7LSA:NSSA外部LSA

鏈路狀態ID:外部網絡號
通告範圍:只存在於NSSA區域,在ABR處被當作5類LSA泛洪出去
7類ASBR,轉化爲5類LSA後,保留一個地址,保留的地址是ASBR的接口地址,其他區域內到外部的路徑實際上是去到保留地址的路徑。兩個ABR時,路由器ID大的負責將7類LSA轉爲5類LSA

其他有關LSA的特性及操作

(1)接口失效後,LSA的運作情況
首先他會發送新的類型1LSA,告訴他的鄰居,他已經沒有了那條鏈路的信息,其次因爲down掉的是LAN中的DR接口,所以路由器會撤銷之前發送的類型2LSA,通過發送改變LSA時長但是並不改變序列號的二類LSA的方法,可以快速的撤回該類型的LSA。這時區域的ABR也感知到了拓撲發生的變化,他根據路由表發生的變化發送新的LSA來告知骨幹區域和其他區域,其他區域再採取相應的措施(去除路由條目,或者有備份路徑)
(2)產生LSA的路由器身份
區域內路由器產生1類LSA和2類LSA
②ABR產生3類和4類LSA
③ASBR生成5類和7類LSA

(3)3類LSA的操作
ABR會忽略來自非骨幹區域的三類LSA,此舉可以消除三類LSA由骨幹區域進入非骨幹區域而又由非骨幹區域進入骨幹區域的問題
②完全末節區域中有默認路由的3類LSA

OSPF區域類型和結構(重!)

區域類型

(1)骨幹區域:所有區域必須連接骨幹區域
(2)標準區域:接收所有內部和外部的路由信息
(3)末節區域:不接受自治系統外部的路由信息(不接受4類和5類LSA),通過一條默認的全0三類LSA前往自治系統外部
(4)完全末節區域:只接收區域內部路由信息 ,通過默認路由和別的區域相連(不接受3,4,5類LSA,通過默認路由與外部網絡通信)
(5)NSSA:接收區域路由和有限的外部路由信息 限制自治系統外信息,NSSA區域中可以有ASBR,存在1/2/3/7類LSA(3類還有一條全0的特殊3類)
(6)完全NSSA:只接收區域內的路由信息和有限的外部路由信息,存在1/2/7類LSA,一條全0的特殊3類。
配置 NSSA Area後要在區域內手工配置一條默認路由(以便訪問OSPF中其他區域的網絡)

OSPF末節區域的默認路由

(1)末節區域,完全末節區域,完全NSSA區域會自動生成一條區域間的默認路由,NSSA區域不會自動生成,需要手動配置一下
(2)如果有兩個ABR,會產生次優路由,用一條默認路由代替一堆路由,其本質也可以是看作路由彙總,路由彙總一直都會損失掉一部分粒度

OSPF路徑選擇

OSPF路由類型

·O,區域內路由
·OIA,區域間路由
·OE2,外部路由,開銷值在區域內傳播時不改變
·OE1,外部路由,開銷值在區域內傳播時改變
·ON2,在NSSA區域中存在,類似OE2
·ON1,在NSSA區域中存在,類似OE1
·OIA,區域間默認路由
·O
N2,NSSA區域中默認路由

選路規則

以下按優先級排列,先出現的優先級最高
·區域內路由>區域間路由>E1/N1路由(這兩類路由被看作是平等的)>E2/N2路由

區域內和區域間路由的選取(同一區域內多臺ABR時)

爲了避免區域邊界單點故障的情況,多數網絡中會至少會使用兩臺ABR,以防止ABR出現故障而造成的網絡癱瘓。ABR可以同時從區域內路由器和另一臺ABR學到某個特定子網的信息。ABR可以學到一條區域內的路由(來自所連接區域),和一條區域間路由(來自另一臺ABR,不是直接到達網絡所在區域而是先到ABR1再通過ABR1到另一個區域,通過了兩個區域所以算作區域間路由)。即使區域間路由的開銷值要比區域內路由的開銷值小,也會優選選取區域內的路由

OSPF虛鏈路

定義

指一條通過一個非骨幹區域連接到骨幹區域的鏈路

目的

通過一個非骨幹區域連接一個區域到骨幹區域
通過一個非骨幹區域連接一個分段的骨幹區域

特點及規則

(1)虛鏈路必須配置在兩臺ABR路由器之間
(2)傳送區域不能是一個末梢區域
(3)虛鏈路的穩定性取決於其經過的區域的穩定性
(4)虛鏈路有助於提供邏輯冗餘

思考:爲什麼OSPF的骨幹區域要是連續的?
因爲所有域間流量都要通過area 0轉發,非骨幹區域可以配置成各種類型,例如末節區域,nssa,他可能並不知道所有的外部路由,如果要轉發給那些未知目的地,非骨幹區域的做法就是把數據轉發給骨幹區域,讓骨幹區域去做轉發,所以骨幹區域的功能是核心轉發,所以要都和骨幹區域相連接。

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