简单网络管理协议SNMP的学习和理解.docx
《简单网络管理协议SNMP的学习和理解.docx》由会员分享,可在线阅读,更多相关《简单网络管理协议SNMP的学习和理解.docx(13页珍藏版)》请在冰点文库上搜索。
简单网络管理协议SNMP的学习和理解
简单网络管理协议(SNMP)的学习和理解
1.SNMP网络管理协议综述
SNMP(SimpleNetworkManagementProtocol)是被广泛接受并投入使用的工业标准,它是由SGMP即简单网关监控协议发展以来的。
它的目标是保证管理信息在任意两点中传送,便于网络管理员在网络上的任何节点检索信息,进行修改,寻找故障;完成故障诊断,容量规划和报告生成。
它采用轮询机制,提供最基本的功能集。
最适合小型、快速、低价格的环境使用。
它只要求无证实的传输层协议UDP,受到许多产品的广泛支持。
2.1管理信息
经由SNMP协议传输的所有管理倍息都表现为非聚集的对象类型。
这些对象类型被收集到一个或多个管理信息库[MIB]中并且对象类型按照管理信息结构和标识(SMI)定义。
简单网络管理协议策l版的sM[于1990年5月定义在一篇题为《基于因特网的了TCP/IP管理信息结构和标识》的RFC中。
这一RFC要求所有的管理信息库数据和信息必须根据ISO8824标准《抽象句法表示法1规范》(ASN.1)编码。
按照ASN.1表示所有信息和对象的目的在于方便向OSI的网络管理协议迁移而无需重新定义现已存在的所有对象和MIB。
SMI为每一对象类型定义以下成分:
①名字;
②句法;
②编码说明。
注意:
一个对象类型的名字明确地代表一个对象,称为对象标识符。
不得分配标识符0给对象类型作为其名字的一部分。
为便于阅读,在标准文档中对象标识符旁边包含对这一对象的描述。
对象标识符是按照在OSIMIB树中建立的严格分层空间构造的,对象标识符总是一个唯一的从树根开始描述MIB树的整数序列。
对象标识符和它的文字描述的组合称为标号。
2.1.1管理树
SMI明确要求所有被管理的信息和数据都要由管理树来标识。
这棵管理树来源于
OSI的定义,它具有从很开始的严格分层化结构。
管理拷的分支和叶子是用数字和字母两种方式显示的。
数字化编码是机器可读的,字母显示则更适合于人的眼睛并帮助用户寻找穿过错综复杂分支的路径。
在树中通向一个节点或叶子的路径是用对象标识符表示的。
树的各个分支是用数值表示的,因此对象标识符就构成了一个整数序列。
管理树纳根下有3个直接后继者IB际电报电话咨询委员会ccnT分支、国际标准化组织Iso分支和J。
int—Iso—CCITT(上述的联合)分文。
下图为因特网子数(1.3.6.1)中所包含的是与因特网有关的所有管理对象。
2.2名字和语法
句法定义了对象的数据类型。
AsN.1的部分结构用来形式化地描述这种数据类型。
ASN.1编码只使用基本编码规则(BER)。
SMI定义了3种数据类型:
原语类型、结构类型和自定义的类型。
1)原语类型(Primitivetypes)
原语ASN.1类型有Integer(整数)、Octet(字节)、String(字符串)、objectIdentifier(对象标识符)和NuLL(空)几种类型。
再没有其他原语类型。
2)结构类型(Constructortypes)
结构类型是一种用于汇集列表和表格的复合类型。
出于这种目的,SNMP使用sequence和sequenceof。
结构类型Sequence允许使用简单类型的列表,在sequence定义中,SNMP协议不提供缺省或可选值。
Sequence的句法构造如下:
SEQUENCE{<typel>,..,<typeN>}
表格是对一些元家组成的舶数据结构的显示。
用entry表示列表名,sequcenceof的句法结构如下:
SEQUENCE<entry>
3)自定义的类型(Definedtypes)
借助于列表和结构类型,其他类型可以从基本类型(已经定义过的类型)(1nteger、
NULL、objectIdentifier和OctetString)派生。
为此,SMI定义了6种复合类型:
(1)NetworkAddress(网络地址)
NetworkAddress允许使用各种格式化的网络地址。
当前,SMI只支持因持网协议
(2)IPAddress(因特网地址)
定义32位IP地址的格式。
(3)Counter(计数器)
32位非负值计数器。
这个计数器从o计到2的32次幂减l(十进制的4294967295),—超出最大值,计数器从零重新计数。
(4)Gauge(量规)
32位非负整数计算器,可做增1计数和减1计数。
Gauge不能超出最大值(2的32次幂减l,十进制4294967295),如超出,将从零重新启动。
(5)TimeTicks(时间标记)
非负的32位的整数。
该整数按1/100s计算时间
(6)Opaque(模糊)
引入这一伪数据类型,以绕过在有限的SMI定义中所固有的任何限制。
它允许任意的ASN.1结构。
在网管站和代理进程间就Opaque数据的解释达成一致是非常必要的。
4)被管对象
管理信息的结构和标识没有定义各自的被管对象,而定义了它们的形式化结构和内容。
每个对象类型由5个字段构成:
对象名、句法、定义、访问方式和状态。
(1)对象名
在“object”下,数值化的对象标识符是与对象的正文描述成对出现的
例子:
atIndex{atEntryl}
(2)句法
使用A5N.1句法类型描述上述内容
(3)定义
描述被管对象的正文存储于这个字段中
(4)访问方式
定义对象的访问字段为只读、只写、读写或不可访问
(5)状态
对象状态字段包含着有关它的至要性的信息。
状态字段可以有以下值
①必备(Mandatory),在每一个实现中必须存在;
②可选(Ophtional),这一对象的集成是每个实现可选的;
③作废(0bsolete),这个对象不再使用。
2.3抽象句法表示法(ASN.1)
1)ASN.1规则
ASN.1定义了一些规则,这些规则对于理解SNMP是极其重要的:
①标准描述了许多已定义的ASN.1类型;
②ASN.1类型名总是用大写字母打头;
③一律用大写字母显示某些保留字。
这些保留字在标准中是有专门含义的;
④某些名字用小写保留字开头。
这些名字仅为增强ASN.1表示法的易读而引入。
2)模版
SMI把被管对象的所有属性定义为一组数据(模板)。
这些模板由5个部分构成:
对象描述、句法、定义、访问方式和对象的状态。
对象棋板句法定义对象的ASN.L编码(Integer、ObjectString、NULI、NetworkAddress、IPAddress、Counter、Gauge、TimeTicks、opaque)。
2.4编码
SNMP协议的所有对象类型是根据Iso8824标准,即《抽象句法表示法1的基本编码规则规范》编码的。
正如在基本编码规则BEE中定义的,AsN.1数据总是用传入数据网的最有效位即最高位,作为第一个值。
如下左图中所示,位8—1总是按从左到右的顺序传送到下一最低协议层。
位8是最高位,位l是最低位。
相应地,这一协议消息的接收者将按顺序的数据流传输位8—1。
所有其他位序,例如,以字节右边为最高位(位1)是非法的。
不同于TcP/四协议,sNMP消息没有固定格式的头。
根据ASN.1的基本编码规则(BER),SNMP把每一数据类型划分成3个字段:
标识字段、长度字段和数据字段(见下右图)。
1)标识字段
标识字段定义朋N.1类型。
对于所有的sNMP协议类型,标识字段都划分为元素类字段、格式化位和标识号字段几部分。
(1)类
标识字段中前两个最高佐(位8和7)描述了标识值的类型。
(2)格式化位
标识字段中的位6称为格式位(F_bit)。
F_bit用以区分下面的标识数值的原语和复合编码。
对于前者,F_bit被置成0;对于后者,F_bit置成l。
(3)标识号字段
标识号字段(位5—1)按二进制数显示标识数值TagNumbers。
该字段总是从左到右编码,从最有效位5开始往下到最低有效位1(位1)。
由于用这5个位只能表示0一3l的数值而且保留二进制值11111为较大的标识值所用,故实际上只能表示0一30的值。
所有更大标识号值用接下来的数据字节代替(如图)。
在这种情况下,最有效的位(位8)总是置为0值。
2)长度字段
在ASN.1中,信息按两种不同类型的长度字段传输,分别称为“确定的形式”和“不确定的形式”。
简单网络管理协议只提供确定形式,即用一个或多个字节定义在随后的信息字段中数据字节数。
长度字段的第一个字节的高位作用在于区别长度字段中有一个字节还是多个字节。
(1)单字节长度字段
如果在倍息字段(位1—7)中的信息长度为0一127个字节之间,则数据字节的个数可以用1个字节的长度字段定义。
长度字段首字节中高位置为0以指明是一个短格式。
(2)多字节长度宁段
如果在信息字段中的数据字节数超过127,需要用若干字节表示长度。
多字节数据字段也称为长格式。
此时,长度字段的第一个字节的高位总是置成1以表明长格式。
在第一个字节中所有其他位(位l一7)按二进制形式定义为后随字节长度的个数。
因为IP协议最多只能处理6E535个字节的数据报,所以SNMP协议多字节长度字段限制为最大3个字节。
3)数据字段
ASN.1的独立功能在数据字段中进行编码。
SNMP协议只提供以下原语类型:
Integer、Null、ObjectIdentifier、Octetstring、Sequence和Sequenceof。
2.5管理信息库
被管对象的总和称为管理信息库(MIB)。
当若干年前定义sNMP时,sNMP协议作者的意图是最大程度地实现简单性和可移植性。
这一概念促使sNMP协议成为网络管理的市场标准。
在SNMP协议早期,管理信息库(MIB)就已经是一个基本部件,在RFCl066中,公布了第一组被管对象,为《基于TCP/IP的因特网的网络管理的管理信息库》的文档。
这个管理信息库被认为是MIBI。
MIBI包含了8个对象组,约100个对象。
在1990年5月,MIBH(RFCll58)取代了MIBI。
MIBII引入了3个新的对象组并引入很多新的对象从而扩展了MIBI已有的对象组。
MIBII划分为以下子组:
系统(Sys)、接口(if)、地址转换(AT)、因待网协议(IP)、因持网控制报文协议〔ICMP〕、传输控制协议(TCP)、用户数据报协议(uDP)、外部网关协议(EGP)、在TcP/IP上实现的公共管理信息协议(CMOT)、传输(Trans)和简单网络管理协议(SNMP)。
下图为MIB的分层结构
2.6SNMP报文
SNMPPD结构如下:
(编码之前)V1中有5中报文;V2增加了GetBulkRequest和InformRequestPDU。
下图为SNMPV1的GetRequstPDU形式:
2.7.SNMP的运行过程
驻留在被管设备上的AGENT从UDP端口161接受来自网管站的串行化报文,经解码、团体名验证、分析得到管理变量在MIB树中对应的节点,从相应的模块中得到管理变量的值,再形成响应报文,编码发送回网管站。
网管站得到响应报文后,再经同样的处理,最终显示结果。
下面根据RFC1157详细介绍Agent接受到报文后采取的动作:
首先解码生成用内部数据结构表示的报文,解码依据ASN.1的基本编码规则,如果在此过程中出现错误导致解码失败则丢弃该报文,不做进一步处理。
第二步:
将报文中的版本号取出,如果与本Agent支持的SNMP版本不一致,则丢弃该报文,不做进一步处理。
当前北研的数据通信产品只支持SNMP版本1。
第三步:
将报文中的团体名取出,此团体名由发出请求的网管站填写。
如与本设备认可的团体名不符,则丢弃该报文,不做进一步处理,同时产生一个陷阱报文。
SNMPv1只提供了较弱的安全措施,在版本3中这一功能将大大加强。
第四步:
从通过验证的ASN.1对象中提出协议数据单元PDU,如果失败,丢弃报文,不做进一不处理。
否则处理PDU,结果将产生一个报文,该报文的发送目的地址应同收到报文的源地址一致。
根据不同的PDU,SNMP协议实体将做不同的处理:
1)、GetRequestPDU:
第一种情况:
如果PDU中的变量名在本地维护的MIB树中不存在,则接受到这个PDU的协议实体将向发出者发送一个GetResponse报文,其中的PDU与源PDU只有一点不同:
将ERROR-STATUS置为noSuchName,并在ERROR-INDEX中指出产生该变量在变量LIST中的位置。
第二种情况:
如果本地协议实体将产生的响应报文的长度大于本地长度限制,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为tooBig,ERROR-INDEX置为0以外,与源PDU相同。
第三种情况:
如果本地协议实体因为其他原因不能产生正确的响应报文,将向该PDU的发出者发送一个GetResponse报文,该PDU除了ERROR-STATUS置为genErr,ERROR-INDEX置为出错变量在变量LIST中的位置,其余与源PDU相同。
第四中情况:
如果上面的情况都没有发生,则本地协议实体向该PDU的发出者发送一个GetResponse报文,该PDU中将包含变量名和相应值的对偶表,ERROR-STATUS为noError,ERROR-INDEX为0,request-id域的值应与收到PDU的request-id相同。
2)、GetNextRequestPDU
GetNextRequest
PDU的最重要的功能是表的遍历,这种操作受到了前面所说的管理变量的表示方法的支持,从而可以访问一组相关的变量,就好象他们在一个表内。
下面通过一个例子解释表遍历的过程:
被管设备维护如下路由表:
DestinationNextHopMetric
10.0.0.9989.1.1.425
9.1.2.399.0.0.33
10.0.0.5189.1.1.425
假设网管站欲取得这张路由表的信息,该表的索引是目的网络地址。
网管站向被管设备发送一个GetNextRequestPDU,其中的受管对象的标识如下
GetNextRequest(ipRouteDest,ipRouteNextHop,ipRouteMetric1)
SNMPagent响应如下GetResponsePDU:
GetResponse((ipRouteDest.9.1.2.3="9.1.2.3"),
(ipRouteNextHop.9.1.2.3="99.0.0.3"),
(ipRouteMetric1.9.1.2.3=3))
网管站继续:
GetNextRequest(ipRouteDest.9.1.2.3,
ipRouteNextHop.9.1.2.3,
ipRouteMetric1.9.1.2.3)
agent响应:
GetResponse((ipRouteDest.10.0.0.51="10.0.0.51"),
(ipRouteNextHop.10.0.0.51="89.1.1.42"),
(ipRouteMetric1.10.0.0.51=5))
值得注意的是agent必须能够确定下一个管理变量名,以保证所有变量能被取到且只被取到一次。
网管站继续:
GetNextRequest(ipRouteDest.10.0.0.51,
ipRouteNextHop.10.0.0.51,
ipRouteMetric1.10.0.0.51)
agent响应:
GetResponse((ipRouteDest.10.0.0.99="10.0.0.99"),
(ipRouteNextHop.10.0.0.99="89.1.1.42"),
(ipRouteMetric1.10.0.0.99=5))
网管站继续
GetNextRequest(ipRouteDest.10.0.0.99,
ipRouteNextHop.10.0.0.99,
ipRouteMetric1.10.0.0.99)
这时因为路由表中所有的行都被取遍,agent因返回路由表对象的下一字典后继即该管理对象在MIB树中的后序遍历的直接后继。
这里应是nettoMediaIndex,管理对象的OBJECT
IDENTIFIER。
这个响应通知网管站对表的遍历已经完成。
3)、GetResponsePDU
GetResponsePDU只有当受到getRequestGetNextRequest
SetRequest才由协议实体产生,网管站收到这个PDU后,应显示其结果。
4)、SetRequestPDU
SetRequestPDU除了PDU类型标识以外,和GetRequest相同,当需要对被管变量进行写操作时,网管站侧的协议实体将生成该PDU。
对SetRequest的响应将根据下面情况分别处理:
(1).如果是关于一个只读变量的设置请求,则收到该PDU的协议实体产生一个GetReponse报文,并置error
status为noSuchName,errorindex的值是错误变量在变量list中的位置。
(2).
如果被管设备上的协议实体收到的PDU中的变量对偶中的值,类型、长度不符和要求,则收到该PDU的协议实体产生一个GetReponse报文,并置error
status为badValue,errorindex的值是错误变量在变量list中的位置。
(3).如果需要产生的GetReponse报文长度超过了本地限制,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为tooBig,errorindex的值是0。
(4).如果是其他原因导致SET失败,则收到该PDU的协议实体产生一个GetReponse报文,并置errorstatus为genErr,
errorindex的值是错误变量在变量list中的位置。
如果不符合上面任何情况,则agent将把管理变量设置收到的PDU中的相应值,这往往可以改变被管设备的运行状态。
同时产生一个GetResponse
PDU,其中errorstatus置为noError,errorindex的值为0。
4)、TrapPDU
V1中的TrapPDU,它与V1中其他类型的PDU的形式并不一致。
V2中的TrapPDU,它与V2中其他类型的PDU的形式是一样的。
Trap是被管设备遇到紧急情况时主动向网管站发送的消息。
网管站收到trapPDU后要将起变量对偶表中的内容显示出来。
一些常用的trap类型有冷、热启动,链路状态发生变化等。
5.SNMP在数据通信产品中的实现
目前数据通信产品(如路由器、接入服务器、ATM)对于SNMPagent一侧的实现是以PSOSSNMPVersion1函数库为基础,以
EpilogueMIB编译器为辅助工具。
AGENT与协议模块以函数接口。
并以协议软件TCP/IP
作为下层支持。
以路由器为例:
Agent以一个独立的任务出现,经初始化后阻塞在UDP
161端口,一旦有来自网管站的请求报文,agent将进行解码、分析、并通过一个socket调用ioctl(int,int,char
*),与其他协议模块接口。
其他模块根据该函数第二个参数(为一个命令字),将管理变量当前的值填入char
*所指向的数据结构。
再经agent编码,发送给网管站。
后者往往是一台具有网管平台如netview的工作站。