萬字長文爆肝路由協(xié)議!
想必我們大家都鼓搗過路由器,路由器可以說是我們?nèi)粘I钪斜夭豢缮俚囊粋€(gè)裝備了,就算你不是程序員,想必你隔壁的七大姑八大姨估計(jì)也讓你配置過路由器。但是大家有沒有想過一個(gè)問題,這個(gè)路由器是干啥用的?你可能知道這是為終端設(shè)備提供 WI-FI 連接上網(wǎng)的一種設(shè)備,當(dāng)我們終端設(shè)備連接 WI-FI 后,就可以通過路由器把數(shù)據(jù)從我的設(shè)備傳到我想要的地方(其他終端設(shè)備),然后實(shí)現(xiàn)我想要的東西和內(nèi)容。
這個(gè)回答整體上是能說通的,但是這里我就要問你一個(gè)問題了。
路由器是如何把數(shù)據(jù)發(fā)送給其他路由器的呢?
這個(gè)問題要回答上來,就要從路由協(xié)議來說起了。
在互聯(lián)網(wǎng)中,不管是局域網(wǎng)還是廣域網(wǎng),一個(gè)數(shù)據(jù)包是可以通過合理的路由控制從一個(gè)終端傳輸?shù)搅硪粋€(gè)終端的。而起到控制這個(gè)數(shù)據(jù)包發(fā)送過程就是路由控制模塊,路由控制模塊遵循路由協(xié)議,路由協(xié)議是整個(gè)互聯(lián)網(wǎng)的數(shù)據(jù)路由的規(guī)范和標(biāo)準(zhǔn)。
路由
為了能夠讓數(shù)據(jù)包正確的到達(dá)目標(biāo)主機(jī),路由器必須要在數(shù)據(jù)發(fā)送的過程中進(jìn)行正確的轉(zhuǎn)發(fā),這也是路由器的第一個(gè)作用:數(shù)據(jù)處理,除了能夠轉(zhuǎn)發(fā)外,數(shù)據(jù)處理還包括對(duì)數(shù)據(jù)進(jìn)行分組過濾、加密、壓縮等。
那么路由器是怎么知道這個(gè)數(shù)據(jù)是要發(fā)往哪里的呢?
路由器內(nèi)部維護(hù)了一個(gè)路由表,這個(gè)路由表會(huì)記錄數(shù)據(jù)包中目標(biāo)主機(jī)的 IP 地址和輸出路徑。路由器的主要工作就是為每個(gè)經(jīng)過路由的數(shù)據(jù)包尋找一個(gè)最佳的傳輸路徑,關(guān)于路由器的一些結(jié)構(gòu)和轉(zhuǎn)發(fā)規(guī)則我們已經(jīng)在 路由器你竟然是這樣的... 這篇文章中提到過了。
靜態(tài)路由和動(dòng)態(tài)路由
我們通常會(huì)把路由器分為靜態(tài)路由和動(dòng)態(tài)路由兩種,不管是靜態(tài)路由還是動(dòng)態(tài)路由,都不會(huì)脫離路由表。如果數(shù)據(jù)發(fā)送前你已經(jīng)把路由規(guī)則設(shè)置好,在發(fā)送時(shí)數(shù)據(jù)會(huì)按照你事先設(shè)置好的路徑進(jìn)行轉(zhuǎn)發(fā)的話,這就是靜態(tài)路由,如果你事先沒有設(shè)置路由規(guī)則,只是讓數(shù)據(jù)在發(fā)送的過程中按照路由協(xié)議的既定規(guī)則進(jìn)行轉(zhuǎn)發(fā)的話,這就是動(dòng)態(tài)路由,這兩種路由方式各有利弊。
靜態(tài)路由會(huì)讓你做大量且重復(fù)的設(shè)置路由的工作,效率低而且任務(wù)量很大,并且擴(kuò)展性比較差,一旦新增一個(gè)路由,就會(huì)讓你把所有的路由重新設(shè)置一遍,甚至還有單點(diǎn)問題,當(dāng)傳輸節(jié)點(diǎn)中某一個(gè)路由出現(xiàn)故障時(shí),數(shù)據(jù)基本不會(huì)繞過這個(gè)路由,需要管理員把路由重新設(shè)置才能繼續(xù)發(fā)送。

