《電子技術應用》
您所在的位置:首頁 > 通信与网络 > 业界动态 > OSPFv3在NBMA链路上的设计与实现

OSPFv3在NBMA链路上的设计与实现

2008-08-04
作者:刘雨愫, 张思东

  摘 要: 基于IPv6下最新標準RFC2740,指出了多種鏈路" title="鏈路">鏈路上OSPFv3的差異:不同的數(shù)據(jù)包發(fā)送方式、鄰居建立和維持機制、泛洪機制、鄰居狀態(tài)機和接口狀態(tài)機,提出了OSPFv3在NBMA鏈路上的解決方案,并在現(xiàn)有OSPFv2源代碼基礎上,成功地在NBMA鏈路上實現(xiàn)了OSPFv3。
  關鍵詞: OSPFv3 NBMA 路由 IPv6


  開放式最短路徑優(yōu)先協(xié)議OSPF是目前應用于大型網(wǎng)絡的主要內部網(wǎng)關路由協(xié)議" title="路由協(xié)議">路由協(xié)議之一,目前版本是IPv4下的OSPFv2。而適用于IPv6下一代互聯(lián)網(wǎng)的OSPFv3目前尚不成熟,并且基本上都只支持廣播鏈路。然而當前實際應用網(wǎng)絡中存在大量的非廣播鏈路,因此多種鏈路上的OSPFv3的研究和實現(xiàn)具有重要意義。本文針對此目標進行了深入分析和研究。為了使程序實現(xiàn)設計目標并兼容現(xiàn)有的OSPFv3,筆者進行了穩(wěn)定性、可維護性等性能的分析和研究,成功地在Linux平臺的路由器上實現(xiàn)了支持NBMA鏈路的OSPFv3,并通過了美國Spirent公司的AX4000的一致性測試" title="一致性測試">一致性測試。
1 多種鏈路簡介
  OSPF路由協(xié)議支持的鏈路類型有:點到點" title="點到點">點到點、廣播、NBMA(Non-Broadcast Multi-Access)和點到多點" title="多點">多點等。在OSPFv3中一些方案已經實現(xiàn)了對廣播鏈路的支持,但對點到點、NBMA和點到多點的支持幾乎沒有。本文以NBMA鏈路為重點,深入分析、設計并實現(xiàn)了對OSPFv3的多鏈路支持。
  首先簡要介紹各種鏈路:
  點到點鏈路(PPP):連接一對路由器的鏈路,例如56kbps串行線路。
  廣播鏈路(Broadcast): 它支持多個路由器,具備廣播能力。廣播鏈路上的每對路由器假定可以相互直接通信,例如以太網(wǎng)。
  非廣播鏈路(Non-Broadcast):它也支持多個路由器,但不具備廣播能力,例如X.25公眾數(shù)據(jù)網(wǎng)(PDN)。在非廣播鏈路上OSPF有兩種運轉模式:(1)Non-Broadcast Multi-Access(NBMA),非廣播多址接入,要求鏈路上兩兩路由器可以相互直接通信,模擬在廣播鏈路上的操作,如ATM網(wǎng);(2)Point-to-MultiPoint,點到多點,把非廣播鏈路視為多個點到點鏈路的集合,如幀中繼網(wǎng)。
2 OSPFv3在各種鏈路上的差異
  通過分析RFC2328和RFC2740,可以歸納總結出各種鏈路類型上的OSPFv3主要在如下幾方面有所不同:數(shù)據(jù)包的發(fā)送方式、鄰居建立和維持機制、泛洪機制、鄰居狀態(tài)機和接口狀態(tài)機。
2.1數(shù)據(jù)包的發(fā)送方式
  OSPFv3各種鏈路類型按照是否支持多播可以分為兩組:(1)支持多播,包括廣播鏈路和點到點鏈路;(2)不支持多播,包括NBMA鏈路和點到多點鏈路。在OSPFv3路由協(xié)議中,涉及多播的數(shù)據(jù)包有Hello包、LSU包(Link State Update,鏈路狀態(tài)更新包)和LSAck包(Link State Acknowledgment,鏈路狀態(tài)確認包)。由于NBMA、點到多點鏈路沒有多播能力,所以在廣播鏈路和點到點鏈路上以多播發(fā)送的數(shù)據(jù)包將以單播方式發(fā)送,即這些包的發(fā)送地址將根據(jù)鏈路類型而定。
