天天看點

OSPF鄰居關系建立過程詳解

以上圖為例,在初始情況下,A、B在某個接口激活了OSPF後,都會開始在這個接口上去發多點傳播的OSPF Hello包,目的是發現OSPF鄰居。Hello包裡,有個active neighbor字段,用來存儲路由器在某個OSPF接口上發現的鄰居,當然,初始情況下,這個Hello包裡是不包含任何活躍的鄰居的(也就沒有active neighbor字段),因為他誰也沒發現。

當OSPF路由器(B)在某個OSPF接口上收到鄰居發來的Hello包(裡面沒有裝active neighbor),它會記錄下A(在自己的OSPF接口資料結構中)并且将A的狀态視為init,然後将A的Router-ID存儲在自己将要發送的Hello包的active neighbor字段裡發送出去,這樣A就會收到這個hello包,并且在這個hello包當中找到自己的Router-ID,那麼A會認為,與B已經完成了雙邊關系的建立,是以A會将B的鄰居狀态置為two-way。與此同時,A也會繼續發送Hello包,并且将B的Router-ID放置于Hello包的active neighbor字段中,而B收到這個Hello包并看見了自己的Router-ID後,B也會将A的狀态置為two-way,至此OSPF的第一個穩态就達到了。

接下來A、B會進入ex-start狀态并開始進行Master、Slave的協商,協商M/S的目的是為了決定在後續的LSA互動中,誰來決定DD(Database Description)封包的序列号(Sequence Number),而Router-ID大的那個OSPF路由器的接口将會成為Master,由它來決定DD Sequence Number,對端則成為slave。這裡要注意Master不是DR,要注意與DR的概念進行區分。這個協商過程,是由互動DBD包實作的,使用的是空的DBD包,也就是不包含任何LSA頭部的DBD包,這個包當中,有三個位非常關鍵:I、M、MS。用于ex-start階段協商Master/Slave的DBD包,I位(或叫做init位)都是置0的,另外MS位如果置1,表示DBD封包始發路由器認為自己的Master,當然起初大家都這麼認為,在一系列DBD交換後,就會得到選舉結果,被選舉為Slave的OSPF接口會将發送的DBD包MS位置為0;另外M位表示More,如果一個OSPF接口發送的DBD包M位置1,在表示這不是最後一個DBD,後續還有DBD包待發送。

當OSPF接口收到一個DBD包且其中I位置0的時候,它就知道與該鄰居的ex-start階段已經過去了,于是将鄰居的狀态置為ex-change,并存儲對端發來的DBD包所包含的LSA 頭部,當然,他自己也發送關于自己OSPF Database(DB)的摘要給鄰居。如此一來,雙方都能通過DBD的互動,了解到對方OSPF DB中的摘要情況。在這個過程中,可能互動數個DBD封包,并要注意,這些封包的I位都置0,且M位一般也置0,除非這是某個OSPF接口發送的最後一個DBD包。

當A收到一個M位置0的DBD包的時候,它就知道,這是鄰居發來的最後一個DBD包了,如果它搜集完這個鄰居(假設是B)發來的DBD并且發現,這些DBD裡有它感興趣的LSA,它期望更詳細的LSA資訊時,它将B置為Loading狀态,并且開始發送LSR封包去請求特定LSA的詳細資訊。B收到這個LSR後,會以LSU進行回應,其中就包含了對方請求的LSA詳細資訊,是以,隻有在LSU封包中,才能看到LSA的完整資訊。收到LSU後,A将LSU中所包含的LSA放進自己的LSDB,并且給B發一個Lsack進行确認。當OSPF接口上所有的待請求的LSA全部收到更新後,它會将鄰居置為FULL。至此,OSPF鄰接關系的建立達到全毗鄰。

在這裡我們有個地方需要留意,我們通常說,OSPF路由器A與B進入了xx狀态,其實這句話并不嚴謹,原因之一,是因為OSPF是接口敏感型協定,許多的操作都是以OSPF接口作為立足點去考慮的,譬如鄰居關系的建立,再如DR和BDR,我們不能說一台路由器是DR,準确的說,應該是某路由器的某個接口是DR;再者,說兩台路由器之間是xx狀态,這個也不嚴謹,所謂的鄰居狀态,必須是以某台路由器為觀察點,在其某個接口上觀察到的某個鄰居的狀态,是以可能出現的一個情況是,在A上,看到的B的狀态為Loading,但是在B上,A的狀态已經是FULL了。

