基于SNMP的网络拓扑结构自动发现研究
2009-09-16
作者:刘亚莉 孙亚民
摘 要: 分析了简单网络管理协议(SNMP)、网络管理模型以及地址解析协议(ARP),在此基础上提出了一种网络拓扑结构的自动发现方法。
关键词: 网络管理 SNMP 拓扑发现
国际标准化组织提出的网络管理标准框架(即开放系统互连管理框架)将网络管理划分成5大功能模块:配置管理、性能管理、故障管理、计费管理和安全管理。Internet体系结构委员会在此框架基础上提出了相应的网络管理标准,即简单网络管理协议SNMP。
直观、可视化的网络拓扑图使网络管理更加方便和高效,所以在网络管理软件中构造拓扑图很有必要。网络拓扑发现技术则是实现网络拓扑图的关键。基于TCP/IP的SNMP协议由于其简单和易于实现的特性,已经成为网络管理领域事实上的协议标准,且目前主要的网络设备都提供对SNMP协议的支持,因此基于SNMP协议的拓扑发现技术被广泛采用。本文主要讨论基于SNMP协议的网络搜索技术。
1 相关协议及概念
1.1 SNMP的管理模型
SNMP的网络管理模型如图1所示。该模型由管理站、代理、管理信息库(Management Information Base,MIB)和网络管理协议等组成。
SNMP管理站一般是单机设备或者共享网络中的一员,它是网络管理员与网络管理系统的接口。SNMP代理对来自管理站的信息查询和请求做出响应,同时异步地向管理站提供一些重要的非请求信息。管理信息库是被管代理特性的数据变量集合。管理站通过获取代理MIB对象的值来实现监视功能,也可以通过修改代理的特殊变量的值来改变代理的配置。
管理站和代理之间通过SNMP网络管理协议连接。该协议包括以下功能。
(1)Get:由管理站执行,获取代理的MIB对象值。
(2)Set:由管理站执行,设置代理的MIB对象值。
(3)Trap:由代理发送的非请求信息,异步地向管理站报告重要事件。
具体地讲,管理站把感兴趣的对象标识提取到应用程序中,发出GetRequest报文,从拥有SNMP管理代理的网络设备中获取指定对象的信息。管理代理用GetResponse消息响应GetRequest报文。GetNextRequest是管理站用于查询信息的报文,它可以获取一个表中指定对象的下一个对象,以遍历整个表。Get实现了对设备信息的查询,如果要求改变代理的配置,就需要管理站向被管代理发送SetRequest报文。SetRequest常用于对网络设备进行远程配置。SNMP陷阱(Trap)是SNMP代理发送给工作站的非请求消息,该消息通知管理站发生了特定事件。
1.2 SNMP报文
管理站和代理之间通过交换SNMP报文来交换信息。管理站的每个请求或者响应都是一个完整、独立的SNMP报文。每个报文包括SNMP版本号、SNMP共同体名和协议数据单元(Protocol Data Unit,PDU)。SNMP的消息格式如图2所示。
1.3 SNMP的管理信息库
管理信息库是网管数据的标准。该标准规定了网络代理必须保存的数据项目、类型及允许的操作。网络管理系统中的每个结点都包括一个MIB,它反映了该结点中被管资源的状态。利用SNMP协议访问网络设备的管理信息库,就可以得到网络设备的所有统计内容,完成网络拓扑的构建。
MIB被划分成8个组和171个对象,SNMP可操作的数据结构和变量都包括在其中。常用的组如下:
(1)System组中包含被管系统的总体信息,如位置、名称、功能、制造者等。
(2)Interfaces组提供网络实体的物理层接口的信息,包括配置信息和每个接口上的事件统计信息。
(3)IP组提供网络结点中有关IP实现和操作的信息。
(4)ICMP组包括了有关ICMP的实现和操作的信息。
(5)TCP组的对象主要用于解决流量控制、丢失重传和网络拥挤等问题。
(6)UDP组监视打开的UDP连接,记录错误信息。
(7)EGP组用于支持外部网关协议的路由器,记录本地和临近路由器的EGP信息。
(8)SNMP组包括了有关SNMP实现和操作的信息。
2 网络拓扑结构的自动发现
网络拓扑图用图形化的方式直观、形象地表示出整个网络中的各子网以及子网内部网络设备之间的互连关系。一个合理的网络拓扑图应该具有层次性,即包括主拓扑和子拓扑。主拓扑显示网络中子网及网关间的互连结构;子拓扑则显示子网内部网络设备间的互连关系。在网络拓扑结构的自动发现的实现过程中,使用SNMP协议搜索路由表信息构造网络主拓扑,使用ARP协议或者ICMP协议发现子网中的终端设备,实现子拓扑的构建。
2.1 主拓扑
计算机网络是由各种不同规模的子网组成的。子网通过各自的路由器同其他的子网通信。这些子网可以是局域网,也可以是某个局域网中的子网,它们都连接到路由器的一个端口上。路由器的端口可以和子网相连,也可以和路由器相连。主拓扑反映网络中的路由设备和子网之间的关系,包括路由器-路由器、路由器-子网以及接口的关系。
主拓扑的搜索通过SNMP协议访问路由表的信息来实现。MIB库中的IP路由表ipRouteTable是对路由表的抽象。其定义用ASN.1文法描述如下:
ipRouteTable OBJECT-TYPE
SYNTAX SEQUENCE OF IpRouteEntry
IpRouteEntry∷=SEQUENCE
{ipRouteDest IpAddress, //路由器的目的子网地址
ipRouteIfIndex INTEGER, //惟一标识本地接口的索引值,
//通过该接口可以到达该路由的下一站
ipRouteNextHop IpAddress, //路由器的下一个网关地址
ipRouteType INTEGER,//路由类型:1-其他,2-无效,
//3-直接,4-间接
ipRouteProto INTEGER//路由的学习机制,
//如RIP、EGP或OSPF等
ipRouteMask IpAddress //路由目的地的子网掩码
……}
如果ipRouteDest为0.0.0.0则表示该路由为缺省路由。由于路由表中的下一站地址项标识的必然是具有路由功能的网络结点,因此从网络管理站的缺省路由开始,采用广度优先或深度优先遍历无向图的算法对整个网络进行遍历,可逐级找出所有的路由器和子网,在此基础上就可以实现网络主拓扑结构的构建。
实现主拓扑搜索的方法如下:假设待访问的网络是一个连通图,而且至少知道其中一个节点R0的IP地址,则初始化已知路由队列,将缺省路由标志IP放到已知的路由队列中,已知路由器队列={R0},已访问路由器队列=φ,下一跳路由器队列=φ,子网队列=φ。
While(已知路由队列不为空)
{
从已知路由队列中取出一个路由器,为CurrentRouter;
if(CurrentRouter属于已访问的路由器队列)
break;
elseif(将CurrentRouter加入到已访问的路由队列成功)
{
访问CurrentRouter的每个路由表项;
if(ipRouteType==indirect)
把路由表中的各ipRouteNextHop不重复地放到下一跳路由器队列;
if(ipRouteType==direct)
把ipRouteDest和ipRouteMask不重复地放到子网队列中;
}
遍历下一跳路由器队列中的每个路由器,将其标志IP放到待访问的路由器队列;
}
说明:
(1)如果在路由器的某路由记录中ipRouteType为3,则其目的子网(ipRouteDest)与本路由器直接相连。ipRouteNextHop表示从该路由器转发数据的出口地址,是该路由器的一块网卡地址。此时,ipRouteNextHop与ipRouteMask相与可以得到子网地址。ipRouteTable中的ipRouteIfIndex是本地接口的索引,其值与接口表(ifTable)中的ifIndex值相对应。通过ifIndex和ifType的对应关系可以得到子网的类型。将子网及其相关信息加入到子网数据库中。
(2)如果不满足条件(1),目的子网不直接与路由器相连,则只能通过ipRouteNextHop所指的下一跳路由器到达子网。此时的下一跳路由器与本路由器直接相连,将其加入到路由器数据库中。
(3)对于新发现的路由器,重复上述步骤完成所有路由器和子网的搜索。
(4)通过对数据库中路由器表和子网表的搜索可以知道大致的网络主拓扑结构。但是要想绘制出网络的拓扑图还需要路由器之间、路由器和子网之间的连接关系,这些关系还需要查询MIB中其他表项的信息。
2.2 子拓扑
需要指出的是使用SNMP协议只能发现网络系统中的路由器和子网,对于子网内部的结构还是一无所知。为了实现子拓扑的搜索则需要引入其他协议,如ARP协议或者ICMP协议。本文中使用ARP协议来实现子拓扑的搜索。
任何有以太网接口的网络设备都必须支持地址解析协议(ARP)并在本机维护一张ARP表,用于IP地址到物理地址的映射。通过分析MIB库中的对象,发现路由器的ipNetToMediaTable表中记录了该路由器所连接其他设备的IP地址到物理地址的映射和映射方式,其ASN.1定义如下:
ipNetToMediaTable OBJECT-TYPE
SYNTAX SEQUENCE OF IpNetToMediaEntry
IpNetToMediaEntry∷=SEQUENCE
{ipNetToMediaIfIndex INTEGER,
//该记录对应的接口索引
ipNetToMediaPhysAddress PhysAddress,
//介质依赖的物理地址
ipNetToMediaNetAddress IpAddress,
//与物理地址对应的IP地址
ipNetToMediaType INTEGER } //地址映射类型
这个表记录了最近活动过的有效设备的IP地址和物理地址。如果子网内主机是活动的,则一定在ipNetToMediaTable中有记录。在主拓扑的发现过程中记录了子网的网络地址和子网掩码。使用子网掩码与相应的路由器表中的ipNetToMediaNetAddress进行“与”操作,就可以得到这个子网内的所有主机的IP地址。此外,通过ipNetToMediaIfIndex查询路由器接口表(ifTable)中对应的子网接口,查看ifType可以查询出子网的类型,这样就实现了子拓扑的发现。
对于网络节点数目不多,网络流量不大的企业内部网,经常采用交换机完成局域网的组建。但是,一般的交换机工作于数据链路层,没有路由功能,所以上述方法不适合于非三层的交换机,这样的网络拓扑属于链路层的拓扑结构。为了检测交换机每个端口的状态,可以从交换机的MAU-MIB中取出相应的值。在RFC2239中定义了MAU-MIB,包含了一些设备内部的状态信息,可以取出ifMauTable表内容,根据其中的ifMauStatus值来判断该端口的运行状态。
查询方法如下:先读取交换机Bridge-MIB中的信息,获取连接到交换机各个端口的计算机的物理地址,然后读取在交换机的ipNetToMediaTable表中保存的所有通过该设备转发数据包的主机的MAC地址。假设这张表中包含了所有连接主机的MAC地址,则可以通过下面的方法来得到它的连接情况。
(1)首先得到dot1dTpFdbTable中关于各个端口的Address Forwarding Table,这是交换机中转发和过滤数据帧的依据。表1显示了端口接入设备物理地址表。
(2)得到物理地址与IP地址转换表(ipNetToMediaTable)。该表保存了所有通过该设备进行数据包转发的主机的MAC地址,其物理地址与IP地址对应表如表2所示。
(3)由上面2张表可以得出端口接入设备信息表,如表3所示。
该表显示了与交换机连接并激活的计算机状态。
3 结束语
本文讨论了基于SNMP协议和ARP协议的网络拓扑发现方法。在使用该方法实现网络拓扑的过程中,采用HP公司的SNMP++开发包,并使用Visual C++作为开发工具,对于MIB-Ⅱ中标识的网络元素使用SQL Server数据库中的表项来表示。所建立的数据库结构反映了网络元素之间的关系,并建立相应的路由器表、子网表、设备表以及连接关系表等。使用开发工具和开发包利用拓扑发现方法将网络数据取到数据库中,再利用开发工具将数据转换成图形显示在网络管理平台上,完成网络拓扑图的构建。实践结果表明该方法可以搜索出指定网段内的拓扑图。网络拓扑图的实现,为继续实现网络管理的其他功能模块打下了基础。
参考文献
1 杨家海,任宪坤,王沛瑜.网络管理原理与实现技术.北京:清华大学出版社,2000
2 岑贤道,安常青.网络管理协议及应用开发.北京:清华大学出版社,1998
3 武俊明,罗军周.基于IP的网络结点发现与拓扑管理.连云港化工高等专科学校学报,2001;14(2)
4 凌军,曹阳,李莉等.基于ARP和SNMP的网络拓扑自动发现算法.武汉大学学报,2001;47(1)