【转】网络拓扑发现原理研究

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是否一致来确定是否属于同一个路由器的。

 

时间: 2024-10-10 14:32:12

【转】网络拓扑发现原理研究的相关文章

PHP CodeIgniter框架的工作原理研究

 这篇文章主要介绍了PHP CodeIgniter框架的工作原理研究,本文首先分析了它的工作流程,然后总结了它的工作原理,需要的朋友可以参考下     CodeIgniter(以下简称CI,官网以及中国站)是一个流行的PHP框架,小巧但功能强大,简洁轻量同时拥有很好的扩展性,在国内也比较受欢迎.另一方面,CI却没有与时俱进,并不支持PHP5.3之后的一些特性,导致它相对更适合较老一些的项目.虽然如此,CI仍是一个优秀的框架,而且它本身内核较小,源码优雅,适于学习. CI易于使用,可以方便的开发出

请问java snmp 怎么实现网络拓扑发现

问题描述 刚开始接触snmp,不懂怎么实现网络拓扑发现请帮忙一下java代码怎么实现, 解决方案 解决方案二:不是很懂,可以看一下snmp4j解决方案三:thisisabigtopic.

中文显示原理研究

显示|中文 预备知识: 1.字节和unicode Java内核是unicode的,就连class文件也是,但是很多媒体,包括文件/流的保存方式 是使用字节流的. 因此Java要对这些字节流经行转化.char是unicode的,而byte是字节. Java中byte/char互转的函数在sun.io的包中间有.其中ByteToCharConverter类是中调度, 可以用来告诉你,你用的Convertor.其中两个很常用的静态函数是 public static ByteToCharConverte

PHP CodeIgniter框架的工作原理研究_php技巧

CodeIgniter(以下简称CI,官网以及中国站)是一个流行的PHP框架,小巧但功能强大,简洁轻量同时拥有很好的扩展性,在国内也比较受欢迎.另一方面,CI却没有与时俱进,并不支持PHP5.3之后的一些特性,导致它相对更适合较老一些的项目.虽然如此,CI仍是一个优秀的框架,而且它本身内核较小,源码优雅,适于学习. CI易于使用,可以方便的开发出web应用.先来看一下CI的工作流程图(此处内容引用自http://codeigniter.org.cn/user_guide/overview/app

Ryu拓扑发现原理分析

Ryu拓扑发现的核心模块是ryu/topology目录下的switches.py,拓扑发现的应用是同目录下的dumper.py.在dumper.py中,会利用_CONTEXTS来实例化switches.py中的Switches类,然后将拓扑发现的相关信息通过日志方式(LOG.debug)显示.启动命令如下所示: ryu-manager –verbose –observe-links ryu.topology.dumper 或者 ryu-manager –verbose –observe-link

《猫眼观察》——发现、研究、探索、分析

这几天在网上搜寻可穿戴设备的信息和资料,我发现自从智能手表上市以来,铺天盖地的产品信息让我莫名其妙的将视线转移到了这些手表身上.今天实在忍不住了,干脆把我收集到的智能手表信息一股脑的罗列分享出来,大家伙儿一起讨论一下. 我会把我所能知道的著名的.不著名的.国外的.国内的全部分享过来,算是对这家伙的一个整理,也算是帮各位科技关注者做个小档案吧!(以下分享的产品只做简单介绍,给各位一个对比参考,排名不分先后,部分中文名称翻译具有自主知识产权,哈哈!) 好!我们开始,....."一大波智能手表正在逼近

SpringMVC关于json、xml自动转换的原理研究

前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:http://www.cnblogs.com/fangjian0423/p/springMVC-introduction.html 现象 本文使用的demo基于maven,是根据入门blog的例子继续写下去的. 我们先来看一看对应的现象. 我们这里的配置文件 *-dispatcher.xml中的关键配置如下(其他常规的配置文件不在讲解,可参考本文一开始提到的入门blog): (视图配置

为你解疑C++ CLR和ISO C++原理区别

用C++ CLR也很长时间了,终于让我明白了ISO C++与C++ CLR的区别,下面就让我简述一下我学习中痛苦和收获吧. 通过学习WinForm编程,严格的说我并不是WinForm编程,因为我的原来的程序里有着大量的ISO C++,完全用C++ CLI来编程我可承受不起,同时由于是自学,几乎用了很长时间我才明白ISO C++与C++ CLR的区别,同时由于国内翻译过来的书太慢了,我看到的C++CLR都是VS2003的老语法,而网上下载的微软的视频却是VS2005,很多语法规则都变得面目全非,终

提高SDN控制器的拓扑发现性能

SDN网络的一大特点就是资源由控制器集中管理,控制器管理网络,最基本的当然需要知道网络的拓扑,而网络拓扑可能时时发生变化,所以控制器需要时时监测,对于整个网络来说,控制器担负了太多的计算任务,所以如果能够帮助控制器减压,则会提高整个网络的性能.本篇文章将以ryu控制器为例,首先介绍传统网络和现在SDN网络的拓扑发现原理,然后介绍改进算法,最后讲解改写后的代码逻辑. 一. LLDP拓扑发现原理 传统网络中的链路发现协议为LLDP(Link Layer Discovery Protocol),LLD