OSPF(Open Shortest Path First開放式最短路徑優先)是一個內部網關協定(Interior Gateway Protocol,簡稱IGP),用於在單一自治系統(autonomous system,AS)內決策路由。是對鏈路狀態路由協定的一種實現,隸屬內部網關協定(IGP),故運作於自治系統內部。著名的迪克斯加算法(Dijkstra)被用來計算最短路徑樹。OSPF分為OSPFv2和OSPFv3兩個版本,其中OSPFv2用在IPv4網路,OSPFv3用在IPv6網路。OSPFv2是由RFC 2328定義的,OSPFv3是由RFC 5340定義的。與RIP相比,OSPF是鏈路狀態協定,而RIP是距離矢量協定。
基本介紹
- 中文名:開放最短路徑優先
- 外文名:OSPF(Open Shortest Path First)
- 類型:路由器選擇協定
OSPF起源,術語與協定,OSPF術語,協定,網路類型,DR、BDR,無法形成鄰接關係的常見原因,泛洪與區域,OSPF泛洪,OSPF區域,兩種類型,OSPF LSA類型,OSPF路由類型,OSPF度量值,特殊區域,數據包類型和格式,OSPF基本配置命令,
OSPF起源
IETF為了滿足建造越來越大基於IP網路的需要,形成了一個工作組,專門用於開發開放式的鏈路狀態路由協定,以便用在大型、異構的I P網路中。新的路由協定已經取得一些成功的一系列私人的、和生產商相關的、最短路徑優先(SPF )路由協定為基礎, 在市場上廣泛使用。包括OSPF在內,所有的S P F路由協定基於一個數學算法—Dijkstra算法。這個算法能使路由選擇基於鏈路狀態,而不是距離向量。OSPF由IETF在20世紀80年代末期開發,OSPF是SPF類路由協定中的開放式版本。最初的OSPF規範體如今RFC1131中。這個第1版( OSPF版本1 )很快被進行了重大改進的版本所代替,這個新版本體如今RFC1247文檔中。RFC 1247OSPF稱為OSPF版本2是為了明確指出其在穩定性和功能性方面的實質性改進。這個OSPF版本有許多更新文檔,每一個更新都是對開放標準的精心改進。接下來的一些規範出如今RFC 1583、2178和2328中。OSPF版本2的最新版體如今RFC 2328中。最新版只會和由RFC 2138、1583和1247所規範的版本進行互操作。
OSPF路由協定是一種典型的鏈路狀態(Link-state)的路由協定,一般用於同一個路由域內。在這裡,路由域是指一個自治系統(Autonomous System),即AS,它是指一組通過統一的路由政策或路由協定互相交換路由信息的網路。在這個AS中,所有的OSPF路由器都維護一個相同的描述這個AS結構的資料庫,該資料庫中存放的是路由域中相應鏈路的狀態信息,OSPF路由器正是通過這個資料庫計算出其OSPF路由表的。
作為一種鏈路狀態的路由協定,OSPF將鏈路狀態組播數據LSA(Link State Advertisement)傳送給在某一區域內的所有路由器,這一點與距離矢量路由協定不同。運行距離矢量路由協定的路由器是將部分或全部的路由表傳遞給與其相鄰的路由器。
術語與協定
OSPF術語
Router-ID
假設這個世界上的人名字是沒有重複的,每個人的名字都不相同,當有一天,遇上個陌生人告訴你,有任何麻煩可以找他,他一定能夠幫你解決;等到你有麻煩的時候,你想找那個人幫忙,可是如果你連那個人的名字都不知道,那么也就不可能找到那個人幫忙了。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的接口,計算Cost的方法為:
將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的拓樸架構,也就是採用核心與分支的拓樸,如下圖:
區域的命名可以採用整數數字,如1、2、3、4,也可以採用IP位址的形式,0.0.0.1、0.0.0.2,因為採用了Hub-Spoke的架構,所以必須定義出一個核心,然後其它部分都與核心相連,OSPF的區域0就是所有區域的核心,稱為BackBone 區域(骨幹區域),而其它區域稱為Normal 區域(常規區域),在理論上,所有的常規區域應該直接和骨幹區域相連,常規區域只能和骨幹區域交換LSA,常規區域與常規區域之間即使直連也無法互換LSA,如上圖中Area 1、Area 2、Area 3、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個必備條件如下:
Area-id(區域號碼)
即路由器之間必須配置在相同的OSPF區域,否則無法形成鄰居。
Hello and Dead Interval(Hello時間與Dead時間)
即路由器之間的Hello時間和Dead時間必須一致,否則無法形成鄰居。
Authentication(認證)
路由器之間必須配置相同的認證密碼,如果密碼不同,則無法形成鄰居。
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,事實上,Drother除了和DR互換LSA之外,同時還會和BDR互換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,可以被所有路由器接收。
協定
一、Hello協定的目的:
用於發現鄰居
在成為鄰居之前,必須對Hello包里的一些參數進行協商
Hello包在鄰居之間扮演著keepalive的角色
允許鄰居之間的雙向通信
用於在NBMA(Nonbroadcast Multi-access)、廣播網路(乙太網)中選舉DR和BDR
二、Hello Packet包含以下信息:
源路由器的RID
源路由器的Area ID
源路由器接口的掩碼
源路由器接口的認證類型和認證信息
源路由器接口的Hello包傳送的時間間隔
源路由器接口的無效時間間隔
優先權
DR/BDR接口IP位址
五個標記位(flag bit)
源路由器的所有鄰居的RID
網路類型
OSPF定義的5種網路類型:
1.1點到點網路,比如T1線路,是連線單獨的一對路由器的網路,點到點網路上的有效鄰居總是可以形成鄰接關係的,在這種網路上,OSPF包的目標地址使用的是224.0.0.5,這個組播地址稱為AllSPFRouters.
2.廣播型網路(broadcast),由cisco提出的網路類型,自動發現鄰居,選舉DR/BDR,hello時間10s。
2.1廣播型網路,比如乙太網,Token Ring和FDDI,這樣的網路上會選舉一個DR和BDR,DR/BDR的傳送的OSPF包的目標地址為224.0.0.5,運載這些OSPF包的幀的目標MAC地址為0100.5E00.0005;而除了DR/BDR以外傳送的OSPF包的目標地址為224.0.0.6,這個地址叫AllDRouters.
3.非廣播型(NBMA)網路 (non-broadcast),由RFC提出的網路類型,手工配置鄰居,選舉DR/BDR,hello時間30s。
3.1.NBMA網路,比如X.25,Frame Relay,和ATM,不具備廣播的能力,因此鄰居要人工來指定,在這樣的網路上要選舉DR和BDR,OSPF包採用unicast的方式
4.點到多點網路 (point-to-multipoint),由RFC提出,自動發現鄰居,不選舉DR/BDR,hello時間30s。
4.1點到多點網路 是NBMA網路的一個特殊配置,可以看成是點到點鏈路的集合. 在這樣的網路上不選舉DR和BDR.
5.點到多點非廣播,由cisco提出的網路類型,手動配置鄰居,不選舉DR/BDR,hello時間30s。
6.虛連結: OSPF包是以unicast的方式傳送
所有的網路也可以歸納成2種網路類型:
- 傳輸網路(Transit Network)
- 末梢網路(Stub Network )
OSPF模式
OSPF模式 | NBMA 推薦拓撲 | 子網接口 | Hello時間 | 連結關係 | RFC/Cisco |
Broadcast | Full or partial mesh | Same | 10 sec | Automatic, DR/BDR elected | Cisco |
Nonbroadcast (NBMA) | Full or partial mesh | Same | 30 sec | Manual configuration, DR/BDR elected | RFC |
Point-to-multipoint | Partial-mesh or star | Same | 30 Sec | Automatic, no DR/BDR | RFC |
Point-to-multipoint nonbroadcast | partial-mesh or star | Same | 30 sec | Manual configuration, no/DR/BDR | Cisco |
Point-to-point | Partial-mesh or star, using subinterface | Different for Each Subinterface | 10 sec | Automatic, no DR/BDR | Cisco |
DR、BDR
在DR和BDR出現之前,每一台路由器和他的所有鄰居成為完全網狀的OSPF鄰接關係,這樣5台路由器之間將需要形成10個鄰接關係,同時將產生20條LSA.而且在多址網路中,還存在自己發出的LSA 從鄰居的鄰居發回來,導致網路上產生很多LSA的拷貝,所以基於這種考慮,產生了DR和BDR.
DR將完成如下工作
DR BDR選取規則:DR BDR選取是以接口狀態機的方式觸發的.
- 路由器的每個多路訪問(multi-access)接口都有個路由器優先權(Router Priority),8位長的一個整數,範圍是0到255,Cisco路由器默認的優先權是1優先權為0的話將不能選舉為DR/BDR.優先權可以通過命令ip ospf priority進行修改.
- Hello包里包含了優先權的欄位,還包括了可能成為DR/BDR的相關接口的IP位址.
- 當接口在多路訪問網路上初次啟動的時候,它把DR/BDR地址設定為0.0.0.0,同時設定等待計時器(wait timer)的值等於路由器無效間隔(Router Dead Interval).
DR BDR選取過程:
- 路由器X在和鄰居建立雙向(2-Way)通信之後,檢查鄰居的Hello包中Priority,DR和BDR欄位,列出所有可以參與DR/BDR選舉的鄰居(priority不為0).
- 如果有一台或多台這樣的路由器宣告自己為BDR(也就是說,在其Hello包中將自己列為BDR,而不是DR),選擇其中擁有最高路由器優先權的成為BDR;如果相同,選擇擁有最大路由器標識的。如果沒有路由器宣告自己為BDR,選擇列表中路由器擁有最高優先權的成為BDR,(同樣排除宣告自己為DR的路由器),如果相同,再根據路由器標識。
- 按如下計算網路上的DR。如果有一台或多台路由器宣告自己為DR(也就是說,在其Hello包中將自己列為DR),選擇其中擁有最高路由器優先權的成為DR;如果相同,選擇擁有最大路由器標識的。如果沒有路由器宣告自己為DR,將新選舉出的BDR設定為DR。
- 如果路由器X新近成為DR或BDR,或者不再成為DR或BDR,重複步驟2和3,然後結束選舉。這樣做是為了確保路由器不會同時宣告自己為DR和BDR。
- 要注意的是,當網路中已經選舉了DR/BDR後,又出現了1台新的優先權更高的路由器,DR/BDR是不會重新選舉的。
- DR/BDR選舉完成後,DRother只和DR/BDR形成鄰接關係.所有的路由器將組播Hello包到AllSPFRouters地址224.0.0.5以便它們能跟蹤其他鄰居的信息,即DR將泛洪update packet到224.0.0.5;DRother只組播update packet到AllDRouter地址224.0.0.6,只有DR/BDR監聽這個地址.
簡潔的說:DR的篩選過程
- 優先權為0的不參與選舉;
- 優先權高的路由器為DR;
- 優先權相同時,以router ID 大為DR;
router-ID選舉規則
首先會在該路由器上的所有 環回接口裡選一個IP位址最大的,如果沒有環回接口就選活動的物理接口IP位址最大的。
(只有在IPV4 的環境下可以自動選舉route-ID 如果是純IPV6環境必須手工指定)
鄰居關係
鄰接關係建立的4個階段:
- 鄰居發現階段。
- 雙向通信階段:Hello報文都列出了對方的RID,則BC完成。
- 資料庫同步階段:主從協商;DD交換;LSA請求;LSA傳播;LSA應答。
- 完全鄰接階段: full adjacency。
鄰居關係的建立和維持都是靠Hello包完成的,在一般的網路類型中,Hello包周期性的以HelloInterval秒傳送,有1個例外:在NBMA網路中,路由器每經過一個PollInterval周期傳送Hello包給狀態為down的鄰居(其他類型的網路是不會把Hello包傳送給狀態為down的路由器的).Cisco路由器上PollInterval默認120s Hello Packet以組播的方式傳送給224.0.0.5,在NBMA類型,點到多點和虛鏈路類型網路,以單播傳送給鄰居路由器。鄰居可以通過手工配置或者Inverse-ARP發現。
OSPF路由器在完全鄰接之前,所經過的幾個狀態:
- Attempt: 只適於NBMA網路,在NBMA網路中鄰居是手動指定的,在該狀態下,路由器將使用HelloInterval取代PollInterval來傳送Hello包。
- Init: 表明在DeadInterval里收到了Hello包,但是2-Way通信仍然沒有建立起來。
- two-way: 雙向會話建立,而RID彼此出現在對方的鄰居列表中。(若為廣播網路:例如:乙太網。在這個時候應該選舉DR,BDR。)
- ExStart: 信息交換初始狀態,在這個狀態下,本地路由器和鄰居將建立Master/Slave關係,並確定DD Sequence Number,路由器ID大的的成為Master。
- Exchange: 信息交換狀態,本地路由器和鄰居交換一個或多個DBD分組(也叫DDP),DBD包含有關LSDB中LSA條目的摘要信息。
- Loading: 信息載入狀態:收到DBD後,將收到的信息同LSDB中的信息進行比較。如果DBD中有更新的鏈路狀態條目,則向對方傳送一個LSR,用於請求新的LSA。
- Full: 完全鄰接狀態,鄰接間的鏈路狀態資料庫同步完成,通過鄰居鏈路狀態請求列表為空且鄰居狀態為Loading判斷。
無法形成鄰接關係的常見原因
- Hello間隔和Dead間隔必須相同才能建立鄰接關係。
- 區域號碼不一致。
- 特殊區域(如stub和nssa等)區域類型不匹配。
- 認證類型和密碼不一致。
- 路由器ID相同。
- Hello包被ACLdeny。
- 鏈路上的MTU不匹配。
- 接口下OSPF網路類型不匹配。
泛洪與區域
OSPF泛洪
Flooding採用2種報文
LSU Type 4---鏈路狀態更新報文
LSA Type 5---鏈路狀態確認報文
(補充下)
{
Hello Type 1 ---Hello協定報文
DD(Data Description) Type 2----鏈路數據描述報文
LSR Type 3----鏈路狀態請求報文
}
在P-P網路,路由器是以組播方式將更新報文傳送到組播地址224.0.0.5.
在P-MP和虛鏈路網路,路由器以單播方式將更新報文傳送至鄰接鄰居的接口地址.
在廣播型網路,DRother路由器只能和DR&BDR形成鄰接關係,所以更新報文將傳送到224.0.0.6,相應的DR以224.0.0.5泛洪LSA並且BDR只接收LSA,不會確認和泛洪這些更新,除非DR失效 在NBMA型網路,LSA以單播方式傳送到DR和BDR,並且DR以單播方式傳送這些更新.
LSA通過LS類型、LS標識和宣告路由器來識別,並通過序列號、校驗和、老化時間判斷LSA新舊。
Seq: 序列號(Seq)的範圍是0x80000001到0x7fffffff.
Checksum: 校驗和(Checksum)計算除了Age欄位以外的所有欄位,每5分鐘校驗1次.
Age: 範圍是0到3600秒,16位長.當路由器發出1個LSA後,就把Age設定為0,當這個LSA經過1台路由器以後,Age就會增加,1個LSA保存在LSDB中的時候,老化時間也會增加.
當收到相同的LSA的多個實例(LS類型、LS標識、宣告路由器相同)的時候,將通過下面的方法來確定哪個LSA是最新的:
- 比較LSA實例的序列號,越大的越新.
- 如果序列號相同,就比較校驗和,越大越新.
- 如果校驗和也相同,就比較老化時間,如果只有1個LSA擁有MaxAge(3600秒)的老化時間,它就是最新的.
- 如果LSA老化時間相差15分鐘以上,(叫做MaxAgeDiff),老化時間越小的越新.
- 如果上述都無法區分,則認為這2個LSA是相同的.
OSPF區域
區域長度32位,可以用10進制,也可以類似於IP位址的點分十進制,分3種通信量
- Intra-Area Traffic:域內通信量
- Inter-Area Traffic:域間通信量
- External Traffic:外部通信量
路由器類型
- Internal Router:域內路由器
- ABR(Area Border Router):區域邊界路由器
- Backbone Router(BR):骨幹路由器
- ASBR(Autonomous System Boundary Router):自治系統邊界路由器.
虛鏈路(Virtual Link)
以下2中情況需要使用到虛鏈路:
- 通過一個非骨幹區域連線到一個骨幹區域.
- 通過一個非骨幹區域連線一個分段的骨幹區域兩邊的部分區域.
虛連結是一個邏輯的隧道(Tunnel),配置虛連結的一些規則:
- 虛連結必須配置在2個ABR之間.
- 虛連結所經過的區域叫Transit Area,它必須擁有完整的路由信息.
- Transit Area不能是Stub Area.
- 儘可能的避免使用虛連結,它增加了網路的複雜程度和加大了排錯的難度.
OSPF區域—OSPF的精華
Link-state 路由在設計時要求需要一個層次性的網路結構.
OSPF網路分為以下2個級別的層次:
骨幹區域 (backbone or area 0)
非骨幹區域 (nonbackbone areas)
在一個OSPF區域中只能有一個骨幹區域,可以有多個非骨幹區域,骨幹區域的區域號為0。
為了避免迴環的產生,各非骨幹區域間是不可以交換LSA信息的,他們只有與骨幹區域相連,通過骨幹區域相互交換信息。
非骨幹區域和骨幹區域之間相連的路由叫邊界路由(ABRs-Area Border Routers),只有ABRs記載了接入各區域的所有路由信息。各非骨幹區域內的非ABRs只記載了本區域內的路由表,若要與外部區域中的路由相連,只能通過本區域的ABRs,由ABRs連到骨幹區域的BR,再由骨幹區域的BR連到要到達的區域。
兩種類型
OSPF LSA類型
1.類型1:Router LSA:每個路由器都將產生Router LSA,這種LSA只在本區域內傳播,描述了路由器所有的鏈路和接口,狀態和開銷.
2.類型2:Network LSA:在每個多路訪問網路中,DR都會產生這種Network LSA,它只在產生這條Network LSA的區域泛洪描述了所有和它相連的路由器(包括DR本身)。
3.類型3:Network Summary LSA:由ABR路由器始發,用於通告該區域外部的目的地址.當其他的路由器收到來自ABR的Network Summary LSA以後,它不會運行SPF算法,它只簡單的加上到達那個ABR的開銷和Network Summary LSA中包含的開銷,通過ABR,到達目標地址的路由和開銷一起被加進路由表里,這種依賴中間路由器來確定到達目標地址的完全路由(full route)實際上是距離矢量路由協定的行為。
4.類型4:ASBR Summary LSA:由ABR發出,ASBR匯總LSA除了所通告的目的地是一個ASBR而不是一個網路外,其他同Network Summary LSA.
5.類型5:AS External LSA:發自ASBR路由器,用來通告到達OSPF自治系統外部的目的地,或者OSPF自治系統那個外部的預設路由的LSA.這種LSA將在全AS內泛洪(4個特殊區域除外)
6.類型6:Group Membership LSA
7.類型7:NSSA External LSA:來自非完全Stub區域(not-so-stubby area)內ASBR路由器始發的LSA通告它只在NSSA區域內泛洪,這是與LSA-Type5的區別.
8.類型8:External Attributes LSA
9.類型9:Opaque LSA(link-local scope,)
10.類型10:Opaque LSA(area-local scope)
11.類型11:Opaque LSA(AS scope)
OSPF路由類型
- 所有路由器都計算前往其所有在區域中每個目的地的最佳路徑,並將他們加入到路由表中。這些是1類LSA和2類LSA,在路由表中用路由指示符O(OSPF)表示。
- 所有路由器都計算前往網際網路中其他區域的最佳路徑。在這些路徑是區域間路由(3類和4類LSA),在路由表中用路由指示燈IA(區域間)表示。
- 除末節區域內的路由器外,所有路由器都計算前往外部自治系統中目標網路的最佳路徑(5類)。這些路由是1類外部路由(E1)還是2類外部路由(E2)取決於配置。在路由表中,1類外部路由用O E1表示,2類外部路由用O E2表示。類似的還有ON1/ON2,與OE1/OE2相同,不過是來自NSSA區域的路由。
OSPF度量值
在Cisco路由器中,使用公式100Mbit/頻寬(單位為Mbit)來計算的,但是,在頻寬等於100Mbits的鏈路上,成本為1.在大於100Mbits的鏈路上這個值就不是很好
RouterA(config-if)#ip ospf cost interface-cost
成本越低,鏈路越好
RouterA(config-router)#atuo-cost reference-bandwidth ref-bw
其中cost:1~65535 ref-bw:1~4294967
特殊區域
- 特殊區域是指人為定義的一些區域,它們在邏輯中一般位於OSPF區域的邊緣只與骨幹區域相連。
- 常見的特殊區域有以下幾類:
(1)Stub區域
由於並不是每個路由器都需要外部網路的信息,為了減少LSA泛洪量和路由表條目,就創建了末梢區域,位於Stub邊界的ABR將宣告一條默認路由到所有的Stub區域內的內部路由器,不接受自治系統外部信息,同時也拒絕4類LSA,Stub區域不能包含ASBR(除非ABR也是ASBR).
(2)Totally Stub區域
Cisco專用區域,不接受自治系統外部路由和自治系統內其他區域匯總路由。
(3)NSSA區域
不接受自治系統外部信息,但NSSA可以包含ASBR。
(4)Totally NSSA區域
Cisco專用區域,不接受自治系統外部路由和自治系統內其他區域匯總路由
區域限制
- 所有位於stub area的路由器必須保持LSDB信息同步,並且它們會在它的Hello包中設定一個值為0的E位(E-bit),因此這些路由器是不會接收E位為1的Hello包,也就是說在stub area里沒有配置成stub router的路由器將不能和其他配置成stub router的路由器建立鄰接關係.
- 不能在stub area中配置虛連結(virtual link),並且虛連結不能穿越stub area.
- stub area里的路由器不可以是ASBR.
- stub area可以有多個ABR,但是由於默認路由的緣故,內部路由器無法判定哪個ABR才是到達ASBR的最佳選擇.
- NSSA允許外部路由被宣告OSPF域中來,同時保留Stub Area的特徵,因此NSSA里可以有ASBR,ASBR將使用type7-LSA來宣告外部路由,但經過ABR,Type7被轉換為Type5.7類LSA通過OSPF報頭的一個P-bit作Tag,如果NSSA里的ABR收到P位設定為1的NSSA External LSA,它將把LSA類型7轉換為LSA類型5.並把它洪泛到其他區域中;如果收到的是P位設定為0的NSSAExternal LSA,它將不會轉換成類型5的LSA,並且這個類型7的LSA里的目標地址也不會被宣告到NSSA的外部NSSA在IOS11.2後支持.
- totally stub area完全的stub區域,連類型3的LSA也不接收。
數據包類型和格式
類型號 包 作用 可靠性
1 HELLO 1、用於發現鄰居2、建立鄰接關係3、維持鄰接關係4、確保雙向通信5、選舉DR和BDR
2 Database Description 資料庫的描述 DBD 可靠
3 Link-state Request 鏈路狀態請求包 LSR 可靠
4 Link-state Update 鏈路狀態更新包 LSU 可靠
5 Link-state Acknowledgment 鏈路狀態確認包 LSACK
Hello包的格式如下:
資料庫描述包的格式如下:
鏈路狀態請求包格式如下:
鏈路狀態更新包的格式如下:
鏈路狀態確認包的格式如下:
AS 自治系統(autonomous system):一組相互管理下的網路,它們共享同一個路由選擇方法,自治系統由地區再劃分並必須由IANA分配一個單獨的16位數字。地區通常連線到其他地區,使用路由器創建一個自治系統。
OSPF基本配置命令
配置LOOPBACK接口地址
ROUTER(config)#interface loopback 0
ROUTER(config)#ip address IP位址 掩碼
- ospf區域的配置
router ospf 100 /* 區域號在銳捷低端設備(交換機S3550,路由器R2621)里是不需要指定區域號的*/
network 192.168.1.0 0.0.0.255 area 0
router-id 192.168.2.1 手動設定router-id
area 1 default-cost 50 手動設定開銷
#clean ip ospf process
- 配置ospf明文認證
interface s0
ip ospf authentication
ip ospf authentication-key <;密碼>
- 配置ospf密文認證
interface s0
ip ospf authentication
ip ospf message-digest-key 1 md5 7 <;密碼>
- debug ip ospf adj 開啟ospf調試
show ip protocols
show ip ospf interface s0
- 手動配置接口花銷,頻寬,優先權
inter s0
ip ospf cost 200
bandwidth 100
ip ospf priority 0
- 虛鏈路的配置
router ospf 100
area <area-id> virtual-link <router-id>
show ip ospf virtual-links
Show ip ospf border-routers
Show ip ospf process-id
Show ip ospf database
show ip ospf database nssa-external
- OSPF路由歸納
Router ospf 1\\對ASBR外部的路由進行路由歸納
Summary-address 200.9.0.0 255.255.0.0
Router ospf 1\\執行AREA1到AREA0的路由歸納
Area 1 range 192.168.16.0 255.255.252.0
- 配置末節區域
IR area <area-id> stub
ABR area <area-id> stub
- 配置完全末節區域
IR area <area-id> stub
ABR area <area-id> stub no-summary
- 配置NSSA
ASBR router ospf 100
area 1 nssa
ABR router ospf 100
area 1 nssa default-information-orrginate
OSPF協定主要優點
1、OSPF是真正的LOOP- FREE(無路由自環)路由協定。源自其算法本身的優點。(鏈路狀態及最短路徑樹算法)
2、OSPF收斂速度快:能夠在最短的時間內將路由變化傳遞到整個自治系統。
3、提出區域(area)劃分的概念,將自治系統劃分為不同區域後,通過區域之間的對路由信息的摘要,大大減少了需傳遞的路由信息數量。也使得路由信息不會隨網路規模的擴大而急劇膨脹。
4、將協定自身的開銷控制到最小。見下:
1)用於發現和維護鄰居關係的是定期傳送的是不含路由信息的hello報文,非常短小。包含路由信息的報文時是觸發更新的機制。(有路由變化時才會傳送)。但為了增強協定的健壯性,每1800秒全部重發一次。
2)在廣播網路中,使用組播地址(而非廣播)傳送報文,減少對其它不運行ospf 的網路設備的干擾。
3)在各類可以多址訪問的網路中(廣播,NBMA),通過選舉DR,使同網段的路由器之間的路由交換(同步)次數由 O(N*N)次減少為 O (N)次。
4)提出NSSA區域的概念,使得NSSA區域內不再傳播引入的ASE路由。
5)在ABR(區域邊界路由器)上支持路由聚合,進一步減少區域間的路由信息傳遞。
6)在點到點接口類型中,通過配置按需撥號屬性(OSPF over On Demand Circuits),使得ospf不再定時傳送hello報文及定期更新路由信息。只在網路拓撲真正變化時才傳送更新信息。
5、通過嚴格劃分路由的級別(共分四極),提供更可信的路由選擇。
6、良好的安全性,ospf支持基於接口的明文及md5 驗證。
7、OSPF適應各種規模的網路,最多可達數千台。