基于SNMP的网络拓扑发现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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 ~ 192
192.168.0.0 255.255.255.0 192.168.0.1 ~ 255
192.168.4.0 255.255.254.0 192.168.4.1 ~ 192.168.5.255
192.168.6.0 255.255.255.0 192.168.6.1 ~ 255
192.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以及其它硬件提供商虽然设计了它们自己的拓扑发现协议,但是这些对于大型,异构的网络没有任何用处。
局域网拓扑发现的复杂性在于以太交换机硬件的内在透明性:网络用户感觉不到网络中交换设备的存在。
这些交换机设备仅仅在执行生成树协议(Spanning tree protocol)时才和邻居设备交换信息,况且这种协议也不是在所有环境下都使用。
交换机能保留的唯一状态是它的转发数据库,它的作用是把收到的数据包转发到适当的端口上去。
这些信息对于局域网的拓扑发现来说是足够的,并且可以通过SNMP的标准MIB来访问。
局域网中,交换机的连接关系确定了整个局域网拓扑结构的布局,所以,发现局域网络拓扑首先要发现交换机之间的连接关系。
3.1 交换机互联关系的发现
图3.4为链路层的网络模型图,其中的节点包括交换机和主机。
交换机通过它们的端口相连,主机通过局域网或者集线器和交换机的端口相连。
由网桥(交换)设备组成的局域网中的设备可以被划分为网桥集合B和端点集合E。
如图3.4所示,B={A,B,C,D}。
E={W, X, Y, Z}。
当今的以太网通常是交换式的,交换机通过不同的端口把网络中的其它各种设备连接起来。
以太局域网中还包括:集线器(图3.4中与A相连),该设备用来把几台主机连接在交换机的同一个端口上;共享网段(图3.4中和C相连);哑交换机,即不支持SNMP 的交换机(图3.4中和B相连)。
交换机和其它交换机以及网段之间的连接不应该出现环路,即使物理上有环路,交换机也会利用生成树算法(spanning tree protocol)在所有连接中选择一个无环路的子集。
一旦拓扑结构确定,交换机就通过监听每个端口的数据包学习网络中设备的位置信息。
当一个新节点发出的数据经过交换机的一个端口时,交换机会把该数据包的源地址加到与该端口对应的列表中。
在这以后,当交换机收到一个发往该地址的数据包时,它会自动把这个数据包转发到对应端口上。
这些对应关系组成了交换机的转发数据库。
在转发数据库中,交换机的每一个端口都对应着多个设备的物理地址,称这些物理地址所对应设备的集合为该端口的转发集。
对于交换机C,用F x C来标识交换机C的端口x的转发集。
在图3.4中,F1C={A,B,D,W,X,Z}。
该集合随着网络拓扑的变化而变化,同时由于记录有生存时间,所以该集合还随着时间而变化。
当该集合中包含该端口下连接的所有设备时,该集合称为完整的,F1C是完整的。
图3.4 链路层网络模型图
1) 直接连接定理
发现局域网络拓扑首先要发现交换机之间的连接关系。
当两个不同的节点互相连接,并且在它们之间不存在任何其它设备时,称该连接为直接连接。
当两个不同的节点通过中间其它设备连接在一起时,称该连接为间接连接。
直接连接是间接连接的一种特殊情况。
如果一个数据包从交换机A的端口x发出,然后中途未经过任何其它网络设备而达到交换机B的端口y,称交换机A的端口x和交换机B的端口y之间有直接连接;如果中途需要经过其它的网络设备才能达到,则称A交换机的端口x和交换机B的端口y之间存在间接连接。
例如,在图3.4中,交换机A和B通过端口1和4直接连接。
A的端口1和C的端口1之间存在间接连接。
如果能判断两个交换机的不同端口之间是否有直接连接,就可以得出网络中交换机的互联关系,下一步发现交换机和主机的连接关系也变的相对容易了。
由图3.4可以观察到,如果F1B和F1C都是完整的,即F1C={A,B,W,X,D,Z},F1B ={C,Y}。
得到,F1B∩F1C=ф,F1B∪F1C=N(N为全集,即图3.4中所有设备的集合)。
这并不是偶然的,因为如果两个交换机的不同端口x,y直接连接,中间没有任何其它设备,那么以相连处为中线,网络中的设备可以划分成两部分,一部分在端口x所对的一侧,即F x A,另一部分在端口y所对的一侧,即F y B。
所以,F x A∪F y B=N。
该命题的逆命题也成立。
直接连接定理[6]: 如果F x A和F y B都是完整的,那么交换机A的端口x和交换机B的端口y直接相连的充要条件是F x A∩F y B=ф且F x A∪F y B=N。
根据直接连接定理,可以遍历局域网中交换机的转发数据库(FDB),对不同交换机端口的转发集作“并”操作,如果结果为全集且“交”操作的结果为空,则这两个端口就是直接连接的。
但是,直接连接方法最大的缺陷就是要求交换机端口的转发集是完整的。
当
网络的规模很大时候,获得完整的转发集几乎是不可能的。
在一个拥有上百,甚至上千个节点的网络中,某个时刻总会有一些节点因为软件或者硬件的原因而处在非活动状态。
这时候,相应的交换机端口的转发集就不会是完整的,上述方法就不适用了。
2) 间接连接定理
为了克服这个缺点,参考文献[7]中提出了一种能够利用非完整的转发集就能判断交换机直接连接的方法。
该方法的基本思想是,利用反证法,排除不可能的连接关系。
图3.5是一个利用反证法来判断交换机之间连接的例子。
假设交换机A 和B 通过某两个端口间接连接,然后判断该连接是否和交换机A 、B 的FDB 中已有信息相矛盾。
如果找不到矛盾,则这个连接是可能存在的;如果矛盾,则这条连接是肯定不存在的。
在图3.5中,交换机A 和交换机B 的连接关系可能有六种,如图3.6所示。
图3.5 交换机A 和B 通过不同的端口连接示例
假设交换机A 的端口1和交换机B 的端口1间接相连,如图3.6的第一种情况所示。
如前文所述,以太局域网中交换机连接成一个树状结构,不存在环路。
所以,此时的网络可以分成三部分。
第一部分是交换机A 的端口2和3所连接的设备;第二部分是交换机B 的端口2所连接的设备;第三部分是交换机A 、交换机B ,以及位于二者中间的设备。
实际上,第一部分是F 2A ∪F 3A ,第二部分是F 2B ,这两部分不应该有交集。
但是,(F 2A ∪F 3A )∩ F 2B ≠ф,所以,这个事实与交换机A 的端口1和交换机B 的端口1相连矛盾。
实际上,除了有间接连接
{Z} {X} {X}
的两个端口以外,两个交换机上的不同端口的转发集不应该有相同的元素。
否则,相当于声称一个设备同时存在于网络的两个不同的位置,显然是不合理的。
在图3.6中,只有第五种情况下没有出现矛盾,其它五种情况均不可能。
所以,实际的情况必定是交换机A的端口1和交换机B的端口2相连。
利用这种方法来判断交换机之间的连接关系并不需要交换机端口的转发集是完整的,只要所有的信息能够排除掉所有不存在的连接关系就足够了。
参考文献[7]中给出了可以利用该方法得出交换机连接关系的最小要求,称之为间接连接定理。
间接连接定理:只要满足以下3个条件之一,就可以确定交换机A和B通过x和y端口间接相连。
设交换机A在x端口上学习到的MAC地址的集合为
F x A。
1.F x A和F y B中同时存在着对方的MAC地址;
2.F x A中存在B的MAC地址,并且A上存在一个端口k(k≠x),使得F y B ∩F k A≠ф;
3.在B上存在两个端口i,j,使得F x A∩F i B≠ф且F x A∩F j B≠ф,并且A 上存在端口k(k≠x),使得F k A∩F y B≠ф。
图3.6 交换机A与B的六种可能的连接关系
由于交换机之间很少通信,所以条件1和2中要求的交换机A的F x A中存在B的MAC地址很难满足,可以利用IP欺骗的方法尽量地使条件满足。
具体做法是:对于子网中的每个交换机S i,利用IP欺骗方法,以S i的IP地址为源地址,向子网中的其他交换机发送ICMP ECHO消息。
在S i收到回应后,将导致S i的FDB中保存有其他交换机的MAC地址。
3) 基于间接连接确定直接连接
根据子网内交换机之间的间接连接关系,就可以确定交换机之间的直接连接关系。
设子网内的所有交换机构成的集合为G。
根据STP协议,交换机之间将构成一棵树。
任选其中一个交换机S i为根,假设S i通过n个端口与其他交换机
构成间接连接,则可以将G-{S i}构成一个划分Πi,划分中包含n个元素,每个元素是与S i的某个端口p相间接连接的交换机的集合,设为G p。
在G p中任选一个交换机S j,则S j必然通过某个端口q与S i的端口p间接连接,如果S j不通过端口q与G p中的其他交换机间接连接,则可以判定S j通过端口q与S i的端口p 直接连接。
3.2 算法的具体描述
基于SNMP的链路层拓扑发现算法主要任务是发现以太网的子网中设备以及连接关系。
本文所描述的算法以给定的子网号和掩码地址作为输入,以交换机对象链表pSwList, 网段对象链表pSegList,打印机对象链表pPrtList和2层连接对象链表pL2ConnList为算法的输出。
给定子网的拓扑信息全部包含在上述的三个链表中。
1)算法的第一部分首先根据子网地址和子网掩码计算出子网的范围,然后扫描该范围内的所有IP地址,并通过3.1.3.3节所给出的方法判断设备的类型以及其它信息。
该过程用伪代码表示如下:
for(子网范围内的每一个地址ipAddr)
{
if(存在某个设备的IP地址为ipAddr)
{
deviceType = getTypeofDevice(ipAddr);
if (deviceType == switch)
生成交换机对象,添加到pSwList链表中;
else if (deviceType == printer)
生成打印机对象,添加到pPtrList链表中;
else
生成主机对象,添加到pHostList中;
}
}
2) 找到子网内所有主机的MAC地址。
3) 遍历子网中所有的交换机,下载交换机的FDB表。
同时为交换机的每个端口生成一个相应的网段对象SegNode,该网段中包含对应端口转发集中的所有在本子网范围内的主机。
4)基于每个交换机的FDB表,利用3.1.3.1所描述的方法计算交换机之间的连接关系。
5)重新调整子网内的所有网段。
对有直接连接的两个端口对应的网段作“与”操作,如果结果为空,则删除这两个网段;如果非空,则删除原来的两个网段,生成一个新的网段,该网段内的主机为“与”操作的结果。
6)把网段和交换机的连接关系构造成对象,添加到2层连接对象链表L2ConnList中。
在算法的第(2)步,之所以要找到物理地址是因为交换机FDB中的地址是MAC地址,在为主机划分网段时,要用到这些MAC地址。
找到主机MAC地址的方法有两种。
第一种是利用主机的MIBII中的inferfaces组中的ifPhysAddress 对象,另一种是利用与该子网相连的路由器中的ipNetToMediaTable来找到该子网内的所有主机的MAC地址。
但是后者并不能保障找到所有的主机的MAC地址,但是它能找到那些不支持SNMP主机的MAC地址。
4 小结
本节按照不同层次描述了基于SNMP的拓扑发现方法。
在网络层,主要利用MIBII的IP组中的路由表来发现网络中的路由器和子网的连接关系;在链路层,主要利用网桥MIB(Bridge Mib)来发现交换机和交换机直接的连接关系。
SNMP 标准协议是拓扑发现的一个重要工具,正是SNMP的存在,才使得耗时巨大的拓扑发现过程的变得迅速快捷。
附录A XML文件格式定义
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
<xs:element name="Internet" type="InternetType">
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
</xs:element>
<xs:complexType name="InternetType">
<xs:sequence>
<xs:element name="subnetList" type="subnetListType"/>
<xs:element name="l3ConnList" type="l3ConnListType"/>
<xs:element name="gwList" type="gwListType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="gwListType">
<xs:annotation>
<xs:documentation>the gateway list</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="gwNode" type="gwNodeType"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="gwNodeType">
<xs:annotation>
<xs:documentation>gateway node</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="ObjectInstance" type="xs:string"/>
<xs:element name="ObjectFatherInstance" type="xs:string"/>
<xs:element name="gwName" type="xs:string"/>
<xs:element name="gwAddr" type="xs:string"/>
<xs:element name="RInterface" type="RInterfaceType" minOccurs="0" maxOccurs="unbounded"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="subnetNodeType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="subnetAddr" type="xs:string"/>
<xs:element name="subnetMask" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="swNode" type="swNodeType" maxOccurs="unbounded"/>
<xs:element name="L2ConNode" type="l2ConNodeType" maxOccurs="unbounded"/>
<xs:element name="segNode" type="segNodeType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="subnetListType">
<xs:sequence>
<xs:element name="subnetNode" type="subnetNodeType"/> </xs:sequence>
</xs:complexType>
<xs:complexType name="l3ConnListType">
<xs:annotation>
<xs:documentation>connection object in network layer</xs:documentation>
</xs:annotation>
<xs:element name="ObjectInstance" type="xs:string"/>
<xs:element name="ObjectFatherInstance" type="xs:string"/>
<xs:element name="sourceInstance" type="xs:string"/>
<xs:element name="linkName" type="xs:string"/>
<xs:element name="linkType" type="xs:integer"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="swNodeType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="swName" type="xs:string"/>
<xs:element name="swAddr" type="xs:string"/>
<xs:element name="commuStr" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="SInterface" type="SInterfaceType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="SInterfaceType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="Mac" type="xs:string"/>
<xs:element name="ifType" type="xs:integer"/>
<xs:element name="ifIndex" type="xs:integer"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
<xs:complexType name="l2ConNodeType">
<xs:annotation>
<xs:documentation>connection object in link layer</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="sourceInstance" type="xs:string"/>
<xs:element name="destInstance" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="segNodeType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="swName" type="xs:string"/>
<xs:element name="hostNode" type="hostNodeType" maxOccurs="unbounded"/>
<xs:element name="age" type="xs:integer"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="hostNodeType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="hostAddr" type="xs:string"/>
<xs:element name="hostMask" type="xs:string"/>
<xs:element name="hostOperateSysType" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="netCard" type="netCardType" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="RInterfaceType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="ifIndex" type="xs:integer"/>
<xs:element name="ifType" type="xs:integer"/>
<xs:element name="age" type="xs:integer"/>
<xs:element name="ipAddr" type="ipAddrType" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="ipAddrType">
<xs:sequence>
<xs:element name="addr" type="xs:string" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="netCardType">
<xs:sequence>
<xs:element name="objectinstance" type="xs:string"/>
<xs:element name="objectfatherinstance" type="xs:string"/>
<xs:element name="IPAddr" type="xs:string"/>
<xs:element name="MAC" type="xs:string"/>
<xs:element name="age" type="xs:integer"/>。