22張圖詳解OSPF:最常用的動(dòng)態(tài)路由協(xié)議
大家好,我是小弗。
RIP 缺陷
提及 OSFP 時(shí),還得先從 RIP 說起。
RIP 以跳數(shù)來計(jì)算到達(dá)目的網(wǎng)絡(luò)的最優(yōu)路徑,在實(shí)際應(yīng)用時(shí)并不合適,以網(wǎng)絡(luò)帶寬和鏈路時(shí)延來衡量網(wǎng)絡(luò)質(zhì)量會(huì)更合理。
RIP 支持的最大跳數(shù)是 16 ,無法用于搭建大規(guī)模的網(wǎng)絡(luò)。
RIP 的收斂速度慢,RIP 會(huì)對(duì)不可達(dá)路由的信息更新進(jìn)行抑制,原路由失效,新路由要等到抑制時(shí)間結(jié)束后,才能更新。
RIP 的更新周期長,一個(gè)路由器突然離線,其它路由器要很長時(shí)間才能發(fā)現(xiàn)。
RIP 使用廣播發(fā)送全部路由信息,網(wǎng)絡(luò)規(guī)模越大,路由信息占用的網(wǎng)絡(luò)資源也越大。
因此,RIP 路由并不適合大規(guī)模的網(wǎng)絡(luò),而 OSPF 協(xié)議解決了這些問題,得到了廣泛的使用。
OSPF 原理
OSPF ,是 Open Shortest Path First 的縮寫,譯為開放最短路徑優(yōu)先。OSPF 是基于鏈路狀態(tài)( Link State )的自治系統(tǒng)內(nèi)部路由協(xié)議,用來替代 RIP 協(xié)議,通用的是 OSPFv2 。
與距離矢量協(xié)議不同,鏈路狀態(tài)協(xié)議使用最短路徑優(yōu)先算法( Shortest Path First ,SPF )計(jì)算和選擇路由。這類路由協(xié)議關(guān)系網(wǎng)絡(luò)鏈路或接口的狀態(tài),比如 up 、down 、IP 地址、掩碼、帶寬、利用率和時(shí)延等。每臺(tái)路由器將已知的鏈路狀態(tài)向其它路由器通告,讓網(wǎng)絡(luò)上每臺(tái)路由器對(duì)網(wǎng)絡(luò)結(jié)構(gòu)有相同的了解。然后,路由器以此為依據(jù),使用 SPF 算法計(jì)算和選擇路由。
OSPF 協(xié)議使用組播發(fā)送協(xié)議包,節(jié)約資源,又減少對(duì)其它網(wǎng)絡(luò)設(shè)備的干擾。
OSPF 將協(xié)議包封裝在 IP 包中,協(xié)議號(hào) 89 。由于 IP 協(xié)議是無連接的,OSPF 定義了一些機(jī)制保證協(xié)議包安全可靠的傳輸。
總之,OSPF 協(xié)議比 RIP 有更大的擴(kuò)展、快速收斂和安全可靠等特性,采用路由增量更新保證路由同步,減少對(duì)網(wǎng)絡(luò)資源的浪費(fèi)。
OSPF 協(xié)議簡(jiǎn)介
OSPF 協(xié)議有四個(gè)主要過程:
- 尋找鄰居
OSPF 協(xié)議啟動(dòng)后,先尋找網(wǎng)絡(luò)中的鄰居( Neighbor ),也就是通過 Hello 報(bào)文確認(rèn)可以雙向通信。
- 建立鄰接關(guān)系
一部分路由器形成鄰居關(guān)系后,就開始進(jìn)行建立鄰接關(guān)系( Adjacency )。建立了鄰居關(guān)系的路由器才能互相傳遞鏈路狀態(tài)信息。
- 鏈路狀態(tài)信息同步
建立鄰接關(guān)系的 OSPF 路由器在網(wǎng)絡(luò)中交互 LSA(鏈路狀態(tài)通告),最后形成包含網(wǎng)絡(luò)完整鏈路狀態(tài)信息的 LSDB(鏈路狀態(tài)數(shù)據(jù)庫)。
- 計(jì)算路由
LSDB 同步完成后,OSPF 區(qū)域內(nèi)的每個(gè)路由器對(duì)網(wǎng)絡(luò)結(jié)構(gòu)有相同的認(rèn)識(shí),鄰居路由器之間形成完全的鄰接關(guān)系。然后,每臺(tái)路由器根據(jù) LSDB 的信息使用 SPF(最短路徑優(yōu)先)算法獨(dú)立計(jì)算出路由。
OSPF 協(xié)議過程
將 OSPF 的四個(gè)過程展開來講,就是一個(gè)個(gè)鄰居狀態(tài)的切換,不同的鄰居狀態(tài)有不同的行為。
Down(失效)
OSPF 鄰居的初始狀態(tài),表示接口沒有收到鄰居發(fā)來的 Hello 報(bào)文。
Init(初始)
收到鄰居發(fā)送的 Hello 報(bào)文,但是報(bào)文內(nèi)沒有自己的 Router-ID ,鄰居狀態(tài)就是 Init 。這個(gè)狀態(tài)表示,直連鏈路上有一個(gè) OSPF 路由器,但是還未確認(rèn)雙向通信。接下來,路由器會(huì)把對(duì)方的 Router-ID 添加到發(fā)送的 Hello 報(bào)文中。
什么是 Router-ID ?
Router-ID 用于標(biāo)識(shí) OSPF 路由器,是一個(gè) 32 位的數(shù)值,跟 IPv4 地址格式一樣。連續(xù)的 OSPF 路由器組成的網(wǎng)絡(luò)叫做 OSPF 域,域內(nèi) Router-ID 必須唯一,也就是在同一個(gè)域內(nèi)不允許出現(xiàn)兩臺(tái)相同 Router-ID 的路由器。Router-ID 可以手動(dòng)設(shè)置,也可以自動(dòng)生成,常見的做法是把設(shè)備的 Router-ID 指定為設(shè)備的 Loopback 接口的 IP 地址。
Attempt(嘗試)
只在 NBMA 網(wǎng)絡(luò)中出現(xiàn)。當(dāng)路由器的 NBMA 接口啟動(dòng)后,鄰居狀態(tài)從 Down 切換到 Attempt 。這種狀態(tài)下,路由器周期性的向鄰居發(fā)送 Hello 報(bào)文,但是未收到鄰居的有效 Hello 報(bào)文。當(dāng)路由器收到鄰居發(fā)送的沒有自己 Router-ID 的 Hello 報(bào)文后,就將鄰居狀態(tài)切換到 Init 。
什么是 NBMA ?
NBMA 類型的網(wǎng)絡(luò)已經(jīng)看不到了,它允許多臺(tái)路由器接入,但是沒有廣播能力,無法使用組播或廣播,只能配置成單播發(fā)送 OSPF 報(bào)文。幀中繼、X.25 都是這類網(wǎng)絡(luò)。
2-Way(雙向通信)
路由器收到鄰居的 Hello 報(bào)文,報(bào)文里有自己的 Router-ID 時(shí),狀態(tài)切換成 2-Way ,表示兩個(gè)路由器形成了可以雙向通信的鄰居關(guān)系。
選舉 DR 和 BDR
如果路由器是在一個(gè) MA 網(wǎng)絡(luò),鄰居狀態(tài)在 2-Way 后,會(huì)進(jìn)行 DR 和 BDR 選舉。
什么是 MA 網(wǎng)絡(luò)?
MA 網(wǎng)絡(luò),即多路訪問網(wǎng)絡(luò),是在同一個(gè)共享介質(zhì)中連接多個(gè)設(shè)備的網(wǎng)絡(luò)。網(wǎng)絡(luò)中的任意兩臺(tái)設(shè)備都能直接進(jìn)行二層通信。MA 網(wǎng)絡(luò)有兩種,一種是 BMA 網(wǎng)絡(luò),即廣播型多路訪問網(wǎng)絡(luò),比如以太網(wǎng),典型場(chǎng)景就是一臺(tái)以太網(wǎng)交換機(jī)連接著多臺(tái)路由器,如果有一個(gè)廣播數(shù)據(jù)發(fā)出來,整個(gè)網(wǎng)絡(luò)中的路由器都能收到。另一種是 NBMA 網(wǎng)絡(luò),即非廣播型多路訪問網(wǎng)絡(luò),比如幀中繼,只是幀中繼不支持廣播。
在 MA 網(wǎng)絡(luò)中,n 臺(tái)路由器都兩兩建立鄰接關(guān)系,那么就有 n(n-1)/2 個(gè)鄰接關(guān)系,會(huì)消耗大量的路由器資源,增加網(wǎng)絡(luò)中 LSA 的泛洪數(shù)量。為了優(yōu)化鄰接關(guān)系數(shù)量,減少不必要的協(xié)議流量,OSPF 會(huì)在每一個(gè) MA 網(wǎng)絡(luò)中選舉一個(gè) DR(指定路由器)和一個(gè) BDR(備用指定路由器)。
既不是 DR 也不是 BDR 的路由器叫做 DROther ,MA網(wǎng)絡(luò)中所有 DROther 只和 DR 及 BDR 建立 OSPF 鄰接關(guān)系,BDR 也和 DR 建立鄰接關(guān)系,DROther 之間只停留在 2-Way 狀態(tài)。這樣,就有 2(n-2)+1 個(gè)鄰接關(guān)系,數(shù)量得到優(yōu)化。
DR 會(huì)偵聽網(wǎng)絡(luò)中的拓?fù)渥兓畔ⅲ⒆兏畔⑼ㄖo其它路由器。BDR 會(huì)監(jiān)控 DR 狀態(tài),當(dāng) DR 發(fā)生故障時(shí)就接替它的工作。
DR 、BDR 的選舉通過 Hello 報(bào)文實(shí)現(xiàn),發(fā)生在 2-Way 狀態(tài)之后。Hello 報(bào)文有路由器接口的 DR 優(yōu)先級(jí),取值范圍是 0 ~ 255 ,默認(rèn)值為 1 ,DR 優(yōu)先級(jí)為 0 的接口沒有 DR 和 BDR 的選舉資格。
當(dāng)接口激活 OSPF 后,它會(huì)查看網(wǎng)絡(luò)中是否存在 DR ,如果有就使用已經(jīng)存在的 DR ,也就是 DR 不可搶占,否則選擇最高優(yōu)先級(jí)的路由器成為 DR ,當(dāng)優(yōu)先級(jí)相等時(shí),選擇 Router-ID 最大的路由器成為 DR 。之后還會(huì)進(jìn)行 BDR 的選舉,選舉過程與 DR 類似。
需要注意的是,DR 和 BDR 是一個(gè)接口級(jí)別的概念。某臺(tái)路由器是 DR ,這種說法不準(zhǔn)確,嚴(yán)謹(jǐn)?shù)恼f法是:某臺(tái)路由器的某個(gè)接口在這個(gè) MA 網(wǎng)絡(luò)中是 DR 。
在一個(gè) MA 網(wǎng)絡(luò)中,DR 要確保網(wǎng)絡(luò)中的所有路由器有相同的 LSDB ,也就是確保 LSDB 同步。DR 使用組播地址 224.0.0.5 向網(wǎng)絡(luò)中發(fā)送 LSU 報(bào)文,所有 OSPF 路由器都會(huì)偵聽這個(gè)組播地址,并同步自己的 LSDB 。而 DROther 感知到拓?fù)渥兓瘯r(shí),向 224.0.0.6 發(fā)送 LSU 報(bào)文通告這個(gè)變化,DR 和 BDR 會(huì)偵聽這個(gè)組播地址。
ExSart(交換開始)
接來下,路由器會(huì)進(jìn)入 ExStart 狀態(tài),發(fā)送空的 DD 報(bào)文,用于協(xié)商 Master/Slave ,Router-ID 最大的路由器成為 Master 路由器,DD 報(bào)文的序列號(hào)由 Master 路由器決定。協(xié)商 Master/Slave 的報(bào)文是空的、不攜帶 LSA 頭部的 DD 報(bào)文,這時(shí)報(bào)文的 I 位被設(shè)置成 1 。
Exchange(交換)
接下來,路由器進(jìn)入 Exchange 狀態(tài),向鄰居發(fā)送描述自己 LSDB 的 DD 報(bào)文,DD 報(bào)文中包含 LSA 頭部。DD 報(bào)文逐個(gè)發(fā)送,每個(gè)報(bào)文中都有 DD 序列號(hào),DD 序列號(hào)由 Master 路由器決定,序列號(hào)在 DD 報(bào)文的交互過程中遞增,確保交互過程的有序性和可靠性。
什么是 DD 報(bào)文?
DD 報(bào)文用于描述 LSDB ,攜帶 LSDB 中 LSA 的頭部數(shù)據(jù),而非完整的 LSA 內(nèi)容。在路由器鄰接關(guān)系的建立過程中,先用空的 DD 報(bào)文協(xié)商 Master/Slave ,然后用 DD 報(bào)文描述各自的 LSDB ,這種 DD 報(bào)文包含 LSDB 里的 LSA 頭部。路由器可以使用多個(gè) DD 報(bào)文來描述 LSDB ,為了保證 DD 報(bào)文傳輸?shù)捻樞蚝涂煽浚琈aster 路由器使用序列號(hào)字段遞增的方式,主導(dǎo)整個(gè) LSDB 描述過程。
Loading(加載)
接下來,路由器進(jìn)入 Loading 狀態(tài),路由器向鄰居發(fā)送 LSR 請(qǐng)求 LSA 的完整信息。鄰居使用 LSU 進(jìn)行回應(yīng),LSU 報(bào)文里有 LSA 的完整信息。在收到 LSU 報(bào)文后,路由器需要發(fā)送 LSAck 對(duì) LSA 進(jìn)行確認(rèn)。
Full(完整)
當(dāng)接口上需要請(qǐng)求的 LSA 列表為空時(shí),表示路由器已經(jīng)完成了和鄰居的 LSDB 同步,沒有再需要請(qǐng)求的 LSA 了,這時(shí)鄰居的狀態(tài)就是 Full 。
路由計(jì)算
接下來,路由器開始計(jì)算路由。先評(píng)估一臺(tái)路由器到另一臺(tái)路由器需要的度量值。OSPF 協(xié)議是根據(jù)路由器的每一個(gè)接口的度量值決定最短路徑的。一條路由的開銷是指到達(dá)目的網(wǎng)絡(luò)的路徑上所有路由器接口的度量值總和。
度量值和接口帶寬有關(guān),路由器的接口度量值是根據(jù)公式 100/帶寬( Mbps )計(jì)算出來的,它作為評(píng)估路由器之間網(wǎng)絡(luò)資源的參考值。另外也可以通過命令手工指定路由器的度量值。
什么是度量值?
每種路由協(xié)議對(duì)度量值的定義是不同的,OSPF 使用 Cost(開銷)作為路由度量值,Cost 值越小,則路徑(路由)越優(yōu)。每一個(gè)激活 OSPF 的接口都有一個(gè)接口的 Cost 值,值等于 100/接口帶寬 Mbit/s,計(jì)算結(jié)果取整數(shù)部分,當(dāng)結(jié)果小于 1 時(shí),值取 1 。這個(gè)值也可以人為修改,修改值會(huì)直接影響 Cost 值的計(jì)算,從而影響網(wǎng)絡(luò)中 OSPF 路由的選擇。
同步 OSPF 區(qū)域內(nèi)每臺(tái)路由器的 LSDB ,路由器通過交互 LSA 實(shí)現(xiàn) LSDB 的同步。LSA 不但攜帶了網(wǎng)絡(luò)連接狀況信息,而且攜帶各接口的 Cost 信息。
由于一條 LSA 是對(duì)一臺(tái)路由器或一個(gè)網(wǎng)段拓?fù)浣Y(jié)構(gòu)的描述,整個(gè) LSDB 就形成了對(duì)整個(gè)網(wǎng)絡(luò)的拓?fù)浣Y(jié)構(gòu)的描述。所有路由器得到一張完全相同的圖。
使用 SPF(最短路徑優(yōu)先算法)計(jì)算出路由。OSPF 路由器用 SPF 算法以自己為根節(jié)點(diǎn),計(jì)算出一棵最短路徑樹。這棵樹上,由根到各個(gè)節(jié)點(diǎn)的累計(jì)開銷最小,也就是從根到各個(gè)節(jié)點(diǎn)的路徑都是最優(yōu)的,這樣就獲得了由根去往各個(gè)節(jié)點(diǎn)的路由。計(jì)算完成后,路由器將路由加入到 OSPF 路由表。當(dāng) SPF 算法發(fā)現(xiàn)有兩條到達(dá)目的網(wǎng)絡(luò)的路由的 Cost 值相同,會(huì)將這兩條路由都加入到 OSPF 路由表中,形成等價(jià)路由。
結(jié)尾
這篇文章,僅僅只是按照 OSPF 的協(xié)議過程,進(jìn)行了一部分的描述,這是為了讓我們對(duì) OSPF 有個(gè)初步的了解。