2.2 鄰居建立和維持機制
  OSPFv3建立鄰居關系機制可以分成兩種:(1)鄰居自動發(fā)現(xiàn)。節(jié)點主動向鄰居發(fā)送Hello包,當鄰居在RouterDeadInterval內給予正確回應,即認為雙方建立了鄰居關系。(2)手工配置鄰居。首先手工配置接口的鄰居(包括Router-ID和IPv6 link-local address),該接口啟動后會間隔HelloInterval發(fā)送Hello包給手工配置的合格鄰居(路由器優(yōu)先級不為0),在RouterDeadInterval內如果收到該鄰居的正確回應,則建立了鄰居關系。否則觸發(fā)事件Inactivity_timer,把鄰居轉為Down狀態(tài),同時開啟查詢鄰居定時器(發(fā)Hello包),定時器間隔是PollInterval,如果收到了鄰居的回應(如果鄰居激活,會開啟reply_timer定時器,發(fā)送reply),則說明該手工配置的鄰居真實存在,同時關閉poll_timer查詢鄰居定時器。在廣播鏈路和點到點鏈路,采用自動發(fā)現(xiàn):周期性地發(fā)送Hello包到多播地址ALLSPFRouters,主動建立和維持鄰居關系;在NBMA鏈路和點到多點鏈路上,采用手工配置。
2.3 泛洪機制
  在廣播和NBMA鏈路上有DR(指定路由器)和BDR(備份指定路由器)選舉,而點到點鏈路和點到多點鏈路沒有DR和BDR選舉。
2.4 鄰居狀態(tài)機和接口狀態(tài)機
  對NBMA網(wǎng)絡有專門的狀態(tài)Attempt:當鄰居處于Down,收到InterfaceUp事件后,路由器將為鄰居列表中的(合格候選DR)每個鄰居產生Start事件,轉為Attempt狀態(tài)。對點到點、點到多點有接口狀態(tài)point-to-point。只有廣播類型的接口加入到多播組AllSPFRouters和AllDRouters,支持多播的點到點鏈路的接口加入到多播組AllSPFRouters。
3 NBMA鏈路上OSPFv3的設計與實現(xiàn)
3.1 單播、多播方式選擇
  當一個接口啟動后,將根據(jù)鏈路類型選擇是否加入多播組。對于廣播鏈路和點到點鏈路的網(wǎng)絡接口必須加入多播組以支持多播。在運行了OSPFv3協(xié)議后,接口就會周期性地向鏈路發(fā)送Hello報文,以便與同一鏈路上的其他路由器建立和維持鄰居關系。根據(jù)鏈路類型的不同,Hello包的發(fā)送地址如圖1所示。


  LSU包和LSAck包發(fā)送方式按照鏈路類型的不同發(fā)送的目的地址有所不同,如圖2所示。


3.2 NBMA鏈路上的鄰居建立和維持
  由于NBMA網(wǎng)絡類型不能自動建立鄰居關系,需要手工為其配置鄰居,包括鄰居的IPv6鏈路本地地址以及鄰居的Router-ID。首先把路由器的接口設置為NBMA鏈路類型,并在此接口上配置鄰居。在OSPFv2中,鄰居配置在全局模式下進行,通過識別鄰居的IPv4地址和路由器接口的IPv4地址是否有相同的子網(wǎng)掩碼確定配置哪個接口的鄰居;在OSPFv3中,配置的是鏈路本地地址,上述策略失效,選擇在接口模式下配置鄰居。在NBMA鏈路上建立OSPFv3鄰居關系如圖3所示,過程如下:


  (1)如果路由器是合格的候選DR(Router Priority不是0),則向所有的合格候選DR的鄰居周期性發(fā)送Hello包。如果本身是DR或者BDR,則向所有的鄰居周期發(fā)送Hello包。為了減少 Hello包的發(fā)送數(shù)量,合格候選DR路由器的數(shù)目應該較少。
  (2)如果路由器不是合格的候選DR,而且存在DR和BDR,則周期性地向DR和BDR發(fā)送Hello包。此外,如果它收到合格的候選DR(除了當前DR和BDR)發(fā)出的Hello包,將發(fā)送回應Hello包。
  (3)周期性發(fā)送Hello包,Hello包間隔由鄰居狀態(tài)決定。如果鄰居在狀態(tài)Down,間隔為PollInterval秒,否則間隔為HelloInterval。
  用戶配置的NBMA鄰居需要有一個數(shù)據(jù)結構來存儲,為此要設計一個ospf6_nbr_nbma數(shù)據(jù)結構反映用戶的配置。
  struct ospf6_nbr_nbma
  {
  /* 存放鄰居的IPv6鏈路本地地址 */
  struct in6_addr addr;

  /* 存放鄰居的ID */
  u_int32_t router_id;

  /* 對應的接口 */
  struct ospf6_interface *o6i;

  /* 對應的鄰居 */
  struct ospf6_neighbor *nbr;
  /* 存放鄰居的優(yōu)先級 */
  u_char priority;

  /* 存放配置的查詢時間 */
  u_int32_t v_poll;

  /* 查詢線程 */
  struct thread *t_poll;
  };
