Open Shortest Path First (OSPF) 是一個(gè)標(biāo)準(zhǔn)的路由協(xié)議,OSPF是一種基于鏈路狀態(tài)的路由協(xié)議,也是專為 IP 開發(fā)的路由協(xié)議,直接運(yùn)行在 IP 層上面。它從設(shè)計(jì)上保證了無路由環(huán)路。除此之外,IS-IS也是很常見的鏈路狀態(tài)協(xié)議。
OSPF已經(jīng)使用很多年了,幾乎所有的廠家都支持 OSPF 協(xié)議,只要你在 IT 行業(yè),你就逃不開 OSPF 協(xié)議。有多個(gè)站點(diǎn)的企業(yè)網(wǎng)絡(luò)通常使用 OSPF 來連接其園區(qū)和廣域網(wǎng)(WAN)。
靜態(tài)路由寫起來真的煩,配路由都是一把梭動態(tài)路由。有很多動態(tài)路由OSPF 可能沒有 EIGRP 那么簡單。但是,我建議別被 OSPF 協(xié)議嚇到了,在大型網(wǎng)絡(luò)中 OSPF 是很復(fù)雜,但是在小型網(wǎng)絡(luò)中是真的簡單。在這篇文章中,我將向你介紹 OSPF 主要的知識,提供一些基于OSPF報(bào)文格式的介紹,來達(dá)到了解OSPF路由協(xié)議的特性和特有的一些概念的了解。
OSPF協(xié)議的優(yōu)點(diǎn)主要有:
-
快速收斂,它能夠在網(wǎng)絡(luò)拓?fù)浒l(fā)生變化時(shí),立即進(jìn)行路由的重新計(jì)算,并及時(shí)向其他路由器發(fā)送最新的鏈路狀態(tài)信息,使得各路由器的鏈路狀態(tài)表能夠盡量保持一致;
-
支持可變長子網(wǎng)掩碼,可以支持在一個(gè)網(wǎng)絡(luò)中使用多級子網(wǎng)IP地址;
-
提高了網(wǎng)絡(luò)節(jié)點(diǎn)的可達(dá)性,因?yàn)樗黄屏司嚯x矢量路由協(xié)議對15跳數(shù)的限制,支持網(wǎng)絡(luò)中具有更多的網(wǎng)絡(luò)節(jié)點(diǎn);
-
提供最佳路由的選擇,它組合了網(wǎng)絡(luò)鏈路的多種性能指標(biāo)來計(jì)算最佳路由。
RIP是基于距離矢量算法的路由協(xié)議,應(yīng)用在大型網(wǎng)絡(luò)中存在收斂速度慢、度量值不科學(xué)、易產(chǎn)生路由環(huán)路、可擴(kuò)展性差等問題,目前已逐漸被OSPF取代。
RIP特性
|
帶來的問題
|
逐跳收斂
|
收斂慢,故障恢復(fù)時(shí)間長
|
分布式路由計(jì)算
|
缺少對全局網(wǎng)絡(luò)拓?fù)涞牧私?/span>
|
以“跳數(shù)”為度量
|
存在選擇次優(yōu)路徑的風(fēng)險(xiǎn)
|
OSPF是一種基于鏈路狀態(tài)的路由協(xié)議,它從設(shè)計(jì)上就保證了無路由環(huán)路。OSPF支持區(qū)域的劃分,區(qū)域內(nèi)部的路由器使用SPF最短路徑算法保證了區(qū)域內(nèi)部的無環(huán)路。OSPF還利用區(qū)域間的連接規(guī)則保證了區(qū)域之間無路由環(huán)路。OSPF支持觸發(fā)更新,能夠快速檢測并通告自治系統(tǒng)內(nèi)的拓?fù)渥兓。OSPF可以解決網(wǎng)絡(luò)擴(kuò)容帶來的問題。當(dāng)網(wǎng)絡(luò)上路由器越來越多,路由信息流量急劇增長的時(shí)候,OSPF可以將每個(gè)自治系統(tǒng)劃分為多個(gè)區(qū)域,并限制每個(gè)區(qū)域的范圍。OSPF這種分區(qū)域的特點(diǎn),使得OSPF特別適用于大中型網(wǎng)絡(luò)。OSPF還可以同其他協(xié)議(比如多協(xié)議標(biāo)記切換協(xié)議MPLS)同時(shí)運(yùn)行來支持地理覆蓋很廣的網(wǎng)絡(luò)。OSPF可以提供認(rèn)證功能。OSPF路由器之間的報(bào)文可以配置成必須經(jīng)過認(rèn)證才能進(jìn)行交換。
那么OSPF協(xié)議是如何實(shí)現(xiàn)的呢?面對網(wǎng)絡(luò)擴(kuò)展的需求,又該如何應(yīng)對呢?
OSPF要求每臺運(yùn)行OSPF的路由器都了解整個(gè)網(wǎng)絡(luò)的鏈路狀態(tài)信息,這樣才能計(jì)算出到達(dá)目的地的最優(yōu)路徑。OSPF的收斂過程由鏈路狀態(tài)公告LSA(Link State Advertisement)泛洪開始,LSA中包含了路由器已知的接口IP地址、掩碼、開銷和網(wǎng)絡(luò)類型等信息。收到LSA的路由器都可以根據(jù)LSA提供的信息建立自己的鏈路狀態(tài)數(shù)據(jù)庫LSDB(Link State Database),并在LSDB的基礎(chǔ)上使用SPF算法進(jìn)行運(yùn)算,建立起到達(dá)每個(gè)網(wǎng)絡(luò)的最短路徑樹。最后,通過最短路徑樹得出到達(dá)目的網(wǎng)絡(luò)的最優(yōu)路由,并將其加入到IP路由表中。
Step1:鄰居建立
Step2:同步鏈路狀態(tài)數(shù)據(jù)庫
Step3:計(jì)算最優(yōu)路由
Router ID用于在自治系統(tǒng)中唯一標(biāo)識一臺運(yùn)行OSPF的路由器,每臺運(yùn)行OSPF的路由器都有一個(gè)Router ID。
Hello報(bào)文發(fā)現(xiàn)并建立鄰居,A鄰居發(fā)現(xiàn):自動發(fā)現(xiàn)鄰居路由器;B鄰居建立:完成hello報(bào)文中的參數(shù)協(xié)商,建立鄰居關(guān)系;C鄰居保持:通過keepalive機(jī)制,檢測鄰居運(yùn)行狀態(tài)。
鏈路狀態(tài)信息主要包括:A鏈路的類型;B接口IP地址及掩碼;C鏈路上所連接的鄰居路由器;D鏈路的帶寬(開銷)。
OSPF直接運(yùn)行在IP協(xié)議之上,使用IP協(xié)議號89,共有五種報(bào)文類型,每種報(bào)文都使用相同的OSPF報(bào)文頭。
1. Hello報(bào)文:最常用的一種報(bào)文,用于發(fā)現(xiàn)、維護(hù)鄰居關(guān)系。并在廣播和NBMA(None-Broadcast Multi-Access)類型的網(wǎng)絡(luò)中選舉指定路由器DR(Designated Router)和備份指定路由器BDR(Backup Designated Router)。
2. DD報(bào)文:兩臺路由器進(jìn)行LSDB數(shù)據(jù)庫同步時(shí),用DD報(bào)文來描述自己的LSDB。DD報(bào)文的內(nèi)容包括LSDB中每一條LSA的頭部(LSA的頭部可以唯一標(biāo)識一條LSA)。LSA頭部只占一條LSA的整個(gè)數(shù)據(jù)量的一小部分,所以,這樣就可以減少路由器之間的協(xié)議報(bào)文流量。
3. LSR報(bào)文:兩臺路由器互相交換過DD報(bào)文之后,知道對端的路由器有哪些LSA是本地LSDB所缺少的,這時(shí)需要發(fā)送LSR報(bào)文向?qū)Ψ秸埱笕鄙俚腖SA,LSR只包含了所需要的LSA的摘要信息。
4. LSU報(bào)文:用來向?qū)Χ寺酚善靼l(fā)送所需要的LSA。
5. LSACK報(bào)文:用來對接收到的LSU報(bào)文進(jìn)行確認(rèn)。
1.ExStart:鄰居狀態(tài)變成此狀態(tài)以后,路由器開始向鄰居發(fā)送DD報(bào)文。Master/Slave關(guān)系是在此狀態(tài)下形成的,初始DD序列號也是在此狀態(tài)下確定的。在此狀態(tài)下發(fā)送的DD報(bào)文不包含鏈路狀態(tài)描述。2.Exchange:在此狀態(tài)下,路由器與鄰居之間相互發(fā)送包含鏈路狀態(tài)信息摘要的DD報(bào)文。3.Loading:在此狀態(tài)下,路由器與鄰居之間相互發(fā)送LSR報(bào)文、LSU報(bào)文、LSAck報(bào)文。4.Full:LSDB同步過程完成,路由器與鄰居之間形成了完全的鄰接關(guān)系。
1.RTA和RTB的Router ID分別為1.1.1.1和2.2.2.2并且二者已建立了鄰居關(guān)系。當(dāng)RTA的鄰居狀態(tài)變?yōu)镋xStart后,RTA會發(fā)送第一個(gè)DD報(bào)文。此報(bào)文中,DD序列號被隨機(jī)設(shè)置為X,I-bit設(shè)置為1,表示這是第一個(gè)DD報(bào)文,M-bit設(shè)置為1,表示后續(xù)還有DD報(bào)文要發(fā)送,MS-bit設(shè)置為1,表示RTA宣告自己為Master。
2.當(dāng)RTB的鄰居狀態(tài)變?yōu)镋xStart后,RTB會發(fā)送第一個(gè)DD報(bào)文。此報(bào)文中,DD序列號被隨機(jī)設(shè)置為Y(I-bit=1,M-bit=1,MS-bit=1,含義同上)。由于RTB的Router ID較大,所以RTB將成為真正的Master。收到此報(bào)文后,RTA會產(chǎn)生一個(gè)Negotiation-Done事件,并將鄰居狀態(tài)從ExStart變?yōu)镋xchange。
3.當(dāng)RTA的鄰居狀態(tài)變?yōu)镋xchange后,RTA會發(fā)送一個(gè)新的DD報(bào)文,此報(bào)文中包含了LSDB的摘要信息,序列號設(shè)置為RTB在步驟2中使用的序列號Y,I-bit=0,表示這不是第一個(gè)DD報(bào)文,M-bit=0,表示這是最后一個(gè)包含LSDB摘要信息的DD報(bào)文,MS-bit=0,表示RTA宣告自己為Slave。收到此報(bào)文后,RTB會產(chǎn)生一個(gè)Negotiation-Done事件,并將鄰居狀態(tài)從ExStart變?yōu)镋xchange。
4.當(dāng)RTB的鄰居狀態(tài)變?yōu)镋xchange后,RTB會發(fā)送一個(gè)新的DD報(bào)文,此報(bào)文包含了LSDB的摘要信息,DD序列號設(shè)置為Y+1, MS-bit=1,表示RTB宣告自己為Master。
雖然RTA不需要發(fā)送新的包含LSDB摘要信息的DD報(bào)文,但是作為Slave,RTA需要對Master發(fā)送的每一個(gè)DD報(bào)文進(jìn)行確認(rèn)。所以,RTA向RTB發(fā)送一個(gè)新的DD報(bào)文,序列號為Y+1,該報(bào)文內(nèi)容為空。發(fā)送完此報(bào)文后,RTA產(chǎn)生一個(gè)Exchange-Done事件,將鄰居狀態(tài)變?yōu)長oading。RTB收到此報(bào)文后,會將鄰居狀態(tài)變?yōu)镕ull(假設(shè)RTB的LSDB是最新最全的,不需要向RTA請求更新)。
1.RTA開始向RTB發(fā)送LSR報(bào)文,請求那些在Exchange狀態(tài)下通過DD報(bào)文發(fā)現(xiàn)的、并且在本地LSDB中沒有的鏈路狀態(tài)信息。
2.RTB向RTA發(fā)送LSU報(bào)文,LSU報(bào)文中包含了那些被請求的鏈路狀態(tài)的詳細(xì)信息。RTA在完成LSU報(bào)文的接收之后,會將鄰居狀態(tài)從Loading變?yōu)镕ull。
3.RTA向RTB發(fā)送LSAck報(bào)文,作為對LSU報(bào)文的確認(rèn)。RTB收到LSAck報(bào)文后,雙方便建立起了完全的鄰接關(guān)系。
從建立鄰居關(guān)系到同步LSDB的過程較為復(fù)雜,錯(cuò)誤的配置或設(shè)備鏈路故障都會導(dǎo)致無法完成LSDB同步。為了快速排障,最關(guān)鍵的是要理解不同狀態(tài)之間切換的觸發(fā)原因。
DR和BDR可以減少鄰接關(guān)系的數(shù)量,從而減少鏈路狀態(tài)信息以及路由信息的交換次數(shù),這樣可以節(jié)省帶寬,降低對路由器處理能力的壓力。一個(gè)既不是DR也不是BDR的路由器只與DR和BDR形成鄰接關(guān)系并交換鏈路狀態(tài)信息以及路由信息,這樣就大大減少了大型廣播型網(wǎng)絡(luò)和NBMA網(wǎng)絡(luò)中的鄰接關(guān)系數(shù)量。在沒有DR的廣播網(wǎng)絡(luò)上,鄰接關(guān)系的數(shù)量可以根據(jù)公式n(n-1)/2計(jì)算出,n代表參與OSPF的路由器接口的數(shù)量。在本例中,所有路由器之間有6個(gè)鄰接關(guān)系。當(dāng)指定了DR后,所有的路由器都與DR建立起鄰接關(guān)系,DR成為該廣播網(wǎng)絡(luò)上的中心點(diǎn)。BDR在DR發(fā)生故障時(shí)接管業(yè)務(wù),一個(gè)廣播網(wǎng)絡(luò)上所有路由器都必須同BDR建立鄰接關(guān)系。本例中使用DR和BDR將鄰接關(guān)系從6減少到了5,RTA和RTB都只需要同DR和BDR建立鄰接關(guān)系,RTA和RTB之間建立的是鄰居關(guān)系。此例中,鄰接關(guān)系數(shù)量的減少效果并不明顯。但是,當(dāng)網(wǎng)絡(luò)上部署了大量路由器時(shí),比如100臺,那么情況就大不一樣了。