使用動(dòng)態(tài)路由也需要手動(dòng)設(shè)置一些東西,只不過需要設(shè)置的是路由協(xié)議,每個(gè)路由協(xié)議的復(fù)雜程度不同,所以設(shè)置的難以程度也不同,比如 RIP 協(xié)議的設(shè)置過程就比較簡(jiǎn)單,OSPF 的設(shè)置過程就比較繁瑣。不過一旦設(shè)置完成后,如果要新增加一個(gè)路由,就只需要設(shè)置新增加的單個(gè)路由就可以,而且避免了單點(diǎn)問題,動(dòng)態(tài)路由能夠選擇其他路徑從而繞過故障路由。

雖然靜態(tài)路由和動(dòng)態(tài)路由都各有利弊,但是你把他們結(jié)合一來一起使用就可以了。成年人全都要。
路由協(xié)議
上面討論了動(dòng)態(tài)路由會(huì)根據(jù)網(wǎng)絡(luò)情況動(dòng)態(tài)調(diào)整數(shù)據(jù)的轉(zhuǎn)發(fā)路徑,那么這種行為方式是以什么為基礎(chǔ)的呢?
答案是通過路由之間相互交換路由表來實(shí)現(xiàn)的。路由器之間會(huì)在合適的時(shí)間交換路由表,通過這種方式,可以讓網(wǎng)絡(luò)之間所有的路由器都能夠動(dòng)態(tài)調(diào)整數(shù)據(jù)的轉(zhuǎn)發(fā)路徑。當(dāng)網(wǎng)絡(luò)情況發(fā)生變化時(shí),路由器之間彼此交換的路由信息會(huì)告知對(duì)方網(wǎng)絡(luò)的這種變化,通過信息擴(kuò)散使所有路由器都能得知網(wǎng)絡(luò)變化。
常見的動(dòng)態(tài)路由協(xié)議有RIP、OSPF、BGP、MPLS 等,根據(jù)不同的自治系統(tǒng)還可以分為 IGP(內(nèi)部網(wǎng)關(guān)協(xié)議) 和 EGP(外部網(wǎng)關(guān)協(xié)議)。這個(gè)內(nèi)外有啥區(qū)別呢?
這就需要先了解一下什么是自治系統(tǒng):
一個(gè)自治系統(tǒng)(AS)就是處于一個(gè) ISP 網(wǎng)絡(luò)服務(wù)提供商管理控制下的路由器和網(wǎng)絡(luò)群組,它可以是一個(gè)路由器直接連接到 LAN 上,同時(shí)連接到 Internet 上,也可以是由企業(yè)骨干網(wǎng)互聯(lián)的多個(gè)局域網(wǎng)。
自治系統(tǒng)內(nèi)部的動(dòng)態(tài)路由采用的是域內(nèi)路由協(xié)議 IGP,而自治系統(tǒng)之間的路由控制采用的是域間路由協(xié)議 EGP。IGP 和 EGP 又可以叫做內(nèi)部網(wǎng)關(guān)協(xié)議和外部網(wǎng)關(guān)協(xié)議。IGP 和 EGP 是相輔相成的關(guān)系,沒有 EGP 就不可能實(shí)現(xiàn)在不同機(jī)構(gòu)之間的通信,沒有 IGP 也就不可能實(shí)現(xiàn)自治系統(tǒng)的內(nèi)部通信。IGP 協(xié)議可以細(xì)分為 RIP、RIP 2、OSPF 等眾多協(xié)議。EGP 協(xié)議使用的是 BGP 協(xié)議。
我們下面就來認(rèn)識(shí)一下這些協(xié)議。
RIP 協(xié)議
RIP 的全稱是 Routing Information Protocol,路由信息協(xié)議。它是 IGP 中最先得到廣泛應(yīng)用的一種協(xié)議,就像很多剛誕生的萌芽一樣,最開始一定是非常簡(jiǎn)單的。
RIP 協(xié)議要求每個(gè)路由器都要維持一個(gè)集合,這個(gè)集合主要記錄了路由器到目的網(wǎng)絡(luò)所走過的距離,如果路由器與目的網(wǎng)絡(luò)直接相連,那么這個(gè)距離就是 1 ,否則,在路由器到目的網(wǎng)絡(luò)的這段距離中,只要走過一個(gè)路由器,它的距離就會(huì) + 1,這個(gè)距離也稱為**跳數(shù)(hop count)**,也就是說,每經(jīng)過一個(gè)路由器,跳數(shù)就會(huì) + 1,不過,這個(gè)跳數(shù)是有次數(shù)限制的,最大不能超過 15,所以,由此可見,RIP 只適用于小型互聯(lián)網(wǎng)。
RIP 不能在兩個(gè)網(wǎng)絡(luò)之間使用多個(gè)路由,相反的,它會(huì)選擇一條途經(jīng)路由最少的線路進(jìn)行傳輸,哪怕選擇這條最少路由傳輸?shù)木€路時(shí)延大也沒關(guān)系。
由此我們可以歸納出 RIP 協(xié)議的兩個(gè)特點(diǎn):第一個(gè)特點(diǎn)就是它只會(huì)和相鄰的路由器交換消息,那么這個(gè)"相鄰"該如何判斷呢?如果兩個(gè)路由器之間的通信不需要再經(jīng)過另一個(gè)路由器,就說這兩個(gè)路由器是相鄰的。RIP 還規(guī)定不相鄰的路由器不會(huì)交換信息。第二個(gè)特點(diǎn)就是說每個(gè)路由器會(huì)毫不保留的交換自己知道的全部信息,也就是交換彼此的路由表。
還有一個(gè)非常重要的問題我們沒有考慮到,既然我們知道 RIP 協(xié)議規(guī)定了交換信息的規(guī)則,那它是如何規(guī)定交換的時(shí)間間隔呢?
RIP 協(xié)議規(guī)定按照固定的時(shí)間間隔交換路由信息,當(dāng)路由信息發(fā)生變更時(shí),它會(huì)及時(shí)向相鄰的路由器通過交換路由表的方式進(jìn)行更新,更新的原則是路由器要找出最短路徑,使用的是距離向量算法。
距離向量算法
對(duì)于每一個(gè)相鄰路由器發(fā)送過來的 RIP 報(bào)文,通常會(huì)進(jìn)行以下操作:
修改 RIP 報(bào)文中的內(nèi)容,會(huì)把 RIP 報(bào)文中的"下一跳地址" N 、"距離" D 字段的值 + 1。
對(duì)修改后的 RIP 報(bào)文中的每一個(gè)內(nèi)容,進(jìn)行以下步驟:
如果原來路由表中沒有目的網(wǎng)絡(luò)的地址 R ,就會(huì)修改 RIP 報(bào)文中的目的網(wǎng)絡(luò)地址。 如果原來路由表中有目的網(wǎng)絡(luò)的地址,而且下一跳路由的地址是 N,就把收到的 RIP 報(bào)文內(nèi)容替換原路由表中的內(nèi)容。 如果原來路由表中有目的網(wǎng)絡(luò)的地址,但下一跳路由的地址不是 N,如果收到的 RIP 報(bào)文中的距離 D 小于路由表中的距離,就會(huì)進(jìn)行更新。 如果一段時(shí)間內(nèi)沒有收到相鄰路由器的路由表更新消息,就把此相鄰的路由器標(biāo)記為不可達(dá),并把距離設(shè)置為 16,距離 16 表示為不可達(dá)。
RIP 協(xié)議報(bào)文格式
RIP 協(xié)議現(xiàn)階段主要有兩個(gè)版本:RIP 1 和 RIP 2 ,現(xiàn)在更多的使用 RIP 2 的版本,RIP 2 協(xié)議RIP 協(xié)議使用 UDP 協(xié)議進(jìn)行傳輸控制。
RIP 1 和 RIP 2 的主要區(qū)別如下:
RIP 1 是一個(gè)有類路由協(xié)議,RIP 報(bào)文中不包含子網(wǎng)掩碼,這就要求網(wǎng)絡(luò)中所有設(shè)備使用相同的子網(wǎng)掩碼,而 RIP 2 是一個(gè)無類路由協(xié)議,它使用子網(wǎng)掩碼。 RIP 1 在發(fā)送更新包的時(shí)候是使用的廣播方式進(jìn)行的,而 RIP 2 默認(rèn)使用的是組播,當(dāng)然 RIP 2 也支持廣播發(fā)送,但是使用組播的方式既能夠滿足需要,又能夠節(jié)省帶寬。 第三個(gè)區(qū)別是 RIP 2 支持明文或者是 MD5 驗(yàn)證,要求兩臺(tái)路由器在同步路由表的時(shí)候必須進(jìn)行驗(yàn)證,這樣可以加強(qiáng)安全性。
下面是 RIP 2 的報(bào)文格式。

