基于SNMP的网络拓扑发现一、SNMP简介SNMP(Simple Network Management Protocol,简单网络管理协议)是一种基于TCP/IP协议的互连网管理协议。
SNMP诞生于1988年,当时只想把它作为一个短期的网络管理框架,临时用于管理连接到Internet上的设备。
但随着SNMP的发展和大量应用,其使用范围已大为扩展,超出了Internet的范围。
SNMP逐渐作为一种标准的协议在网络管理领域得到了普遍的接受和支持,成为了事实上的国际标准。
SNMP采用“管理进程/代理进程”模型来监视和控制各种可管理网络设备。
其核心思想是在每个网络节点上设置一个管理信息库MIB(Manage Information Base),由节点上的代理负责维护,管理进程通过应用层协议对这些信息库进行访问。
图3.1说明了SNMP网络管理框架的一般体系结构,它由四个主要部件构成,分别是:通信网络、网络协议、网络管理进程和被管网络实体。
网络管理进程被管网络实体图3.1 简单网络管理协议(SNMP )体系结构二、 基于SNMP 协议的网络层拓扑发现SNMP 已经成为网络管理的标准,为网络拓扑自动发现带来了巨大的方便,同时也大大提高了网络拓扑发现的速度。
路由器子网图3.2 网络拓扑结构模型网络层拓扑发现算法的任务就是发现被管网络中的子网、路由器以及它们之间的连接关系。
图3.2是网络拓扑结构的一个模型。
其中,各子网通过各自的路由器与其他子网通信,它们都连接到路由器的一个端口上。
路由器的一个端口可以连接一个子网,也可以同其他路由器相连。
当子网内的某一机器向别的子网发送数据时,数据包首先到达本子网的缺省路由器,缺省路由器检测数据包中的目的地址,根据其路由表确定该目的地址是否在与自己相连的子网中。
如果是,则把数据包直接发往目的地,否则转发给路由表中规定的下一个路由器,下一个路由器再进行类似处理,依次类推,数据包将最终到达目的地。
可见,通过分析路由器上的路由表,就可以知道网络层的拓扑结构。
2.1 网络层拓扑发现用到的MIB 组MIB-II(RFC-1213)是标准的SNMP MIB ,所有的路由器都必须实现它。
拓扑发现程序为了具有通用性的特点,必然选择MIB-II 作为拓扑发现工具。
MIB-II 由很多不同的组组成,本节的拓扑发现算法用到的组包括:system ,interfaces ,和ip 。
下面详细介绍这三个组中包含的对象。
1) System组该组内包含七个对象,分别为:sysDescr、sysObjectID、sysUpTime、sysContact、sysName、sysLocation和sysServices。
其中sysDescr描述了设备的相关信息,一般包括厂商,型号等。
S ysObjectID唯一标识特定厂商的特定类型设备,比如sysObjectID为1.3.6.1.4.9.5.45,则可以判断该设备为思科公司生产的型号为cisco6506的交换机。
SysUptime表示设备从最近一次启动开始正常运行的时间。
SysContact由网络管理员设定,一般设为网络管理员的联系方式。
SysName 为设备的名字,算法中会用这个对象来判断不同的IP地址是否属于同一个设备。
SysLocation由网络管理员设定,一般设为设备所在地点。
SysServices表示了该设备所能提供的服务。
2) Interfaces组该组包含两个对象ifNumber和ifTable。
其中,ifNumber对象表示该设备所具有的接口数量。
该组的另一个元素ifTable是一张表,表内的每一个字段都是某一个接口的一个属性,包括接口索引(ifindex),接口类型(ifType),接口速度(ifSpeed)和接口物理地址(ifPhysAddress)等。
3) IP组该组的元素较多,其中有三个表对拓扑发现来说比较重要,分别是ipAddrTable,ipRouteTable和ipNetToMediaTable。
通过表ipAddrTable,可以找到被管设备所有的IP地址,同时结合interfaces 组的ifTable表,可以把接口和其IP地址一一对应起来。
网络层的拓扑发现算法主要就是利用表ipRouteTable来判断网络层的拓扑结构的。
子网与路由器以及路由器和路由器的关系都能从路由表中得出来。
该表中对应拓扑发现的对象列举如下:IpRouteDest:路由的目的地址。
如为0.0.0.0,说明该路由为缺省路由。
通往同一个目的地的路由可能有多个,路由的选择依赖于所使用的路由协议。
IpRouteNextHop:路由的下一跳路由器地址。
ipRouteMask:路由目的地的子网掩码。
提取IP数据包中的目的地地址,与ipRouteMask进行按位“与”运算,得到的结果与ipRouteDest比较,如相同则应选择该路由。
如果ipRouteDest为0.0.0.0,则规定ipRouteMask也为0.0.0.0。
ipRouteType:路由的类型,为整型类型。
其意义如表3.1所示:表3.1 ipRouteType值及其意义ipRouteType值意义Other(1) 其他Invalid(2) 非法Direct(3) 该路由目的地址为路由器直接连接的子网远程路由,目的地址为远程的主机、网络或Indirect(4)子网2.2 基于SNMP的网络层对象发现在详细讨论拓扑发现算法之前,首先对算法中涉及到的一些问题进行说明。
1)默认网关的发现首先,访问拓扑发现程序所在计算机的SNMP MIBII中的ipRouteTable,如果发现有ipRouteDest值为0.0.0.0的记录,则说明程序所在的计算机设置了默认网关,该记录的ipRouteNextHop值即为默认网关的地址。
检查默认网关的ipForwarding值。
如果为1,则表明该默认网关确实是路由设备,否则不是。
2) 子网的发现遍历路由器MIBII的IP管理组中管理对象ipRouteDest下的所有对象,以每个路由目的网络号为索引,查询ipRouteType字段的值。
若该值为3(direct),则表明这条路由为直接路由,若该值为4(indirect),则为间接路由。
间接路由表明在通往目的网络或目的主机的路径上还要经过其它路由器,而直接路由表明目的网络或目的主机与该路由设备直接相连,这样就得到了与路由器直接相连的网络号。
再以这组网络号中的每个为索引,查询其路由掩码(ipRouteMask)。
根据路由掩码,就可以确定这组网络中每一个的IP地址范围。
例如,已知路由器的IP地址为192.168.4.1,且路由器支持SNMP协议。
利用SNMP协议可以得到以下与路由器直接相连的子网,如图3.3所示。
网络号网络掩码地址范围159.226.204.128 255.255.255.192 159.226.204.129 ~ 192192.168.0.0 255.255.255.0 192.168.0.1 ~ 255192.168.4.0 255.255.254.0 192.168.4.1 ~ 192.168.5.255192.168.6.0 255.255.255.0 192.168.6.1 ~ 255192.168.7.0 255.255.255.0 192.168.7.1 ~ 255图3.3 与网关直连的子网3) 其他路由设备的发现对于除了默认网关之外的路由设备,查询默认网关MIBII的IP管理组路由表中类型为间接路由的路由表项,得到路由的下一跳地址(ipRouteNextHop)。
下一跳地址给出了与该网关相连的路由设备,仍可以利用上面的方法搜索这个设备的路由表。
这样,该方法可以搜索出多个路由设备,并要求将它们所存储的路由表信息进行整合,得到更大的网络拓扑。
4) 网络层的连接对象网络层拓扑主要反映子网和路由器之间的连接关系。
子网和路由器的连接关系可以在发现与路由器直接相连的子网时得到,路由器和路由器的连接关系可以通过路由表中的ipRouteNextHop得到。
2.3 基于SNMP的网络层拓扑发现算法描述网络层拓扑发现算法用伪代码描述如下:CGateway gw =GetDefaultGateway();//得到默认网关If (gw确实是路由设备)把该设备添加到RouteList链表的末尾;for(RouteList中的每一个路由器CurrentRouter)//遍历该路由器的路由表,提取路由器和子网信息{for (CurrentRouter的路由表的每一项){if (ipRouteType 为direct){if ( ipRouteMask为255.255.255.255) (1){把IpRouteNextHop所代表的路由器添加到RouteList尾部,同时保证链表中的路由器不重复;(2)把当前路由器CurrentRouter和IpRouteNextHop代表的路由器之间的链接添加到链表LinkList中;}else{把ipRouteDest和ipRouteMask所代表的子网添加到SubnetList中去;把该子网与当前路由器CurrentRouter之间的连接添加到LinkList中;}}if (ipRouteType 为indirect){把IpRouteNextHop所代表的路由器添加到RouteList尾部,同时保证链表中的路由器不重复;把当前路由器CurrentRouter和IpRouteNextHop代表的路由器之间的链接添加到链表LinkList中;}}}在(1)处,如果ipRouteMask为255.255.255.255,那么该路由为到主机的路由。
也就是说,以该路由的ipRouteNextHop为地址的路由器和当前路由器通过一根电缆直接连接。
在(2)处判断不同的IP地址是否属于同一台路由器时,可以首先查询ip管理组的ipAddrTable的所有IP地址,然后看当前的IP地址是否也在列表当中,如果在就是同一台路由设备,否则不是。
三、基于SNMP协议的链路层拓扑发现算法在大多数情况下,仅仅发现网络层的拓扑结构是不够的,还需要发现链路层的拓扑结构,即子网内的设备及其连接关系。
子网内的设备包括主机、交换机、打印机、集线器等等。
连接关系不但包括设备之间的连接,还包括其他设备和交换机端口之间的连接关系以及交换机端口之间的连接关系。
虽然局域网的拓扑信息对于网络管理非常重要,但是该信息却很难得到。
大部分网络管理工具仅仅依赖网络层的拓扑发现和网络管理员手工添加二层的网络设备,比如交换机等,没有提供链路层的拓扑发现。
Cisco,Intel以及其它硬件提供商虽然设计了它们自己的拓扑发现协议,但是这些对于大型,异构的网络没有任何用处。