4 測試與結果
  基于上述實現(xiàn),在美國Spirent公司的AX/4000網(wǎng)絡測試儀上進行了一致性測試。下面以其中一個測試為例介紹其配置、目的、測試步驟和預期結果。
  測試目的:驗證在廣播網(wǎng)和NBMA網(wǎng)上,如果有多個路由器宣稱自己是DR并且都具有相同的路由器優(yōu)先級,則具有較大路由器ID的被選為DR(此時IUT是DR)。
  AX/4000配置:
  OSPF Node Setup中節(jié)點的接口模式選為 NBMA,NBMA poll multiplier設置為12,即設置PollInterval為120s,Router-ID為0.0.0.3,優(yōu)先級為1,area-id為0。
  路由器A的配置:配置鏈路類型為NBMA,并在接口上配置鄰居。
 ?。糲onfig-if>ipv6 ospf6 link non-broadcast
 ?。糲onfig-if>neighbor fe80::20c:76ff:fe8a:9397 router-id 0.0.0.2
  測試步驟:
  1. 配置RouterA的Router-ID為0.0.0.2:
  <config-ospf6># router-id 0.0.0.2
  2. 配置RouterA的優(yōu)先級為1:
 ?。糲onfig-if>#ipv6 ospf6 priority 1
  3. 配置RouterA的area-id為0:
 ?。糲onfig-ospf6>#interface eth0 area 0
4.RouterA向IUT發(fā)送Hello包
  預期結果:IUT應當給tester-A發(fā)送一個帶有IUT是DR信息的Hello包。
  此測試例順利通過,結果如圖4所示。


  利用AX/4000,進行了總共266個測試,通過率超過93%。目前支持多種鏈路的OSPFv3已經順利通過國家863專家組鑒定。
參考文獻
1 RFC2328, J. Moy. OSPF Version 2[S]. April 1998
2 RFC2740, R. Coltun.OSPF for IPv6[S].December 1999
3 張宏科,張思東,劉文紅.路由器原理與技術[M]. 北京:國防工業(yè)出版社,2003
4 [美]John T.Moy著, 胡光明譯. OSPF協(xié)議剖析[M]. 北京: 中國電力出版社, 2002
5 [美]John T.Moy著, 閔春平譯.OSPF協(xié)議完全實現(xiàn) [M].北京:中國電力出版社, 2002
6 S.Fujiwara. Test Selection based on Finite State Models.IEEE Trans on Software Engineering,1991;17(6):591~603
7 楊 晶,趙保華,屈玉貴.基于層次結構的OSPF一致性測試.通信學報,2002;23(8):89

本站內容除特別聲明的原創(chuàng)文章之外,轉載內容只為傳遞更多信息,并不代表本網(wǎng)站贊同其觀點。轉載的所有的文章、圖片、音/視頻文件等資料的版權歸版權所有權人所有。本站采用的非本站原創(chuàng)文章及圖片等內容無法一一聯(lián)系確認版權者。如涉及作品內容、版權和其它問題,請及時通過電子郵件或電話通知我們,以便迅速采取適當措施,避免給雙方造成不必要的經濟損失。聯(lián)系電話:010-82306118;郵箱:aet@chinaaet.com。