IGP網路協議之OSPF詳解一
上一篇文章中我們簡單的瞭解了RIP距離向量這種路由協議,現在開始我們目前使用最廣泛,應用最多,也是最實用的內部網管協議OSPF的學習。OSPF協議是IETF(Internet網路工程部)基於SPF演算法(shortest path first 最短路徑優先)開發的協議。當時是大家想開發一款開放的最短路徑優先協議,所以就叫做open shortest path frist 這也就是OSPF名字全稱。下面我們開始正式瞭解OSPF吧。
1 OSPF基礎
OSPF協議相對的確比較複雜,我們會花不少時間講解其中比較重要的幾個概念,我們需要注意的就是也是最重要的倆個就是OSPF報文型別以及LSA型別。
OSPF允許在一個自治系統裡劃分區域的做法,相鄰的網路和它們相連的路由器組成一個區域(Area)。每一個區域有該區域自己拓撲資料庫,該資料庫對於外部的區域是不可見的,每個區域內部路由器的鏈路狀態資訊資料庫實際上只包含著該區域內的鏈路狀態資訊,他們也不能詳細地知道外部的連結情況,在同一個區域內的路由器擁有同樣的拓撲資料庫。和多個區域相連的路由器擁有多個區域的鏈路狀態資訊庫。劃分區域的方法減少了鏈路狀態資訊資料庫的大小、並極大地減少了路由器間交換狀態資訊的數量。
1.1 OSPF報文型別及基本特性
OSPF協議的基本特性如下:
1.OSPF是IGP協議,是Link-State協議,基於IP 協議之上,協議號為89。 2.採用SPF演算法(Dijkstra演算法)計算最佳路徑。 3.能夠快速響應網路變化,和RIP不一樣,OSPF只計算更新的那一部分路由,不會每次都整表進行更新,並且他是觸發更新,這一部分會在報文互動過程中詳細講解。 4.支援等價的負載均衡。
ospf報文會有五種報文型別,每種報文的功能如圖:
講解報文之前這裡說明一下,ospf互動狀態有七種,然後又有鄰居和鄰接倆個概念。
其中OSPF路由器啟動後,通過OSPF介面向外傳送Hello報文。並且收到Hello報文的OSPF路由器會檢查報文中所定義的引數,如果雙方一致就會形成鄰居關係。
鄰接是隻有當雙方成功交換DD報文,交換LSA並達到LSDB的同步之後,才形成真正意義上的鄰接關係
我們來通過一系列圖片認識這一過程:

這是建立鄰居的開始

這是鄰接關係的開始

達到同步建立完畢