RIP 2 報(bào)文可以細(xì)分為首部部分和路由部分。
首部部分主要有命令、版本和必為 0字段,其中命令標(biāo)識(shí)報(bào)文的類型,1 標(biāo)識(shí) Request 請(qǐng)求,向相鄰路由請(qǐng)求全部或者部分路由信息;2 標(biāo)識(shí) Response 請(qǐng)求,向相鄰路由器發(fā)送自己全部或者部分信息。然后是 RIP 版本,表示是 RIP 1 還是 RIP 2。后面的必為 0 其實(shí)主要為了要補(bǔ)齊 4 字節(jié)設(shè)計(jì)的。
下面是 RIP 報(bào)文的路由信息:
地址簇標(biāo)識(shí)符:其值為 2 時(shí)表示 IP 協(xié)議。對(duì)于 Request 報(bào)文,此字段值為 0。路由標(biāo)記:這個(gè)一般填入自治系統(tǒng)號(hào),有可能存在 RIP 收到自治系統(tǒng)以外的路由選擇信息。網(wǎng)絡(luò)地址:這個(gè)就表示目的網(wǎng)絡(luò)地址。子網(wǎng)掩碼:目的地址的子網(wǎng)掩碼。下一跳路由器地址:表示路由器的下一跳地址,如果為 0.0.0.0,則表示發(fā)布此路由的路由器地址就是最優(yōu)下一跳地址。跳數(shù):需要經(jīng)過的路由數(shù)量。
RIP 存在一個(gè)問題是當(dāng)網(wǎng)絡(luò)故障時(shí),會(huì)經(jīng)過較長時(shí)間才能將信息同步到所有的路由器。
RIP 的主要問題以及解決辦法
如下圖所示,有一個(gè)網(wǎng)絡(luò)1 和路由器 1,路由器 1 到網(wǎng)絡(luò) 1 的 RIP 報(bào)文中的路由信息(為了方便描述,省略其他報(bào)字段信息)是"1,1,直接交付",這個(gè)意思就是說:到網(wǎng)絡(luò) 1 的距離是 1 個(gè)路由器的跳數(shù),是直連的方式。

