第三章 OSPF(一)

2021-10-11 02:25:13 字數 3614 閱讀 7642

3.1 ospf的基本概念

ospf(open shortest path first)開放式最短路徑優先協議是典型的鏈路狀態協議,支援vlsm(可變長子網掩碼),支援路由彙總等,另外區域(area)的引入使得ospf能夠支援更大規模的網路。ospf現在主要有兩個版本,乙個是面向ipv4的ospfv2,和面向於ipv6的ospfv3。

與距離向量路由協議不同,鏈路狀態路由協議中路由器交換的不是路由表,而是本地的直連線口狀況。路由器將這些資訊載入到lsdb(鏈路狀態資料庫)中,經過計算生成乙個以自己為根的「樹」,根據這個樹算出最優路徑並載入自己的路由表中。

3.1.1 route-id

route-id是乙個ospf域中一台路由器的唯一標識,與ipv4的ip位址格式是相同的。

如果不配置路由器標識,預設預設,但是建議配置。(若為預設,則預設為本地loopback的ip位址,若本地有多個,則選擇最優的乙個)

通常會將路由器標識與為本地環迴介面的ip位址保持一致。

3.1.2 ofps的三張表

1、鄰居表

在進行鏈路狀態通告之前,直連路由器需要建立ospf鄰居關係。

只要在ospf介面上發現鄰居,就會被寫入鄰居表內。

鄰居表描述了鄰居狀態、主從關係、route-id、dr優先順序、介面ip等資訊。

2、鏈路狀態資料庫(lsdb)

執行鏈路狀態協議的路由器都會向外洪氾鏈路狀態資訊。

在ospf中,叫鏈路狀態通告(lsa)。

路由器會將收到的lsa中的路由載入到lsdb中。

3、ospf路由表

通過對lsdb的計算,會產生乙個以本地為根、無環的最短路徑樹。基於這棵樹可以算出到達各個網段的最佳路徑,最終會將計算好路由載入到ospf路由表中。

3.1.3 度量值

ospf使用cost(開銷)值作為度量值,每個啟用ospf埠都會有乙個cost值,預設為參考頻寬/介面頻寬(預設參考頻寬100mbit/s),取結果的整數部分,若小於1則記為1。

上圖中r2想訪問10.1.13.0/24網段,如果經過r1,那麼度量值為r2的g0/0/0的cost值加r1的g0/0/1的cost值,為2;如果經過r3,度量值為r2的s1/0/0的cost值加r3的g/0/1的值,為49。所以ospf最終選擇經過r1來訪問10.1.13.0/24網段。

ospf的介面cost可以手動修改,也可以通過修改介面的參考頻寬來影響介面cost值。

3.1.4 報文型別及格式

報文名稱 報文描述

hello 用於發現直連鏈路上的ospf鄰居,以及維護ospf鄰居關係。

dd(database description,資料庫描述)用於描述lsdb,攜帶lsdb頭部資料。

lsr(link state request,鏈路狀態請求) 用於向ospf鄰居請求lsa

lsu(link state update,鏈路狀態更新) 用於傳送lsa,該報文中攜帶的是完整的lsa資料,lsa是裝載在lsu中進行洪氾的。

lsack(link state acknowledgment,鏈路狀態確認) 裝置接收到lsu後,lsack用於對接收的lsa進行確認。

ospf通用報文頭部

版本:ospfv2版本的值為2。

型別:用來區分ospf報文型別,1-hello、2-dd、3-lsr、4-lsu、5-lsack。

報文長度:整個ospf報文的長度。

路由器id:路由器的ospf route-id。

區域id:該報文的區域id。

校驗和:用於檢驗報文的有效性。

驗證型別:用來指示報文的認證型別。

認證資料:用於報文認證的內容。

3.1.5 鄰接關係的建立

down(失效):介面未被啟用,不傳送hello報文。

init(初始):開始傳送hello報文。

2-way(雙向通道):如果路由器收到的hello報文中有自己的route-id時,會將對方的狀態設定為2-way。

loading(載入):根據收到的lsa頭部資訊,路由器會向鄰居傳送lsr來請求lsa的完整資訊,對方使用lsu來回應,收到後回應lsack加以確認。

