王 磊,马 亮
(西南交通大学 信息科学与技术学院,成都 611756)
铁路信号的集中监测(CSM,Centralized Signaling Monitoring) 系统是面向高速铁路及普速铁路信号领域的综合性维护支持和信息监控网络平台[1]。根据铁路部门运营管理结构,CSM系统应用“三级四级”的体系结构进行系统部署,铁路局采用交换机组网,车站局域网采用交换机或者集线器组网,电务段子系统则是整个网络信息与服务的汇集地[2]。这些网络设备大多布置在信号机房内,规模庞大复杂,设备之间接口众多,而信号与通信设备若各自独立则不利于进行故障诊断,因此,需要对CSM系统中的网络设备进行集中监测及管理。在信息系统中网络设备之间的通信状态监测依赖于网络拓扑[3],目的是通过拓扑图直观地反映网络中设备的连接状况,并且可基于网络拓扑实现故障定位、分析和维修[4],因此,在CSM系统中网络拓扑技术是关键。文献[1]中使用CSM平台对信号设备进行集中监控和智能分析,为铁路信号设备实施“状态修”创造了有利条件,但是,需要对CSM平台本身的网络设备进行监测与维护。文献[5]设计了信息系统综合监控平台,使用ARP表结合ping扫描的方法实现信息系统网络拓扑的自动发现,但是网络拓扑生成时间较长,影响监测的实时性和准确性,而且如果某些设备关闭ping扫描功能,可能会导致扫描不完整,影响拓扑生成的完整性。
本文以保障CSM系统运行可靠性,提高自动拓扑时效性、完整性和准确性为目的,基于SNMP协议,采用网际控制报文协议(ICMP)结合端口扫描的方法全面地探测活动节点,从而能够更有效地发现CSM系统中各网络设备之间的拓扑关系,并可依照生成树原理分析冗余的物理连接,实现自动发现的拓扑与实际网络拓扑一致,最终通过C#语言编程实现拓扑自动发现算法。
SNMP称为简单网络管理协议(Simple Network Management Protocol)[6],是最早的网络管理协议之一。由于SNMP被设计成与协议无关,因而得到了众多厂商和网络管理平台的支持,对它进行分析具有重要的意义。SNMP是一种基于用户数据报协议 (User Datagram Protocol,UDP)的协议[7],可通过SNMP协议从路由器中的MIBⅡ信息库或交换机、网桥中的VLAN-MIB、Bridge-MIB[8]信息库中获取路由设备列表或主机列表,从而构造网络拓扑。
本文中主要通过SNMP获取管理信息库(MIB)变量,目的是通过相关的MIB对象判断网络中设备的真实(物理)连接情况,拓扑发现过程中需要获取的MIB中的对象详细见表1~表3。表1主要是得到网络中路由器的MAC地址以及IP地址,表2得到交换机转发表中MAC地址及对应的端口号,表3是获得交换机生成树协议中的端口号、根桥等信息。
表1 ipNetToMediaTable表对象及说明
表2 dot1dTpFdbTable表对象及说明
表3 dot1dStpPortTable表对象及说明
为了方便得到MIB变量,在C#中可调用针对SNMP协议封装的类库SnmpSharpNet.dll,通过GetSNMPTable方法调用封装类库。
关键代码如下:
//配置设备的团体名,IP地址,版本号等信息。
OctetString community = new OctetString(comm);
IpAddress agent = new IpAddress(ip);
AgentParameters param = new AgentParameters(community);
param.Version = SnmpVersion.Ver1;
UdpTarget target = new UdpTarget((IPAddress)agent, 161, 2000, 1)
//根据Oid找对应的值Oid rootOid = new Oid(oid);
Oid lastOid = (Oid)rootOid.Clone();
//采用GetNext方式获取,并暂时保存在temp_list中
Pdu Table_pdu_next = new Pdu(PduType.Get-Next);
List<string> temp_list=new List<string>();
while(lastOid!=null)
{
temp_list.Add(Table_result.Pdu.VbList[0].Value.ToString());
//找完指定表之后,lastOid赋值null
}
生成树协议(STP, Spanning Tree Protocol)是一个网桥到网桥的协议[9],它随后被IEEE802 委员会修订并发布在802.1d 规范[10]中。STP生成树的使用既保障网桥之间的冗余连接,同时又可避免网络环路在交换链路中的出现。STP基本术语包括:
(1)网桥协议数据单元(BPDU):STP中的“hello数据包”,间隔一定时间(该时间可配置)发送,该消息在各网桥之间交换;
(2)网桥号(Bridge ID):由2字节优先级与6字节MAC地址组成,为网络中每一台交换机标识身份, 优先级为 0–65535,缺省为 32768;
(3)根网桥(RB):具有最小网桥号,根网桥并且所有端口都处于转发状态;
(4)指定网桥(DB):指到根网桥的累计路径花费最小的网桥;
(5)根端口(RP):网络中在非根网桥上,指定连接到根桥路径最短的端口;
(6)指定端口(DP):非根网桥为每个需要连接的网段选出一个指定端口,根网桥上的端口都是指定端口;
(7)非指定端口(BP):非指定端口将处于阻塞状态,不转发任何用户数据。
STP的主要思想是每个网桥定时发送BPDU,在冗余网络连接中维持一个无回路的网络,阻塞一个或者多个冗余的接口。当网络中某条链接故障或者添加新的链接,能够快速发现网络链接变化,按照STP配置交换机接口,避免丢失链接或新的回路出现。
1.2.1 STP工作过程
(1)进行根桥的选取:每台交换机定时向邻接交换机发送BPDU,选出Bridge ID最小的网桥作为网络中的根桥;
(2) 确定交换机指定端口及根端口:通过计算非根桥的交换机到根桥的最小路径开销,找出根端口(最小的发送方网桥ID)和指定端口(最小的端口ID);
(3) 裁剪冗余端口:阻塞非根网桥上非指定端口以裁剪冗余的环路,构造一个无环路的拓扑结构。
如图1所示,根桥(S1)选作为树干,在处于稳定状态的网络中,BPDU从根桥沿着无环的树枝传送到网络的各个网段,没被裁剪的活动链路作为向外辐射的树枝,原本S2与S3之间有一条链接,图中虚线为阻塞环路,此时S2的端口4或者S3的端口2为阻塞状态。经过裁剪冗余之后,生成一颗树结构,树结构是没有环路的。
图1 STP协议得到生成树示意图
1.2.2 STP操作规则
STP操作之后,最终确定唯一的生成树,如图2所示,A为根交换机,每个网络中只有一个根桥,根桥上的接口全是指定端口(黄色圈),对于其他非根桥,每个根桥只有一个根端口(黑色圈);并且每个段只有一个指定端口,其他接口为非指定端口,在图2中,C交换机到A交换机,可以通过C-A链路,还可以C-B-A链路,STP生成树之后,C的端口2阻塞,那么就只能C-A,此时该段就只有A交换机的2端口为指定端口。指定端口才可以转发数据,非指定端口(阻塞端口)不能转发数据。
图2 STP工作过程示意图
通常在发现网络拓扑过程中会涉及到很多表单,甚至有的表单会多次处理使用,由于各个设备性能也存在差异,如果直接使用SNMP协议反复获取路由器、交换机的网络信息表单就会占用更多的网络资源,并且会增加构造拓扑的时间,虽然我们是在局域网中发现网络拓扑,但是需要获取多个设备表单。针对该情况,本文采用本地表单的形式,在数据库中保存当前活动节点以及所有活动节点的网络信息。
(1)需要保存已经探测到的活动节点,表项包括:设备IP、类型及活动节点标志,用于存放已经被ICMP探测或端口扫描出的节点信息;(2)需要一张表存放ICMP没有探测到的节点,可用于端口多次扫描使用,表项包括:设备IP,扫描次数标记。
针对路由器,我们需要获取表1中的对象,与该路由器设备ID,IP生成表(设备ID,路由器IP,节点IP,节点MAC地址)。
交换机需要获取表2及表3中的对象,构造转发表(设备ID,交换机IP,节点MAC地址,节点端口号,节点状态)和STP生成树表(设备ID,设备IP,Bridge ID,端口号,端口状态,根桥Bridge ID,指定桥Bridge ID,指定端口ID)。
系统采用ICMP结合端口扫描的方式作为拓扑发现的探测机制,避免少数设备屏蔽了ICMP功能之后不能被正常发现,导致拓扑不够完整的问题,所以需要通过端口扫描作为辅助方法,结合这两种方式可以更加快速完整地发现搜索范围内的所有活动节点。
设备活动节点的搜索过程如下:
(1)按照管理员要求配置搜索范围,接着由程序通过多个线程同时使用基于ICMP的Ping方法,针对此范围内的活动节点进行发现,把探索到的节点存入活动节点表中;
(2)针对不响应ICMP的节点,进一步使用端口扫描,按照配置文件中的参数可以重复扫描的次数,如果达到扫描次数的上限仍然没有响应就应该放弃此节点,如果在某次扫描中响应,则此节点应该当作被发现的活动节点,加入活动节点表中,待后续数据处理使用。活动节点的扫描流流程如图3所示。
图3 扫描流程图
采用这样的方法可以有效地探测活动节点设备。端口使用了全TCP连接的扫描方式,与探测主机搭建一个能够被识别的对应端口的连接,为了节约搜索等待的时间,搜索子模块可同时开启多个线程来进行扫描,并且将搜索发现的活动节点信息全部保存在活动节点表中。
2.3.1 物理连接判断
通过 SNMP协议获取路由器、交换机等网络设备的路由表、转发表数据,虽然转发表记录了节点的 MAC地址,但是若多台交换机同在一个交换域内,不管节点是否物理连接此交换机,整个交换域内MAC地址都会被保存在当前交换机中,所以单纯地根据交换机上的转发表还无法区分此交换机与其他设备是直连的还是非直连的关系[11],所以需要进一步通过分析生成树协议,按照生成树的方式来判断设备直连关系。
局域网络中活动节点探测完成后,需要先对各节点进行区分找出各自的类型,并将类型保存在活动节点表单类型中。根据设备类型,可以直接通过SNMP协议访问对应需要的MIB信息库,也就是得到各路由器ARP表及各交换机的转发表和STP生成树表。
从上文1.2.2中已经知道STP操作的规则,可以得出下面几条结论。根据这些STP总结的结论,能够确定出根交换机、交换机与交换机、路由器之间的物理端口连接情况。
结论1:设交换机S1的端口标识为S1i,它的指定网桥为S2,若在指定网桥上的端口(指定端口)为S2j,则S2必为交换机,且交换机S1、S2 通过接口S1i、S2j设备直连,并且可以确定S1的端口S1i是根端口。
结论2:若端口上获得节点的MAC地址是通过非根交换机的指定端口或者根端口获得,则该MAC地址对应的设备属于非直连设备;如果是通过别的端口(处于转发状态)获取,则属于直连设备。因为根交换机所有端口都是指定端口,所以还需要判断是不是与交换机根端口连接,若是,则不是直连,反之则是直连。
结论3:若阻塞接口的指定网桥是除自身以外的其它交换机,那么该接口必定与其他交换机存在作为备份使用的冗余链路。
结论4:设交换机S 的接口p的转发表记为ASp。对于物理直接连接的交换机S、K 的两接口a、b,若ASa∩AKb≠φ,则交换机S与交换机K是通过集线器间接连接,反之,交换机S、K 是通过接口a、b直连。
2.3.2 网络拓扑步骤
使用C#语言开发程序,在内存中使用存储格式如下。
设备类:
网络拓扑步骤如下:
(1)根据交换机STP生成树表,找到根交换机,再由结论1,通过查看表单中的指定网桥,可知道对应的根端口,这样初步找到所有交换机的直连关系,再根据结论3找到阻塞端口构成冗余的连接关系;
(2)通过步骤(1)已经找到所有交换机之间的物理连接关系,接下来需要将主机加入到各交换机端口上,根据结论2,结合交换机转发表中的端口号和MAC地址,找到直连的主机,到这里物理拓扑基本上完成;
(3)完成步骤(2)之后,可根据结论4找到交换机之间是否存在集线器连接,并在内存的设备信息类中修改设备直连关系。
根据电务段生产力的调整,未来铁路信息化有着更大的需求,依据以数据为中心、通信为依靠的布局,建立网络通信与信号设备为一体的铁路信号综合监测系统。看得出局域网络的正常对各设备之间的通信是至关重要,因此需要对网络中的交换机、路由器等关键设备进行网络拓扑,图4是在该系统中应用该方法得到的网络拓扑效果展示图片。用该方法能够快速有效地发现网络中路由设备与各交换机、交换机与各关键设备的物理连接关系,通过拓扑图直观了解网络设备的状况,便于维护人员对设备进行故障分析。
本文通过基于SNMP的ICMP探测并结合端口扫描的方法,实现网络拓扑发现,可减少网络开销,实现网络拓扑发现,完整地发现网络中所有的活动节点,结合STP生成树协议能够准确地发现设备之间的物理连接链路,包括冗余链路的发现。但是由于项目需求,本文的方法也存在不足,目前可用于局域网内的拓扑发现,要想对广域网拓扑发现还需要进一步研究,并结合其他技术手段来实现。针对目前实现的网络拓扑发现,下一步将基于该网络拓扑方法研究网络故障定位,实现综合监测平台的智能故障诊断。
图4 在实际中网络拓扑的效果展示