此時(shí)加進(jìn)來了網(wǎng)絡(luò) 2 和路由器 R2,R2 到網(wǎng)絡(luò) 1 的 RIP 報(bào)文是 "1,2,R1",它表示路由器 R2 到網(wǎng)絡(luò) 1 的距離是 2 跳,下一個(gè)路由器是 R1。

好了,上面兩幅圖中都能正常發(fā)送 RIP 報(bào)文,相安無事。此時(shí)網(wǎng)絡(luò) 1 出現(xiàn)了故障,導(dǎo)致 R1 無法直接到達(dá)網(wǎng)絡(luò) 1,那么R1、 R2 此時(shí) RIP 的報(bào)文該如何發(fā)送呢?
實(shí)際上,與網(wǎng)絡(luò) 1 直接相連的是 R1,所以 R1 首先知道網(wǎng)絡(luò) 1 是不可用的,一旦 R1 知道網(wǎng)絡(luò) 1 不可用,就會(huì)修改 RIP 報(bào)文為 "1,16,直接",然后向 R2 同步路由表,如下圖所示:

但是由于 RIP 協(xié)議本身的特性,這個(gè)路由表同步過程沒那么快速的完成,而此時(shí) R2 不知道網(wǎng)絡(luò) 1 不可用,所以它還是繼續(xù)經(jīng)過 R1 向網(wǎng)絡(luò) 1 發(fā)送報(bào)文。
一旦 R2 的報(bào)文發(fā)送給 R1 ,R1 就會(huì)認(rèn)為經(jīng)過 R2 可以到達(dá)網(wǎng)絡(luò) 1 ,所以 R1 就會(huì)把 RIP 報(bào)文修改為 "1,3,R2",表明我到網(wǎng)絡(luò) 1 的距離是 3 跳,下一個(gè)路由器要經(jīng)過 R2 ,如下圖所示

