OSPF之鄰居關(guān)系、鄰接關(guān)系
Ospf中路由器之間存在兩種連接關(guān)系:鄰居關(guān)系和鄰接關(guān)系。本博文將詳細(xì)介紹這2種關(guān)系建立及工作原理。
如果兩臺(tái)路由器之間共享一條公共數(shù)據(jù)鏈路(兩臺(tái)路由器中間沒(méi)有其它路由器,或者兩臺(tái)路由器之間存在虛連接),并且成功協(xié)商了hello包中所指定的參數(shù),那么它們就成為鄰居。如果兩個(gè)鄰居之間需要同步LSDB,那么它們之間需要建立鄰接關(guān)系。如果兩個(gè)路由器之間建立了鄰接關(guān)系,那么它們的LSDB一定是同步的。LSA只在存在鄰接關(guān)系的路由器之間傳遞。
那么鄰居關(guān)系和鄰接關(guān)系怎么建立呢?鄰居關(guān)系通過(guò)hello報(bào)文來(lái)建立。Hello報(bào)文中包含如下一些內(nèi)容:
1、始發(fā)路由器的router-id
2、始發(fā)路由器接口的area-id
3、始發(fā)路由器接口的地址掩碼
4、始發(fā)路由器接口的authentication type和authentication message
5、始發(fā)路由器接口的hello-interval
6、始發(fā)路由器接口的router dead-interval
7、路由器優(yōu)先級(jí)
8、指定DR和BDR
9、標(biāo)識(shí)可選性能的5個(gè)標(biāo)志位
10、始發(fā)路由器的所有有效neighbor router-id(始發(fā)路由器接收到了它們的hello報(bào)文)
以兩臺(tái)路由器之間建立鄰居關(guān)系為例:
1、R1發(fā)送hello報(bào)文(組播或者單播,鏈路層類型來(lái)定),neighbor字段為空
2、R2收到hello報(bào)文,為R1建立一個(gè)鄰居數(shù)據(jù)結(jié)構(gòu),并把R1的鄰居狀態(tài)置為init,然后向R1發(fā)送hello報(bào)文,neighbor字段中包含R1的rougerID,表示自己收到了R1的hello報(bào)文。
3、R1收到R2的hello報(bào)文之后,為R2建立一個(gè)鄰居數(shù)據(jù)結(jié)構(gòu),并把鄰居狀態(tài)置為2way,然后向R2發(fā)送hello報(bào)文,報(bào)文的neighbor字段中包含R2的routerID。
4、R2收到R1的hello報(bào)文后,把R1的鄰居狀態(tài)置為2way
至此,鄰居關(guān)系就建立起來(lái)了,鄰居路由器之間會(huì)按時(shí)發(fā)送hello報(bào)文進(jìn)行?;睿绻鹔ello報(bào)文超時(shí),那么該路由器就會(huì)宣告這里鄰居失效。
所有路由器之間都達(dá)到2way狀態(tài)后,它們會(huì)根據(jù)網(wǎng)絡(luò)類型判斷是否需要選舉DR和BDR,如果需要的話就開(kāi)始選舉DR和BDR。
鄰居路由器之間會(huì)判斷是否需要建立鄰接關(guān)系,怎么判斷呢?
1、 如果是point-to-point鏈路,需要建立鄰接關(guān)系
2、 如果是point-to-multipoint鏈路,需要建立鄰接關(guān)系
3、 如果網(wǎng)絡(luò)類型是虛鏈路,需要建立鄰接關(guān)系
4、 本地路由器是網(wǎng)段上的DR,需要建立鄰接關(guān)系
5、 本地路由器是網(wǎng)段上的BDR,需要建立鄰接關(guān)系
6、 鄰居路由器是網(wǎng)段上的DR,需要建立鄰接關(guān)系
7、 鄰居路由器是網(wǎng)段上的BDR,需要建立鄰接關(guān)系
如何建立鄰接關(guān)系呢?
其實(shí)鄰接關(guān)系的建立過(guò)程中就順帶把LSDB同步了。過(guò)程如下:
建立鄰接關(guān)系使用下面三種協(xié)議報(bào)文:
Hello報(bào)文type1、數(shù)據(jù)庫(kù)描述數(shù)據(jù)包type2、鏈路狀態(tài)請(qǐng)求報(bào)文type3、鏈路狀態(tài)更新報(bào)文type4、鏈路狀態(tài)確認(rèn)報(bào)文type5
1、RT1的一個(gè)連接到廣播類型網(wǎng)絡(luò)的接口上激活了OSPF協(xié)議,并發(fā)送了一個(gè)HELLO報(bào)文(使用組播地址224.0.0.5)。由于此時(shí)RT1在該網(wǎng)段中還未發(fā)現(xiàn)任何鄰居,所以HELLO報(bào)文中的Neighbor字段為空。
2、RT2收到RT1發(fā)送的HELLO報(bào)文后,為RT1創(chuàng)建一個(gè)鄰居的數(shù)據(jù)結(jié)構(gòu),并且將RT1的鄰居狀態(tài)機(jī)置為Init。RT2發(fā)送一個(gè)HELLO報(bào)文回應(yīng)RT1,并且在報(bào)文中的Neighbor字段中填入RT1的Router id,表示已收到RT1的HELLO報(bào)文。
3、RT1收到RT2回應(yīng)的HELLO報(bào)文后,為RT2創(chuàng)建一個(gè)鄰居的數(shù)據(jù)結(jié)構(gòu),并將鄰居狀態(tài)機(jī)置為Exstart狀態(tài)。下一步雙方開(kāi)始發(fā)送各自的鏈路狀態(tài)數(shù)據(jù)庫(kù)。
為了提高發(fā)送的效率,雙方需先了解一下對(duì)端數(shù)據(jù)庫(kù)中那些LSA是自己所需要的(如果某一條LSA自己已經(jīng)有了,就不再需要請(qǐng)求了)。方法是先發(fā)送DD報(bào)文,DD報(bào)文中包含了對(duì)本地?cái)?shù)據(jù)庫(kù)中LSA的摘要描述(每一條摘要可以惟一標(biāo)識(shí)一條LSA,但所占的空間要少得多)。由于OSPF直接用IP報(bào)文來(lái)封裝自己的協(xié)議報(bào)文,所以在傳輸?shù)倪^(guò)程中必須考慮到報(bào)文傳輸?shù)目煽啃浴?/p>
為了做到這一點(diǎn),在DD報(bào)文的發(fā)送過(guò)程中需要確定雙方的主從關(guān)系。作為Master的一方定義一個(gè)序列號(hào)seq,每發(fā)送一個(gè)新的DD報(bào)文將seq加一。作為Slave的一方,每次發(fā)送DD報(bào)文時(shí)使用接收到的上一個(gè)Master的DD報(bào)文中的seq。實(shí)際上這種序列號(hào)機(jī)制是一種隱含的確認(rèn)方法。如果再加上每個(gè)報(bào)文都有超時(shí)重傳,就可以保證這種傳輸是可靠的。
RT1首先發(fā)送一個(gè)DD報(bào)文,宣稱自己是Master(MS=1),并規(guī)定序列號(hào)為x。I=1表示這是***個(gè)DD報(bào)文,報(bào)文中并不包含LSA的摘要,只是為了協(xié)商主從關(guān)系。M=1說(shuō)明這不是***一個(gè)報(bào)文。
4. RT2在收到RT1的DD報(bào)文后,將RT1的鄰居狀態(tài)機(jī)改為Exstart,并且回應(yīng)了一個(gè)DD報(bào)文(該報(bào)文中同樣不包含LSA的摘要信息)。由于RT2的RouterID較大,所以在報(bào)文中RT2認(rèn)為自己是Master,并且重新規(guī)定了序列號(hào)為y。
5. RT1收到報(bào)文后,同意了RT2為Master,并將RT2的鄰居狀態(tài)機(jī)改為Exchange。RT1使用RT2的序列號(hào)y來(lái)發(fā)送新的DD報(bào)文,該報(bào)文開(kāi)始正式地傳送LSA的摘要。在報(bào)文中RT1將MS=0,說(shuō)明自己是Slave。
6. RT2收到報(bào)文后,將RT1的鄰居狀態(tài)機(jī)改為Exchange,并發(fā)送新的DD報(bào)文來(lái)描述自己的LSA摘要,需要注意的是:此時(shí)RT2已將報(bào)文的序列號(hào)改為y+1了。
7. 上述過(guò)程持續(xù)進(jìn)行,RT1通過(guò)重復(fù)RT2的序列號(hào)來(lái)確認(rèn)已收到RT2的報(bào)文。RT2通過(guò)將序列號(hào)+1來(lái)確認(rèn)已收到RT1的報(bào)文。當(dāng)RT2發(fā)送***一個(gè)DD報(bào)文時(shí),將報(bào)文中的M=0,表示這是***一個(gè)DD報(bào)文了
8. RT1收到***一個(gè)DD報(bào)文后,發(fā)現(xiàn)RT2的數(shù)據(jù)庫(kù)中有許多LSA是自己沒(méi)有的,將鄰居狀態(tài)機(jī)改為L(zhǎng)oading狀態(tài)。此時(shí)RT2也收到了RT1的***一個(gè)DD報(bào)文,但RT1的LSA,RT2都已經(jīng)有了,不需要再請(qǐng)求,所以直接將RT1的鄰居狀態(tài)機(jī)改為Full狀態(tài)。
9. RT1發(fā)送LS Request報(bào)文向RT2請(qǐng)求所需要的LSA。RT2用LS Update報(bào)文來(lái)回應(yīng)RT1的請(qǐng)求。RT1收到之后,需要發(fā)送LS Ack報(bào)文來(lái)確認(rèn)。上述過(guò)程持續(xù)到RT1中的LSA與RT2的LSA完全同步為止。此時(shí)RT1將RT2的鄰居狀態(tài)機(jī)改為Full狀態(tài)。
注:
以上過(guò)程是兩臺(tái)路由器由相互沒(méi)有發(fā)現(xiàn)對(duì)方的存在到建立鄰接關(guān)系的過(guò)程。或者可以理解為網(wǎng)絡(luò)中新加入一臺(tái)路由器時(shí)的處理情況。當(dāng)兩臺(tái)路由器之間的狀態(tài)機(jī)都已經(jīng)達(dá)到Full狀態(tài)之后,如果此時(shí)網(wǎng)絡(luò)中再有路由變化時(shí),就無(wú)須重復(fù)以上的所有步驟。只由一方發(fā)送LS Update報(bào)文通知需要更新的內(nèi)容,另一方發(fā)送LS Ack報(bào)文予以回應(yīng)即可。雙方的鄰居狀態(tài)機(jī)在此過(guò)程中不再發(fā)生變化。
原文鏈接:http://blog.sina.com.cn/s/blog_620dbe2e0101nil7.html