2 OSPF詳情
Hello報文:週期性傳送,用來發現和維持OSPF鄰居關係。內容包括一些定時器的數值、DR(Designated Router,指定路由器)、BDR(Backup DesignatedRouter,備份指定路由器)以及自己已知的鄰居。 DD(Database Description,資料庫描述)報文:描述了本地LSDB中每一條LSA的摘要資訊,用於兩臺路由器進行資料庫同步。 LSR(Link State Request,鏈路狀態請求)報文:向對方請求所需的LSA。兩臺路由器互相交換DD報文之後,得知對端的路由器有哪些LSA是本地的LSDB所缺少的,這時需要傳送LSR報文向對方請求所需的LSA。內容包括所需要的LSA的摘要。 LSU(Link State Update,鏈路狀態更新)報文:向對方傳送其所需要的LSA。 LSAck(Link StateAcknowledgment,鏈路狀態確認)報文:用來對收到的LSA進行確認。內容是需要確認的LSA的Header(一個報文可對多個LSA進行確認)。
表1 OSPF路由協議包型別
包型別 | 目的 |
---|---|
Hello協議包 | 發現和維護鄰居 |
資料庫描述 | 彙總資料庫內容 |
鏈路狀態請求 | 資料庫下載 |
鏈路狀態更新 | 資料庫上載 |
鏈路狀態確認 | 擴散確認 |
2.1 五類報文
2.1.1 hello報文
Hello協議用於尋找和維護路由器所連網路上的鄰居關係。通過週期性地發出Hello包,來確定和維護鄰居路由器介面是否仍在起作用。Hello包被髮送到網路上的每個活動的路由器介面。在廣播和非廣播的多點訪問的網路上,DR和BDR的選舉也是通過Hello包來完成的。在不同的物理網路上,Hello包的目的地址是不同的;在點到點和廣播網路上,其目的地址是AllSPFRouter(224.0.0.5);在虛鏈路上是單播,也就是從虛鏈路的源端直接傳送到鏈路的另一端;而在點到多點的網路上,分離的Hello包分別傳送到相連的每一個鄰居;在非廣播的多點訪問網路上,Hello包的傳送要看各個路由器的配置資訊。
Hello協議的作用是發現和維護鄰居關係、選舉DR和BDR。在廣播型網路上每一個路由器週期性地廣播Hello包(目的地址是AllSPFRouter),使得它能夠被鄰居發現。每一個路由器的每個介面都有一個相關的介面資料結構,當Hello包裡的特定引數(如Area ID, Authentication,
Network Mask, HelloInterval, RouterDeadInterval 和Options
values)相匹配時,Hello包才能被接收。Hello包中包含著本路由器所希望選舉的DR和該DR的優先順序、BDR和BDR的優先順序、還有本路由器通過交換Hello協議包所“看”到的其它路由器。從Hello包裡得到的鄰居被放在路由器的鄰居列表裡。當從接收到的Hello包裡看到自己時,就建立了雙向通訊。建立了雙向通訊的路由器才有可能建立連線(adjacency)關係,能否建立連線關係,要看連線兩個鄰居的網路的型別。通過Hello協議包的交換,得知了希望成為DR和BDR的路由器以及他們的優先順序,下一步的工作是選舉DR和BDR。
2.1.2 DD報文
在OSPF中,保持區域範圍內的所有路由器的鏈路狀態資料庫同步極為重要。通過建立並保持鄰接關係,OSPF使具有鄰接關係的路由器的資料庫同步,進而保證了區域範圍內所有路由器資料庫同步。資料庫同步過程從建立鄰接關係開始,在完全鄰接關係已建立時完成。當路由器的埠狀態為ExStart時,路由器通過發一個空的資料庫描述包來協商“主從”關係以及資料庫描述包的序號,Router ID大的為主,反之為從。序號也以主路由器產生的初始序號為基準,以後的每一次資料庫描述包的傳送,序號都要加1。主路由器傳送鏈路狀態描述包(資料庫描述包),從路由器接收鏈路狀態描述包後來檢查自己的鏈路狀態資料庫,如果發現鏈路狀態資料庫裡沒有改項,則進行新增該項,並將該項加入鏈路狀態請求列表,準備向主路由器請求新的鏈路狀態,並向主路由器傳送確認包。主路由器收到鏈路狀態請求包時,發出鏈路狀態的更新包,進行鏈路狀態的更新。從路由器收到鏈路狀態更新包後發出確認包,進行確認,表示收到該更新包,否則主路由器就在重發定時器的啟動下進行重複傳送。每一個路由器向它的鄰居傳送資料庫描述包來描述自己的資料庫,每一個數據庫描述包由一組鏈路狀態廣播組成,鄰居路由器接收該資料庫描述包,並返回確認訊息。這兩個路由器形成了一種“主從”關係,只有主路由器能夠向從路由器傳送資料庫描述包,反之則不行。當所有的資料庫請求包都已被主路由器處理後,主從路由器也就進入了鄰接完成狀態。當DR與整個區域內所有的路由器都完成鄰接關係時,整個區域中所有路由器的資料庫也就同步了。
2.1.3 LSR報文
兩臺路由器互相交換過DD報文之後,知道對端的路由器有哪些LSA是本地的LSDB所缺少的和哪些LSA是已經失效的,這時需要傳送LSR報文(Link State Request Packet)向對方請求所需的LSA
內容包括所需要的LSA的摘要。
LS type、Link State ID和Advertising Router可以唯一標識出一個LSA,當兩個LSA一樣時,需要根據LSA中的LS sequence number、LS checksum和LS age來判斷出所需要LSA的新舊。
2.1.4 LSU報文
用來向對端路由器傳送所需要的LSA,內容是多條LSA(全部內容)的集合。
LSU報文(Link State Update Packet)在支援組播和廣播的鏈路上是以組播形式將LSA泛洪出去。
為了實現Flooding的可靠性傳輸,需要LSAck報文對其進行確認。對沒有收到確認報文的LSA進行重傳,重傳的LSA是直接傳送到鄰居的。
2.1.5 LSAck報文
用來對接收到的LSU報文進行確認。
內容是需要確認的LSA的Header(一個LSAck報文可對多個LSA進行確認)。
LSAck(Link State Acknowledgment Packet)報文根據不同的鏈路以單播或組播的形式傳送
當鏈路狀態資料庫達到同步以後,各個路由器就利用同步的資料庫以自己為根節點來並行地計算最優樹,從而形成本地的路由表。
當收到IP包需要查詢路由表時,按照以下規則完成路由查詢:
(1)在路由表中選擇相匹配的路由記錄。相匹配的記錄是指需轉發IP包的目的地址“落在”該匹配路由記錄的目的地址範圍內(該匹配記錄可能有多個)。如:如果有路由表項為172.16.64.0/18,172.16.64.0/24和172.16.64.0/27供目的地址172.16.64.205選擇,則選擇最後一項。因為它是最匹配的一個。也就是說要選擇一個掩碼最長的一個。預設路由是最後要選擇的,因為它的掩碼最短。如果沒有匹配的路由表項供選擇,則有ICMP傳送一個目標不可到達的控制報文,而且該IP包將被丟棄。
(2)如果有多個路徑匹配,根據路由的型別來進行進一步的選擇,它們的優先順序依次為區域內的路徑,區域間得額路徑,E1型的外部路徑,E2型的外部路徑。
(3)如果有型別和費用都相等的多條路徑,則OSPF將同時利用它們。
(4)最後利用所尋找的路徑來進行IP包的轉發。
3 總結
OSPF協議內容比較多,今天講的可能有點亂,下一篇我會整理好把其他關鍵點打通,讓大家更明白這一過程,今天我們記住五大報文型別即可。hello報文,DD報文,LSR報文,LSU報文,LSAck報文。