同理,R2 收到 R1 的報(bào)文后會(huì)將其 RIP 報(bào)文修改為 "1,4,R1"。。。。。。然后不斷進(jìn)行 R1 和 R2 的循環(huán)。

這個(gè)循環(huán)什么時(shí)候終止呢?
直到 R1 和 R2 的跳數(shù)都增大到 16 時(shí),R1 和 R2 才知道網(wǎng)絡(luò) 1 是不可達(dá)的。這不就是白干么?不過這就是 RIP 協(xié)議的一個(gè)特點(diǎn)。這個(gè)特點(diǎn)通俗一點(diǎn)來講就是好消息傳播的快,壞消息傳播的慢。
有沒有什么方法能夠補(bǔ)救一下這種傳播慢的方式?
一種方式就是控制跳數(shù)為 16,這相當(dāng)于是從報(bào)文傳輸時(shí)間上進(jìn)行控制;二是規(guī)定路由器不會(huì)再把收到的消息反向傳輸給發(fā)送端,這種方式被稱為水平分割,如下圖所示

還有一種方式就是當(dāng)路由信息發(fā)生變化時(shí),不等待一定的時(shí)間(例如 30 秒)而是直接發(fā)送出去,這看起來是更容易想到的方式,想想也是,網(wǎng)絡(luò)都斷了,還要等待 30 s 才發(fā)送,真的很雞肋。
總之,因?yàn)槠鋮f(xié)議特征和報(bào)文限制了其只能用在小型網(wǎng)絡(luò)中。
OSPF 協(xié)議
OSPF 是為了克服 RIP 的缺點(diǎn)在 1989 年開發(fā)出來的,OSPF 稱為 開放最短路徑優(yōu)先 ( Open Shortest Path First ) 協(xié)議。注意雖然它被叫做最短路徑優(yōu)先協(xié)議,但是卻并不能說明其他協(xié)議不是最短路徑優(yōu)先的,一般自治系統(tǒng)內(nèi)的路由器都會(huì)選擇一個(gè)最短路徑來進(jìn)行傳輸。
OSPF 使用的是分布式的鏈路狀態(tài)協(xié)議,而非像 RIP 那樣的距離向量協(xié)議。和 RIP 協(xié)議相比,OSPF 主要有下面這些變化:
OSPF 會(huì)向自治系統(tǒng)內(nèi)的所有路由器發(fā)送消息,OSPF 首先會(huì)向相鄰的路由器發(fā)送消息,然后相鄰的路由器又向與之相鄰的路由器發(fā)送消息,漸漸的會(huì)同步所有的路由器。而 RIP 僅僅會(huì)向周圍幾個(gè)距離比較近的路由器發(fā)送消息。 OSPF 發(fā)送的消息就是路由器相鄰的所有路由器的鏈路狀態(tài),這些狀態(tài)包括了路由器都與哪些路由器相鄰,以及鏈路的 metric,其實(shí)就是 RIP 中的跳數(shù)。對(duì)于 RIP 協(xié)議來說,它僅僅會(huì)向相鄰的路由器同步整個(gè)路由表。 OSPF 會(huì)在鏈路發(fā)生變化時(shí)向所有路由器同步消息,而 RIP 在不管網(wǎng)絡(luò)狀態(tài)是否發(fā)生變化,都會(huì)定期交換路由表信息。
由此來看,OSPF 和 RIP 的區(qū)別還是比較大的。
由于 OSPF 會(huì)定期向周圍的路由器同步鏈路信息,因此這些路由器可以建立一個(gè)鏈路狀態(tài)數(shù)據(jù)庫,每一個(gè)路由器都知道自治系統(tǒng)內(nèi)有多少路由器,以及和這些路由器的 metric,因此每個(gè)路由器都可以以自己為根來構(gòu)建一個(gè)路由表。RIP 協(xié)議雖然也能知道這些信息,只不過它無法知悉整個(gè)自治系統(tǒng)內(nèi)的所有路由信息。
說了這么多,那為什么 OSPF 協(xié)議為啥比 RIP 協(xié)議更適用于大型網(wǎng)絡(luò)?
首先 OSPF 沒有跳數(shù)限制,而且 OSPF 會(huì)將自治系統(tǒng)劃分為更小的區(qū)域,每個(gè)區(qū)域都有一個(gè)標(biāo)識(shí),當(dāng)然區(qū)域的劃分也是有范圍的,最大不能超過 200 個(gè),下面就是一個(gè) OSPF 對(duì)自治系統(tǒng)內(nèi)不同區(qū)域的劃分。

