http://hi.baidu.com/renyijiu/blog/item/4ad68246b18aec0d6b63e5d3.html
1.背景描述
随着信息时代的到来,对计算机网络的依赖使得计算机网络本身运行的可靠性变得至关重要,对网络管理也就有了更高的要求。
按照OSI的定义,网络管理主要包括五个功能域:故障管理、配置管理、性能管理、安全管理和计费管理。在五大功能域中,配置管理是基础,它的主要功能包括发现网络的拓扑结构、监视和管理网络设备的配置情况。其它的各项功能都以已知网络的拓扑结构为基础。
网络拓扑发现的主要目的是获取和维护网络节点的存在信息和它们之间的连接关系信息,并在此基础上绘制出整个网络拓扑图。网络管理人员在拓扑图的基础上对故障节点进行快速定位。
本文旨在对网络拓扑发现的原理进行探讨,并在此基础上写出了网络拓扑发现的基础模块。
2.拓扑发现原理
网络拓扑自动发现的方法很多,但归结起来主要有以下三种:基于SNMP的网络拓扑发现方法;基于通用协议的网络拓扑发现方法;基于路由协议的网络拓扑发现方法;本文结合这三种方法对整个网络进行三层(网络层)拓扑发现和二层(链路层)拓扑发现以及路由层的拓扑发现,以给用户呈现出最真实的网络拓扑结构。
2.1 网络层的拓扑发现
网络层拓扑发现的原理是结合ICMP和ARP以及SNMP,对指定的网络进行活动设备的检查,得到所有的活动设备,然后通过SNMP取得设备的基本信息,根据基本信息确定设备的类型,再根据设备的类型取得相应设备的详细信息,网络层拓扑发现的步骤如下:
首先通过默认网关路由器获取存在的子网列表,然后通过ICMP Ping或路由器中的ARP信息遍历指定子网中所有的活动设备,并用系统团体名库去找到设备的团体名,如果找到则用SNMP协议获取设备的基本信息,并判断出设备的类型(路由器/交换机/防火墙/UPS/主机等),并在此基础上获取相应设备的详细信息。如果没有找到设备的团体名,则默认此设备为主机。
如何找到默认的路由网关呢?查找拓扑发现程序所在计算机的SNMP MIBII中的ipRouteTable,如果发现ipRouteDest值为0.0.0.0的记录,则说明程序所在的计算机设置了默认网关,ipRouteNextHop值即为默认网关的地址。然后检查默认网关的ipForwarding值。如果为1,则表明该默认网关确实是路由设备,否则不是。
如何取得存在的子网列表呢?遍历路由器MIBII的IP管理组中管理对象ipRouteDest下的所有对象,以每个路由目的网络号为索引,查询ipRouteType字段的值。若该值为3(direct)表明为直接路由,若该值为4(indirect)则为间接路由。间接路由表明要通往目的网络或目的主机还要经过其它路由器,而直接路由表明与目的网络或目的主机直接相连,这样就可以得到与路由器直接相连的网络号。再根据网络号中的每条记录查询其路由掩码(ipRouteMask)。根据取得路由掩码,就可以确定每一个存在的网络子网的IP地址范围。
如何发现其它的路由设备?查找默认路由网关MIBII的IP管理组路由表中类型为间接路由的路由表项,得到路由的下一跳地址(ipRouteNextHop)。遍历下一跳地址给出的路由设备,就可以得到更大的网络拓扑。
如何发现网络层设备的连接关系?子网与路由器的连接关系遍历每个路由器下包含的子网来确定,主机与子网的关系可以通过主机IP与子网掩码来确定。
2.2链路层的拓扑发现
链路层拓扑发现的原理是根据交换机的cdp邻居表、端口ifIndex和port对应表、自学习表判断出各交换机的连接关系,具体的拓扑发现步骤如下:
A、获取所有路由器的arp表信息,对于主机则通过SendARP或netbios来获取arp信息。
B、获取所有交换机的cdp邻居表、端口的ifIndex和port对应表、自学习表。
C、对交换机的互连关系进行判断,如果某个交换机的某个端口学习到了路由器的mac地址,则认为此端口为上行端口,如果交换机只有一个端口有自学习表项,也认为此端口是上行端口。如果一个交换机的上行端口中没有接其它的交换机则此交换机为根交换机。
D、对于每个交换机,如果它的某个端口和其它根上的多个端口冲突,通过cdp信息修正2者之间的连接关系,
用①表示邻居的根交换机,用②表示自己的根交换机,
如果①=②,表示它和它的邻居已经在同一棵树上,不处理;
如果是上行端口上的邻居,将①的层次和父亲改成self的层次和父亲;将①下的所有接点的层次加(self的层次-1)那么多;将self的父亲改成邻居的端口,并将self的level增加(邻居的层次+1)那么多;将self下所有接点的level增加(邻居的层次+1)那么多。
如果是其他端口上的邻居,将②的层次和父亲改成邻居的层次和父亲;将②下的所有接点的层次加(邻居的层次-1)那么多;将邻居的父亲改成self的端口,并将邻居的level增加(self的层次+1)那么多;将邻居下所有接点的level增加(self的层次+1)那么多。
F、对每个交换机,如果不是根交换机,则在其上加一个节点表示上行端口,并查找该交换机下的主机和UPS。
2.3路由层的拓扑发现
路由层的拓扑发现原理是TraceRoute所有设备节点,根据返回的路由路径即可得到相关设备的路由拓扑关系,拓扑发现的步骤如下:
首先找到根节点,如果没有则生成一个;然后对每一个非路由器设备调用TraceRoute,将device id 为0而又没有子节点的treenode删掉,将device type是主机,但有子节点的设备改成路由器。
对于多址路由器的问题,可以通过查看路由器的osid是否一致来确定是否属于同一个路由器的。