北方交通大学 马文彬 张慧勇
自从20世纪90年代以来,越来越多的企业及个人在加入Internet网,使网络规模持续扩大。为了适应越来越多的流量,新节点、新链路不断的被引进到网络上,从而使手工维护很难跟上网络的变化,给网络管理带来困难。
网络由一起工作的大量实体构成,向用户提供某种服务。这些实体功能由硬件和软件执行,一些出现在真实网络中实体的例子有路由器、服务器、普通主机、链路等,所有这些都影响着网络运行的方式及提供给最终用户的服务质量。例如,如果一个应用服务器(Web Server)出现宕机而从网络上剥离下来,那么用户将得不到他们所期望的服务(浏览网页)。提到拓扑发现,一般是指发现完成最终用户服务所涉及到的所有实体,不仅要发现实体,而且要发现实体在网络中所起的作用及实体间互相连接的方式。
网络拓扑对网络管理、网络规划非常有用。例如,网络故障、流量瓶颈等重要信息能直接显示在网络拓扑上,这样网络管理员对当前的网络状况就有一个清楚的认识,对哪里发生了故障一目了然。如果网络拓扑上显示一条链路总处于满负荷传输状态,那么扩大该条链路的容量对提高网络性能将有很大帮助。此外,网络拓扑对网络仿真也十分重要,要仿真能否在现有网络上新开放一种应用,必须首先有正确的网络拓扑。
获得网络拓扑的最简单的方法莫过于让管理员根据实际网络手工绘出其拓扑,但现在网络越来越复杂,越来越庞大,并一直在膨胀,而且实体在网络中担负的功能也越来越复杂,要跟踪这样一个网络需要花费很多时间或精力,而且网络一旦有所改变所有工作必须重做。网络拓扑自动发现正是基于这个原因发展起来的,本文对能用于拓扑发现的一些常用的工具和技术作了简要的介绍,并基于笔者的实践提供了一个简单的算法实现,该算法主要针对同一个管理机构下的IP网络的拓扑自动发现,更复杂的拓扑发现算法可在此基础上进一步扩展。
一、用于拓扑发现的工具
1. Ping
Ping命令是IP网上最古老的一种工具,用来监测网络节点是否活着,或用于监测到网络节点间的往返时延(RTT)。通常Ping只涉及网络上的源和目的两节点,而忽略网络细节。另外我们可以使用广播Ping,其Ping的地址不是一个单一的地址,而是子网的广播地址,所有位于该子网的主机均对此Ping包进行响应,从而一次就可得到子网内的全部活动主机。
使用Ping的最大问题是,当Ping一个活着的主机时,其往返时延往往在几十毫秒左右,但Ping一个不存在的或宕着的主机,一般比较常用的超时通常为20秒,再加上为了减少丢包对测量结果的影响而采取发2~3个Ping包,这样对这类主机的监测代价就非常大。这个问题最直接的解决方案是减少超时值,但是必须注意不要小于网络实际的往返时延。通过精心设计超时和重发策略(随着跳数的增多,超时相应增大),可以有效减少等待时间同时又减少误判。
使用广播Ping的问题是,现在实际网络中广播Ping很少得到完全支持,部分网络由路由器代替子网内的主机响应。在另外一些网络中主机根本就不对广播Ping进行响应,甚至路由器根本不转发能引起广播的包。这是基于网络安全的考虑,因为可以利用这个特性进行拒绝服务攻击,例如向几个大的子网进行广播Ping,并把源地址设置为受害者的地址,这样受害者就会淹没于大量ICMP Ping的响应包,从而拒绝提供任何服务。对该问题的一个解决方案是设计一个专门的Broadcast Ping程序,其内部实现是直接将子网的广播地址转变为多个主机地址,然后启动多个线程或进程来分别向主机发送Ping包,从而获取子网内的全部主机地址。
2. Traceroute
Traceroute命令是TCP/IP家族内另一个比较早的工具,它可用来发现测试点和目标主机之间的路由器。路由器在转发包之前总是将其TTL值减1,如果TTL降为0,则路由器向源地址发送TTL-Expired ICMP消息。Traceroute实现的原理就是应用路由器的这个特性,通过发送TTL逐渐增大的探测包,由测试点到目标间这条路经上所有的路由器依次向测试点发送TTL-Expired ICMP包,从而发现所有路由器。因为几乎所有的路由器设计时都实现了发送TTL-Expired ICMP消息的功能,所以大多数情况下Traceroute的结果是准确可信的。由于采用逐渐增大TTL值的方法,每探测一个目标需要依次发送不同TTL值的多个包,因此用Traceroute获取结果比Ping要慢的多。可以设计一种并发式的Traceroute命令,一次发送不同TTL值的多个包,从而加速路由器的发现速度。
3. DNS
IP地址是为网络上的路由器或主机等机器设计的,它不符合人类的记忆习惯,DNS(Domain Name System)就是为了解决这个问题而开发的。DNS系统主要用于网络设备IP地址到名字的映射,同时也维护一些其他信息如设备的硬件平台及操作系统等。
使用DNS服务器提供的区域传输功能可以一次获取域内许多主机和路由器,快捷方便,这是它的优点。但如果主机的地址通过DHCP获得,则DNS对此就无能为力,此外,DNS服务器提供的信息可能与实际情况不一致,甚至有些DNS服务器没有提供区域传输功能。尽管有诸多缺点,DNS在拓扑发现中还是很重要的,我们可以把DNS返回的信息作为其他算法的起点;我们还可以在不知道网络具体结构的情况下,使用不同时间返回来的信息直接用来估算网络的增长速度。
4. SNMP
SNMP(简单网络管理协议)的基本思想是所有的网络设备维护一个MIB(管理信息库)保存其所有运行进程的相关信息,并对管理工作站的查询进行响应。SNMP协议描述了一种从MIB库中获取信息的方法,对设备唯一的要求是支持SNMP并且MIB中的信息足够丰富。
使用SNMP的最大优点是信息自动随网络的状况更新,这样通过SNMP获取的拓扑信息总是反映网络最新的状况。其缺点是并不是所有设备都支持SNMP协议,而且除了标准的MIB信息外,各厂家都为自己的设备开发了专门的MIB,如果在拓扑自动发现程序中使用了这些MIB,其处理上可能不得不随厂家的不同而作特殊的处理。因此,我们建议尽量使用标准MIB。本文中用到的MIB组有System组、Interfaces组、IP组,它们均为当前MIB-II下的标准组。
5. 其它工具或技术
除了上面介绍的几种常用工具外,我们还可利用节点的ARP表查询它直连的设备,利用路由协议(如OSPF、BGP)发现所有子网或网络,发现所有的路由器,在BGP下还可发现一条路经经过的自治域(Autonomous Systems)。对于非IP网络,可利用专门的技术(对IPX网络可采用SAP)发现网络拓扑信息。此外,一些厂家专有的技术如Cisco的CDP(思科发现协议,仅用于Cisco设备)、Netflow技术等也可用于拓扑发现。
二、算法实现
在本小节,我们给出一个IP网络拓扑自动发现算法,使用的技术是ICMP(Ping)和SNMP。本文提供的算法要求输入SNMP Read-Community,适用于发现同一个管理机构下的IP网络。算法首先从本地子网开始,通过Ping获取本地所有活动主机,利用SNMP区分出普通主机和路由器,然后对路由器进行查询,下载路由器的System组、Interfaces组、IP组的信息。获取路由器直连的网络,进行下一轮运算,直到发现所有网络或到达指定的深度(跳数)。程序主要涉及四大模块:
主循环控制模块:程序初始化及算法深度控制,到达指定深度后跳出循环;
子网搜索模块:搜索子网内的所有活动主机和路由器;
ICMP模块:处理ECHO请求及应答;
SNMP模块:处理SNMP相关操作。
程序中两个重要的类为RouterClass和NetClass。RouterClass包括两个指针分别指向IpList和NetList,IpList存放路由器的IP地址,NetList存放路有器连接的网络。NetClass包括两个指针分别指向Rconnect和Hconnect。
本算法使用了两个集合:临时网络集合,已发现网络集合。临时网络集合用于存放当前深度和下一深度中还没有被搜索的网络,对已搜索的网络需要添加到已发现网络集合。算法中为了避免多次发现同一路由器(因为路由器有多个IP地址),需要遍历路由器的IPList。程序使用的主要算法流程如下:
●子网搜索模块
(1)利用Ping搜索子网内所有的活动IP地址。
(2)利用SNMP区分路由器和普通主机,并分别添加到NetClass的Rconnect和Hconnect。
(3)针对每一个路由器,下载有关MIB变量(System组,Interfaces组,IP组),对MIB变量分析,分别写入RouterClass的IPList和NetList。
(4)为防止路由器被多次发现,要遍历RouterClass的IPList。
(5)将在(3)中发现的而又没有搜索的网络添加到深度为n+1的临时网络集合中。
●主循环控制模块
(1)从深度为n的临时网络集合中抽取一个子网进行子网搜索(调用子网搜索模块)。
(2)将(1)中搜索的网络添加到已发现网络集合。
(3)重复进行(1)和(2)直到临时网络集合为空。
(4)如果n小于指定深度(n
本文提供了一个可用于IP网络的拓扑自动发现算法。这个算法使用了路由器的MIB信息和ICMP(Ping)的结果来产生拓扑。路由器的IP地址不需要事先知道,本文给出的算法自动找出路由器,并利用SNMP协议获取有关拓扑的MIB信息,本算法试图发现尽量多的网络,或在到达指定深度(跳数)后自动停止。本文所提供的算法适用于同一个管理机构下的IP网络的拓扑自动发现,属于不同管理机构的网络(如Internet)拓扑自动发现要复杂得多,这种情况下就需要采用其它技术(如Traceroute),编写新的算法实现,这正是笔者下一步努力的方向。
----《通信世界》