這么做的好處是能夠提高區(qū)域內(nèi)的消息傳輸效率,減少通信量。想象一下,如果是一個(gè)特別大的自治系統(tǒng)內(nèi)部不做任何劃分的話,那么每個(gè)路由器同步一次消息需要多大的通信量啊。
OSPF 的劃分采用的是一種分層的方式,分為上下兩層,在上層的叫做主干區(qū)域,主干區(qū)域的標(biāo)識(shí)符規(guī)定為 0.0.0.0,主干區(qū)域的作用主要用來連接其他在下層的區(qū)域,每個(gè)區(qū)域內(nèi)部都有負(fù)責(zé)和主干區(qū)域路由器通信的中間路由器,這個(gè)中間路由器叫做 區(qū)域邊界路由器,而主干區(qū)域內(nèi)的路由器叫做 主干路由器,主干路由器可以是區(qū)域邊界路由器,在所有的主干路由器中,還有一個(gè)負(fù)責(zé)和外部自治系統(tǒng)進(jìn)行通信的路由器,這個(gè)路由器叫做自制邊界系統(tǒng)路由器。
分層思想雖然解決了 OSPF 內(nèi)通信量龐大的問題,但是通信的種類大大增加,讓 OSPF 這個(gè)協(xié)議變的很復(fù)雜。不過,分層的思想是極其重要的,因?yàn)槿魏未笮途W(wǎng)絡(luò)也好,操作系統(tǒng)也好,都會(huì)體現(xiàn)分層的思想,畢竟解耦是一門藝術(shù)。
OSPF 沒有使用任何傳輸層協(xié)議進(jìn)行通信,相反的它會(huì)直接傳輸 IP 數(shù)據(jù)報(bào)。
那么問題來了,為什么還有協(xié)議不會(huì)使用傳輸層協(xié)議傳輸報(bào)文呢?
因?yàn)?OSPF 需要執(zhí)行可靠的多播操作,它會(huì)盡可能和自治系統(tǒng)內(nèi)的多個(gè)鄰居路由器通信,而 TCP 是不支持多播的,并且 UDP 無法保證可靠傳輸,所以 OSPF 實(shí)現(xiàn)了自己的傳輸機(jī)制,從而繞過了 TCP 和 UDP。
OSPF 構(gòu)成的數(shù)據(jù)包不大,這樣可以減少通信量,還有一個(gè)好處就是不必將數(shù)據(jù)包進(jìn)行分片,因?yàn)榈卜制蟮臄?shù)據(jù)片丟失任意一個(gè),就無法組裝成發(fā)送的數(shù)據(jù)包,必須進(jìn)行重傳。
下面是 OSPF 的報(bào)文以及各個(gè)字段的含義。

