OSPFv3d在NBMA链路上的设计与实现
日期:2007-4-28摘要:基于ipv6下最新标准rfc2740,提出了多种链路上ospfv3的差异:不同的数据包发送方式、邻居建立和维持机制、泛洪机制、邻居状态和接口状态机,提出了ospfv3在nbma链路上的解决方案,并在现有ospfv2源泉代码基础上,成功地nbma链路上实现了ospfv3。
开放式是最短路么优先协议ospf是目前应用于大型网络的主要内部网关路由协议之一,目前版本是ipv4下的ospfv2。而适用于ipv6下一代互联网的ospfv3目前尚不成熟,并且基本上都只支持广播链路。然而当前实际应用网络中存在大量的非广播链路,因此多种链路上的ospfv3的研究和实现具有重要意义。本文针对此目标进行了深入分析和研究。为了使程序实现设计目标并兼容现有的ospfv3,笔者进行了稳定性、可维护性等性能的分析和研究,成功地在linux平台的路由器上实现了支持nbma链路的ospfv3,并通过了美国spirent公司的ax4000的一致性测试。
1 多种链路简介
ospf路由协议支持的链路类型有:点到点、广播、nbma(non-broadcast multi-access)和点到多点等。在ospfv3中一些方案已 实现了对广播链路的支持,但对点到点、nbma和点到多点的支持几乎没有。本文以nbma链路为重点,深入分析、设计并实现了对ospfv3的多链路支持。
首先简要介绍各种链路:
点到点链路(ppp):连接一对路由器的链路,例如56kbps串行线路。
广播链路(broadcast):它支持多个路由器,具备广播能力。广播链路上的每对路由器假定可以相互直接通信,例如以太网。
非广播链路(non-broadcast):它也支持多个路由器,但不具备广播能力,例如x.25公众数据网(pdn)。在非广播链路上ospf有两种运转模式:(1)non-broadcast multi-access(nbma),非广播多址接入,要求链路上两两种由器可以相互直接通信,模拟在广播链路上的操作,如atm网;(2)point-to-multipoint,点到多点,把非广播链路视为多个点到点链路的集合,如帧中继网。2>通过分析rfc2328和rfc2740,可以归纳总结出各种链路类型上的ospfv3主要在如下几方面有所不同:数据包的发送方式、邻居建立和维持机制、泛洪机制、邻居状态机和接口状态机。
2.1 数据包的发送方式
ospfv3各种链路类型按照是否支持多播可以分为网组:(1)支持多播,包括广播链路和点到点链路;(2)不支多播,包括nbma链路和点到多点链路。在ospfv3路由协议中,涉及多播的数据包有hello包、lsu包(link state update,链路状态更新包)和lsack包(link state acknowledgment,,链路状态确认包)。由于nbam、点到多点链路没有多播能力,所以在广播链路和点到点链路上以多播发送的数据包将以单播方式发送,即这些包的发送地址将根据链路类型而定。
2.2 领导建立和维持机制
ospfv3建立邻居关系机制可以分成两种:(1)邻居自动发现。节点主动向邻居发送hello包,当邻居在routerdeadinterval内给予正确回应,即认为双方建立了邻居关系。(2)手工配置邻居。首先手工配置接口的邻居(包括router-id和ipv6 link-local address),该接口启动后会间隔hellointerval发送hello包给手工配置的合格邻居(路由器优先级不为0),在routerdeadinterval内结果收到该邻居的正确回应,则建立了邻居关系。否则触发事件inactivity_timer,把邻居转为down状态,同时开启查询邻居定时器(发hello包),定时器间隔是pollinterval,如果收到了邻居的回应(如果邻居激活,会开启reply_timer定时器,发送reply),则说明该手工配置的邻居真实存在,同时关闭poll_timer查询邻居定时器。在广播链路和点到点链路,采用自动发现:周期性地发送hello包到多播地址allspfrouters,主动建立和维持邻居关系;在nbma链路和点到多点链路上,采用手工配置。
2.3 泛洪机制
在广播和nbma链路上有dr(指定路由器)和bdr(备份指定路由器)选举,而点到点链路和点到多点链路没有dr和bdr选择。 2.4 邻居状态机和接口状态机
对nbma网络有专门的状态attempt:当邻居处于down,由到interfaceup事件后,路由器将为邻居到表中的(合格候选dr)每个邻居产生start事件,转为attempt状态。对点到点、点到多点有接口状态point-to-point。只有广播类型的接口加入到多播组allspfrouters和alldrouters,支持多播的点到点链路的接口加入到多播组allspfrouters。
3>3.1 单播、多播方式选择
当一个接口启动后,将根据链路类型选择是否加入多播组。对于广播链路和点到点链路的网络接口必须加入多播组以支持多播。在运行了ospfv3协议后,接口就会周期性地向链路发送hello报文,以便与同一链路上的其他路由器建立和维持邻居关系。根据链路类型的不同,hello包的发送地址如图1所示。
lsu包和lsack包发送方式按照链路类型的不同发送的目的地址有所不同,如图2所示。
3.2>由于nbma网络类型不能自动建立邻居关系,需要手工为其配置邻居,包括邻居的ipv6链路本地地址以及邻居的router-id。首先把路由器的接口设置为nbma链路类型,并在此接口上配置邻居。在ospfv2中,邻居配置在全局模式下进行,通过识别邻居的ipv4地址和路由器接口的ipv4地址是否有相同的子网掩码确定配置哪个接口的邻居;在ospfv3中,配置的是链路本地地址,上述策略失效,选择在接口模式下配置邻居。在nbma链路上建立ospfv3邻居关系如图3所示,过程如下:
(1)如果路由器是合格的候选dr(router priority不是0),则向所有的合格候选dr的邻居周期性发送hello包。如果本身是dr或者bdr,则向所有的邻居周期发送hello包。为了减少hello包的发送数量,合格候选dr路由器的数目应该较少。
(2)如果路由器不是合格的候选dr,而且存在dr和bdr,则周期性地向dr和bdr发送hello包。此外,如果它收到合格的候选dr(除了当前dr和bdr)发出的hello包,将发送回应hello包。
(3)周期性发送hello包,hello包间隔由邻居状态决定。如果邻居在状态down,间隔为pollinterval秒,否则间隔为hellointerval。
用户配置的nbma邻居需要有一个数据结构来存储,为此要设计一个ospf6_nbr_nbma数据结构反映用户的配置。
struct width=368 align=right vspace=1 border=0>
{
/存放邻居的ipv6链路本地地址/
struct in6_addr addr;
/存放邻居的id/
u_int32_t router_id;
/对应的接口/
struct>/对应的邻居/
struct>/存放邻居的优先级/
u_char priority;
/存储配置的查询时间/
u_int32_t v_poll;
/查询线程/
struct thread t_poll;
};
4 测试与结果
基于上述实现,在美国spirent公司的ax/4000网络测试仪上进行了一致性测试。下面以其中一个测试为例介绍其配置、目的、测试步骤和预期结果。
测试目的:验证在广播网和nbma网上,如果有多个路由器宣称自己是dr并且都是具有相同的路由器优先级,则具有较大路由器id的被选为dr(此时iut是dr)。
ax/4000配置;
ospf 120s,router-id为0.0.0.3,优先级为1,area-id为0。
路由器a的配置:配置链路类型为nbma,并在接口上配置邻居。
测试步骤:
1.配置routera的router-id为0.0.0.2:
2.配置routera的优先级为1:
预期结果:iut应当给tester-a发送一个带有iut是dr信息的hello包。
此测试例顺利通过,结果如图4所示。
利用ax/4000,进行了总共266个测试,通过率超过93%。目前支持多种链路的ospfv3已经顺利通过国家863专家组鉴定。