OSPF動態路由協議筆記之(二) : 基本原理(下)
本筆記承接上一節,繼續對OSPF報文的報文頭部和報文類型進行詳盡的介紹,接着介紹OSPF建立鄰接關系的過程(即LSDB同步的過程),最后補充上一節筆記中提及的DR和BDR選舉的過程。
OSPF報文類型及作用
(1)OSPF協議報文頭部
RIP路由器之間是基於UDP 520的報文進行通信,OSPF也有其規定的通信標准。OSPF使用IP承載其報文,IP報文頭部協議號為89。
在OSPF Packet部分,所有的OSPF報文均使用相同的OSPF報文頭部。報文頭部各字段含義如下:
① Version(1個字節):版本。對於當前所使用的OSPFv2,該字段的值為2。
② Type(1個字節):類型。OSPF報文類型。其值分別代表以下幾種報文類型:
l 1:Hello報文;
l 2:DD報文;
l 3:LSR報文;
l 4:LSU報文;
l 5:LSAck報文。
③ Packet length(2個字節):數據包長度。表示整個OSPF報文的長度,單位是字節。
④ Router ID(4個字節):發送該報文的路由器標識。表示生成此報文的路由器的Router ID。
⑤ Area ID(4個字節):發送該報文的所屬區域。表示此報文需要被通告到的區域。
⑥ Checksum(2個字節):校驗和。用於校驗報文的完整性,其校驗的范圍是整個OSPF報文,包括OSPF報文頭部。
⑦ Auth Type(2個字節):驗證類型。
為0時表示不認證;為1時表示簡單的明文密碼認證;為2時表示加密(MD5)認證。
⑧ Authentication(8個字節):鑒定字段。認證所需的信息,該字段的內容隨AuType(驗證類型)的值不同而不同。
當驗證類型為0時未作定義;類型為1時此字段為密碼信息;類型為2時此字段包括Key ID、MD5驗證數據長度和序列號的信息,MD5驗證數據添加在OSPF報文后面,不包含在Authenticaiton字段中。
(2)OSPF報文類型
OSPF的報文頭部定義了OSPF路由器之間的通信的標准與規則,基於這個標准OSPF報文需要實現什么功能呢?
Type=1為Hello報文,用來建立和維護鄰居關系,鄰居關系建立之前,路由器之間需要進行參數協商。
Type=2為數據庫描述報文(DD),用來向鄰居路由器描述本地鏈路狀態數據庫,使得鄰居路由器識別出數據庫中的LSA是否完整。
Type=3為鏈路狀態請求報文(LSR),路由器根據鄰居的DD報文,判斷本地數據庫是否完整,如不完整,路由器把這些LSA記錄進鏈路狀態請求列表中,然后發送一個LSR給鄰居路由器。
Type=4為鏈路狀態更新報文(LSU),用於響應鄰居路由器發來的LSR,根據LSR中的請求列表,發送對應LSA給鄰居路由器,真正實現LSA的泛洪與同步。
Type=5為鏈路狀態確認報文(LSAck),用來對收到的LSA進行確認,保證同步過程的可靠性。
DD、LSR、LSU、LSAck與LSA的關系:
DD報文中包含LSA頭部信息,包括LS Type、LS ID、Advertising Router 、LS Sequence Number、LS Checksum。
LSR中包含LS Type 、LS ID和Advertising Router 。
LSU中包含完整的LSA信息。
LSAck中包含LSA頭部信息,包括LS Type、LS ID、Advertising Router、LS Sequence Number、LS Checksum。
五種報文可以高效地完成LSA的同步,那么實際的報文交互過程是什么呢?
(3)OSPF報文功能需求
Hello機制動態發現並維護鄰居前文已介紹,不再贅述。
RIP設置了Request和Response兩種報文來完成路由信息的同步,OSPF路由器之間為了完成LSA的同步,可以直接把本地所有LSA發給鄰居路由器,但是鄰居路由器直接同步LSA並不是最好的方式。
更快速、更高效的方式是先在鄰居路由器之間傳送關鍵信息,路由器基於這些關鍵信息識別出哪些LSA是沒有的、哪些是需要更新的,然后向鄰居路由器請求詳細的LSA內容。對於OSPF來說,需要有比RIP更高效、更可靠的方式來完成路由器之間的信息同步。
OSPF建立鄰接關系
OSPF協議主要分為建立鄰居關系和鄰接關系兩個步驟。在上一節筆記中,已經介紹了OSPF在兩台路由器中進行完兩次Hello報文交互之后,建立鄰居關系的過程,其中經歷從Down狀態到2-way狀態的過程。接下來將會繼續介紹建立鄰接關系的詳細過程。
建立鄰接關系,指在兩台路由器中進行完鏈路狀態數據庫(LSDB)同步之后,建立起來的最終狀態。其中經歷了從ExStart狀態到Full狀態的過程,最終同步顯示的狀態是Full。
建立鄰接關系的狀態含義:
Ⅰ ExStart:鄰居狀態變成此狀態以后,路由器開始向鄰居發送DD報文。Master/Slave關系是在此狀態下形成的,初始DD序列號也是在此狀態下確定的。在此狀態下發送的DD報文不包含鏈路狀態描述。
Ⅱ Exchange:在此狀態下,路由器與鄰居之間相互發送包含鏈路狀態信息摘要的DD報文
Ⅲ Loading:在此狀態下,路由器與鄰居之間相互發送LSR報文、LSU報文、LSAck報文。
Ⅳ Full:LSDB同步過程完成,路由器與鄰居之間形成了完全的鄰接關系。
LSDB同步過程如下:
Step 1:RTA和RTB的Router ID分別為1.1.1.1和2.2.2.2並且二者已建立了鄰居關系,兩者的狀態均為2-way狀態。當RTA的鄰居狀態變為ExStart后,RTA會發送第一個DD報文。
此報文中,DD序列號(Seq)被隨機設置為X,I-bit設置為1,表示這是第一個DD報文,M-bit設置為1,表示后續還有DD報文要發送,MS-bit設置為1,表示RTA宣告自己為Master(主)。
Step 2:當RTB的鄰居狀態變為ExStart后,RTB會發送第一個DD報文。收到該DD報文后,RTA會產生一個Negotiation-Done事件,並將鄰居狀態從ExStart變為Exchange。
此報文中,DD序列號(Seq)被隨機設置為Y(I-bit=1,M-bit=1,MS-bit=1,含義同上)。由於RTB的Router ID較大,所以RTB將成為真正的Master(主)。
Step 3:當RTA的鄰居狀態變為Exchange后,RTA會發送一個新的DD報文,此報文中包含了LSDB的摘要信息,收到此DD報文后,RTB會產生一個Negotiation-Done事件,並將鄰居狀態從ExStart變為Exchange。
此報文中,DD序列號(Seq)設置為RTB在步驟2中使用的序列號Y,I-bit=0,表示這不是第一個DD報文,M-bit=0,表示這是最后一個包含LSDB摘要信息的DD報文,MS-bit=0,表示RTA宣告自己為Slave(從)。
Step 4:當RTB的鄰居狀態變為Exchange后,RTB會發送一個新的DD報文,此報文包含了LSDB的摘要信息。
此報文中,DD序列號(Seq)設置為Y+1, MS-bit=1,表示RTB宣告自己為Master(主)。
Step 5:雖然RTA不需要發送新的包含LSDB摘要信息的DD報文,但是作為Slave,RTA需要對Master發送的每一個DD報文進行確認。所以,RTA向RTB發送一個新的DD報文。發送完此報文后,RTA產生一個Exchange-Done事件,將鄰居狀態變為Loading。
此報文中,DD序列號(Seq)設置為Y+1,該報文內容為空。
Step 6:RTB收到此報文后,假設在RTB的LSDB是最新最全的,不需要向RTA請求更新的情況下,會直接將鄰居狀態變為Full。
LSDB同步過程
當RTA作為Slave(從),當發現從Master(主)路由器發過來的DD報文中,包含了本地LSDB不存在的鏈路狀態信息摘要,那么RTA需要向RTB請求更新。此時過程又是如何呢?
Step 1:RTA開始向RTB發送LSR(Link State Request)報文,請求那些在Exchange狀態下通過DD報文發現的、並且在本地LSDB中沒有的鏈路狀態信息。
Step 2:RTB向RTA發送LSU(Link State Update)報文,LSU報文中包含了那些被請求的鏈路狀態的詳細信息。RTA在完成LSU報文的接收之后,會將鄰居狀態從Loading變為Full。
Step 3:RTA向RTB發送LSAck(Link State Acknowledge)報文,作為對LSU報文的確認。RTB收到LSAck報文后,雙方便建立起了完全的鄰接關系。
OSPF鄰居狀態機
從建立鄰居關系到同步LSDB的過程較為復雜,錯誤的配置或設備鏈路故障都會導致無法完成LSDB同步。為了快速排障,最關鍵的是要理解不同狀態之間切換的觸發原因。
這是形成鄰居關系的過程和相關鄰居狀態的變換過程。
① Down:這是鄰居的初始狀態,表示沒有從鄰居收到任何信息。在NBMA網絡上,此狀態下仍然可以向靜態配置的鄰居發送Hello報文,發送間隔為PollInterval,通常和Router DeadInterval間隔相同。
② Attempt:此狀態只在NBMA網絡上存在,表示沒有收到鄰居的任何信息,但是已經周期性的向鄰居發送報文,發送間隔為HelloInterval。如果Router DeadInterval間隔內未收到鄰居的Hello報文,則轉為Down狀態。
③ Init:在此狀態下,路由器已經從鄰居收到了Hello報文,但是自己不在所收到的Hello報文的鄰居列表中,表示尚未與鄰居建立雙向通信關系。在此狀態下的鄰居要被包含在自己所發送的Hello報文的鄰居列表中。
④ 2-Way Received:此事件表示路由器發現與鄰居的雙向通信已經開始(發現自己在鄰居發送的Hello報文的鄰居列表中)。Init狀態下產生此事件之后,如果需要和鄰居建立鄰接關系則進入ExStart狀態,開始數據庫同步過程,如果不能與鄰居建立鄰接關系則進入2-Way。
⑤ 2-Way:在此狀態下,雙向通信已經建立,但是沒有與鄰居建立鄰接關系。這是建立鄰接關系以前的最高級狀態。
⑥ 1-Way Received:此事件表示路由器發現自己沒有在鄰居發送Hello報文的鄰居列表中,通常是由於對端鄰居重啟造成的。
⑦ ExStart:這是形成鄰接關系的第一個步驟,鄰居狀態變成此狀態以后,路由器開始向鄰居發送DD報文。主從關系是在此狀態下形成的;初始DD序列號是在此狀態下決定的。在此狀態下發送的DD報文不包含鏈路狀態描述。
⑧ Exchange:此狀態下路由器相互發送包含鏈路狀態信息摘要的DD報文,描述本地LSDB的內容。
⑨ Loading:相互發送LS Request報文請求LSA,發送LS Update通告LSA。
⑩ Full:兩台路由器的LSDB已經同步。
LSA(鏈路狀態信息通告)頭部
LSA(Link State Advertisement)是路由器之間鏈路狀態信息的載體。LSA是LSDB的最小組成單位,也就是說LSDB由一條條LSA構成的。
所有的LSA都擁有相同的頭部,關鍵字段的含義如下:
① LS age(2個字節):此字段表示LSA已經生存的時間,單位是秒。
② LS type(1個字節):此字段標識了LSA的格式和功能。常用的LSA類型有五種。
③ Link State ID(4個字節):此字段是該LSA所描述的那部分鏈路的標識,例如Router ID等。
④ Advertising Router(4個字節):此字段是產生此LSA的路由器的Router ID。
⑤ LS sequence number(4個字節):此字段用於檢測舊的和重復的LSA。
LS type,Link State ID和Advertising Router的組合共同標識一條LSA。
LSDB中除了自己生成的LSA,另一部分是從鄰居路由器接收的。鄰居路由器之間相互更新LSA必然需要一個“通道”。
DR與BDR的選舉及作用
在運行OSPF的MA網絡包括廣播型和NBMA網絡,會存在兩個問題:
① 在一個有n個路由器的網絡,會形成(n×(n−1))/2 個鄰接關系。管理復雜。
② 鄰居間LSA的泛洪擴散混亂,相同的LSA會被復制多份。如RTA向其鄰居RTB、RTC、RTD分別發送一份自己的LSA,同樣其他路由器也會分別向網絡內所有鄰居發送一份LSA。重復的LSA泛洪,造成資源浪費。
這樣的工作效率顯然是很低的,消耗資源的。最為高級的路由協議,OSPF是怎樣解決這些問題的呢?
(1)DR和BDR的作用
DR(Designated Router)即指定路由器,其負責在MA網絡建立和維護鄰接關系並負責LSA的同步。
DR與其他所有路由器形成鄰接關系並交換鏈路狀態信息,其他路由器之間不直接交換鏈路狀態信息。這樣就大大減少了MA網絡中的鄰接關系數量及交換鏈路狀態信息消耗的資源。
DR一旦出現故障,其與其他路由器之間的鄰接關系將全部失效,鏈路狀態數據庫也無法同步。此時就需要重新選舉DR,再與非DR路由器建立鄰接關系,完成LSA的同步。為了規避單點故障風險,通過選舉備份指定路由器BDR(Backup Designated Router),在DR失效時快速接管DR的工作。
偽節點是一個虛擬設備節點,其功能需要某台路由器來承載,下面將介紹DR/BDR的選舉規則。
(2)DR和BDR的選舉
選舉規則:DR/BDR的選舉是基於接口的。
Step 1:接口的DR優先級越大越優先。
Step 2:接口的DR優先級相等時,Router ID越大越優先。
Tips:DRother不參與選舉,可通過命令進行指定路由器為DRother。
1、下列哪些選項屬於OSPF報文類型?
A)Hello
B)Database Description
C)Link State Request
D)Link State DD
E)Link State Advertisement
答:ABC
2、OSPF的網絡類型包括( )?
答:P2P,P2MP,NBMA,BMA