OSPF動態路由協議筆記之(一) : 基本原理(上)
RIP是基於距離矢量算法的路由協議,應用在大型網絡中存在收斂速度慢、度量值不科學、可擴展性差等問題。於是IETF提出了基於SPF算法的鏈路狀態路由協議OSPF(Open Shortest Path First)。通過在大型網絡中部署OSPF協議,彌補了RIP協議的諸多不足。
本筆記主要介紹OSPF(Open Shortest Path First,開放最短路徑優先)動態路由協議的產生背景,以及基本工作原理(包括OSPF協議鄰居建立過程,鏈路狀態信息LSA,四種網絡類型和度量方式)。
產生的背景
在OSPF產生之前,網絡大部分運行RIP動態路由協議主要有三大特性:逐跳收斂,分布式路由計算,以“跳數”為度量。
① 逐跳收斂
如上圖所示,N1網絡發生變化,RTA向RTB發出更新,RTB收到更新之后進行本地計算,完成計算后再向RTC發送路由變化通知,如此循環。逐跳收斂的方式,造成了網絡收發數據緩慢的問題。
在 “收到更新”==》“計算路由”==》“發送更新”的路由收斂過程中,RIP的局限性在於路由器需要在完成路由計算之后才可以向鄰居發送路由變化通知。
OSPF路由協議將這個過程調整為:“收到更新”==》“發送更新”==》“計算路由”,即路由器從鄰居收到路由更新后立刻向其他鄰居路由器轉發,然后再本地計算新的路由。這樣的收斂方式可以大大降低全網路由收斂的時間。
② 傳聞路由更新機制
RIP在計算路由完全依賴於從鄰居路由器收到的路由信息,RTE僅依靠從RTD獲取的信息計算路由,對RTA、RTB和RTC之間的網絡情況並不了解。RIP在計算路由時,缺少對全局網絡拓撲的了解。
因為RIP路由器僅從鄰居路由器獲取路由信息,所以對於非最優或者錯誤路由信息,RIP路由器並不能識別或屏蔽。解決此問題的關鍵最佳方式是路由器收集全網的信息,並基於這些信息獨立計算路由。
③ 以“跳數”為度量
因為RIP基於跳數的度量方式,所以N1與N2網絡互訪時會選擇RTA->RTB->RTD->RTE作為最優路徑。顯然RTB->RTC->RTD之間的以太鏈路要比RTB->RTD的串行鏈路帶寬要高的多。使用基於跳數的度量方式,沒有將鏈路花銷等因素考慮進去,因此可能會產生次優路由。
基於跳數的度量方式並沒有考慮數據包的鏈路轉發延遲,如果采用以累積帶寬為選路參考依據,可以更好的規避選擇次優路徑的風險。
鏈路狀態路由協議OSPF
為了彌補RIP的缺點和不足,IETF提出了基於SPF算法的鏈路狀態路由協議OSPF(Open Shortest Path First)。
OSPF協議擁有三個特點:
① 路由信息傳遞與路由計算分離
OSPF作為鏈路狀態路由協議,不直接傳遞各路由器的路由表,而傳遞鏈路狀態信息,各路由器基於鏈路狀態信息獨立計算路由。
② 基於SPF算法
所有路由器各自維護一個鏈路狀態數據庫。鄰居路由器間先同步鏈路狀態數據庫,再各自基於SPF(Shortest Path First)算法計算最優路由,從而提高收斂速度。
③ 以“累計鏈路開銷”作為選路參考值
在度量方式上,OSPF將鏈路帶寬作為選路時的參考依據。 “累計帶寬”是一種要比“累積跳數”更科學的計算方式。
Tips:
所謂Link State(鏈路狀態)指的就是路由器的接口狀態。在OSPF中路由器的某一接口的鏈路狀態包含了如下信息:
① 該接口的IP地址及掩碼
② 該接口的帶寬
③ 該接口所連接的鄰居
。。。。。。
OSPF路由協議的工作步驟
企業網絡是由眾多的路由器、交換機等網絡設備之間互相連接組成的,類似一張地圖。由於眾多不同型號的路由器、不同類型的鏈路及其連接關系,造成了路由計算的復雜性。
OSPF的路由計算過程可以簡化描述為:
Step 1:建立鄰居關系
路由器之間發現並建立鄰居關系。
Step 2:同步鏈路狀態數據庫
每台路由器產生並向鄰居泛洪鏈路狀態信息,同時收集來自其他路由器鏈路狀態信息,完成LSDB(Link State Database)的同步。
Step 3:計算最優路由
每台路由器基於LSDB通過SPF算法,計算得到一棵以自己為根的SPT(Shortest Path Tree),再以SPT為基礎計算去往各鄰居連接網絡的最優路由,並形成路由表。
接下來,本筆記會按照上述三個步驟詳細的闡述OSPF的原理和實現。
OSPF基本工作原理
(1)OSPF鄰居建立過程
在了解OSPF鄰居建立的過程之前,我們必須先對以下兩個基本概念有一定的認識。
① Router ID -- 運行OSPF路由器的唯一標識符
用於在自治系統中唯一標識一台運行OSPF的路由器,每台運行OSPF的路由器都有一個Router ID。
企業網中的設備少則幾台多則幾十台甚至幾百台,每台路由器都需要有一個唯一的ID用於標識自己。
Router ID是一個32位的無符號整數,其格式和IP地址的格式是一樣的,Router ID選舉規則如下:
Step 1:手動配置OSPF路由器的Router ID(通常建議手動配置);
Step 2:如果沒有手動配置Router ID,則路由器使用Loopback接口中最大的IP地址作為Router ID;
Step 3:如果沒有配置Loopback接口,則路由器使用物理接口中最大的IP地址作為Router ID。
OSPF的路由器Router ID重新配置后,可以通過重置OSPF進程來更新Router ID。
② Hello報文 -- 鄰居發現、鄰居建立、鄰居保持
OSPF路由器之間在交換鏈路狀態信息之前,首先需要彼此建立鄰居關系,通過Hello報文實現。在OSPF鄰居關系建立的過程中,Hello報文從中起到的作用包括:
Ⅰ 鄰居發現:自動發現運行OSPF協議的鄰居路由器。
OSPF協議通過Hello報文可以讓互聯的路由器間自動發現並建立鄰居關系,為后續可達性信息的同步作准備。
Ⅱ 鄰居建立:完成Hello報文中的參數協商,建立鄰居關系。
在形成鄰居關系過程中,路由器通過Hello報文完成一些參數的協商。
Ⅲ 鄰居保持:通過Keepalive機制,檢測鄰居運行狀態。
鄰居關系建立后,周期性的Hello報文發送還可以實現鄰居保持的功能,在一定時間內沒有收到鄰居的Hello報文,則會中斷路由器間的OSPF鄰居關系。
③ Down、Init、2-way -- OSPF建立鄰居關系的三個狀態
在建立鄰居關系的過程中,路由器主要需要經歷從Down到2-way狀態,這個過程的最終狀態是2-way狀態,詳細介紹分別如下:
Ⅰ Down:這是鄰居的初始狀態,表示沒有從鄰居收到任何信息。
Ⅱ Init:在此狀態下,路由器已經從鄰居收到了Hello報文,但是自己的Router ID不在所收到的Hello報文的鄰居列表中,表示尚未與鄰居建立雙向通信關系。
Ⅲ 2-way:在此狀態下,路由器發現自己的Router ID存在於收到的Hello報文的鄰居列表中,已確認可以雙向通信。
OSPF建立鄰居關系
在理解Router ID,Hello報文,建立鄰居關系的Down、Init、2-way狀態的概念之后,接下來就可以開始介紹建立OSPF鄰居關系的過程了:
鄰居關系建立過程如下:
Step 1:RTA和RTB的Router ID分別為1.1.1.1和2.2.2.2。當RTA啟動OSPF后,RTA會發送第一個Hello報文。此報文中鄰居列表為空,且狀態為Down,RTB收到RTA的這個Hello報文,狀態置為Init。
Step 2:RTB發送Hello報文,此報文中鄰居列表為空,RTA收到RTB的Hello報文,狀態置為Init。
Step 3:RTB向RTA發送鄰居列表為1.1.1.1的Hello報文,RTA在收到的Hello報文鄰居列表中發現自己的Router ID,狀態置為2-way。
Step 4:RTA向RTB發送鄰居列表為2.2.2.2的Hello報文,RTB在收到的Hello報文鄰居列表中發現自己的Router ID,狀態置為2-way。
Tips:擴展知識
因為鄰居都是未知的,所以Hello報文的目的IP地址不是某個特定的單播地址。鄰居從無到有,OSPF采用組播的形式發送Hello報文(目的地址224.0.0.5)。對於不支持組播的網絡,OSPF路由器如何發現鄰居呢?
OSPF支持通過單播方式建立鄰居關系。
對於不支持組播的網絡可以通過手動配置實現鄰居的發現與維護。
當網絡規模越來越大或者設備頻繁更新,相關聯的OSPF路由器都需要更改靜態配置,手動更改配置的工作量變大且容易出錯。除了特殊場景,一般情況下不適用手動配置的方式。
(2)鏈路狀態信息LSA
區別於RIP路由器之間交互的路由信息,OSPF路由器同步的是最原始的鏈路狀態信息,而且對於鄰居路由器發來的鏈路狀態信息,僅作轉發。最終所有路由器都將擁有一份相同且完整的原始鏈路狀態信息。
每台運行OSPF協議的路由器所描述的信息中都應該包括:
l 鏈路的類型
l 接口IP地址及掩碼
l 鏈路上所連接的鄰居路由器
l 鏈路的帶寬(開銷)
Tips:擴展知識
Q:路由器只需要知道目的網絡號/掩碼、下一跳、開銷(接口IP地址及掩碼、鏈路上的鄰居、鏈路的開銷)即可,為什么要有鏈路的類型呢?
A:數據鏈路層協議類型多種多樣,工作機制也各不相同。為適配多種數據鏈路層協議,必須考慮各類鏈路層協議在組網時的應用場景。
以下介紹OSPF划分了四種網絡類型:P2P,P2MP,BMA,NBMA;以及如何以此來組成拓撲信息的一部分的:
① 網絡類型 - P2P(點對點網絡)
P2P網絡是指一段鏈路上只能連接兩台設備的環境。廣播、組播數據包都可以轉發。
不需要進行DR和BDR的選舉。直接形成鄰接關系。
P2P網絡例子:兩台通過PPP(Point-to-Point Protocol)鏈路相連的路由器網絡。
當兩台設備通過PPP鏈路進行連接,設備上采用的接口封裝協議就是PPP,當激活OSPF時,OSFP會根據接口的數據鏈路層封裝將它網絡類型設置為P2P,采用HDLC封裝時,缺省網絡類型也為P2P。
在P2P網絡類型中,5種OSPF報文都是通過組播地址224.0.0.5來發送的。在缺省狀態下,接口會以10秒的周期去發送hello報文。
② 網絡類型 - P2MP(點對多點網絡)
多個點到點網絡的集合。支持廣播、組播。
不需要進行DR和BDR的選舉。這種網絡類型需要管理員手動配置。
將一個非廣播網絡看成是一組P2P網絡,這樣的非廣播網絡便成為了一個點到多點(P2MP)網絡。在P2MP網絡上,每個路由器的OSPF鄰居可以使用反向地址解析協議(Inverse ARP)來發現。P2MP可以看作是多個P2P的集合,P2MP可以支持廣播、組播的轉發。
沒有一種鏈路層協議默認屬於P2MP類型網絡,也就是說必須是由其他的網絡類型強制更改為P2MP。常見的做法是將非完全連接的幀中繼或ATM改為P2MP的網絡。
OSPF在P2MP網絡類型的接口上,以組播的形式發送hello報文,以單播的形式發送其他報文。缺省狀態下hello報文的發送間隔為30秒。
③ 網絡類型 - BMA(廣播型多點接入網絡)
由兩台及兩台以上的路由器通過共享介質互聯,支持廣播、組播。
需要進行DR和BDR的選舉。BMA是一個支持廣播的網絡環境,允許多台設備接入,任意兩台設備都可以進行二層通信。
BMA中以組播的形式發送hello報文,LSU報文,LSAck報文,以單播的形式發送DD報文和LSR報文。
所有的OSPF路由器都會偵聽224.0.0.5這個組播地址,當要發送給所有路由器時,目的地址為224.0.0.5。DR和BDR會偵聽224.0.0.6這個組播地址,當要發送給DR和BDR時目的地址為224.0.0.6。
缺省情況下,BMA發送hello報文的時間間隔為10秒。
④ 網絡類型 - NBMA(非廣播多點接入型網絡)
兩台或兩台以上路由器通過VC互連。不支持廣播、組播。
需要進行DR和BDR的選舉。與BMA網絡不同的是NBMA網絡默認不支持廣播與組播報文的轉發。在NBMA網絡上,OSPF模擬在廣播型網絡上的操作,但是每個路由器的鄰居需要手動配置。
NBMA(non-broadcast multiple access)型網絡的例子:通過全互連的幀中繼鏈路相連的路由器網絡。
在幀中繼網絡中,ospf沒有辦法通過發送hello包來建立鄰居關系,只能通過使用單播方式來制定鄰居,命令如下:peer x.x.x.x
NBMA雖然也允許多台設備接入,但是它並不具備廣播功能。為了順利的進行鄰接關系的建立,一般用單播的形式去發送hello報文。
缺省情況下,hello報文會以30秒的周期被接口發送。
Tips:文中提到的DR和BDR選舉,是用於防止LSA在OSPF網絡重復泛洪,造成資源浪費。詳細介紹會放到下一篇筆記中。
(3)鄰居與鄰接關系
鄰居(Neighbor)關系與鄰接(Adjacency)關系是兩個不同的概念。OSPF路由器之間建立鄰居關系后,進行LSDB同步,最終形成鄰接關系。
在P2P網絡及P2MP網絡上,具有鄰居關系的路由器之間會進一步建立鄰接關系。
在廣播型網絡及NBMA網絡上,非DR/BDR路由器之間只能建立鄰居關系,不能建立鄰接關系,非DR/BDR路由器與DR/BDR路由器之間會建立鄰接關系,DR與BDR之間也會建立鄰接關系。
鄰接關系建立完成,意味着LSDB已經完成同步,接下來OSPF路由器將基於LSDB使用SPF算法計算路由。
(4)OSPF的度量方式
OSPF通過設置鏈路狀態信息中的開銷值(Cost)進行度量。
某接口cost=參考帶寬/實際帶寬。默認參考帶寬為100M。當計算結果有小數位時,只取整數位;結果小於1時,cost取1。
若需要調整接口cost值有兩種方式:
① 直接在接口下配置
需要注意的是,配置的cost是此接口最終的cost值,作用范圍僅限於本接口。
② 修改OSPF的默認參考帶寬值
作用范圍是本路由器使能OSPF的接口。建議參考整個網絡的帶寬情況建立參考基線,所有路由器修改相同的參考帶寬值,從而確保選路的一致性。
OSPF以“累計cost”為開銷值,也就是流量從源網絡到目的網絡所經過所有路由器的出接口的cost總和,以RTA訪問RTC Loopback 1接口192.168.3.3為例,其cost=G1’s cost+G3’s cost。
相比於RIP,OSPF的度量方式不僅考慮“跳數”,而且還考慮了“帶寬”,比RIP更可靠的選擇最優的轉發路徑。
到此,OSPF的建立鄰居過程,以及OSPF的部分工作原理已經介紹完畢了。下一節筆記會重點對OSPF報文頭部進行逐字段拆解,區分不同OSPF報文類型,再闡述LSDB(鏈路狀態數據庫)的同步以及DR和BDR選舉的過程和作用。