( 1 ) 版本 Version :當(dāng)前 OSPF 版本號(hào)是 v2 ,主要標(biāo)準(zhǔn)是 RFC 1583 和 RFC 2328。
( 2 ) 類型 Type:OSPF 的報(bào)文類型有五類,這個(gè)類型可以表示任何一類 OSPF 報(bào)文。
( 3 ) 分組長度 Packet length:包括 OSPF 首部在內(nèi)的分組長度,以字節(jié)為單位。
( 4 ) 路由器標(biāo)識(shí)符 Router ID:標(biāo)志這個(gè)分組是由哪個(gè)路由器接口發(fā)出的,這個(gè)路由器的 IP 地址。
( 5 ) 區(qū)域標(biāo)識(shí)符 Area ID:表示這個(gè)分組屬于哪個(gè)區(qū)域,它的一個(gè)標(biāo)識(shí)符。
( 6 ) 檢驗(yàn)和:用于檢測(cè)分組中是否出現(xiàn)差錯(cuò)。
( 7 ) 鑒別類型:目前只有兩種鑒別類型,0 (不用) 和 1(口令)。
( 8 ) 認(rèn)證數(shù)據(jù)(鑒別):類型為 0 就填 0 ,為 1 時(shí)就填入 8 個(gè)字符口令。
OSPF 除了上述這些報(bào)文的特點(diǎn)之外,還有一些其他特點(diǎn):
( 1 ) 如果到一個(gè)目的網(wǎng)絡(luò)有多條相同 metric 的路徑,那么 OSPF 會(huì)通過負(fù)載均衡的方式來使用每一條路徑。
( 2 ) OSPF 允許管理員手動(dòng)的設(shè)置 metric,如果是敏感的業(yè)務(wù)就可以設(shè)置較高的 metric,如果對(duì)于敏感性要求沒那么高,就可以設(shè)置較低的 metric。這在 RIP 中根本不可能,RIP 只允許一條最短路徑。
( 3 ) OSPF 分組具有鑒別功能,這保證了傳輸鏈路信息的安全性。
( 4 ) OSPF 支持可變長度的子網(wǎng)劃分和無分類編址 CIDR 。
( 5 ) 由于網(wǎng)絡(luò)中的鏈路狀態(tài)經(jīng)常會(huì)發(fā)生變化,因此 OSPF 會(huì)讓每一個(gè)鏈路帶上一個(gè) 32 位的序號(hào),序號(hào)越大狀態(tài)越新。
上面說到 OSPF 有五種報(bào)文類型,主要有下面這五種:
類型 1 :hello 報(bào)文,這個(gè)報(bào)文會(huì)定期以組播的形式發(fā)送,主要作用就是維護(hù)和鄰居路由器的可達(dá)性,確保能夠雙向通信,但是并不是所有的報(bào)文都會(huì)建立關(guān)系,必須和報(bào)文中的所有字段都匹配后,才能建立。下面是 hello 報(bào)文的字段。

Nestwork Mask:網(wǎng)絡(luò)掩碼。
Hello Interval:發(fā)送 hello 報(bào)文的時(shí)間間隔。默認(rèn)情況下,OSPF 在 P2P 或廣播類型的接口上發(fā)送 hello 間隔為10 s,在 NBMA 和 P2MP 類型接口上hello間隔為 30 s。
Options:可選項(xiàng),路由器通過設(shè)置 options 字段來通告自己能夠支持某種特性
Router Pri:路由器優(yōu)先級(jí)
Router Dead Interval :路由器失效時(shí)間。默認(rèn)情況下該路由接口為 hello interval 的 4 倍關(guān)系,如果在此時(shí)間內(nèi)未收到鄰居發(fā)來的 hello 報(bào)文,則認(rèn)為鄰居失效。
Designated Router:指定路由器。如果字段為 0.0.0.0 表示 DR 尚未指定或者沒有 DR。Backup Designated Router:備份指定路由器。網(wǎng)絡(luò)中 BDR 的接口 IP 地址。如果字段為 0.0.0.0 表示 BDR 尚未指定或者沒有 BDR。Neighbor:鄰居。此處填充的是鄰居的 Router ID。
類型 2 :數(shù)據(jù)庫分組(Database Description),用于向相鄰站點(diǎn)同步自己的鏈路數(shù)據(jù)庫中的鏈路狀態(tài)信息。

Interface MTU:最大接口數(shù)據(jù)單元,由此接口發(fā)出最大的 IP 數(shù)據(jù)長度,默認(rèn)為 0 。
I:initial bit,初始標(biāo)志位,當(dāng)連續(xù)發(fā)送多個(gè) DD 報(bào)文時(shí),如果此報(bào)文時(shí)第一個(gè)就是 1 ,否則就是 0 。
M:more ,如果設(shè)置為1表示后面還有其他的 DD 報(bào)文,如果這是最后一個(gè) DD 報(bào)文則設(shè)置為 0。
M/S:此位設(shè)置為 1 表示為 master 路由器。
DD sequence number DD 報(bào)文序列號(hào)。主從雙方利用序列號(hào)來保證 DD 報(bào)文傳輸?shù)目煽啃院屯暾浴SA headers:DD 報(bào)文中所含 LSA 的頭部信息。
類型 3:鏈路狀態(tài)請(qǐng)求 ( Link State Request ) 分組,用 LSR 報(bào)文請(qǐng)求完整的 LSA 消息。

