具体实施方式
本发明提供了一个路由监控装置。
域间路由监测就是对BGP路由的监测,目前最常用的外部网关协议是BGP-4(Border Gateway Protocol Version4,边界网关协议版本4)。BGP-4是一个用于自治系统之间的、复杂的分布式动态路由协议,BGP-4的主要功能是在实现BGP-4协议的系统之间交换网络可达性信息。这些网络可达性信息包括一个路由所穿越的自治系统的列表,用以建立一个表示连接状态的图,从而解决路由环路问题,使在AS(Access Server,接入服务器)基础上的路由选择策略成为可能。
两个BGP-4Speaker建立了TCP连接后,进行参数协商,在达成一致后,开始交换路由信息。在这时的初始情况下,两个BGP-4Speaker需要交互全部的路由表。此后,采用增量更新的方式,即只声明新的路由或撤销无效的路由,不需要进行周期性的路由刷新。
由于BGP-4是一个集距离向量算法和链路状态算法于一身的协议,通过对路由交互信息的分析,特别是Update帧中的AS-PATH属性的分析,可以得到从观测点到目的网络的AS序列。将这些序列整合起来,可以得到关于整个网络的拓扑结构。另外,BGP-4是一个动态的路由协议,除了在初始情况下交互全部的路由表,BGP-4将会以增量的方式发送路由变化信息。这些信息都通过Update帧发送给邻近的BGP-4Speaker。通过动态的对这些信息的分析,可以达到对整个BGP网络动态实时的分析。
本发明所述的路由监控装置主要是通过路由协议(包括ospf和BGP协议等)发现网络故障。该路由监控装置的实施例的结构如图1所示。主要由数据采集平台(即数据采集模块)、数据管理、存储(即数据存储模块)、数据分析、处理(即数据处理模块)、界面显示模块等4个模块组成。
上述路由监控装置可以应用于自治域内路由的监控和自治域间路由的监控。自治域内路由的监控基于OSPF,自治域间路由的监控基于BGP。
下面详细介绍本发明所述的路由监控装置中各个模块的功能和具体实现。
一、数据采集模块。
数据采集模块主要负责收集网络的路由信息数据,并将采集到的路由信息数据传输给数据存储、管理模块。上述路由信息数据,在OSPF协议中是LSA报文,在BGP协议中是Update帧。
数据采集模块采用被动监控与主动监控相结合的方式来收集数据。在该单元中,由一个路由代理实现OSPF和BGP协议,然后通过与其他路由器建立紧邻关系和进行路由信息交互,从而获取路由信息数据。
二、数据存储模块。
数据存储模块将数据采集模块传输过来的路由信息数据进行相应的处理,按照路由信息数据的内容生成拓扑信息、网络事件等。然后,将上述原始的路由信息数据、拓扑信息、网络事件等进行保存,以供监控系统进行分析和处理。
三、数据处理模块。
数据处理模块对存储和管理模块所存储的数据进行分析和处理,以实现主要的路由监控功能。在该模块中包括拓扑监控模块,路由监控模块和故障监控模块,分别完成网络拓扑监控功能、路由行为监控和网络故障监控功能。
路由行为监控模块中包括:路由信息统计子模块、路由交互信息查询子模块、快照时间配置子模块和路由器抖动统计子模块。下面分别介绍上述各个子模块。
1、路由信息统计子模块。
在数据存储模块所存储的路由信息数据中包含有一些直接的路由信息,如OSPF协议中的网络路由,External1路由,External2路由等;BGP协议中的AS_PATH,prefix等。路由信息统计子模块统计单位时间内接收到的上述路由信息量,根据该上述路由信息量来衡量网络状况。当上述路由信息量出现了突然的变动,则意味着网络故障的发生。因此,通过对路由信息量的监测,能够起到网络预警的作用。
一种路由信息统计功能的处理过程示意图如图2所示,具体处理过程为:Daemon程序以固定时间(5分钟)从路由表中获得统计路由信息,将该统计路由信息保存在RRD-Tool数据库中。当用户在网页上提交参数(如:显示多长时间范围的数据)时,根据用户提交的参数和保存在RRD-Tool数据库中的数据,生成相应的图表,并通过web页面显示。
2、路由交互信息查询子模块。
路由交互信息查询包括:快照信息查询和实时信息查询。快照信息查询实现对定时Snapshot(快照)数据库的查询,其处理过程如图3所示,具体处理过程为:
用JSP动态生成查询页面,用JavaBean实现进行快照信息搜索的核心程序。用户可以选择搜索Snapshot数据库的时间、搜索Snapshot数据库中的路由信息数据的类型、每网页显示结果的数目。用户可以指定搜索某路由器的公布的路由信息数据,以及指定搜索的网络或者路由器等。
实时信息查询与快照信息查询类似,所不同的是实时Snapshot的时间值需要由用户进行填写:用户可以指定所搜索路由信息的beginTime和lastTime的时间范围,也可以选择仅搜索当前时刻有效的路由信息,还可以选择搜索昨天活动过的路由信息。
3、快照时间配置子模块。
快照时间配置子模块主要提供给用户配置系统作快照的间隔时间,并根据该间隔时间控制对路由信息数据进行快照。其具体处理过程为:
首先,将用户指定的间隔时间保存到配置文件中。快照DAEMON程序将最近一次进行路由信息快照的时间记录下来,该DAEMON程序还以一个较小的时间间隔检查最近一次快照的时间,一旦当前时间与最近一次快照的时间大于或等于上述用户指定的时间间隔,该DAEMON程序即对路由信息数据进行快照,将快照结果保存到数据库中。
4、路由器抖动统计子模块。
某段时间内路由器抖动的情况能反映出路由器设备的性能以及存在的问题,路由器抖动信息的统计过程如图4所示,具体处理过程为:
把路由器抖动事件定义为:某路由器新出现;某路由器发生故障;某路由器中新添加一链路;某路由器减少一链路(故障)等。
首先,设定一个数值N和一个时间值T作为参数。然后,通过访问数据库统计从时间T到当前时刻之内发生抖动最严重的前N个路由器(如果存在至少有N个路由器发生抖动的话),并根据统计结果生成网页文件输出,供用户查询。
在网页中可以通过JSP调用C程序进行信息统计,并把结果显示出来。
五、界面显示子模块。
界面显示子模块主要用于将经分析和处理后的拓扑数据以一个友好、交互的界面显示出来。界面显示子模块需要显示网络的拓扑结构,显示不同时刻拓扑结构的差异,还需要通过页面列出网络事件和发生的故障,给用户提供对存储数据的查询等。
路由监控系统的拓扑显示形式包括两种,一种是OSPF路由监控的JavaApplet显示形式,另一种是BGP路由监控的Flash显示形式。下面就这两种显示形式进行详细说明。
(1)、OSPF路由监控的拓扑显示形式。
OSPF路由监控的拓扑显示是通过在HTML文件里嵌入一个Java Applet文件(以jar形式保存),当用户访问HTML文件的时候,即自动加载该JavaApplet。
该拓扑显示的处理过程如下:
1、用户浏览HTML文件,在HTML文件里嵌入了一个Java Applet文件;
2、用户的浏览器加载上述Java Applet文件;
3、上述Java Applet启动,进行下述初始化过程:
初始布局,载入标志拓扑(用以发现拓扑异常),设置各事件监控;
Applet访问同一服务器上的文件,获取各拓扑信息并进行构造拓扑结构;
Applet根据HTML文件里各参数进行初始化拓扑显示相关数据;
Applet把网络拓扑结果显示出来。
下面分几个部分来介绍OSPF路由监控的拓扑显示方式。
(1)、拓扑生成。
该拓扑显示形式的算法的简单描述如下:
输入:当前有效拓扑信息集T
输出:网络拓扑G=<V,W,E>
1)[初始化G]
2)[遍历当前有效拓扑信息集] 执行3)~5)
3)[处理路由器]若info.topoType=RT,V←V+{info.v};
4)[处理网络]若info.topoType=NET,W←W+{info.w};
5)[处理链路]若info.topoType=Link,E←E+{info.e};
另外,把输入改为在某一历史时刻t0有效的拓扑信息集,即可得到历史拓扑生成算法。
(2)、节点信息相关。
每一个节点都有其相关信息:包括动态获取或者是静态配置的。其中,依靠协议动态获取的节点信息有:路由器的IP地址、Router ID、接口数目、公布的LSA数目,以及各链路的度量等。而静态配置的节点信息则可以比较灵活。当用户想查看某个节点的时候,可以显示与该节点相关的所有信息;而当用户想查看所有节点的信息时,则可以循环显示各节点信息。为了使得显示的节点信息更加灵活,可以通过手工编辑节点信息。
(3)、网络故障检测。
本发明提供的根据标准拓扑检测网络故障的处理过程示意图如图6所示,具体处理过程如下:
首先,人工配置一个标准的网络拓扑,在Applet刚初始化的时候,加载该标准的网络拓扑。当Applet获取得到当前时候(或历史时刻)的拓扑信息后,将得到的拓扑信息与上述标准的网络拓扑进行比较,如果标准的网络拓扑里的某些节点或者某些链路在得到的拓扑信息里不存在,则在网络拓扑显示图上显示出网络故障。
(4)、获取两个时间点间的网络拓扑差异。
可以通过处理(t0,t1]间的拓扑信息得到网络拓扑的变化,具体算法如下:
输入:拓扑信息集Tt0,Tt0t1,时间点t0和t1
输出:拓扑结构G0与G1的差异G2
1)[求G0]由算法三得到t0时刻的网络拓扑结构G0;
3)[遍历集合]按时间逆序,
4)[处理V]若info.topoType=RT,执行5)~6)
5)[获取G1.V-G0.V]如果(info.flag=1且 ),
G1.V←G1.V+info.v,G2.V←G2.V+info.v;
6)[获取G0.V-G1.V]如果(info.flag=0且info.v∈G0.V),G1.V←G1.V-info.v,G2.V←G2.V+info.v;
7)[处理W]若info.topoType=NET,执行8)~9)
8)[获取G1.W-G0.W]如果(info.flag=1且),G1.W←G1.W+info.w,G2.W←G2.W+info.w;
9)[获取G0.W-G1.W]如果(info.flag=0且info.w∈G0.W),G1.W←G1.W-info.w,G2.W←G2.W+info.w;
10)[处理E]若info.topoType=LINK,执行11)~12)
11)[获取G1.E-G0.E]如果(info.flag=1且 ),G1.E←G1.E+info.e,G2.E←G2.E+info.e;
12)[获取G0.E-G1.E]如果(info.flag=0且info.e∈G0.E),G1.E←G1.E-info.e,G2.E←G2.E+info.e;
上面算法只是一个简单的描述,实际的实现要复杂得多。算法5的思想是:利用两拓扑结构的“增量”来计算出拓扑的变化,它不计算G1,而通过G0以及G0与G1间的变化来推算出G1。算法5在求得G0后,只需遍历一次(t1,t2]时间段内的拓扑信息即可,当G0与G1相差不大时,其数据量是相当小的。
利用上述算法5,还可以得到一些有用的信息:如果把所有的节点按照它们在t1和t2两个时间点的状态进行划分,可以分为以下五类:
第一类:t1时刻存在,t2时刻也存在,且在[t1,t2]内没有变化的节点;
第二类:t1时刻存在,t2时刻也存在,且在[t1,t2]内有变化的节点;
第三类:t1时刻不存在,t2时刻存在的节点;
第四类:t1时刻存在,t2时刻不存在的节点;
第五类:t1时刻不存在,t2时刻也不存在,但中途出现过的节点。
为了得到上述五类不同的节点,对上述算法5进行了改进,改进后的算法如下:
1)初始化两布尔数组hasProcess和hasDown,其容量均为上一次网络拓扑节点的数目,所有值均为false;初始化NewNodeList_1,NewNodeList_2两个链表;
按照时间递减的顺序遍历从时刻t1到时刻t2新安装的拓扑类型为节点(如:路由器)的信息记录,对于每一条记录t,进行下面的处理;
a)在上一次网络拓扑结构中查找该节点,如果存在(设其索引值为i),则
如果hasProcess[i]为false,则hasProcess[i]←true,如果t.flag=0,则hasDown[i]←true;
b)否则(该节点不存在于上一次的网络拓扑结构中),在NewNode List_1和NewNodeList_2查找该节点,如果都不存在,则
i.如果t.flag=1,则把节点加入到NewNodeList_1链表中去;
ii.否则把节点加入到NewNodeList_2链表中去;
经过2),根据t1和t2两个不同时刻的拓扑,我们可以抽取出五类不同的节点并在拓扑图中用不同颜色标识:
第一类节点:{node_i|hasProcess[i]=false},用蓝色表示;
第二类节点:{node_i|hasProcess[i]=true,hasDown[i]=false},用黄色表示;
第三类节点:{node_j|node_j in NewNode List_1},用黑色表示;
第四类节点:{node_i|hasProcess[i]=true且hasDown[i]=true},用红色表示;
第五类节点:{node_j|node_jin NewNode List_2},用灰色表示。
(5)、节点隐藏功能。
由于种种原因,在网络拓扑图上有时需要不显示一些节点,最典型的是监控系统:由于监控系统也实现了路由协议,所以通过拓扑抽取算法得到的拓扑结构里也包含该监控系统,但从网络管理操作人员的角度来看,是不希望在拓扑图上出现该监控系统的。
因此,本发明实现了可以人工配置节点显示与否的功能,具体处理过程为:将不希望出现在拓扑图上的节点的ROUTER ID以及节点类型(路由器节点或者网络节点)写到一配置文件上,根据该配置文件对网络拓扑结构进行改变,如:假如现在路由器节点A、B、C的连接关系是A—B—C(为简便,这里的连接都是双向的),当配置成不显示节点B的时候,那么对节点A和C的改变是:1)A和C直接相连;2)A到C之间的度量等于A到B加上B到C的度量,而C到A之间的度量也类似。
2、BGP路由监控的拓扑显示形式。
BGP的路由监控系统的拓扑显示是采用Flash技术实现的,采用网页的方式进行显示。在该拓扑显示形式中,主要工作是按用户指定参数对拓扑进行布图,并且提供对路由信息和路由表的查询功能。用户指定要显示的拓扑范围,系统根据用户指定的参数对拓扑结构表进行处理,生成拓扑元素的座标,并通过XML语言对其进行封装,传送到拓扑显示模块予以显示。
用户可以通过根AS和层次这两个参数来控制拓扑显示的范围:
根AS:根AS是要显示的拓扑的核心AS,根AS在拓扑图中位于图的中央,其他的AS与其相连,围绕根AS分布在其周围。
层次:在拓扑图中,显示到根AS距离小于等于层次的那些AS。
这样,可以把拓扑图看成一个圆形结构,根AS是圆的圆心,层次是圆的半径。
在实际系统中,用树结构来表示n层的拓扑,这棵树被称为拓扑树。其中,树的根节点是根AS,树的高度是层次level。由于拓扑不是一个真正意义上的树,因此,树中节点之间也可能有连接关系存在,但是,在拓扑树中,只考虑层次结构,不考虑那些额外的连接,具体的连接信息将在以后处理。
一种拓扑树的数据结构示意图如图7所示,该拓扑树的数据结构如下:每个节点都有一个asn项用来表示自治系统,一个level项来表示层次,根节点的层次为0,另外每个节点还有指向其第一个子女的firstchild指针和指向最后一个子女的lastchild指针,指向下一个兄弟节点的nextsibling指针和指向前一个兄弟的presibling指针。这样通过指针可以方便的查找一个节点的子女和兄弟。
在拓扑树中,一个节点和他的父节点以及子女都存在邻接关系,为了在添加子女时不会将父节点也添加进去,采用一个全局的AS链表来保存已经处理过的AS,在实际系统中,这个链表被Hash表代替,以提高查找效率。生成一棵以rootAS为根,层次为n的拓扑树的构造算法如下:
初始化:level=0,currentAS=rootAS,AS_LIST=[]
创建节点:
以currentAS和level构建树节点node
在AS_LIST中添加currentAS
从TOPO_TABLE中取出currentAS的neighbor_set
level=level+1,parentAS=currentAS
若level>=n结束
遍历neighbor_set中的每一个元素neighbor
如果该neighbor.AS在AS_LIST中不存在,currentAS=neighbor.AS,递归调用创建新节点。
将该节点添加到parrentAS的子女中
本发明提供的一种根AS为18011,层次为3的拓扑树的结构如图8所示。
通过上述算法,可以创建用户指定根AS和层次的拓扑树。树中的节点代表了要显示给用户的所有的AS。由于拓扑显示是用flash进行显示,flash的计算能力有限,为了提高运行速度以及显示的美观,本发明在后台确定每一个AS的位置,将AS的位置,AS中包含的prefix以及AS间的连接通过XML语言进行封装,发送到前台,通过flash编写的界面给予显示。
下面介绍坐标的确定算法。
由于整个拓扑显示图表现为一个圆形形状,所以,采用圆形布局的方案来确定各个AS的位置。根AS在圆心的位置,其他节点都围绕在圆心的四周。每一层次的节点排放在同一个圆的轨迹上,每层之间的距离相等。这样,可以用极坐标来表示节点的位置,根节点的坐标为(0,0)。
对于一个节点而言,其坐标(ρ,θ)中ρ值由其所在的层次决定,θ应该由其子女坐标来决定。θ=(θmin+θmax)/2,即父节点的θ值由其子女的θ值的最大和最小值决定。这样,父节点将位于子节点的对称轴上。
若一节点没有子节点,则需要在外层留下该节点的位置,这个位置被称为虚节点,否则,将无法计算没有子节点的父节点的位置。在最外层,将节点和虚节点平均分布。
本发明提供的一种虚节点的应用示意图如图9所示。在拓扑树中,N2没有子节点,此时,在拓扑图中需要为他加入一个虚节点。虚节点参与布图计算,但是在最后显示中不加以显示。
对最外层的节点和虚节点进行编号,在内层的节点,用两个值start和end来表示其子节点的开始编号和结束编号。在最外层的节点,start=end。
如图9所示,虚节点的编号为0,N4点编号为1,N5点编号为2。则,N2点的start=0,end=0,N3点的start=1,end=2。(start+end)/(max+1)×π即为该点的极坐标中的θ值。其中max为最大编号。因此,在图10中,N2点的θ值为(0+0)/3×π=0,N3点的θ值为(1+2)/3×π=π。
在拓扑图中,可以看出,一个节点的start为其第一个节点的start,end为其最后一个节点的end。如果一个节点没有子节点,则给该节点赋予一个start=end的编号。编号算法如下:
首先,设一全局变量max=1
递归执行下面算法makeNo(as):
如果as没有子节点,则as.start=max-1,as.end=max-1,max=max+1,结束
遍历其子节点child
makeNo(child)
as.start=as.firstchild.start
as.end=as.lastchild.end
调用makeNo(rootAS)。
根据上述算法,能够计算出每个节点的编号范围,通过编号范围,就能确定极坐标中的θ值。
在布图中,最外层节点和虚节点是均匀分布的,这就要求节点之间的距离相等。由于最外层节点可能会很多,因此,最外层节点间必须保证一最小距离min_range才能确保节点不至于太密而出现重叠的问题。
通过min_range,就能确定每层之间的距离(level_range)。为了布图的美观,对层与层之间的最小距离做了限制,当计算出来的距离小于该最小距离min_level_range,令level_range=min_level_range。
设最外层邻近的两点的坐标为(ρ,θ1)和(ρ,θ2),则他们间的距离为:
化简得到两点间距离为:
在公式中θ
2-θ
1为两点间的夹角,为2π/max。令
则可以计算出ρ的值。由于每一层之间距离相等,因此,每一层节点的半径为(level
*ρ)/max_level。
通过计算出的半径和角度,在拓扑图上就能确定每一个点的位置。当位置确定好以后,再通过查找拓扑表,将连接信息和prefix信息添加到拓扑树中,最后,用XML进行封装。一个XML的例子如图10。
在上图可以看到,每个AS用一个as元素进行表示,用属性as_number表示AS号,level表示层次,x和y表示坐标。每个as元素包含了若干个neighbor元素用来表示连接关系,若干个prefix元素表示属于该自治系统的网络的前缀。
通过拓扑布图,生成了用户指定的区域的节点坐标,通过XML对其进行封装,将坐标送到前台显示模块,显示给最终用户。
在实际应用中,在将上述本发明所述的路由监控系统部署在CERNET2网络的北京节点附近,与北京核心路由器形成邻接关系后,所述路由监控系统多次灵敏地反映出CERNET2网络中故障节点的IP地址,故障链路的起始IP地址,极大地帮助了网管人员确定故障位置,并迅速排除故障。
以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。