下面是關于狀态機的詳細解釋:

1.Down 

在DOWN狀态下,OSPF接口仍然有嘗試發現鄰居的意願,是以會不斷的發送多點傳播hello包。

2.Attempt

如果一個路由器,它鄰居處于這種狀态,則表示它從鄰居沒有收到任何資訊,但是做了努力來與鄰居聯系。

僅在NBMA網絡上存在,當NBMA網絡上具有DR選取資格的路由器和其鄰居路由器相連的接口開始變為有效(Activ/e)時,或者當這台路由器成為DR或BDR時,這台具有DR選取資格的路由器将會把鄰居路由器的狀态轉換到Attempt狀态。在Attempt狀态下,路由器将使用hellointerval時間代替pollinterval的時間來作為向鄰居發送hello資料包的時間間隔。

3.init 

當OSPF接口收到鍊路上某個鄰居發來的第一個HELLO包的時候,它會在接口上将該鄰居置為init狀态,注意這個hello包中可能并未包含任何的鄰居資訊。但是這至少證明,我這個OSPF接口在這個鍊路上,至少有個活的鄰居。下面是一個沒有發現任何active neighbor的hello包:

4.Two-way

當OSPF路由器在某個鍊路上發現了鄰居後,它自己發送的hello包裡就會增加active neighbor字段,用于存儲在該鍊路上發現的OSPF鄰居。當一台OSPF router看到自己(的RouterID)出現在鄰居發過來的的hello分組中,它就會将該鄰居置為Two-way。該狀态是OSPF鄰居之間可以具有的最基本的關系,也是第一個穩态,但是此時兩者還不能共享路由資訊。下面是一個已經在鍊路上發現了鄰居1.1.1.1的hello:

5.ExStart

一台OSPF路由器在将某個鄰居置為2way狀态後,就開始發送空的DBD包,用于協商master/slave。這個就是ex-start狀态。兩台router間用空的BDB 分組确定master和slave關系(注意不是DR和BDR),

在DBD包中有3個标記位用來管理鄰接關系的建立過程:

I位    或稱為初始位(initial bit) 用于ex-start協商主從關系的初始化協商的DBD包,該位置1

M位    或稱為後繼位(More bit) 如果這不是OSPFrouter發送的最後一個DBD,該位置1

MS位   或稱為主/從位(Master/slave bit) 如果始發路由器是Master,則該位置1

如果某台OSPF router收到鄰居發來的DBD,I位也就是init位置0,則意味着ex-start狀态結束,并且MS/slave已經選出來了,那麼該路由器會将鄰居置為exchange狀态,開始用包含LSA頭部的DBD交換各自的LSBD。

下面是一個用于初始化協商的DBD消息:

6.Exchange狀态

這個過程,雙方使用包含自己LSA頭部的DBD封包進行互動,并且将對方發過來的LSA頭部、并且自己感興趣的LSA(或自己沒有的LSA)存儲在一個本地OSPF接口的隊列裡,以便在下一個階段進行LSA詳細資訊的請求。當某個OSPF接口收到鄰居發來的DBD,M位置0,則表示對方已經發完DBD了,與此同時,如果該路由器的這個OSPF接口上存在待請求的LSA,那麼它會将這個鄰居置為loading狀态。

下面是一個裝載了LSA頭部的DBD消息:

7.loading 狀态

OSPF router使用LSR去請求LSA的詳細資訊,對方使用LSU發來更新,是以隻有LSU裡才有LSA的完整資訊。在收到LSU後,一方面本地使用LSAack進行确認,另一方面将LSU中包含的LSA裝載進自己的LSDB。

以下是一個LSR消息,非常的簡單:

接着是一個LSU消息,裡頭包含了LSA的完整資訊,LSA這裡暫時不做詳細介紹,請看下文:

8.Full Adjacency狀态

Loading 狀态結束後,也就是本地OSPF接口上再沒有待更新的LSA隊列後,将鄰居置為FULL。

本文為原創博文,版權歸屬紅茶三杯(http://blog.sina.com.cn/vinsoney),轉載請注明出處。

<b></b>

<b>本文轉自Grodd51CTO部落格,原文連結:http://blog.51cto.com/juispan/2049562</b><b>,如需轉載請自行聯系原作者</b>

繼續閱讀