路由協議OSPF全稱爲Open Shortest Path First,也就開放的最短路徑優先協議,由於OSPF是由IETF開發的,它的使用不受任何廠商限制,全部人均可以使用,因此稱爲開放的,而最短路徑優先(SPF)只是OSPF的核心思想,其使用的算法是Dijkstra算法,最短路徑優先並無太多特殊的含義,並無任何一個路由協議是最長路徑優先的,全部協議,都會選最短的。 算法
OSPF的流量使用IP協議號89。數據庫
OSPF工做在單個AS,是個絕對的內部網關路由協議(Interior Gateway Protocol,即IGP)。緩存
OSPF對網絡沒有跳數限制,支持 Classless Interdomain Routing (CIDR)和Variable-Length Subnet Masks (VLSMs),沒有自動彙總功能,但能夠手工在任意比特位彙總,而且手工彙總沒有任何條件限制,能夠彙總到任意掩碼長度。網絡
OSPF支持認證,而且支持明文和MD5認證;OSPF不能夠經過Offset list來改變路由的metric。架構
OSPF並不會週期性更新路由表,而採用增量更新,即只在路由有變化時,纔會發送更新,而且只發送有變化的路由信息;事實上,OSPF是間接設置了週期性更新路由的規則,由於全部路由都是有刷新時間的,當達到刷新時間閥值時,該路由就會產生一次更新,默認時間爲1800秒,即30分鐘,因此OSPF路由的按期更新週期默認爲30分鐘。負載均衡
OSPF全部路由的管理距離(Ddministrative Distance)爲110,OSPF只支持等價負載均衡。less
距離矢量路由協議的根本特徵就是本身的路由表是徹底從其它路由器學來的,而且將收到的路由條目一絲不變地放進本身的路由表,運行距離矢量路由協議的路由器之間交換的是路由表,距離矢量路由協議是沒有大腦的,路由表歷來不會本身計算,老是把別人的路由表拿來就用;而OSPF徹底拋棄了這種不可靠的算法,OSPF是典型的鏈路狀態路由協議,路由器之間交換的並非路由表,而是鏈路狀態,OSPF經過得到網絡中全部的鏈路狀態信息,從而計算出到達每一個目標精確的網絡路徑。dom
Router-IDoop
假設這個世界上的人名字沒有重複,每一個人的名字都不相同,當有一天,趕上個陌生人告訴你,有任何麻煩能夠找他,他必定可以幫你解決;等到你有麻煩的時候,你想找那我的幫忙,但是若是你連那我的的名字都不知道,那麼也就不可能找到那我的幫忙了。OSPF就相似於上述狀況,網絡中每臺OSPF路由器都至關於一我的,OSPF路由器之間相互通告鏈路狀態,就等因而告訴別人能夠幫別人的忙,如此一來,若是路由器之間分不清誰是誰,沒有辦法肯定各自的身份,那麼通告的鏈路狀態就是毫無心義的,因此必須給每個OSPF路由器定義一個身份,就至關於人的名字,這就是Router-ID,而且Router-ID在網絡中絕對不能夠有重名,不然路由器收到的鏈路狀態,就沒法肯定發起者的身份,也就沒法經過鏈路狀態信息肯定網絡位置,OSPF路由器發出的鏈路狀態都會寫上本身的Router-ID,能夠理解爲該鏈路狀態的簽名,不一樣路由器產生的鏈路狀態,簽名毫不會相同。設計
每一臺OSPF路由器只有一個Router-ID,Router-ID使用IP地址的形式來表示,肯定Router-ID的方法爲:
★1 .手工指定Router-ID。
★2 .路由器上活動Loopback接口中IP地址最大的,也就是數字最大的,如C類地址優先於B類地址,一個非活動的接口的IP地址是不能被選爲Router-ID的。
★3 .若是沒有活動的Loopback接口,則選擇活動物理接口IP地址最大的。
注:若是一臺路由器收到一條鏈路狀態,沒法到達該Router-ID的位置,就沒法到達鏈路狀態中的目標網絡。
Router-ID只在OSPF啓動時計算,或者重置OSPF進程後計算。
COST
OSPF使用接口的帶寬來計算Metric,例如一個10 Mbit/s的接口,計算Coast的方法爲:
將10 Mbit換算成bit,爲10 000 000 bit,而後用10000 0000除以該帶寬,結果爲 10000 0000/10 000 000 bit = 10,因此一個10 Mbit/s的接口,OSPF認爲該接口的Metric值爲10,須要注意的是,計算中,帶寬的單位取bit/s,而不是Kbit/s,例如一個100 Mbit/s的接口,Cost 值爲 10000 0000 /100 000 000=1,由於Cost值必須爲整數,因此即便是一個1000 Mbit/s(1GBbit/s)的接口,Cost值和100Mbit/s同樣,爲1。若是路由器要通過兩個接口才能到達目標網絡,那麼很顯然,兩個接口的Cost值要累加起來,纔算是到達目標網絡的Metric值,因此OSPF路由器計算到達目標網絡的Metric值,必須將沿途中全部接口的Cost值累加起來,在累加時,同EIGRP同樣,只計算出接口,不計算進接口。
OSPF會自動計算接口上的Cost值,但也能夠經過手工指定該接口的Cost值,手工指定的優先於自動計算的值。
OSPF計算的Cost,一樣是和接口帶寬成反比,帶寬越高,Cost值越小。到達目標相同Cost值的路徑,能夠執行負載均衡,最多6條鏈路同時執行負載均衡。
鏈路(Link)
就是路由器上的接口,在這裏,應該指運行在OSPF進程下的接口。
鏈路狀態(Link-State)
鏈路狀態(LSA)就是OSPF接口上的描述信息,例如接口上的IP地址,子網掩碼,網絡類型,Cost值等等,OSPF路由器之間交換的並非路由表,而是鏈路狀態(LSA),OSPF經過得到網絡中全部的鏈路狀態信息,從而計算出到達每一個目標精確的網絡路徑。OSPF路由器會將本身全部的鏈路狀態絕不保留地所有發給鄰居,鄰居將收到的鏈路狀態所有放入鏈路狀態數據庫(Link-State Database),鄰居再發給本身的全部鄰居,而且在傳遞過程種,絕對不會有任何更改。經過這樣的過程,最終,網絡中全部的OSPF路由器都擁有網絡中全部的鏈路狀態,而且全部路由器的鏈路狀態應該能描繪出相同的網絡拓樸。好比如今要計算一條地鐵線路圖,如上海地鐵二號線某段的圖,若是不直接將該圖給別人看,圖比如是路由表,如今只是報給別人各個站的信息,該信息比如是鏈路狀態,經過告訴別人各個站左邊一站是什麼,右邊一站是什麼,別人也能經過該信息(鏈路狀態),畫出完整的線路圖(路由表),如獲得以下各站信息(鏈路狀態):
★南京東路-站 (左邊一站是人民廣場,右邊一站是陸家嘴)
★南京西路-站 (左邊一站是靜安寺,右邊一站是人民廣場)
★靜安寺-站 (右邊一站是南京西路)
★人民廣場-站 (左邊一站是南京西路,右邊一站是南京東路)
★陸家嘴-站 (左邊一站是南京東路)
還原線路圖(路由表)以下:
根據分析如下兩站信息(兩條鏈路狀態):
★南京西路-站 (左邊一站是靜安寺,右邊一站是人民廣場)
★靜安寺-站 (右邊一站是南京西路)
計算 由於靜安寺右邊是南京西路,而南京西路左邊是靜安寺,因此靜安寺和南京西路是相鄰的,爲 靜安寺 — 南京西路,而且因爲南京西路右邊是人民廣場,因此經過這兩條信息,得出線路爲 靜安寺 — 南京西路 — 人民廣場,繼續往下
再根據以下兩站信息(鏈路狀態):
★人民廣場-站 (左邊一站是南京西路,右邊一站是南京東路)
★南京東路-站 (左邊一站是人民廣場,右邊一站是陸家嘴)
計算 由於以前南京西路右邊是人民廣場,人民廣場左邊是南京西路,因此南京西路和人民廣場是相鄰的兩站,而且人民廣場右邊是南京東路,得出線路爲 南京西路 — 人民廣場 — 南京東路,而且由於南京東路右邊是陸家嘴,因此 這部分線路得知爲南京西路 — 人民廣場 — 南京東路 — 陸家嘴,繼續往下
再根據以下一站信息(鏈路狀態):
★陸家嘴-站 (左邊一站是南京東路)
計算 由於南京東路右邊是陸家嘴,而陸家嘴左邊是南京東路,因此兩站相鄰,得出爲 南京東路 — 陸家嘴,
經過以上各部分的線路:
靜安寺 — 南京西路 — 人民廣場
南京西路 — 人民廣場 — 南京東路 — 陸家嘴
南京東路 — 陸家嘴
因此很輕鬆的就畫出該段地鐵線路圖爲:
靜安寺 — 南京西路 — 人民廣場 — 南京東路 — 陸家嘴
從以上計算過程能夠知道,由於獲得各站的信息,就能畫出整條線路圖,而OSPF也一樣根據路由器各接口的信息(鏈路狀態),計算出網絡拓樸圖,OSPF之間交換鏈路狀態,就像上面交換各站信息,而不像RIP和EIGRP直接交換路由表,交換路由表,就等於直接給人看線路圖,可見OSPF的智能算法,比距離矢量協議對網絡有更精確的認知。
OSPF區域
由於OSPF路由器之間會將全部的鏈路狀態(LSA)相互交換,絕不保留,當網絡規模達到必定程度時,LSA將造成一個龐大的數據庫,勢必會給OSPF計算帶來巨大的壓力;爲了可以下降OSPF計算的複雜程度,緩存計算壓力,OSPF採用分區域計算,將網絡中全部OSPF路由器劃分紅不一樣的區域,每一個區域負責各自區域精確的LSA傳遞與路由計算,而後再將一個區域的LSA簡化和彙總以後轉發到另一個區域,這樣一來,在區域內部,擁有網絡精確的LSA,而在不一樣區域,則傳遞簡化的LSA。區域的劃分爲了可以儘可能設計成無環網絡,因此採用了Hub-Spoke的拓樸架構,也就是採用核心與分支的拓樸,以下圖:
區域的命名能夠採用整數數字,如一、二、三、4,也能夠採用IP地址的形式,0.0.0.一、0.0.0.2,由於採用了Hub-Spoke的架構,因此必須定義出一個核心,而後其它部分都與核心相連,OSPF的區域0就是全部區域的核心,稱爲BackBone 區域(骨幹區域),而其它區域稱爲Normal 區域(常規區域),在理論上,全部的常規區域應該直接和骨幹區域相連,常規區域只能和骨幹區域交換LSA,常規區域與常規區域之間即便直連也沒法互換LSA,如上圖中Area 一、Area 二、Area 三、Area 4只能和Area 0互換LSA,而後再由Area 0轉發,Area 0就像是一箇中轉站,兩個常規區域須要交換LSA,只能先交給Area 0,再由Area 0轉發,而常規區域之間沒法互相轉發。
OSPF區域是基於路由器的接口劃分的,而不是基於整臺路由器劃分的,一臺路由器能夠屬於單個區域,也能夠屬於多個區域,以下圖:
若是一臺OSPF路由器屬於單個區域,即該路由器全部接口都屬於同一個區域,那麼這臺路由器稱爲Internal Router(IR),如上圖中的R2,R3和R4;若是一臺OSPF路由器屬於多個區域,即該路由器的接口不都屬於一個區域,那麼這臺路由器稱爲Area Border Router (ABR),如上圖中的R1,ABR能夠將一個區域的LSA彙總後轉發至另外一個區域;若是一臺OSPF路由器將外部路由協議重分佈進OSPF,那麼這臺路由器稱爲Autonomous System Boundary Router (ASBR),如上圖中,R5將EIGRP重分進OSPF,那麼R5就是ASBR,可是若是隻是將OSPF重分佈進其它路由協議,則不能稱爲ASBR。
能夠配置任何OSPF路由器成爲ABR或ASBR。
因爲OSPF有着多種區域,因此OSPF的路由在路由表中也以多種形式存在,共分如下幾種:
若是是同區域的路由,叫作Intra-Area Route,在路由表中使用O來表示;
若是是不一樣區域的路由,叫作Inter-Area Route或Summary Route,在路由表中使用O IA來表示;
若是並不是OSPF的路由,或者是不一樣OSPF進程的路由,只是被重分佈到OSPF的,叫作External Route,在路由表中使用O E2或OE 1來表示。
當存在多種路由能夠到達同一目的地時,OSPF將根據前後順序來選擇要使用的路由,全部路由的前後順序爲:
Intra-Area — Inter-Area — External E1 — External E2,即 O — O IA — O E1 — O E2。
注:
★一臺路由器能夠運行多個OSPF進程,不一樣進程的OSPF,可視爲沒有任何關係,如須要得到相互的路由信息,須要重分佈。
★每一個OSPF進程能夠有多個區域,而路由器的鏈路狀態數據庫是分進程和分區域存放的。
鄰居(Neighbor)
OSPF只有鄰居之間纔會交換LSA,路由器會將鏈路狀態數據庫中全部的內容絕不保留地發給全部鄰居,要想在OSPF路由器之間交換LSA,必須先造成OSPF鄰居,OSPF鄰居靠發送Hello包來創建和維護,Hello包會在啓動了OSPF的接口上週期性發送,在不一樣的網絡中,發送Hello包的間隔也會不一樣,當超過4倍的Hello時間,也就是Dead時間事後尚未收到鄰居的Hello包,鄰居關係將被斷開。
兩臺OSPF路由器必須知足4個條件,才能造成OSPF鄰居,4個必備條件以下:
1.Area-id(區域號碼)
即路由器之間必須配置在相同的OSPF區域,不然沒法造成鄰居。
2.Hello and Dead Interval(Hello時間與Dead時間)
即路由器之間的Hello時間和Dead時間必須一致,不然沒法造成鄰居。
3.Authentication(認證)
路由器之間必須配置相同的認證密碼,若是密碼不一樣,則沒法造成鄰居。
4.Stub Area Flag(末節標籤)
路由器之間的末節標籤必須一致,即處在相同的末節區域內,不然沒法造成鄰居。
注:
★OSPF只能使用接口的Primary地址創建鄰居,不能使用Secondary創建鄰居。
★路由器雙方接口要麼都爲手工配置地址(Numbered),要麼都爲借用地址(Unnumbered),不然沒法創建鄰居。
鄰接(Adjacency)
兩臺OSPF路由器可以造成鄰居,但並不必定能相互交換LSA,只要能交換LSA,關係則稱爲鄰接(Adjacency)。鄰居之間只交換Hello包,而鄰接(Adjacency)之間不只交換Hello包,還要交換LSA。
DR/BDR
當多臺OSPF路由器連到同一個多路訪問網段時,若是每兩臺路由器之間都相互交換LSA,那麼該網段將充滿着衆多LSA條目,爲了可以儘可能減小LSA的傳播數量,經過在多路訪問網段中選擇出一個核心路由器,稱爲DR(Designated Router),網段中全部的OSPF路由器都和DR互換LSA,這樣一來,DR就會擁有全部的LSA,而且將全部的LSA轉發給每一臺路由器;DR就像是該網段的LSA中轉站,全部的路由器都與該中轉站互換LSA,若是DR失效後,那麼就會形成LSA的丟失與不完整,因此在多路訪問網絡中除了選舉出DR以外,還會選舉出一臺路由器做爲DR的備份,稱爲BDR(Backup Designated Router),BDR在DR不可用時,代替DR的工做,而既不是DR,也不是BDR的路由器稱爲Drother,事實上,Dother除了和DR互換LSA以外,同時還會和BDR互換LSA,以下圖:
上圖中R1被選爲DR,R2被選爲BDR,而R3和R4爲Drother,R3同時和R1與R2互換LSA,R4也同時和R1與R2互換LSA,但R3與R4卻不能互換LSA。
其實不難看出,DR與BDR並無任何本質與功能的區別,只有在多路訪問的網絡環境,才須要DR和BDR,DR與BDR的選舉是在一個二層網段內選舉的,即在多個路由器互連的接口範圍內,與OSPF區域沒有任何關係,一個區域可能有多個多路訪問網段,那麼就會存在多個DR和BDR,但一個多路訪問網段,只能有一個DR和BDR;選舉DR和BDR的規則爲:
★比較接口優先級
選舉優先級最高的成爲DR,優先級數字越大,表示優先級越高,被選爲DR的概率就越大,次優先級的爲BDR,優先級範圍是0-255,默認爲1,優先級爲0表示沒有資格選舉DR和BDR。
★Route-Id大小
若是在優先級都相同的狀況下,Route-Id 最大的成爲DR,其次是BDR,數字越大,被選爲DR的概率就越大。
由於全部路由器都能與DR和BDR互換LSA,因此全部路由器都與DR和BDR是鄰接(Adjacency)關係,而Drother與Drother之間沒法互換LSA,因此Drother與Drother之間只是鄰居關係。
在一個多路訪問網絡中,選舉DR和BDR是有時間限制的,該時間爲Wait時間,默認爲4倍的Hello時間,即與Dead時間相同,若是OSPF路由器在超過Wait時間後也沒有其它路由器與本身競爭DR與BDR的選舉,那麼就選本身爲DR;當一個多路訪問網絡中選舉出DR與BDR以後,在DR與BDR沒有失效的狀況下,不會進行從新選舉,也就是在選舉出DR與BDR以後,即便有更高優先級的路由器加入網絡,也不會影響DR與BDR的角色,在越出選舉時間(Wait時間)後,只有DR與BDR失效後,纔會從新選舉。DR失效後,會同時從新選舉DR與BDR,而在BDR失效後,只會從新選舉BDR。
DR和BDR與Drother的數據包處理會有所不一樣,
全部OSPF路由器,包括DR與BDR,都可以接收和傳遞目標地址爲224.0.0.5的數據包。
只有DR和BDR才能接收和傳遞目標地址爲224.0.0.6的數據包。
因而可知,Drother路由器將數據包發向目標地址224.0.0.6,只能被DR和BDR接收,其它Drother不能接收;而DR和BDR將數據包發向目標地址224.0.0.5,能夠被全部路由器接收。