snmp介绍以及mib树的遍历_第1页
snmp介绍以及mib树的遍历_第2页
snmp介绍以及mib树的遍历_第3页
snmp介绍以及mib树的遍历_第4页
snmp介绍以及mib树的遍历_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MRTG用了多年,也搞过一段RRDTool和Cacti做监控画图,但是一直都对SNMP的MIB库定义感到模棱两可,尤其那堆类似 ...0 的数字感到迷惑,这回收集了一些资料,好好整理了一下,自己感觉清晰了不少,把收集整理的资料做个笔记,也分享给朋友。SNMP协议介绍 简单网络管理协议(SNMP:Simple Network Management Protocol)是由互联网工程任务组(IETF:Internet Engineering Task Force )定义的一套网络管理协议。该协议基于简单网关监视协议(SGMP:Simple Gateway Monitor

2、Protocol)。利用SNMP,一个管理工作站可以远程管理所有支持这种协议的网络设备,包括监视网络状态、修改网络设备配置、接收网络事件警告等。虽然SNMP开始是面向基于IP的网络管理,但作为一个工业标准也被成功用于电话网络管理。1. SNMP基本原理SNMP采用了Client/Server模型的特殊形式:代理/管理站模型。对网络的管理与维护是通过管理工作站与SNMP代理间的交互工作完成的。每个SNMP从代理负责回答SNMP管理工作站(主代理)关于MIB定义信息的各种查询。下图10是NMS公司网络产品中SNMP协议的实现模型。SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都

3、是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。数据报结构如下图版本识别符(version identifier):确保SNMP代理使用相同的协议,每个SNMP代理都直接抛弃与自己协议版本不同的数据报。 团体名(Community Name):用于SNMP从代理对SNMP管理站进行认证;如果网络配置成要求验证时,SNMP从代理将对团体名和管理站的IP地址进行认证,如果失败,SNMP从代理将向管理站发送一个认证失败的Trap消息 协议数据单元(PDU):其中PDU指明了SNMP的消

4、息类型及其相关参数。 2. 管理信息库MIBIETF规定的管理信息库MIB(由中定义了可访问的网络设备及其属性,由对象识别符(OID:Object Identifier)唯一指定。MIB是一个树形结构,SNMP协议消息通过遍历MIB树形目录中的节点来访问网络中的设备。下图给出了NMS系统中SNMP可访问网络设备的对象识别树(OID:Object Identifier)结构。下图给出了对一个DS1线路状态进行查询的OID设置例子。 3. SNMP的五种消息类型SNMP中定义了五种消息类型:Get-Request、Get-Response、Get-Next-Request、Set-Request、

5、Trap · Get-Request 、Get-Next-Request与Get-Response SNMP管理站用Get-Request消息从拥有SNMP代理的网络设备中检索信息,而SNMP代理则用Get-Response消息响应。Get-Next-Request用于和Get-Request组合起来查询特定的表对象中的列元素。如:首先通过下面的原语获得所要查询的设备的接口数:iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifNumber(2)后再通过下面的原语,进行查询(其中第一次用Get-Request,其后

6、用Get-Next-Request):iso org(3) dod(6) internet(1) mgmt(2) mib(1) interfaces(2) ifTable(2) · Set-RequestSNMP管理站用Set-Request 可以对网络设备进行远程配置(包括设备名、设备属性、删除设备或使某一个设备属性有效/无效等)。 · TrapSNMP代理使用Trap向SNMP管理站发送非请求消息,一般用于描述某一事件的发生。 SNMP管理信息库MIB 管理信息库MIB指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息)。MIB给出了一个网络中所有可能的被管理

7、对象的集合的数据结构。SNMP的管理信息库采用和域名系统DNS相似的树型结构,它的根在最上面,根没有名字。下图画的是管理信息库的一部分,它又称为对象命名(objectnamingtree)。 管理信息库的对象命名举例对象命名树的顶级对象有三个,即ISO、ITU-T和这两个组织的联合体。在ISO的下面有4个结点,其中的饿一个(标号3)是被标识的组织。在其下面有一个美国国防部(Department of Defense)的子树(标号是6),再下面就是Internet(标号是1)。在只讨论Internet中的对象时,可只画出Internet以下的子树(图中带阴影的虚线方框),并在Internet结点

8、旁边标注上即可。 在Internet结点下面的第二个结点是mgmt(管理),标号是2。再下面是管理信息库,原先的结点名是mib。1991年定义了新的版本MIB-II,故结点名现改为mib-2,其标识为.2.1,或Internet(1) .2.1。这种标识为对象标识符。最初的结点mib将其所管理的信息分为8个类别,见表1。现在de mib-2所包含的信息类别已超过40个。表1 最初的结点mib管理的信息类别应当指出,MIB的定义与具体的网络管理协议无关,这对于厂商和用户都有利。厂商可以在产品(如路由器)中包含SNMP代理软件,并保证在定义新的MIB项目后该软件仍遵守标