LS Type :鏈路狀態(tài)類型。
Link State ID:LSA 標(biāo)識(shí)。
Advertising Router:產(chǎn)生該 LSA 的路由器 Router ID。
類型 4: 鏈路狀態(tài)更新 ( Link State Update ) 分組,

路由器收到 LSR 后會(huì)以 LSU 報(bào)文進(jìn)行回應(yīng),在 LSU 報(bào)文中就包含了對(duì)方請(qǐng)求的 LSA 完整的信息。
詳細(xì)的 LSA 報(bào)文通常會(huì)分開來寫,包括 LSA Header,Router-LSA,Network-LSA。
類型 5: 鏈路狀態(tài)確認(rèn) ( Link State Acknowledgment ) 分組,用來對(duì)接收到的 LSU 報(bào)文進(jìn)行確認(rèn)。內(nèi)容是需要確認(rèn)的 LS A的 header,一個(gè) LSACK 報(bào)文可以對(duì)多個(gè) LSA 進(jìn)行確認(rèn)。

OSPF 規(guī)定,每隔 10 s 就要交換一次 Hello 分組,來判斷網(wǎng)絡(luò)鏈路是否可達(dá),這就很像某種心跳檢測(cè)機(jī)制。路由表就會(huì)根據(jù) Hello 分組的檢測(cè)結(jié)果來制定的。在正常情況下,絕大多數(shù)分組都是 Hello 分組,如果在 40 s 內(nèi)沒有收到發(fā)過來的 Hello 分組,就會(huì)認(rèn)為相鄰路由器不可達(dá),應(yīng)該立刻修改鏈路狀態(tài)數(shù)據(jù)庫中所記錄的鏈路信息,還要重新制定路由表。
其他四種 OSPF 報(bào)文都是用來進(jìn)行鏈路狀態(tài)數(shù)據(jù)庫同步的。這個(gè)同步的意思就是說不同路由器的鏈路狀態(tài)相同。兩個(gè)同步的路由器被稱為完全相鄰的。并不是在物理距離上離的比較近就被稱為相鄰,而是要判斷它的鏈路狀態(tài)。
總結(jié)一下上面五種報(bào)文類型的用途:通過發(fā)送 Hello 報(bào)文確認(rèn)是否連接;通過 DD 分組來進(jìn)行鏈路狀態(tài)信息同步;在路由運(yùn)行階段,通過鏈路狀態(tài)請(qǐng)求包請(qǐng)求路由控制信息,然后由鏈路狀態(tài)更新包接收路由同步信息,最后通過鏈路狀態(tài)確認(rèn)包通知已接收到路由控制信息。
當(dāng)新加一個(gè)路由器開始工作時(shí),它不知道應(yīng)該向誰同步鏈路信息,所以它需要通過分組來判斷相鄰的路由器都有哪些,以及向相鄰路由器發(fā)送的 metric 是多少,如果所有的路由器都把自己的狀態(tài)信息對(duì)全網(wǎng)進(jìn)行廣播的話,那么各個(gè)路由器把鏈路狀態(tài)信息組合起來就能得到狀態(tài)鏈路數(shù)據(jù)庫,不過這樣開銷太大了。
所以,OSPF 通過使用數(shù)據(jù)庫分組和相鄰路由器交換鏈路信息狀態(tài)來得到全網(wǎng)的狀態(tài)鏈路數(shù)據(jù)庫,下面是組合成狀態(tài)鏈路數(shù)據(jù)庫所需要發(fā)送過的 OSPF 報(bào)文。

這樣一來,就會(huì)建立狀態(tài)鏈路數(shù)據(jù)庫,在網(wǎng)絡(luò)運(yùn)行過程中發(fā)生路由狀態(tài)變更的話,只需要發(fā)送鏈路狀態(tài)更新分組即可,更新完成后需要發(fā)送鏈路狀態(tài)確認(rèn)報(bào)文。
而且 OSPF 不像 RIP 一樣具有好消息傳播快,壞消息傳播慢的問題。
?往期推薦?
??

