以太网络拓扑发现 - SNMP
- 格式:doc
- 大小:3.65 MB
- 文档页数:12
以太网络拓扑发现一.原理概述简单网络管理协议(SNMP)首先是由Internet工程任务组织(Internet Engineering Task Force)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。
许多人认为SNMP在IP上运行的原因是Internet运行的是TCP/IP协议,然而事实并不是这样。
SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。
SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。
SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。
名字说明MIB 管理信息库SMI 管理信息的结构和标识SNMP 简单网络管理协议从被管理设备中收集数据有两种方法:一种是只轮询(polling-only)的方法,另一种是基于中断(interrupt-based)的方法。
如果你只使用只轮询的方法,那么网络管理工作站总是在控制之下。
而这种方法的缺陷在于信息的实时性,尤其是错误的实时性。
你多久轮询一次,并且在轮询时按照什么样的设备顺序呢?如果轮询间隔太小,那么将产生太多不必要的通信量。
如果轮询间隔太大,并且在轮询时顺序不对,那么关于一些大的灾难性的事件的通知又会太馒。
这就违背了积极主动的网络管理目的。
当有异常事件发生时,基于中断的方法可以立即通知网络管理工作站(在这里假设该设备还没有崩溃,并且在被管理设备和管理工作站之间仍有一条可用的通信途径)。
然而,这种方法也不是没有他的缺陷的,首先,产生错误或自陷需要系统资源。
如果自陷必须转发大量的信息,那么被管理设备可能不得不消耗更多的时间和系统资源来产生自陷,从而影响了它执行主要的功能(违背了网络管理的原则2)。
而且,如果几个同类型的自陷事件接连发生,那么大量网络带宽可能将被相同的信息所占用(违背了网络管理的原则1)。
尤其是如果自陷是关于网络拥挤问题的时候,事情就会变得特别糟糕。
Java和SNMP技术的网络拓扑发现/物理拓扑发现入门ObjectSNMP产品介绍ObjectSNMP是一个面向对象的SNMP开发组件,与关系数据库流行的O-R Mapping技术类似,系统提供了Java/SNMP网关、RMI/SNMP网关、Web Service/SNMP网关服务。
开发者无需理解SNMP协议和MIB细节,只需要定义普通数据对象,然后将数据对象按添加、删除、修改、查询等模式提交给网关即可。
ObjectSNMP网关会自动将数据对象按开发者的期望发送到SNMP设备,并返回用户需要的数据对象。
基于ObjectSNMP技术,ObjectSNMP还提供诸如分布式代理SNMP网关、网络拓扑发现、物理拓扑发现、网络自动搜索发现、设备连接关系发现、设备类型发现、网络漫游搜索、以及定义好的可管理各种设备的MIB数据等高级功能。
ObjectSNMP的技术架构ObjectSNMP的功能1. O-M Mapping映射框架功能参考数据库领域流行的O-R Mapping技术,实现SNMP领域的Object-MIB映射框架,自动翻译MIB和OID语法,自动翻译SNMP命令和网络操作,彻底告别Socket、PDU、UDP、SNMPGet/Set/GetNex/GetBulk、OID方式的编程模式,开发人员需要做的仅仅是定义一个与MIB数据相对应的普通数据对象。
然后通过各种网关提交数据对象,即可完成对SNMP的复杂访问。
2. Java/SNMP网关使用者的程序和ObjectSNMP在同一个Java进程内,使用者定义普通Java数据对象,然后通过Java API访问ObjectSNMP网关。
3. Java RMI/SNMP网关使用者的程序和ObjectSNMP在不同的Java进程内,或在不同的机器上。
使用者定义普通Java数据对象,然后通过RMI Java API访问ObjectSNMP网关。
4. Web Service/SNMP网关使用者可以为PHP、C++、.NET、Java、Flex、JavaScrip等支持Web Service技术的其他程序,通过在Web环境中,访问ObjectSNMP网关。
基于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是网络拓扑结构的一个模型。
其中,各子网通过各自的路由器与其他子网通信,它们都连接到路由器的一个端口上。
路由器的一个端口可以连接一个子网,也可以同其他路由器相连。
当子网内的某一机器向别的子网发送数据时,数据包首先到达本子网的缺省路由器,缺省路由器检测数据包中的目的地址,根据其路由表确定该目的地址是否在与自己相连的子网中。
如果是,则把数据包直接发往目的地,否则转发给路由表中规定的下一个路由器,下一个路由器再进行类似处理,依次类推,数据包将最终到达目的地。
网络拓扑发现与管理方法随着互联网的迅速发展,网络拓扑的规模和复杂性也逐渐增加。
对于网络管理员来说,准确了解和管理网络拓扑是至关重要的。
本文将介绍几种常见的网络拓扑发现与管理方法,帮助网络管理员提高网络运维效率。
一、网络拓扑概述网络拓扑是指网络中各个设备之间的连接关系,包括物理链路和逻辑链路。
网络拓扑的结构决定了数据在网络中的传输路径和传输效率。
因此,进行网络拓扑发现和管理对于确保网络顺畅运行非常重要。
二、人工拓扑发现与管理方法人工拓扑发现和管理方法是一种传统的方式,网络管理员通过手动查看设备之间的连线和配置信息来构建和管理网络拓扑。
这种方法灵活性较高,能够提供详细的拓扑信息。
然而,随着网络规模的扩大,人工管理变得繁琐且容易出错。
三、SNMP协议拓扑发现与管理方法简单网络管理协议(SNMP)是一种网络管理协议,用于设备之间的监控、配置和管理。
SNMP协议可以通过轮询设备的MIB(管理信息库)来获取设备的拓扑信息。
管理员可以使用SNMP协议获取设备的邻接信息和接口状态等,从而建立和管理网络拓扑。
这种方法可以自动化地发现和管理网络拓扑,但对于大规模复杂网络来说,SNMP协议的效率和可扩展性有一定局限性。
四、CDP和LLDP拓扑发现方法CDP(Cisco Discovery Protocol)是思科设备上的一种发现协议,用于发现连接到思科设备上的其他设备。
类似的,LLDP(链路层发现协议)是一种开放的链路层协议,可用于在多厂商设备之间发现和识别连接关系。
CDP和LLDP协议可以获取设备之间的邻接信息和接口状态,从而构建网络拓扑。
这种方法适用于多厂商设备的网络,但对于特定厂商的设备兼容性存在限制。
五、通过数据包分析的拓扑发现方法数据包分析是一种基于抓包技术的拓扑发现方法。
管理员可以使用数据包分析工具,如Wireshark,对网络中的数据包进行捕获和分析。
通过分析数据包中的源和目的地址等信息,可以还原网络拓扑以及设备之间的连接关系。
以太网络拓扑发现一.原理概述简单网络管理协议(SNMP)首先是由Internet工程任务组织(Internet Engineering Task Force)(IETF)的研究小组为了解决Internet上的路由器管理问题而提出的。
许多人认为SNMP在IP上运行的原因是Internet运行的是TCP/IP协议,然而事实并不是这样。
SNMP被设计成与协议无关,所以它可以在IP,IPX,AppleTalk,OSI以及其他用到的传输协议上被使用。
SNMP是一系列协议组和规范(见下表),它们提供了一种从网络上的设备中收集网络管理信息的方法。
SNMP也为设备向网络管理工作站报告问题和错误提供了一种方法。
名字说明MIB 管理信息库SMI 管理信息的结构和标识SNMP 简单网络管理协议从被管理设备中收集数据有两种方法:一种是只轮询(polling-only)的方法,另一种是基于中断(interrupt-based)的方法。
如果你只使用只轮询的方法,那么网络管理工作站总是在控制之下。
而这种方法的缺陷在于信息的实时性,尤其是错误的实时性。
你多久轮询一次,并且在轮询时按照什么样的设备顺序呢?如果轮询间隔太小,那么将产生太多不必要的通信量。
如果轮询间隔太大,并且在轮询时顺序不对,那么关于一些大的灾难性的事件的通知又会太馒。
这就违背了积极主动的网络管理目的。
当有异常事件发生时,基于中断的方法可以立即通知网络管理工作站(在这里假设该设备还没有崩溃,并且在被管理设备和管理工作站之间仍有一条可用的通信途径)。
然而,这种方法也不是没有他的缺陷的,首先,产生错误或自陷需要系统资源。
如果自陷必须转发大量的信息,那么被管理设备可能不得不消耗更多的时间和系统资源来产生自陷,从而影响了它执行主要的功能(违背了网络管理的原则2)。
而且,如果几个同类型的自陷事件接连发生,那么大量网络带宽可能将被相同的信息所占用(违背了网络管理的原则1)。
尤其是如果自陷是关于网络拥挤问题的时候,事情就会变得特别糟糕。
克服这一缺陷的一种方法就是对于被管理设备来说,应当设置关于什么时候报告问题的阈值(threshold)。
但不幸的是这种方法可能再一次违背了网络管理的原则2,因为设备必须消耗更多的时间和系统资源,来决定一个自陷是否应该被产生。
结果,以上两种方法的结合:面向自陷的轮询方法(trap-directed polling)可能是执行网络管理最为有效的方法了。
一般来说,网络管理工作站轮询在被管理设备中的代理来收集数据,并且在控制台上用数字或图形的表示方式来显示这些数据。
这就允许网络管理员分析和管理设备以及网络通信量了。
被管理设备中的代理可以在任何时候向网络管理工作站报告错误情况,例如预制定阈值越界程度等等。
代理并不需要等到管理工作站为获得这些错误情况而轮询他的时候才会报告。
这些错误情况就是众所周知的SNMP自陷(trap)。
在这种结合的方法中,当一个设备产生了一个自陷时,你可以使用网络管理工作站来查询该设备(假设它仍然是可到达的),以获得更多的信息。
二.系统概述因为这个作业比较特殊,由于没有相应的实验环境,所以最初的作业要求显得不切实际,和助教老师商量过后,决定将该作业分为两块,一是实现mib viewer功能,即能够通过收发数据包取得任何oid所对应的mib值,二是通过一个静态的数据结构来仿真top发现的算法,因为这两者的结合加上相应的网络环境,就能够实现现实的网络top发现了,换句话说,实现了这两部分的内容,也就基本上达到了作业的要求。
下面分两部分说明:1.Mib viewer使用方法:选中mib viewer标签,在target ip栏中输入希望查询的设备ip地址,在oid栏中填入希望查询的oid值(oid值的输入与选择的查询方法有关),选择想要的查询方法(Get,GetNext,GetBulk)…Get:一次只读一条记录,而且对于目标oid肯定,例如,希望读取sysDescr的值,则oid 值必须输入1.3.6.1.2.1.1.1.0。
GetNext:一次只读取一条记录,但是能读取不确定的oid所对应的信息,如输入1.3.6.1.2.1.1.1,也能读出对应的sysDescr值。
GetBulk:一次能读取多条数据,需要在对应的edit框中输入所需读取的信息数目,例如在oid 中输入1.3.6.1.2.1.1,在edit栏中输入7,就能读出System组的所有7条信息。
效果图:程序设计说明:目前流行的snmp工具包主要有net-snmp,agent++,snmp++,和winsnmp,我用的是由微软提供的winsnmp开发包,因为其它的工具包要么不是免费的(如hp公司的snmp++和agent++),要么是针对linux系统开发的,对VC的支持不好,所以被迫选择了winsnmp,使用之后发现这个开发包很不好用,集成度太低,而且宏定意相当凌乱,总之,花了相当功夫才上手的。
我自己将winsnmp.h提供的api封装成一个CSnmp类,方便后面程序的开发,期中主要的函数有://构造函数CSnmp();主要封装了三个api://启动Snmp服务SnmpStartup(nMajorVersion,nMinorVersion,nLevel,nTranslateMode,nRetransmitMode) //设置传输模式*注意,这里必须为V2以上版本,否则对很多功能不支持。
SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2)//设置重传模式SnmpSetRetransmitMode(SNMPAPI_ON)//建立会话bool CreateSession(HWND hWnd, UINT wMsg, CString& errorinfo);//绑定变量列表bool CreateVBL(LPCSTR string, smiLPV ALUE pvalue,CString& errorinfo);//追加绑定变量列表bool SetVBL(LPCSTR string, CString& errorinfo);//创建协议数据单元for get or get nextbool CreatePDU(smiINT PDU_type, CString& errorinfo);//创建协议数据单元for getbulkbool CreatePDU(smiINT PDU_type, CString& errorinfo, int a);//发送数据包bool Send(LPCSTR address,const char* password, CString& errorinfo);//接收数据包并解析bool Receive(LPTSTR name[30],smiLPV ALUE value[30], CString& errorinfo);期中主要包括://接受消息SnmpRecvMsg(m_hSession,&srcEntity,&dstEntity,&context,&pPDU)//获取数据包内的信息SnmpGetPduData(pPDU,PDU_type,request_id,error_status,error_index,&varbindlist)//获取变量数目m_nCount = SnmpCountVbl(varbindlist)//获取变量的值for(int i=1;i<=m_nCount;i++)SnmpGetVb(varbindlist,i,pOid[i-1],value[i-1])//获取变量相对应的oid值for(i=0;i<m_nCount;i++){if(SnmpOidToStr(pOid[i],100,name[i]) == SNMPAPI_FAILURE)//错误映射表…便于调试void ErrorToString(unsigned long errorindex, CString &str);实际使用时,主要是两个函数:send(CString AgentIP, CString a,int b)//三个参数分别为目标ip,待查oid值,查找类型按以下顺序调用CSnmp中的函数:CreateSession(CNetView::m_hWnd,wMsg,errorinfo)//wMsg是自己定义的消息,用来联动receive()函数CreateVBL((LPCSTR)m_strOid[0].GetBuffer(0),NULL,errorinfo)m_Snmp.CreatePDU(SNMP_PDU_GET,errorinfo)//共有三种查找方式,这里以get为例m_Snmp.Send((LPCSTR)AgentIP,"public", errorinfo)receive()在成功调用CSnmp中的Receive(pOid,pValue,errorinfo)函数之后用switch-case语句分析返回的信息内容,并加以记录和输出。
二.静态算法演示:效果图:说明:主要是用自己定义的一个静态的数据结构来仿真网络top的发现算法。
算法描述:在每次找到交换机的时候,对该交换机进行如下操作:主要涉及oid:Generated from OBJECT-TYPE definition found in rfc1213-mib2.asn1OID value: 1.3.6.1.2.1.4.21.1.7OID description:ipRouteNextHop OBJECT-TYPESYNTAX IpAddressACCESS read-writeSTATUS mandatoryDESCRIPTION"The IP address of the next hop of this route.(In the case of a route bound to an interfacewhich is realized via a broadcast media, the value of this field is the agent's IP address on thatinterface.)"::= { ipRouteEntry 7 }OID value: 1.3.6.1.2.1.4.21.1.8OID description:ipRouteType OBJECT-TYPESYNTAX INTEGER {other(1),invalid(2),direct(3),indirect(4)}ACCESS read-writeSTATUS mandatoryDESCRIPTION"The type of route. Note that the valuesdirect(3) and indirect(4) refer to the notion of direct and indirect routing in the IParchitecture.Setting this object to the value invalid(2) hasthe effect of invalidating the corresponding entry in the ipRouteTable object. That is, iteffectively dissasociates the destinationidentified with said entry from the routeidentified with said entry. It is animplementation-specific matter as to whether the agent removes an invalidated entry from the table. Accordingly, management stations must be prepared to receive tabular information from agents thatcorresponds to entries not currently in use.Proper interpretation of such entries requiresexamination of the relevant ipRouteType object." ::= { ipRouteEntry 8 }OID value: 1.3.6.1.2.1.4.21.1.11OID description:ipRouteMask OBJECT-TYPESYNTAX IpAddressACCESS read-writeSTATUS mandatoryDESCRIPTION"Indicate the mask to be logical-ANDed with thedestination address before being compared to the value in the ipRouteDest field. For those systems that do not support arbitrary subnet masks, anagent constructs the value of the ipRouteMask by determining whether the value of the correspondent ipRouteDest field belong to a class-A, B, or Cnetwork, and then using one of:mask network255.0.0.0 class-A255.255.0.0 class-B255.255.255.0 class-CIf the value of the ipRouteDest is 0.0.0.0 (adefault route), then the mask value is also0.0.0.0. It should be noted that all IP routing subsystems implicitly use this mechanism."::= { ipRouteEntry 11 }OID value: 1.3.6.1.2.1.1.7OID description:sysServices OBJECT-TYPESYNTAX INTEGER (0..127)ACCESS read-onlySTATUS mandatoryDESCRIPTION"A value which indicates the set of services that this entity primarily offers.The value is a sum. This sum initially takes the value zero, Then, for each layer, L, in the range 1 through 7, that this node performs transactions for, 2 raised to (L - 1) is added to the sum. For example, a node which performs primarily routing functions would have a value of 4 (2^(3-1)). In contrast, a node which is a host offeringapplication services would have a value of 72(2^(4-1) + 2^(7-1)). Note that in the context of the Internet suite of protocols, values should be calculated accordingly:layer functionality1 physical (e.g., repeaters)2 datalink/subnetwork (e.g., bridges)3 internet (e.g., IP gateways)4 end-to-end (e.g., IP hosts)7 applications (e.g., mail relays)For systems including OSI protocols, layers 5 and 6 may also be counted."::= { system 7 }OID value: 1.3.6.1.2.1.4.20.1.1OID description:ipAdEntAddr OBJECT-TYPESYNTAX IpAddressACCESS read-onlySTATUS mandatoryDESCRIPTION"The IP address to which this entry's addressinginformation pertains."::= { ipAddrEntry 1 }OID value: 1.3.6.1.2.1.4.20.1.3OID description:ipAdEntNetMask OBJECT-TYPESYNTAX IpAddressACCESS read-onlySTATUS mandatoryDESCRIPTION"The subnet mask associated with the IP address ofthis entry. The value of the mask is an IPaddress with all the network bits set to 1 and allthe hosts bits set to 0."::= { ipAddrEntry 3 }主要静态数据结构:iproutetype1[0][0]=4;//路由器接口所连接的设备类型iproutetype1[0][1]=3;//3为交换机iproutetype1[0][2]=3;//4为路由器iproutetype1[0][3]=3;iproutetype1[1][0]=4;iproutetype1[1][1]=3;iproutetype1[1][2]=3;iproutetype1[1][3]=3;iproutenexthop1[0][0]="202.120.1.2";//路由器接口所连接路由器的ip地址iproutenexthop1[1][0]="202.120.1.1";iproutedest1[0][1]="192.168.0.1";//路由器接口所连接交换机的ip地址iproutedest1[0][2]="192.168.0.2";iproutedest1[0][3]="192.168.0.3";iproutedest1[1][1]="192.168.1.1";iproutedest1[1][2]="192.168.1.2";iproutedest1[1][3]="192.168.1.3";routemask1[0][1]="255.255.255.0";//路由器接口所连接的交换机的子网掩码routemask1[0][2]="255.255.255.0";routemask1[0][3]="255.255.255.0";routemask1[1][1]="255.255.255.0";routemask1[1][2]="255.255.255.0";routemask1[1][3]="255.255.255.0";host_ip[0]="192.168.3.1";//第三层设备iphost_ip[1]="192.168.3.2";type[0]=76;//第三层设备的sysservice值type[1]=32;***更详细的代码解释请参见源程序注释。