第五章 OSPFv3协议的实现
在OSPFv3协议的实现当中,按照协议功能的不同将实现分为三个部
.外围接口的实现;
.协议包交互的实现;
.路由计算的实现。
5.1.外围接口的实现
从第四章的接口总体设计中可以看出,OSPFv3的外围接口主要涉及
到五个接口:与路由管理模块RTM的接口、与配置模块VTY的接口、
与IPv6层的接口、与网管模块的接口、与lib库的接口。与路由管理模块
RTM和配置模块VTY的接口可通过流式套接口实现;与IM 层的通信
则可以通过原始套接口实现;lib库是各个路由协议的公共库,OSPFv3
与lib库的通信只是简单的函数调用;与网管模块的通信是通过自定义的
SMUX机制实现的。
5.1.1.与路由管理模块的接口
OSPFv3路由协议并不直接同内核路由表发生交互,而是通过一个路
由管理模块 (RTM)同内核路由表发生交互。OSPFv3进程可以传递
OSPFv3类型的路由给RIM系统,也可以从RTM的路由表中学习其他类
型 (非OSPFv3)的路由或学习操作系统的接口信息。
同理,OSPFv3协议从路由管理模块RTM接收IM 路由信息时也执
行相似的过程。接收路由信息包的流程如图5.5所示。
‘开始洛
、、
一 了
将套接口接收数据放
入ibuf缓冲区
取出路由类型、消息类型
、
图5.5IM 路由消息接收流程
其它消息的收发类似于IPv6路由信息的收发,所不同的是在三个字
节的公共包头后面携带的数据不同。
5.1.2.与配置模块的接口
与配置模块的接口主要是完成对OSPFv3协议的配置。配置的方式很
多,这里选用telnet的方式进行配置。运行的OSPFv3协议提供telnet服
务,用户通过某一主机telnet到OSPFv3协议上,通过字节流套接口向
OSPFv3协议发送配置命令,OSPFv3协议解析收到的命令并完成相应的
酉己置。
如上所述,该接口也采用TCP连接的字节流套接口,所不同的是,
OSPFv3协议作为连接服务器方存在。工作的流程如下:
1,当OSPFv3协议启动后,创建IPvb字节流套接口,同时设置套
接口SOREUSEADDR,即地址和端口可以重复使用;
2、调用bind函数在套接口上绑定一个本地协议地址 (IM 地址和
端口号),选择路由器的IM 地址,端口号可以人为指定,这里
OSPFv3设定为2606。这也是telnet时要指定的端口;
3、调用listen函数在新创建的套接口上进行侦听;
4、向线程管理员添加读线程,用于执行侦听套接口上的读数据操
作;
5,当客户端与服务器端建立连接后,VTY不断从套接口以固定大
小 (VTY读缓冲区大小)读取数据,存放在缓冲区;
6、对接收到的数据进行处理,如果是命令则OSPFv3进行解析并完
成配置。添加写线程,将要返回给配置终端的数据写入到VTY
的输出缓冲区;添加读线程,继续从套接口接收数据。
5.1.3.与IPv6层的接口
OSPFv3路由协议是在IPv6层之上的动态路由协议,所有的OSPFv3
协议包都直接封装在IPvb包中传输,OSPFv3在IPv6数据包中的协议号
是89。路由器软件协议栈的层次结构如图5.6所示。
息;
.邻居信息表:管理邻居IM 地址、邻居接口ID,邻居路由器ID,
邻居选项、邻居优先级、邻居状态、邻居状态变化次数、邻居
LS重传队列长度等OSPFv3路由器邻居MIB信息;
.虚邻居信息表:管理虚邻居所在传输域ID、虚邻居路由器ID,
虚邻居IM 地址、虚邻居选项、虚邻居状态、虚邻居状态变化
次数、虚邻居LS重传队列长度等OSPFv3路由器虚邻居MIB信
息。
5.1.4.与Gb库的接口
lib库是整个项目实施方案中设计的公共支撑系统,是为了减少整套
IM 路由协议栈的复杂程度,将协议栈代码中许多模块都能用到的函数
作了一个库,这样,不需要在具体的功能模块中定义函数就可以像系统调
用一样使用某些函数了。lib库中主要定义了对一些公共数据结构进行操
作、维护得函数,如对接口、线程管理、命令树管理、双向链表、缓冲、
套接口、VTY等得操作。
OSPFv3与lib库的通信完全是函数调用关系,由lib库提供对OSPFv3
任务运行的基本支持。例如:OSPFv3任务启动时,首先要调用lib库生
成线程管理员,然后要调用lib库生成套接口,同时调用lib完成协议中
各种数据机构得初始化,最后调用lib库进行协议运转得循环。
5.2.协议包交互的实现
OSPFv3路由器协议包的交互是OSPFv3协议实现中非常重要的组成
部分。它的主要目的是实现OSPFv3路由器动态发现邻居、快速对网络状态进行聚合,从而动态地同步路由域内所有OSPFv3路由器的链路状态数
据库(LSDB),为OSPFv3的路由计算提供基础。其内容应该包括呼叫协
议、可靠泛洪协议、协议包的收发、协议包处理、LSDB的维护、接口状
态机、邻居状态机等内容。
5.2.1.协议包的实现
在OSPFv3协议中,定义了5种类型的协议包,如图5.12所示:
协议包类型编号
协议包描述
1
Hello包
2
数据库描述包 (DD)
3
链路状态请求包 (LSR)
4
链路状态更新包 (LSU)
5
链路状态确认包 (LSAck)
图5.12OSPFv3协议包类型
这5种类型的协议包都包含一个如图5.13所示的公共包头,该公共
包头携带了发送路由器的基本信息以及协议包携带内容的标识。性。结构iovec有两个基本成员变量:void类型的指针iov少ase和int类
型iovlen。成员iovbase可以存放不同的指向任何结构的指针;成员
iovlen说明指向的数据的大小。通过多个iovesbase和iovlen的链表组合,
就可将分散的多片存贮区构成一个整体。如图5.14所示。
10v
lov
lov
lov
10v
lov
图5.14 用iovec构建OSPFv3协议包
其中,数据片断可能有多个,对于不同的协议包它们携带的内容不同。
如在Hello包中,它们可能为Hello包包头、邻居路由器ID列表;在链路
状态请求包中,它们可能为LSA的头;在链路状态更新包中,它们可能
为LSA的个数、LSA的实体。
5.2.2.呼叫协议的实现
呼叫(Hello)协议是协议包交互的重要组成部分,它的作用是发现
和维持邻居关系,同时在广播网络和非广播多接入(NBMA)网络上触发
DR的选举。
Hell。包是OSPFv3的第一类报文。当一个路由器接口运行了OSPFv3
协议之后,接口就会周期性地向链路上发送Hello包。如图5.巧所示,描
述了一个OSPFv3接口加入到某一个域中,从DOWN状态到接口启动后
状态,并且已给该接口邻居分配了站点本地或者全球单播地址,
则要将该地址拷贝进该域内前缀LSA,此时要求前缀选项域设
置LA-bit,并且前缀长度为128,度量值为0;
4
、 否则,要将该接口的前缀拷贝进域内前缀LSA;
5 1
产 将与该接口直连的主机地址拷贝进域内前缀LSA;
、
︸
6
I 如果接口上有虚连接,则当成点到点链路来处理;
7
J 最后,设置前缀个数字段值。
5.2.4.可靠泛洪协议的实现
可靠泛洪协议是OSPFv3快速收敛和路由器链路状态数据库同步的
保证。当OSPFv3接收到新的LSA或LSA发生变化时,泛洪过程便开始
了。此过程分两个阶段,第一阶段是LSA接收处理,第二阶段是把接收
的LSA泛洪给邻居。
5.2.4.1.泛洪第一阶段的实现
该阶段对收到的LSA进行处理,判断是否应该将刚收到的LSA安装
到自己的数据库中去。泛洪第一阶段对LSA的接收处理流程如图5.24所
示 。
.根据是否从其接收到的接 口泛洪出去 定义 了
OSPFV3LSAFLOODBACK常数;
.根据刚刚收到的LSA是否有一个同样新的实例在LSDB中,
定义了OSPF6LSADUPLICATE常数:
.根据是否是隐含确认,定义了OSPF6LSAIMPLIEDACK常
数。默认为隐含确认的规则是:收到一个LSA,发现该LSA
有 一个一样新的相同实例在该邻居的重传列表中。
这三个常量定义如下:
#define OSPFv3LSA
FLOODBACK
(1<<0)
#define OSPFV3LSA
DUPLICATE
(1<<1)
#define OSPFV3LSA
IMPLIEDACK
(1+2)
在每次向LSDB注入一个 “A时,都创建一个ospfv3一sa的变量对
LSA进行管理。本部分主要用到。spfv3少a结构中的flags成员变量,当
出现对LSA的相应处理时,就会用相应的以上定义的常量进行与操作。
如需要将收到的LSA从接口上泛洪出去,则需要在收到的LSA中增加泛
洪回去的标志:
receivedlsa->flags 卜OSPFV3weLSAFLOODBACK
5.2.5.接口状态机的实现
5.2.5.1.接口状态机状态及事件
所谓接口状态机就是指路由器接口所处状态变化所遵循的规律,即接
口在某一事件的触发下从一种状态变化为下一种状态所遵循的特定规律,
而这些可变化的状态是有限的。这里己经提到,接口状态的变化是由接口
接收的事件引发的,而当每一件事件发生时,针对当前接口的不同状态会
图5.28DR选举流程
5.2.6.邻居状态机的实现
5.2.6.1.邻居状态机状态及事件
邻居状态机控制路由器与邻居进行消息交互。当接口知道自己同某一5.3.路由计算的实现
有关路由表的计算是OSPFv3的核心内容,它是动态生成路由器内核
路由表的基础。OSPFv3路由表的计算要完成的主要内容是路由表的填
写,填写的依据就是网络中的各种链路状态通告。OSPFv3路由表建立过
程可以分解为以下步骤:
1)保存当前路由表:当前存在的路由表是无效的,必须从头开始重
新建立路由表。但必须保存当前的路由表,以便将来标注新路由
表的路由条目的变化。
2)域内路由的计算:通过为每个域建立最短路径树来计算域内路
由。
3)域间路由的计算:通过查看域间LSA(包括域间前缀LSA和域
间路由器LSA)来计算域间路由。若该路由器连到多个域,则只
检查主干域内的域间LSA.
4)较优路由的检查:对于连接了一个或多个传送区域的区域边界路
由器,必须检查传送区域的域间LSA,来看是否存在比第2-3步
中发现的更好的路径。
5)AS外部路由的计算:这通过查看
来计算目
的地在本自治系统外的路由。在步骤2-4中已经确定了AS边
界路由器的位置。
53.1.路由表数据结构设计
定义二叉树的数据结构来完成对路由表的管理。用二叉树来管理路由
表的数据结构如下:
5.3.2.域内路由的计算
域内路由的计算主要分两步来完成:第一步根据Router-LSA和
Network-LSA来完成最短路径树的建立,第二步根据己经建立好的最短
路径树和域内前缀LSA来完成域内路由的计算。最短路径树的建立方法
在第二章第5节进行了介绍。域内路由的计算过程如图5.30所示。
在其中计算SPF树时要有下一跳的计算。所谓下一跳,是指路由器
在“存储一转发”数据包时,对于到达特定目的的数据包应该转交的地址。
下一跳的计算可以用图5.31来说明。
{根 -卜-一
父节点
目的
图5.31下一跳的计算
如图5.31所示,计算下一跳时要涉及根、父节点、目的三个参数。
根与父节点间的虚线表示可以有很多节点在中间。有关计算的规则为:
①如果目的和根之间至少有一个路由器,则下一跳只需直接从父节点继
承。
②否则,目的和根之间没有路由器,分两种情况讨论:
a)父节点就是根。对点到多点网络需查看目的节点路由器链路状态
通告的链路数据域:对直连或点到点不需要下一跳;对虚链路,
下一跳要在检查传输域摘要链路状态通告时得到。输出接口就是
直连到目的的接口。
b)父节点是网络。查看目的节点的链路LSA,下一跳为目的节点的
链路本地地址。
计算SPF树
SPF树上第一币1日
图5.30域内路由计算过程
5.3.3.域间路由的计算
域间路由是指本域中路由器到达其它域的路由。域间路由有两种情
况,即到达其它域网络的路由和自治系统边界路由器(AutonomousSystem
BorderRouter-ASBR)的路由。这两种情况由OSPFv3中域间前缀LSA和
域间路由器LSA描述。如果路由器连接到多个区域,则只考虑主干域的
域间链路状态通告。对于每条链路状态通告有下面的原则:
①若该链路状态通告的度量值或存活时间为最大值,或者它是由本路
开始
图5.32域间路由的计算
5.3.4.较优路由的检查
这一步只在连接到一个或多个传输域上的域边界路由器上执行。它的
目的有两个:一是查看有没有比前两步中得到的路由更优的路由存在:二5.3.5.外部路由的计算
AS外部路由主要考虑通往自治系统外部目的的路由,’言是由AS外
部链路状态通告计算得到的。在每一条AS外部链路状态通告中,都通告
了到达某一特定目的的度量、下一跳地址、外部路由标签等内容。因此,
AS外部路由的计算相对来说比较简单。对每一条链路状态通告,只需经
过下面的一些判断:
①若度量值、存活时间和通告路由器中任一个不符合条件,则不予处
理。
②若不存在到通告路由器ASBR的路由,则不予处理。
③若外部ISA中没有下一跳地址,则表明数据包应转交给通告路由
器ASBR,按照这一前提增加相应路由。
④若下一跳地址存在,但其不可达,则不予处理。
⑤根据AS外部链路状态通告中E比特位的值的情况,决定度量类型
和度量值,并按情况增加或更新相应的路由。
外部路由的计算流程如图5.34所示。
第六章 协议运行及测试情况
目前,该套OSPFv3协议软件己经能够运行于VxWorks操作系统上,
所用目标机为IntelX&6处理器的特制工控机。
6.1.协议运行的软件支持
6.1.1.基本IPv‘协议栈的安装
由于目前国内标准的VxWorks操作系统不支持IPvb基本协议栈,而
OSPFv3协议运行于IPvb基本协议之上,所以,必须首先安装IPv6基本
协议栈。
我们使用的IM 基本协议栈是自行在VxWorks网络协议栈的MUX
层上的协议扩展,因此要对操作系统的内核做修改。更具体的说就是修改
编译器的库文件,在库文件中加入IPv6基本协议栈,同时,在操作系统
网络启动时,自动将IPv6等基本协议挂载到操作系统的网络协议栈上。
我们以下称支持IPv6基本协议栈的编译器为v6编译器。
6.1.2.公共lib库支持
OSPFv3协议软件的运行还必须要有路由协议软件包中公共lib库的
支持,即要有通过v6编译器编译过的公共lib库,以下简称lib.a.
lib库需要在Tornado集成环境下制作。在创建工程时选择
downloadable工程,编译器选择Pentium编译器。在添加完工程后,需要
在工程中添加lib库文件。值得注意的是,在lib库工程的属性中,编译
规则应该为archive。项目中,编译后的库文件名为lib.a.
6.1.3.VxWorks操作系统image的制作
为在目标机上运行VxWorks操作系统,需制作可从目标机上下载的
VxWorks映象(image)。这里的映象如第三章第1节介绍,只包括最基本
的BSP和VxWorks内核,它为应用程序的运行提供平台。
VxWorks操作系统映象需要在Tomad。集成环境下制作。在创建工程
时选择bootable工程,BSP类型选择Pentium。值得注意的是,需要在
bootable工程的属性中定义支持IPv6的宏,这样在操作系统启动时就会
将IM 基本协议栈挂载到VxWorks网络协议栈上。
6.2.协议软件工程的制作
OSPFv3协议软件工程的制作同一般应用软件的制作工程相同。步骤
如下:
1、制作downloadable工程;
6.4.软件测试情况
目前,该套OSPFv3协议软件己经完成了单元测试。所做测试不属于
公开测试,测试内容的包括OSPFv3软件的一致性测试和功能测试,所用
的测试环境均为同一套路由协议栈代码。针对于不同的测试项选用了不同
的网络拓扑环境,在测试过程中选用Linux,BSD操作系统作为测试设备,
VxWorks操作系统为DUT(DeviceUnderTest)被测设备。
6.4.1.测试拓扑
在OSPFv3软件的测试中运用到了不同的测试环境,典型的拓扑环境
如图6.4所示。
连接到其它AS
坐
stub
Huh
图6.4OSPFv3协议测试环境
6.4.2.软件测试点
根据OSPFv3协议— RFC2328和RFC2740,我们可以将OSPFv3
测试分成分成以下几大测试点:
1、报文交互测试:包含各种报文的交互以及报文交互过程引起的路 由器的相应;
2、虚链接的测试:在虚链接上测试各种报文的交互;
3,LSA功能测试:测试各种LSA的生成及各个字段的意义
4,LSDB的维护测试:测试相同域内、不同域内的LSDB的同步情
况;测试外部LSA的泛洪情况;测试使用路由聚合时的LSDB
同步情况;
5、路由计算测试:分为域内、域间、外部路由的计算情况;在测试
域间路由时,测试路由聚合的情况;
6、性能测试:当前主要测试大路由表的测试,在大路由表的传递过
程中,路由器的LSDB的同步情况。
6.43.测试结果情况
目前OSPFv3软件已经通过了内部的测试,实践表明,运行于
VxWorks操作系统上的OSPFv3软件可以和运行于Linux操作系统上的
OSPFv3软件 (我们称为标准机)实现很好的互联互通。主要表现在:
.OSPFv3软件可以正常启动、关闭;
.OSPFv3软件可以很好地实现Shell配置,实现了类Cisco的配置
命令集;
.OSPFv3软件可以和底层硬件和操作系统实现很好交互,可以实
时了解底层物理接口状况;
.OSPFv3软件可以和标准机正常交互Hello报文,利用Hello报文
可以动态发现和维护邻居关系,可以正常发起DR的选举过程;
.OSPFv3软件可以支持各种定时器:Hello间隔、路由器死亡间隔、
路由器重传时间间隔、路由器传输时延;
第七章 总结与展望
本论文主要研究了在VxWorks操作系统上OSPFv3协议软件的设计
与实现,深入对操作系统、OSPFv3协议的原理、OSPFv3协议软件的设
计、OSPFv3协议软件的实现过程进行了论述。本章主要总结论文所做工
作,展望今后可进一步深入研究的工作。
7.1.总结
首先,本文总结了IPv6的研究背景和国内外研究现状,分析了IPv4
的不足和IPv6的发展趋势,论述了研制IPv6路由器的重要性,同时也指
出了研制高性能IPv6路由器协议栈软件的重要性。目前国内外还没有支
持VxWorks操作系统的OSPFv3软件,论文给出了基于VxWorks操作系
统的OSPFv3协议软件开发的紧迫性和必要性。
其次,本文深入分析了VxWorks操作系统的特点,特别剖析了
VxWorks操作系统网络协议栈的特点。目前VxWorks操作系统不支持
IPv6基本协议栈,论文对VxWorks操作系统中IM 基本协议栈的扩展提
出了思路。
再次,本文对OSPFv3协议软件的设计需求进行了分析,系统给出了
协议软件的总体设计。其中包括VxWorks操作系统IPv6基本协议栈移植
的设计、OSPFv3协议软件外围接口的总体设计、OSPFv3协议软件单任
务多线程实现的总体设计、OSPFv3协议软件多硬件平台适配的设计。
最后,本文对OSPFv3协议软件的实现进行了详细论述。按照功能将
OSPFv3软件分为外围接口、报文交互、路由计算三大部分进行实现。在
外围接口部分,主要涉及与路由管理模块的接口、与配置模块的接口、与
IPv6层的接口、与网管模块的接口、与lib库的接口五大内容;在报文交
互部分,主要涉及呼叫协议、可靠泛洪协议、接口状态机、邻居状态机以
及链路状态通告等内容:在路由计算部分,主要按协议标准分为域内、域
间和自治系统外部路由计算。所有实现都给出了相应的描述和实现流程。
目前,该套OSPFv3协议软件己经完成了内部的测试,有待进一步的性能
测试。
7.2.展望
目前的Internet提供的是 “besteffort”的服务,随着多媒体应用的不
断发展,Internet将面临越来越多的音频和视频业务,这些业务要求Internet
能为用户提供服务质量保证,从传统的尽最大努力的服务向QOS保证服
务的过渡是Internet发展的一个必然趋势。Internet的QOS体系结构要求
路由必须能够提供QOS特性。因此,对OSPFv3进行QOS扩展是一个紧
急而重要的任务。
OSPFv3协议是基于链路状态的动态路由协议,其一个显著的特点是
路由的计算依据网络的实际状况。但目前工作的问题就是没有一种很好的
手段能够动态反映网络实际状况,即对网络的描述手段比较欠缺。这样就
会出现网络路由决策与网络资源实际状况不想吻合的情况。
目前,也能看到人们用统计和模糊的办法解决上面问题的尝试40[[]4[11
我们自己也在尝试通过质量水平涨落函数揭示质量因素的变化与质量水
平涨落之间的内在联系。质量水平涨落函数主要从带宽和延迟两个方面研
究用户对网络的需求与网络资源状况之间的平衡。
另外一方面,随着高带宽的多媒体网络应用的发展,例如网络视频会
加载中,请稍候......