9、准。用户可以使用同一网络管理客户软件来管理具有不同版本的MIB的多个路由器。当然,一个没有新的MIB项目的路由器不能提供这些项目的信息。这里要提一下MIB中的对象.4.1,即enterprises(企业),其所属结点数已超过3000。例如IBM为.4.1.2,Cisco为.4.1.9,Novell为.4.1.23等。世界上任何一个公司、学校只要用电子邮件发往进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用SNMP进行管理。/=Snmp+是一套强大的网络管理应用开发包。它提供

10、了Snmp网管协议所描述的所有命令,并且提供SMI数据类型的解析。MIB数据包含普通数据和表数据。在提取表数据时,由于表项的数量和Oid都不确定,所以不能通过某个特定的Oid直接获得取值。通常,关于Snmp的书上都会介绍使用GetNext命令来实现表的遍历,这种方法比较简单,这里主要讨论该算法的原理和如何用Snmp+实现。MIB表是通过行和列来描述的。其中列表头是各个表项的原始Oid,而行表头则是index。这样以来一个Oid和一个index就唯一地确定了表中的一项。比如在接口表中,ifDescr(Oid为..1.2)为一列,而具体对于某一个接口则为一行。这样,某一

11、具体表项的Oid就表示为:列Oid+index的形式。下图形象地描述了一张表的格式。ifIndex..1.1ifDescr..1.2ifType..1.3ifMtu..1.4Ifspeed..1.5Index0xxxxxxxxxxxxxxxIndex1xxxxxxxxxxxxxxxIndex2xxxxxxxxxxxxxxx按照协议描述,最基本的方法是通过index来获取某一表项。但事实上,index本身也是一个表项,再加之有些表需要多个index,并且各种

12、index的数据类型不同,比如要手工处理ip地址类型的index就比较困难,所以这种方法具有很难的操作性。因此,在实际编程时,可以采取一些比较技巧化的方法。从Snmp中对于GetNext命令的描述可知,如果GetNext的参数为一个表中某一列的表头Oid,比如前面的ifDescr(..1.2),则得到的值为该列第一行元素值,并可得到该值的Oid。再对取得的Oid使用GetNext就可获得该列第二行的值。如此下去,如果到了该列的最后一行,那么用GetNext将得到下一列的第一行。如果到了该表的最后一个元素,那么用GetNext将得到按MIB树所得的下一个元素值。显然,

13、在越界的情况下,其Oid的前部分已不同于本列表头的Oid,所以,可以通过得到的Oid值来判断是否越界。以下为其主要的代码:/*从代理提取某一特定表项,即表中的一列*/void get_Table(Oid *item_oid, CTarget *target) GenAddress address; target->get_address( address); int index_count=0; /该列的行数 bool tag=true; /标志循环是否结束 for(;tag=true;) Pdu pdu; Vb vb; vb.set_oid(item_oid); pdu += vb;

14、int status; if (status=snmp->get_next( pdu, *target)= SNMP_CLASS_SUCCESS) pdu.get_vb( vb,0);Oid full_oid; /该表项的Oid vb.get_oid(full_oid); /判断是否已越界,如果是则结束循环 if(item_oid ->nCompare(item_oid ->len(), full_oid)=0) vb.get_oid(full_oidindex_count); index_count+; /* 在这里进行数据处理 */ else tag=false; els

15、e tag=false; 以上的算法是从表中提取一列,那么如何提取一行呢?对于上述算法可以加以改进以适应我们的需要。但是,GetNext命令是按列遍历的,当我们要用它获得一行的时候还是必须先至少获得一列的信息,也就是说,在行遍历算法中还是要包含上述代码。这种方法经过实践是成功的,在这里仅对算法进行一下描述。首先还是要执行上述代码,但是,在数据处理的时候必须保存所得到的完整Oid。我们知道,得到的Oid实际上是由列Oid+index构成,而列Oid是已知的,那么如果我们将得到的Oid前面的列Oid部分替换为另外的列Oid就可以获得该行另一列的完整Oid。在多数情况下,同一表中不同的列Oid仅相差

16、一个数字,所以,替换方法也比较简单。这里假设我们只需替换一位(其它情况下只需做修改即可),算法如下:/按行提取表数据Oid row_oidMAX_OID_NUM;/*首先在此处包含前面按列提取的代码,并在数据处理处将full_oid保存在数组row_oid*/ /假设前面已经将第一列的所有表项Oid保存在数组row_oid中了 /按行循环for(int i=0; i<index_count; i+) Oid oid; /获取该行中每一列的数据 for(oid=第一列oid; oid<最后一列oid; oid=下一列的oid) Pdu pdu; Vb vb; /替换,如有需要,可以采用其它方法,这里选取最简单的情况只替换一位 row_oidioid.len()-1=oidoid.len()-1; vb.set_oid(row_oidi); pdu += vb; int status; if (status=snmp->

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论