full(全毗鄰):當介面上待請求的lsa列表為空時,此時狀態為full,僅傳送hello保持鄰接關係。

r1和r2的g0/0/0介面都開啟了ospf協議,首先r1以組播(224.0.05)形式傳送hello包報文。

r2收到此hello報文後,首先會對報文進行檢查,如果雙方的網路掩碼、hello間隔、路由失效間隔不一致,會忽略該報文。

通過檢查後,r2發現收到的hello報文中沒有自己的route-id,於是將r1設定未init狀態,並發出乙個hello報文,其中包含有r1的route-id。

當r1收到此hello報文後發現其中有自己的route-id,於是將r2設定為2-way狀態。r2這邊也同理,當r2發現收到的來自r1的hello報文中有自己的route-id,也會將r1設定為2-way狀態,也就是建立了雙向通訊。

此時r1,r2成功建立了ospf鄰居關係。

如果路由器介面接入的是多路訪問網路,兩路由器接下來會進行dr/bdr的選舉,要注意的是:

1、dr/bdr/drother的角色是基於埠設定的,而不是應用在整個路由器上面;

2、dr的角色不具有搶占性,即使後來接入的路由器優先順序更高,也不會影響當前dr的角色;

3、dr選舉的依據是priority欄位,預設值為1。如果優先順序相同,那麼route-id最高的將會成為dr。如果優先順序為0,則不參與選舉直接成為drother。

此時兩路由器都會進入exstart狀態,首先r1和r2都認為自己是dr,並向對方傳送dd報文,其中dd報文的序列號就是priority的值(假設在此之前手動將r1和r2的priority值分別改為了200和300)。

這時r1收到來自r2的dd報文後,發現r2的優先順序比自己的大,於是就會將自己設定為非master,並在傳送dd報文時將dd序列號改為300。

r2收到來自r1的dd報文後,會進入exchange狀態,也會將r1切換到exchange狀態。

雙方開始互相傳送帶有lsa頭部的dd報文。

r2向r1 傳送dd報文,此時dd序列號為308,r1收到後使用相同的dd序列號向r2傳送乙個dd報文,在該報文中,將m位元位設定為0,此dd報文起確認的作用。r2收到後繼續傳送自己的dd報文,當傳送到最後乙個dd報文時也將m位元位設定為0。r1收到該報文後,向r2回應乙個空的dd報文用來確認,報文序列號為309。

此時兩路由器進入loading狀態。

r1會向r2傳送lsr報文以請求自己感興趣的lsa,r2收到後會回應含有相應完整lsa的lsu報文,r1收到來自r2的lsu後會將收到的lsa載入自己的lsdb中,並回應lsack加以確認。r2也同理。

雙方可能會相互傳送多個lsr,lsu,當r1,r2發現自己沒有其他的lsa需要從鄰居獲取時,便將鄰居的狀態切換到full。

第三章 OSPF(三)

3.3 ospf協議特性 3.3.1 路由彙總 當網路規模比較大時,路由器維護的路由資訊也就越多,當網路拓撲中的一處發生改變時,就會導致相應的變更資訊傳播到全網。所以在保證全網可達的前提下,減少網路中路由器的路由表規模是很有必要的。路由彙總是把一組路由匯聚成一條路由,通過路由彙總可以大大減小路由表的...

第三章 堆疊

1.基礎知識 堆疊可以實現很多的應用,遞迴的問題轉化成非遞迴形式,在本質上也是堆疊的問題.它是一種 filo 操作的資料結構,一般也有兩種儲存方式 陣列跟鍊錶實現形式,這裡我給出了鍊錶形式的堆疊模板,裡面包括了基本的堆疊所有的操作,還有兩個比較著名的應用例子,時間倉促,精力比較有限,關於迷宮老鼠還沒...

第三章 曙光

第三章 曙光 第二場校園招聘開始了。其實,洋對這個公司的不是很了解。因為前幾天突然在bbs上面看到了這個公司的招聘資訊,洋覺得這個公司不錯,就上網投了簡歷。接下來的乙個多小時,讓洋很震撼!想不到這個公司這個厲害,而且無論從哪方面來說,絕對不比之前的那個公司差。想不到自己的乙個不經意的決定到了這個大的...