在鄰居發(fā)現(xiàn)完成之后,路由器會根據(jù)網(wǎng)段類型進(jìn)行DR選舉。在廣播和NBMA網(wǎng)絡(luò)上,路由器會根據(jù)參與選舉的每個(gè)接口的優(yōu)先級進(jìn)行DR選舉。優(yōu)先級取值范圍為0-255,值越高越優(yōu)先。缺省情況下,接口優(yōu)先級為1。如果一個(gè)接口優(yōu)先級為0,那么該接口將不會參與DR或者BDR的選舉。如果優(yōu)先級相同時(shí),則比較Router ID,值越大越優(yōu)先被選舉為DR。為了給DR做備份,每個(gè)廣播和NBMA網(wǎng)絡(luò)上還要選舉一個(gè)BDR。BDR也會與網(wǎng)絡(luò)上所有的路由器建立鄰接關(guān)系。為了維護(hù)網(wǎng)絡(luò)上鄰接關(guān)系的穩(wěn)定性,如果網(wǎng)絡(luò)中已經(jīng)存在DR和BDR,則新添加進(jìn)該網(wǎng)絡(luò)的路由器不會成為DR和BDR,不管該路由器的Router Priority是否最大。如果當(dāng)前DR發(fā)生故障,則當(dāng)前BDR自動成為新的DR,網(wǎng)絡(luò)中重新選舉BDR;如果當(dāng)前BDR發(fā)生故障,則DR不變,重新選舉BDR。這種選舉機(jī)制的目的是為了保持鄰接關(guān)系的穩(wěn)定,使拓?fù)浣Y(jié)構(gòu)的改變對鄰接關(guān)系的影響盡量小。

OSPF支持將一組網(wǎng)段組合在一起,這樣的一個(gè)組合稱為一個(gè)區(qū)域。劃分OSPF區(qū)域可以縮小路由器的LSDB規(guī)模,減少網(wǎng)絡(luò)流量。
區(qū)域內(nèi)的詳細(xì)拓?fù)湫畔⒉幌蚱渌麉^(qū)域發(fā)送,區(qū)域間傳遞的是抽象的路由信息,而不是詳細(xì)的描述拓?fù)浣Y(jié)構(gòu)的鏈路狀態(tài)信息。每個(gè)區(qū)域都有自己的LSDB,不同區(qū)域的LSDB是不同的。路由器會為每一個(gè)自己所連接到的區(qū)域維護(hù)一個(gè)單獨(dú)的LSDB。由于詳細(xì)鏈路狀態(tài)信息不會被發(fā)布到區(qū)域以外,因此LSDB的規(guī)模大大縮小了。Area 0為骨干區(qū)域,為了避免區(qū)域間路由環(huán)路,非骨干區(qū)域之間不允許直接相互發(fā)布路由信息。因此,每個(gè)區(qū)域都必須連接到骨干區(qū)域。運(yùn)行在區(qū)域之間的路由器叫做區(qū)域邊界路由器ABR(Area Boundary Router),它包含所有相連區(qū)域的LSDB。自治系統(tǒng)邊界路由器ASBR(Autonomous System Boundary Router)是指和其他AS中的路由器交換路由信息的路由器,這種路由器會向整個(gè)AS通告AS外部路由信息。
在規(guī)模較小的企業(yè)網(wǎng)絡(luò)中,可以把所有的路由器劃分到同一個(gè)區(qū)域中,同一個(gè)OSPF區(qū)域中的路由器中的LSDB是完全一致的。OSPF區(qū)域號可以手動配置,為了便于將來的網(wǎng)絡(luò)擴(kuò)展,推薦將該區(qū)域號設(shè)置為0,即骨干區(qū)域。
在配置OSPF時(shí),需要首先使能OSPF進(jìn)程。命令ospf [process id]用來使能OSPF,在該命令中可以配置進(jìn)程ID。如果沒有配置進(jìn)程ID,則使用1作為缺省進(jìn)程ID。命令ospf [process id] [router-id <router-id>]既可以使能OSPF進(jìn)程,還同時(shí)可以用于配置Router ID。在該命令中,router-id代表路由器的ID。命令network用于指定運(yùn)行OSPF協(xié)議的接口,在該命令中需要指定一個(gè)反掩碼。反掩碼中,“0”表示此位必須嚴(yán)格匹配,“1”表示該地址可以為任意值。命令display ospf peer可以用于查看鄰居相關(guān)的屬性,包括區(qū)域、鄰居的狀態(tài)、鄰接協(xié)商的主從狀態(tài)以及DR和BDR情況。
-
OSPF 協(xié)議需要有關(guān)復(fù)雜網(wǎng)絡(luò)的高級知識,因此不像其他一些協(xié)議那樣容易學(xué)習(xí)。
-
當(dāng)有更多路由器添加到網(wǎng)絡(luò)時(shí),OSPF 路由不會擴(kuò)展。OSPF 協(xié)議缺乏可擴(kuò)展性使其不適合跨 Internet 路由。
-
OSPF 協(xié)議維護(hù)路由信息的多個(gè)副本,增加了所需的內(nèi)存量。
OSPF的復(fù)雜度,真讓人感嘆,現(xiàn)在回想起來,精通OSPF就是大牛了,我覺得起碼要幾個(gè)方面都做到吧。
對OSPF的協(xié)議非常清楚,包括幾乎所有的細(xì)節(jié);
在OSPF的疑難解答方面,不說來一個(gè)答一個(gè),起碼立刻能找到分析問題的方法,找到并正確定位問題;
就是對協(xié)議的發(fā)展要心中有數(shù),網(wǎng)絡(luò)技術(shù)的不斷發(fā)展,對路由協(xié)議也提出了各種各樣新的要求,并且對協(xié)議進(jìn)行著不斷擴(kuò)展。作為一個(gè)精通OSPF協(xié)議的人,需要關(guān)注這些新技術(shù)的發(fā)展方向這是理所當(dāng)然的。