简单网络管理协议SNMP,简单网络管理协议snmp最容易被蛮力攻击
本作品内容为简单网络管理协议SNMP,格式为 doc ,大小 502784 KB ,页数为 30页
('内部公开▲SNMP1概述..........................................................................................................................................................12SNMP的工作原理..................................................................................................................................12.1网络管理模型.................................................................................................................................12.2网络管理协议结构.........................................................................................................................22.3网络管理服务.................................................................................................................................32.4委托代理.........................................................................................................................................43管理信息结构SMI.................................................................................................................................43.1ASN.1..............................................................................................................................................43.2文本约定.........................................................................................................................................53.3对象定义.........................................................................................................................................63.4TRAP定义........................................................................................................................................63.5对象标志符.....................................................................................................................................73.6表对象的定义.................................................................................................................................83.7对象和对象实例的区别...............................................................................................................103.8OID的字典序................................................................................................................................104协议数据单元(PDU--PROTOCOLDATAUNIT)........................................................................104.1SNMP报文格式............................................................................................................................104.2SNMP报文类型............................................................................................................................114.3SNMPV2基本的PDU格式..........................................................................................................124.4SNMP消息的生成........................................................................................................................134.5SNMP消息的接受和处理............................................................................................................135SNMP协议操作....................................................................................................................................155.1GETREQUEST..................................................................................................................................155.1.1GetRequest—PDU报文格式....................................................................................................155.1.2SNMPv2对GetRequest-PDU的处理(参考RFC1905)......................................................155.1.3SNMPv1对GetRequest-PDU的处理(参考RFC1157).......................................................165.2GETNEXTREQUEST—PDU.............................................................................................................165.2.1GetNextRequest报文格式.........................................................................................................175.2.2SNMPv2对GeNextRequest-PDU的处理(参考RFC1905)................................................175.2.3SNMPv1对GeNextRequest-PDU的处理(参考RFC1157)................................................18ZTE中兴版权所有不得外传内部公开▲5.3RESPONSE-PDU..............................................................................................................................185.3.1Response报文格式...................................................................................................................185.3.2SNMPv2对Response-PDU的处理(参考RFC1905)..........................................................205.3.3SNMPv1对响应报文GetResponse的处理(参考RFC1157)..............................................205.4SETREQUEST-PDU.........................................................................................................................205.4.1SetRequest报文格式.................................................................................................................205.4.2SNMPv2实体对SetRequest报文的处理(参考RFC1905).................................................215.4.3SNMPv1对SetRequest报文的处理(参考RFC1157).........................................................225.5GETBULKREQUEST-PDU...............................................................................................................235.5.1GetBulkRequest-PDU报文格式...............................................................................................235.5.2SNMPv2对GetBulkRequest-PDU报文的处理(参考RFC1905).......................................245.6INFORMREQUEST-PDU..................................................................................................................255.6.1InformRequest-PDU的格式.....................................................................................................255.6.2SNMPv2对InformRequest-PDU的处理(参考RFC1905).................................................265.7TRAP-PDU.....................................................................................................................................265.7.1SNMPv1的Trap........................................................................................................................265.7.2SNMPv2的SNMPv2-Trap-PDU...............................................................................................286SNMP的安全控制................................................................................................................................296.1SNMPV2-基于共同体的管理框架...............................................................................................296.2SNMPv3的安全策略....................................................................................................................30ZTE中兴版权所有不得外传内部公开▲1概述简单网络管理协议(SNMP)由internet活动委员会(IAB)制定,是Internet组织用来管理TCP/IP互联网和以太网的网络管理协议,它最初是作为一种可提供最小的网络管理功能的临时方法开发的。SNMP使用的管理信息结构(SMI)和管理信息库(MIB)提供了一组监控网络元素的最小的,但功能强大的工具。它的结构十分简单,能够简单快速地实现。因而SNMP在网络管理领域得到了广泛的接受,已经成为事实上的国际标准。SNMP目前包括三个版本:SNMPv1、SNMPv2、SNMPv3。SNMPv2是SNMP的后续版本,它对SNMP进行了大量的功能增强,并在某种程度上保持了简单和易于实现的特点。IETF最初在RFC2441—RFC1452中定义了SNMP的一系列规范,随后在RFC1901—1910中发布了更新版本,并成为IAB的推荐标准。稍后IETF又相继发布了网络管理的一系列标准管理信息库,为SNMP开发人员提供了MIB定义和操作的规范。本章将重点介绍SNMPv2,并增加了SNMPv3安全管理的内容。2SNMP的工作原理2.1网络管理模型SNMP的体系结构是基于一个或多个网络管理站以及若干个网络元素组成的模式,见图1。网络管理站的任务是监督和控制网络元素。连接到网络中的、拥有一个或多个网络管理代理的任何设备,都可称为网络元素。代理充当所有网络管理功能的智能前端处理机。这意味着某些网络管理任务被转发给代理并在网络元素中处理。代理与网络管理站之间的通信则是由SNMP协议控制。在SNMP的管理者—代理模型如下图所示:ZTE中兴版权所有不得外传内部公开▲SNMP采用了面向对象的网络管理方法,这种方法把被管理的网络资源抽象为管理对象,把对网络实体的管理和操作转化为对管理对象的操作,不同对象之间的相互作用和相互通信就构成了一个完整的管理系统。其核心思想是:在每个网络节点上存在一个管理信息库MIB,即所有管理对象的集合。从管理者的观点看,所有的网络管理操作都通过对MIB对象的读写,创建和删除完成。MIB由节点上的SNMP代理负责维护,SNMP代理使用SNMP网络管理协议与管理者进行信息交互,把来自管理者的命令或请求转换为本设备特有的指令,完成管理者的指示,并对MIB对象进行相应的修改。SNMP管理者负责对网元进行全面管理和控制,它使用SNMP协议发出管理操作的指令,并接受来自SNMP代理的通知。2.2网络管理协议结构SNMP使用UDP作为传输层协议.UDP只提供无连接的服务,因此SNMP不需要在代理和管理者之间保持联接.SNMP实体发送消息后不需等待应答,可以继续发送其它消息或进行其它动作.SNMP并不要求消息的可靠性,消息可能被底层的传输服务丢失,因此可靠性的实现应由SNMP发送实体根据消息的重要性自行决定。此外,SNMP使用ISO的抽象语法标记ASN.1的一个有限子集定义MIB对象的语法,并用与ASN.1相关的基本编码规则BER作为表示层协议,对对象进行编码.根据ISO的七层协议参考模型,SNMP属于应用层的协议,它的体系结构如下图所示:ZTE中兴版权所有不得外传内部公开▲2.3网络管理服务综合起来,SNMPv2支持的基本操作由三种:GET,SET和TRAP。Get操作用于从拥有SNMP代理的网络设备中获取信息。能够交换的信息很多,如系统的名字,系统自启动后正常运行的时间,系统的性能数据等等。管理者能够获取的信息内容由代理提供的MIB对象决定,代理可以通过对MIB对象读写权限的设置和SNMP的安全机制控制管理者的访问。涉及GET操作的协议消息由四种,其中,Get-Rrequest用来检索MIB标量对象的值,GetBulk-Request用来检索一批MIB对象的值,GetNext-Request则是请求MIB中下一个标量对象的值,SNMP代理则以Get-Response消息响应管理者的命令。管理者通过轮询挨个索取各个代理上的MIB对象值,从而掌握设备的全部图景。特别值得注意的是,GetNext_Request消息为管理者提供了在不知道一个MIB对象的情况下检索该对象的能力。管理者可以利用此消息来遍历一个未知MIB并发现它的结构。因此,开发人员就有可能开发出独立通用的SNMP管理程序,在一定程度上能够管理所有的SNMP代理。管理者使用SET操作可以对一个设备上的参数进行远程配置。如,设置系统的名字,设置系统的负责人信息,在管理上开启或关闭一个信道,建立或拆除一个交叉联接,设置性能数据的阈值等。SNMP同样以Get-Response消息响应管理者的SET命令。SNMP陷阱(TRAP)是代理主动发送给管理者的非请求消息。这些消息通知管理者发生了一个特定的事件,所有可以发送的陷阱消息也必须是MIB已经定义的。发送的陷阱消息可以是ZTE中兴版权所有不得外传内部公开▲告警,如温度过高,联接失败等,也可以是一些事件通知,如系统启动,联接建立等。轮询和TRAP机制相结合,使基于SNMP的管理达到较好的管理效果。以节省网络带宽和代理的处理时间。2.4委托代理使用SNMP要求所有管理者和代理都支持UDP和IP,这就限制了它对其它不支持TCP/IP协议的网络设备的直接管理。为了实现对这些设备的管理,提出了委托代理(proxy)的概念。委托代理将SNMP管理者发出的SNMP消息转换为设备特定的消息格式,从而使管理者能够管理其他多种类型的设备。此外,委托代理可以提供到多个设备的管理访问。管理者只需和一个委托代理通信,就可以管理多个设备,这样就大大减少了管理信息的传输量,减轻了网络的负担。特别是当管理者和被管设备处于不同子网和区域时,它的好处更加明显。3管理信息结构SMI在SNMP中,管理信息被视为所有管理对象的集合,它们构成了一个虚拟的信息存储区域,称之为“管理信息库(MIB)”。SNMP采用抽象语法表示(AbstractSyntaxNotationOne)ASN.1来定义这些管理对象。所谓管理信息结构(ManageInformationStructure)SMI,就是使用ASN.1来描述管理对象的方法和组织形式。为了便于理解SNMP,我们必须先对ASN.1由一个大致的了解。3.1ASN.1ASN.1属于表示层协议,他定义了一些基本的数据类型和由此组何出复杂数据类型的方法。它可以用来作为数据结构的描述和类型标志,其上的应用层协议使用这些数据类型定义自己特有的协议数据单元。从概念上看,它有些类似于高级程序设计语言的数据类型定义,实际上,ASN.1正是吸收了许多高级程序设计语言的类型说明方法,以便能够与程序语言数据类型方便的对应,以利于程序实现。ASN.1采用基本编码规则(BasicEncodeRule)BER,将用ASN.1书写的数据结构变换为字符流以准备传送。ASN.1允许用户在它的基础尚自己定义其他数据类型。ASN.1采用一个字节来作为数据类型的标记,其中由大量的保留标记用以定义新的数据类型。BER定义了如何将ASN.1描述的数据结构表示为字节流,使得发送方和接收方都能够正确的将传送的字节流和特定的ASN.1类型的值一一对应起来。BER的编码结构如下:类型长度内容类型用一个字节表示,它决定了内容如何解释。内容有0到多个字节表示。为简单起见,SNMP并不支持ASN.1的全部数据类型,而是只使用了它的一个子集.在RFC1902中,定义了SNMP使用的全部标量数据类型,包括ASN.1定义的基本数据类型和SNMP在此基础上扩充的数据类型.企业自定义的MIB标量对象必须是以下这些数据类型.\uf06cINTEGER:32Bit整数,(-2147483648..2147483647)。\uf06cInteger32:32Bit整数,(-2147483648..2147483647)。\uf06cUnsigned32:无符号32Bit整数,(0..4294967295)。\uf06cOCTETSTRING:字符串,SIZE(0..65535)。最好在255以内。\uf06cNULL:空类型。ZTE中兴版权所有不得外传内部公开▲\uf06cObjectID:对象标识,最大32Bit。\uf06cIPAddress:32Bit的IP地址。\uf06cCounter32:32Bit的计数器,从0递增,到达最大值后回到0,然后再递增.\uf06cCounter64:64Bbit计数器。\uf06cGauge32:测量值,为32Bit非负整数,可以递增或者递减.\uf06cTimeTicks:32Bit非负整数,代表从某一刻开始后流失的时间,单位以1/100秒计\uf06cBITS:位串。除了这些简单类型以外,ASN.1还支持复杂数据类型的定义。ASN.1提供的复杂数据类型有:SEQUENCE,SEQUENCEOF,SET,SETOF,CHIOCE。它们的含义分别为:\uf06cSEQUENCE:类似于C语言的结构struct或是pascal语言的记录record。\uf06cSEQUENCEOF:类似于数组。\uf06cSET:集合。集合中的元素是不同类型的。\uf06cSETOF:集合。集合中的元素是相同类型的。\uf06cCHIOCE:选择,类似于c语言的联合union。在snmp中,只有SEQUENCE和SEQUENCEOF。3.2文本约定在设计一个MIB时,为了增加MIB的可读性,经常需要定义一些新的数据类型.这些类型在语法上等同于上节的基本数据类型,采用同样的ASN.1编码格式,但是有不同的名字和更加精细的语法,用于表示某些特定的管理资源.这种新数据类型在SNMP中称为文本约定(textualconvention),在某种程度上可以理解为C语言中的宏或者是typedef.文本惯例定义的语法结构如下:TYPENOTATION::=TEXTUAL-CONVENTIONDISPLAY-HINTTextemptySTATUS"current""deprecated""obsolete"DESCRIPTIONTextREFERENCETextemptySYNTAXtype其中,各部分的解释为:\uf06cDISPLAY-HINT:该类型的数据的显示格式。\uf06cSTATUS:该文本约定的状态。"current"表明正在使用,"obsolete"表明该定义已经过时了,"deprecated"表明虽然该定义已经过时了,但是出于兼容性的考虑仍然可以予以实现。\uf06cDESCRIPTION:文字描述。\uf06cREFERENCE:参考。\uf06cSYNTAX:该文本约定的基本数据类型。ZTE中兴版权所有不得外传内部公开▲3.3对象定义在SNMP中,采用如下格式定义一个管理对象。OBJECT-NAMEOBJECT-TYPESYNTAXtypeMAX-ACCESS“not-accessible”“read-only”“read-write”“read-create”“accessible-for-notify”STATUS"current""deprecated""obsolete"DESCRIPTIONTextemptyREFERENCETextempty::={xxxn}其中,各部分的解释为:\uf06cOBJECT-NAME:对象名。\uf06cSYNTAX:该对象的数据类型。\uf06cMAX-ACCESS:该对象的访问权限。“not-accessible”表明该对象不能够被任何manager访问;“read-only”表明该对象是只读的;“read-write”表明该对象可以被读写;“read-create”表明该对象可以被读写、创建和删除;“accessible-for-notify”表明该对象只能包含在通知中。\uf06cSTATUS:该对象的状态。"current"表明正在使用,"obsolete"表明该定义已经过时了,"deprecated"表明虽然该定义已经过时了,但是出于兼容性的考虑仍然可以予以实现。\uf06cDESCRIPTION:文字描述。\uf06cREFERENCE:参考。\uf06c{xxxn}:对象标识符,这将在下面详细解释。3.4Trap定义在SNMP中,采用如下格式定义一个通知:NOTIFICATION-NAMENOTIFICATION-TYPEOBJECT{object1,…,objectn}emptySTATUS"current""deprecated""obsolete"DESCRIPTIONTextemptyREFERENCETextempty::={xxxn}其中,OBJECT子句表明了该通知中应该附带的对象。在一条通知的实例中,附带的第一个对象实例是当前时间,然后是该通知的标志,然后顺序天加上OBJECT子句中列出的对象的实例。其他子句的解释同对象定义的相同,这里就不再多说。ZTE中兴版权所有不得外传内部公开▲3.5对象标志符所有采用ASN.1描述的MIB都使用ASN.1定义的属性结构组织管理信息。每一个管理信息是树中的一个节点,每个节点的标志包括:一个整数和一个字符串描述。对于每一个节点,从树根到该节点都有一条唯一路径,这条路径上的每一个节点都对应到一个整数。这样,从树的根部开始,每一个节点都唯一对应到一组整数,这一组整数就是该节点的对象标识符(ObjectIdentifier)OID。这样的一棵树成为管理信息树MIT或MIB树。在SNMP中,所有的管理对象都是MIB树的叶子节点。这样,每一个管理对象都拥有一个唯一的OID,在SNMP的报文中就通过这个OID标志该管理对象,使得发送方和接收方都能够理解,而且不会产生歧义。在对象的定义中,{xxxn}就指明了该对象的OID,其中xxx为它在MIT中的父亲节点,n为一个整数。注意,该整数在它的兄弟节点中不能重复,以保证惟一性。由父亲节点的OID加上这个整数,就构成了该节点的OID。OID的显示格式为:依次排列各个整数,各个数字之间用句点隔开。ASN.1的MIT是唯一的,所有采用ASN.1作为表示层协议的应用层协议都拥有这棵树的一部分。例如:Q3和SNMP中定义的管理对象都能够在这棵树中找到自己的位置而不重复。下图是MIT的一部分:上图中,sysUpTime是一个snmp的管理对象,表示系统时间。它的OID为:1.3.6.1.2.1.1.3。3.6表对象的定义上例中的sysUpTime在snmp中被称为标量对象,用我们熟悉的c语言作类比,他大概相当于如下的普通变量:inttime;ZTE中兴版权所有不得外传内部公开▲在snmp中,ASN.1的数据类型相当于int,对象相当于变量。有时候,定义类似于数组变量那样的对象是必须的,在snmp中,采用表对象解决这个问题。以下是一个表对象的具体例子:sysORTableOBJECT-TYPESYNTAXSEQUENCEOFSysOREntryMAX-ACCESSnot-accessibleSTATUScurrentDESCRIPTION"……"::={system9}sysOREntryOBJECT-TYPESYNTAXSysOREntryMAX-ACCESSnot-accessibleSTATUScurrentDESCRIPTION"……"INDEX{sysORIndex}::={sysORTable1}SysOREntry::=SEQUENCE{sysORIndexINTEGER,sysORIDOBJECTIDENTIFIER,sysORDescrDisplayString,sysORUpTimeTimeStamp}sysORIndexOBJECT-TYPESYNTAXINTEGER(1..2147483647)MAX-ACCESSnot-accessibleSTATUScurrentDESCRIPTION"……"::={sysOREntry1}sysORIDOBJECT-TYPESYNTAXOBJECTIDENTIFIERMAX-ACCESSread-onlySTATUScurrentDESCRIPTION"……"::={sysOREntry2}sysORDescrOBJECT-TYPESYNTAXDisplayStringMAX-ACCESSread-onlySTATUScurrentDESCRIPTION"……"::={sysOREntry3}sysORUpTimeOBJECT-TYPESYNTAXTimeStampMAX-ACCESSread-onlySTATUScurrentDESCRIPTION"……"::={sysOREntry4}ZTE中兴版权所有不得外传内部公开▲在上例中,定义了四个简单对象sysORIndex,sysORID,sysORDescr,sysORUpTime,我们称之为列对象。此外,定义了一个类型为SEQUENCE的对象sysOREntry,它包含了以上四个列对象,我们称之为行对象;定义了一个类型为SEQUENCEOFSysOREntry的对象sysORTable,我们称之为表对象。为了便于理解,我们将以上的定义用c语言重新写一遍(不是完全的一一对应,只是大致在概念上类似):struct{intsysORIndex;oidsysORID;charsysORDescr;intsysORUpTime}sysORTable[n];其中,sysOREntry大概相当于结构数组中的一个数组元素。注意到,行对象和表对象的访问权限都是not-accessible,它们对于manager是不可见的。对于manager来说,能够访问的只是一个一个的列对象。每个表对象都有索引对象,用来区分表中不同的行。索引在行对象的定义中用index子句声明。在上例中,索引对象为sysORIndex。索引对象可以是一个,也可以是多个。3.7对象和对象实例的区别由于表对象的出现,使得一个列对象的OID可能对应到实际的多份管理信息,产生了歧义。为了解决这个问题,引入了对象实例的概念。一个对象实例是对象的具体化。一个列对象可能拥有多个对象实例。例如,在上面的例子中,假设sysORTable中有5行,则列对象sysORUpTime相应的有5个对象实例。以c语言来说明,如果在c语言中定义了一个数组:inta[5],则对象和对象实例的区分有些类似于a和a[0]的区别。对于一个标量对象,只拥有一个实例,这种情况下对象和对象实例是一一对应的。实际上,对于manager来说,所能够访问的只是对象实例,这种情况下,对象实例也要有自己的OID。列对象的对象实例的OID是对象的OID加上它的索引对象的值。在上例中,sysORUpTime的OID为1.3.6.1.2.1.1.9.1.1.4,简记为xxx,表中有5行,每行的索引对象sysORIndex的值分别为1,2,3,4,5,则sysORUpTime拥有5个实例,其OID分别为:xxx.1,xxx.2,xxx.3,xxx.4,xxx.5。对于标量对象,其对象实例的OID为对象的OID加上0,如yyy.0的形式。3.8OID的字典序OID可以排序,称之为字典序。我们用一个例子就可以简单的说明排序的原则:1.3.6<1.3.6.0<1.3.6.2<1.3.7实际上,所谓mib就是所有对象实例的集合。把这些对象实例按照oid的字典序排序,整个mib就构成了一个大的一维表格。因此,manager可以根据字典序对mib进行串行访问。4协议数据单元(PDU--ProtocolDataUnit)4.1SNMP报文格式一个SNMP报文由一个版本标识符(versionidentifier),一个SNMP共同体标识符ZTE中兴版权所有不得外传内部公开▲(communityname)和一个数据字段(PDU)组成。versioncommunityPDU\uf0a7版本标识符(versionidentifier)------此版本字段指明所用的SNMP版本。SNMPv1的版本号总取值为0,SNMPv2取值为1。\uf0a7共同体标识符(communityname)------每一个SNMP通信组,都拥有一个八进制串形式的无二义的共同体名(communityname),它与每一条消息一起传输。在SNMPv1里,网管站与代理之间的通信关系被定义为相同共同体之间的关系,代理仅仅执行属于同一共同体的网管站的全部管理操作。管理操作在本代理所实现的全部对象级上发挥作用,并且直接由分配给每一共同体的共同体概要(communityprofile)加以过滤。在SNMPv2c中,提供共同体名用来区分不同的管理集合,把与一个任务相关的所有对象用共同体名加以标识,表示它们是同一个组的。在消息的发送和接收时都带有这个字段,用于接收方和发送方辨别报文的权限。这样可以避免与管理任务无关的SNMP协议实体冒充管理者对代理发送假的命令。\uf0a7数据字段(PDU)------SNMP消息在数据字段中进行编码。4.2SNMP报文类型在SNMPv1中,定义了5种协议的操作,它们在RFC1157中有具体的描述。这些消息分别是:\uf0a7GetRequest------使网管站能请求从代理的MIB中读取一个指明的变量。\uf0a7GetNextRequest------使网管站能够从某个MIB中获取几个相邻的变量。\uf0a7GetResponse------代理对一个读取操作的回答。在SNMPv2中,它被重定义为Response。\uf0a7SetRequest------网管站对一个设备中代理维护的参数进行远程配置,使代理MIB里的一个变量的值能够被改变,例如,可以设置设备的名字、关掉一个端口或清除一个地址解析表中的项,代理从应答(GetResponse)命令也可获得此命令的执行结果。\uf0a7Trap------是SNMP代理发送给管理站的请求信息,通知管理站发生了一个特定的事件(报警等)。在SNMPv2中,它被重定义为SNMPv2-Trap。在SNMPv2中,又加入了两个新的操作,具体的操作可参考RFC1905。新加入的这两个操作分别是:\uf0a7GetBulkRequest------它是对GetNextRequest的推广。它可以对大量的数据尤其是表格进行更为有效的读取。GetNextRequest一次只能读取一个MIB变量,而GetBulkRequest一次可以读出一个表格所维护的所有MIB变量。与GetNextRequest相比,GetBulkRequest操作中通过网络发送的包更少,基本重复操作仅局限于代理中。\uf0a7InformRequest------在SNMPv2中,抛弃了代理(服务器)和网络管理者(客户)的严格划分,利用管理者—管理者通信模型,通过为对象变量的值规定上限和下限,可以在管理者/代理上设置告警(alarms)。如果阈值被突破,则高层管理站会通过InformRequest得知这一事件。InformRequest总是被接受者以Response加以确认。SNMPv1的设备仅能完成管理者的功能或代理功能,而在SNMPv2中提出的管理者-管理者模型,使网管站可以同时起到代理或管理者的作用。双代理指管理站可以向其他管理站提供ZTE中兴版权所有不得外传内部公开▲信息,即通过代理功能唤醒的服务要传递给更高层的代理,而这些代理将该高层代理当作它们的网管站。下表列出了管理者和代理各自所能涉及的功能。管理站和代理处理的报文功能管理站代理接收ResponseInformRequestSNMPv2TrapGetRequestGetNextRequestGetBulkRequestSetRequest发送GetRequestGetNextRequestGetBulkRequestSetRequestInformRequestResponseResponseSNMPv2Trap4.3SNMPv2基本的PDU格式变量绑定表的最大绑定数N为2147483647。一个变量绑定一般由一个name和一个value组成,当处理一个请求发生了意外时,value字段的类型标记填入错误描述(noSuchObject、noSuchInstance或endOfMibView)组成。在发送请求报文时,只有name字段有意义,可以忽略value,这时在value字段的类型标记填入NULL。SNMPv1的GetRequest、GetNextRequest、GetResponse和SetRequest具有和上面相同的格式,只是SNMPv1的Trap和它们有不同的格式,SNMPv1的Trap与SNMPv2的SNMPv2-Trap格式也不同。报文格式中各字段的含义分别为:\uf06cPDU类型。\uf06c请求标识符(Request-ID):它是一个32位的整数。在一个Response-PDU中的Request-ID值取它所回应的那个请求PDU的Request-ID值。生成Request-ID仅用于监视未完成的报文,这样一个SNMPv2应用就能够区分不同的请求报文,使接收的请求报文与相应ZTE中兴版权所有不得外传内部公开▲的应答报文相匹配。当使用不可靠的数据报服务时,报文可能会丢失或重复,Request-ID值提供了确认网络中重复的消息的一个方法,根据ID号可以很容易的检测出重复报文。在重传的请求报文中,SNMPv2报文应使用不同的Request-ID值。\uf06c错误状态(ErrorStatus)和错误索引(ErrorIndex):在一个响应报文Response-PDU中,非零的错误状态(ErrorStatus)值表示发生了额外的事件使得不能完成请求的操作。这时,错误索引(ErrorIndex)的非零值表示了引起这个额外事件的变量绑定表中的那个变量绑定的信息。一个变量绑定由它的索引值确定,变量绑定表中的第一个变量绑定序号为1,变量绑定表中的第二个变量绑定序号为2,以此类推。在变量绑定表:变量绑定表中包含许多个变量绑定{name,value},代表操作的变量。4.4SNMP消息的生成SNMP消息的生成过程如下图所示:Éí·ÝÑéÖ¤´¦Àí¹¹ÔìPDU¹¹ÔìSNMPÏûÏ¢±àÂëSNMPÏûÏ¢PDUIPAddress,PortAddressCommunityNameеÄPDUSNMPMessageSNNPprotocalstackÓ¦ÓÃʵÌåUDPÓû§ÇëÇóÃèÊöÐÅÏ¢ÒѱàÂëµÄSNMPÏûÏ¢1.根据用户信息构造PDU。2.将PDU,Communityname,源、目的传输地址送给身份验证处理模块。其可以根据需要作一些变换,例如对authenticationcode进行加密或inclusion等。1.构造SNMP消息,该消息由版本号,团体名和上面生成的新的PDU组成。利用基本编码规则编码SNMP消息,然后送到UDP发送处理模块。4.5SNMP消息的接受和处理SNMP消息的接收、处理过程如下图所示:ZTE中兴版权所有不得外传内部公开▲SNNPprotocalstackÉí·ÝÑéÖ¤´¦Àí´¦ÀíGet/GetNext/SetPDUÉú³ÉGet/GetNext/SetResponsePDUMIBInterfaceRoutines¹¹ÔìSNMPÏûÏ¢SNMPÏûÏ¢´¦Àí±àÂëSNMPÏûÏ¢UDPÊý¾Ý°ü½ÓÊÕ´¦ÀíUDPÊý¾Ý°ü·¢ËÍ´¦Àí½âÂëSNMPÏûÏ¢UDP1.UDP数据包接收处理模块在UDP的周知口接收SNMP消息。2.解码SNMP消息。3.SNMP消息处理模块对消息进行基本的语法检查,同时核实版本号。4.将CommunityName,PDU,源、目标传输地址送给身份验证处理模块,如果身份验证成功,身份验证处理模块返回一个PDU。如果验证失败,协议实体可决定是否发送身份验证失败trap。5.协议实体对PDU进行基本的语法检查。如果成功,则根据CommunityName使用合适的访问授权处理PDU。6.生成响应PDU.7.构造响应SNMP消息。8.编码SNMP消息。发送SNMP消息。ZTE中兴版权所有不得外传内部公开▲5SNMP协议操作5.1GetRequestGetRequest命令使得网管系统(客户)能够在一个SNMP代理(服务器)的MIB里获取一个指定的变量。对象标识符在这类报文中作为参量进行发送。作为对GetRequest的响应,客户方总是接收一个Response—PDU类型的报文。GetRequest—PDU的类型代码规定为0。除类型代码外,GetRequest报文还包括另外四个字段,请见报文格式。5.1.1GetRequest—PDU报文格式PDU类型(TYPE)0请求标识(RequestID)错误状态错误索引(errorstatus)(errorindex)00变量绑定表Variable-Bindings\uf0a7请求标识(RequestID)------用于监视未完成的报文。有了这一标记,SNMP就可以将应答与发出的请求对应起来。\uf0a7错误状态(errorstatus)------GetRequest-PDU中的错误状态(errorstatus)字段总为0。\uf0a7错误索引(errorindex)------GetRequest-PDU中的错误索引(errorindex)字段总为0。\uf0a7变量绑定(VariableBindings)------此字段定义所需的对象标识符。5.1.2SNMPv2对GetRequest-PDU的处理(参考RFC1905)SNMPv2协议实体当接收到一个GetRequest-PDU时,对变量绑定表中的每个变量绑定进行处理,生成一个Response-PDU。Response-PDU除了对以下几种情况设置的一些域的值有所不同外,其他域与接收到的GetRequest-PDU报文有相同的值。对每个变量绑定的处理如下:1)如果变量绑定的名字与接收到的请求报文要求的名字相同,则变量绑定的值设置为找到的变量(namedvariable)的值。2)如果变量绑定的名字的对象标识符前缀与接收到的请求报文的对象标识符前缀不同,则它返回的值为“noSuchObject”。3)否则,变量绑定的值设为“noSuchInstance”。如果不是以上的原因使检查变量绑定的过程失败,则对Response-PDU重新格式化,它的RequestID和VariableBindings域与接收到的GetRequest-PDU报文有相同的值,只是它的errorstatus值设为“genErr”,errorindex值设置为引起失败的变量绑定的索引值。否则,Response-PDU的errorstatus值设为“noError”,errorindex值设为0。ZTE中兴版权所有不得外传ResponseGetRequest管理站代理图4GetRequest的处理过程内部公开▲生成的响应报文Response-PDU将被封装成一个报文发送出去。如果这个报文的大小不超过本地对报文大小的限制,而且也不超过请求源的最大报文长度的大小,它就被发送到生成GetRequest-PDU的发起者那里。反之,则生成一个更改过的Response-PDU,它的RequestID和VariableBindings域与接收到的GetRequest-PDU报文有相同的值,只是它的errorstatus值设为“tooBig”,errorindex值设为0,而且清空变量绑定域。这个更改过的响应报文Response-PDU被封装成一个报文。如果这个报文的大小不超过本地对报文大小的限制,而且也不超过请求源的最大报文长度的大小,它就被发送到生成GetRequest-PDU的发起者那里,否则计数器snmpSilentDrops的值加1,并且丢弃该报文。5.1.3SNMPv1对GetRequest-PDU的处理(参考RFC1157)SNMPv1的GetRequest-PDU格式与SNMPv2相同,SNMPv1协议实体在接收到GetRequest-PDU报文时,对变量绑定表中的每个变量绑定进行处理,生成一个Response-PDU。Response-PDU除了对以下几种情况的一些域的值有所不同外,其他域与接收到的GetRequest-PDU报文有相同的值。对每个变量绑定的处理如下:1)如果变量绑定域的命名的对象名不与MIB视中得到的变量名完全匹配,则接收实体向发起请求方送出与GetRequest有相同格式的GetResponse-PDU,它的error-status为“noSuchName”,error-index为接收到的报文的对象名成分的索引(index)。2)如果变量绑定表中的对象是一个集合类型,则接收实体向发起请求方送出与GetRequest有相同格式的GetResponse-PDU,它的error-status为“noSuchName”,error-index为接收到的报文的对象名成分的索引(index)。3)如果生成的GetResponse-PDU报文长度超过逻辑上的限制,则接收实体向发起请求方送出与GetRequest有相同格式的GetResponse-PDU,它的error-status为“tooBig”,error-index为0。4)对变量绑定表中的任何对象来说,若返回的对象值不能由以上各规则进行重传,则接收实体向发起请求方送出与GetRequest有相同格式的GetResponse-PDU,它的error-status为“genErr”,error-index为接收到的报文的对象名成分的索引(index)。如果以上规则都不满足应用,则接收实体向发起请求方送出GetResponse-PDU,对接收到的消息的变量绑定的每个对象相应的GetResponse-PDU代表了变量的名称和值,它的error-status为“noErr”,error-index为0,GetResponse-PDU的request-id值为接收到消息的request-id值。5.2GetNextRequest—PDU该命令使得网管系统(客户机)能够查询MIB树型结构中下一个对象的值。在这种PDU中,以上次已知的对象标识符而不是所需对象标识符的值作为参量进行发送。它特别适合于遍历各个表或快速地查询连续对象。对不了解的对象,也可以针对其前一个对象发出GetNextRequest来得到它。作为对GetNextRequest的响应,客户方总是接收一个Response—PDU类型的报文。GetNextRequest—PDU的类型代码规定为1。除PDU类型代码外,GetNextRequest报文还包括另外四个字段,见报文格式。5.2.1GetNextRequest报文格式PDU类型请求标识错误状态错误索引变量绑定表ZTE中兴版权所有不得外传ResponseGetNextRequest管理站代理图5GetNextRequest的处理过程内部公开▲(TYPE)1(RequestID)(errorstatus)(errorindex)00VariableBindingsList\uf0a7请求标识(RequestID)------用于监视未完成的报文。有了这一标记,SNMP就可以将应答与发出的请求对应起来。\uf0a7错误状态(errorstatus)------GetNextRequest-PDU中的错误状态(errorstatus)字段总为0。\uf0a7错误索引(errorindex)------GetNextRequest-PDU中的错误索引(errorindex)字段总为0。\uf0a7变量绑定(VariableBindings)------此字段包含的是紧接所需对象之前的对象。GetNextRequest命令中的对象变量的值用相关ASN.1值进行编码。5.2.2SNMPv2对GeNextRequest-PDU的处理(参考RFC1905)当接收到一个GeNextRequest-PDU时,接收的SNMPv2实体对变量绑定表中的每个变量绑定进行处理,生成一个Response-PDU。Response-PDU除了以下几种情况的一些域值有所不同外,其他域与接收到的GeNextRequest-PDU有相同的值。每个变量绑定的处理如下:1)变量位于可得到的请求报文的所有变量名的列表中,并且它的名字是输入的GeNextRequest变量绑定名的第一个字典顺序的后继(firstlexicographicsuccessor),则相应的变量绑定名和值被设为本地变量名和值送到Response-PDU中发送。2)如果GeNextRequest-PDU请求的变量绑定的名不在可得到的字典顺序的变量名中,例如,无字典后继,则Response-PDU中变量的值设为“endOfMibView”,名字域设为与GeNextRequest-PDU相同的变量绑定名。如果不是以上的原因使变量绑定的处理失败,则对Response-PDU重新格式化,它的Request-ID和VariableBindings域与接收到的GetNextRequest-PDU报文有相同的值,只是它的errorstatus值设为“genErr”,errorindex值设为引起失败的变量绑定的索引值。否则,Response-PDU的errorstatus值设为“noError”,errorindex值设为0。生成的响应报文Response-PDU被封装成一个报文。如果这个报文的大小不超过本地对报文大小的限制,而且也不超过请求源能接收的最大报文长度,它就被发送到生成GetNextRequest-PDU的发起者那里。反之,则生成一个更改过的Response-PDU,它的RequestID和VariableBindings域与接收到的GetNextRequest-PDU报文有相同的值,只是它的errorstatus值设为“tooBig”,errorindex值设为0,而且清空变量绑定域。这个更改过的响应报文Response-PDU被封装成一个报文。如果这个报文的大小不超过本地对报文大小的限制,而且也不超过请求源能接收的最大报文长度,它就被发送到生成GetNextRequest-PDU的发起者那里,否则计数器snmpSilentDrops的值加1,并丢弃该报文。5.2.3SNMPv1对GeNextRequest-PDU的处理(参考RFC1157)SNMPv1的GetNextRequest-PDU格式与SNMPv2相同,接收的SNMPv2实体对变量绑定表中的每个变量绑定进行处理,生成一个Response-PDU。Response-PDU除了以下几种情况的一些域值有所不同外,其他域与接收到的GeNextRequest-PDU有相同的值。每个变量绑定的处理如下:1)变量绑定域的对象名不是字典顺序上领先于从相关MIB视中得到的Get操作变量名,则接收实体向发起请求方送出与GetNextRequest有相同格式的GetResponse-PDU,它的error-status为“noSuchName”,error-index为接收到的报文的对象名成分的索引(index)。2)如果生成的GetResponse-PDU报文长度超过逻辑上的限制,则接收实体向发起请求方送出与GetNextRequest有相同格式的GetResponse-PDU,它的error-status为“tooBig”,error-ZTE中兴版权所有不得外传内部公开▲index为0。3)如果对于变量绑定的对象名,如果不是由于以上原因,使得字典顺序的后继者的值重新得到(retrieved),则接收实体向发起请求方送出与GetNextRequest有相同格式的GetResponse-PDU,它的error-status为“genErr”,error-index为接收到的报文的对象名成分的索引(index)。如果以上规则都不满足应用,则接收协议实体向发起请求方送出GetResponse-PDU,其中对于接收到报文的变量绑定的每个名字和值,GetResponse-PDU中相应的部分代表了变量的名称和值,其中name是相关MIB视的Get操作可得到所有对象的按字典顺序排好的name,同时,所给的名字域的value值为字典顺序的后继的value值。它的error-status为“noErr”,error-index为0,GetResponse-PDU的request-id值为接收到报文的request-id值。5.3Response-PDUResponse(响应)命令使代理能够对来自管理系统的所有GetRequest、GetNextRequest、SetRequest、GetBulkRequest或InformRequest查询进行响应。Response命令的PDU类型代码为2,除PDU类型代码外,Response报文还包括另外四个字段,见报文格式。5.3.1Response报文格式PDU类型(TYPE)2请求标识(RequestID)错误状态错误索引(errorstatus)(errorindex)变量绑定表VariableBindings\uf0a7请求标识(RequestID)------它总是与对相关查询的响应有关。通过ID号可以很容易的检测出重复报文。\uf0a7错误状态(errorstatus)------有如下值:1)tooBig(太大)------代理程序无法在一个SNMP报文中容纳所需数据。2)noSuchName(无此名)------在对SNMP请求进行译码时,代理发现有未知变量名而不能进行处理。这并不意味着该名字在代理中不存在,而只是说明按预先设置的共同体概要(CommunityProfile)不能识别该名字。3)badValue(坏值)------在译码时,代理发现了不正确的句法或不正确的值,因而无法改变所需变量。4)readOnly(只读)------在译码时,代理发现按照共同体概要表不能对变量进行写入操作。5)genError(一般错)------代理将所有其他错误标记为一般错(GenericErrors)。SNMPv2中没有对这些错误给予进一步的划分。6)noAccess(不可访问)------变量不在预定义的MIBVIEW(MIB视图)内,不能读取或进行修改。7)wrongType(错误类型)------转换后的新值与正确的ASN.1数据类型不一致。8)wrongLength(错误长度)------转换后的新值与正确的长度不符。9)wrongEncoding(错误编码)------转换后的新值编码不正确。10)wrongValue(错误值)------转换后的新值超出该对象类型值的范围。ZTE中兴版权所有不得外传内部公开▲11)noCreation(不可创建)----所指示的变量不存在,代理不能创建这种对象类型。12)InconsistentValue(不一致值)----所指示的变量与代理的其他变量不一致。13)resourceUnavailable(资源不可用)----所希望的资源在代理上未被保留。14)commitFailed(提交失败)-不能进行变量绑定中值的转换,因而不能实施变更操作。15)undoFailed(撤消失败)----不能进行变量绑定中值的转换。变更操作不能取消。16)authorizationError(授权失败)----检测到验证错误。17)notWritable(不可写)-------所指示的变量不存在,代理无法创建。18)inconsistentName(不一致名)-------所指示的名字与代理的其他名字不一致。\uf0a7错误索引(errorindex)------如果Response-PDU的errorindex字段为非零值,则说明在刚进行的请求中检测到有错误发生。errorindex字段中含有的附加信息有助于标识错误的原因。errorindex字段的定义如下表所示:表6错误索引字段的定义名字值noSuchObject(无此对象)0noSuchInstance(无此实例)1endOfMibView(MIBView尾)21)NoSuchObject(无此对象)------所需对象代理不支持,或还没有在设备中实现。2)NoSuchInstance(无此实例)------拥有该名字的一实例代理不支持,或还没有在设备中实现。3)EndOfMibView(MIBView尾)------已达到相关管理者MIB的最后,没有更多的值可供传输。\uf0a7变量绑定(VariableBindings)------所需对象标识符在此字段中定义。Response命令中对象变量的值用相关的ASN.1值进行编码。5.3.2SNMPv2对Response-PDU的处理(参考RFC1905)如果Response-PDU的errorstatus为非零值,则变量绑定表中的变量绑定的值域可以被忽略。如果Response-PDU的errorstatus和errorindex均为非零值,则errorindex的值为引起请求失败的变量绑定的索引。一个请求报文的变量绑定表中的第一个变量绑定索引为1,第二个变量绑定索引为2,以此类推。一个担当管理者角色的SNMPv2实体必须能够接收和处理错误状态(errorstatus)字段为“noSuchName”、“badValue”或“readOnly”的Response-PDU。接收到一个Response-PDU的SNMPv2实体将它的内容呈现给生成请求报文的SNMPv2应用实体,它的Request-ID值与请求报文的Request-ID值相同。5.3.3SNMPv1对响应报文GetResponse的处理(参考RFC1157)SNMPv1中,响应报文与SNMPv2不同,而是用GetResponse表示,报文格式则与SNMPv2相同。在RFC1157中没有更多关于协议实体对收到GetResponse报文后的处理,只是提到接收到GetResponse报文的协议实体将它的内容呈现给SNMP应用实体。ZTE中兴版权所有不得外传内部公开▲5.4SetRequest-PDUSetRequest命令使管理系统可以改变代理上指定变量的值,对象标识符作为参量同这种报文一起发送。如果代理能处理带有规定值的SetRequest命令,则发回一个Response(响应)包确认操作有效,如果出错,则创建一个Response包并将相关出错消息发回给请求者(管理站)。为SetRequest命令规定的PDU类型代码是3。除PDU类型代码外,SetRequest报文还包括另外四个字段,见报文格式。5.4.1SetRequest报文格式PDU类型(TYPE)3请求标识(RequestID)错误状态错误索引(errorstatus)(errorindex)00变量绑定表VariableBindings\uf0a7请求标识(RequestID)------用于监视未完成的报文。有了这一标记,SNMP就可以将应答与发出的请求对应起来。\uf0a7错误状态(errorstatus)------SetRequest-PDU中的错误状态(errorstatus)字段总为0。\uf0a7错误索引(errorindex)------SetRequest-PDU中的错误索引(errorindex)字段总为0。\uf0a7变量绑定(VariableBindings)------此字段规定所需的对象标识符。SetRequest命令中对象变量的值用相关ASN.1值进行编码。5.4.2SNMPv2实体对SetRequest报文的处理(参考RFC1905)SNMPv2实体接收到一个SetRequest-PDU报文后,生成的响应报文Response-PDU,将它封装成一个消息,它的RequestID和VariableBindings具有同请求报文相同的值。SNMPv2实体还决定errorstatus和errorindex可能的最大取值范围。如果这个消息的大小不超过本地对报文大小的限制,而且也不超过请求源所能接收的最大报文长度,它就被发送到生成SetRequest-PDU的发起者那里。反之,则生成一个更改过的Response-PDU,它的RequestID和VariableBindings域与接收到的SetRequest-PDU报文有相同的值,只是它的errorstatus值设为“tooBig”,errorindex值设为0,而且清空变量绑定域。这个更改过的响应报文Response-PDU被封装成一个报文。如果这个报文的大小不超过本地对报文大小的限制,而且也不超过请求源能接收的最大报文长度,它就被发送到生成SetRequest-PDU的发起者那里,否则,计数器snmpSilentDrops的值加1,并且丢弃该报文。无论怎样,SetRequest-PDU的处理到此结束。接收SetRequest-PDU的SNMPv2实体对变量绑定表中的每个变量进行处理,生成一个Response-PDU,所有域与接收到的请求报文有相同的值,除了以下几个方面:ZTE中兴版权所有不得外传ResponseSetRequest管理站代理图6SetRequest的处理过程内部公开▲变量绑定需要两个步骤的操作。第一步,每个变量绑定都要被确认,全部确认成功后才能进入第二步,在第二个步骤中每一个变量都会被改变。当然,设计者可以自由地选择实现第一步还是第二步,或者两步都要做。事实上,在大多数情况下,为了保证一致性,这两步工作都是必要的。第一个步骤的确认工作如下进行,直到它们全部确认成功或有一个变量出现错误:1)如果变量绑定的名字指定了由于在MIB视图中不存在的变量,使得请求访问被拒绝(或将被拒绝),则Response-PDU的errorstatus值设为“noAccess”,errorindex值设为失败的变量绑定的索引值。2)如果没有与变量绑定的名字的OBJECT-IDENTIFIER的前缀(prefix)相同的变量,或无论指定的是多么新的一个值,它都可以被创建或更改,则Response-PDU的errorstatus值设为“notWritable”,errorindex值设为引起失败的变量绑定的索引值。3)如果变量绑定根据ASN.1句法指定的值与要求的所有变量(绑定名字与请求报文有相同的OBJECT-IDENTIFIER的prefix值)的类型不一致,则Response-PDU的errorstatus值设为“wrongType”,errorindex值设为引起失败的变量绑定的索引值。4)如果变量绑定根据ASN.1句法指定的值与要求的的所有变量(绑定名字与请求报文有相同的OBJECT-IDENTIFIER的前缀(prefix)值)的长度不一致,则Response-PDU的errorstatus值设为“wrongLength”,errorindex值设为引起失败的变量绑定的索引值。5)如果变量绑定的值包含ASN.1句法编码,它与这个域的ASN.1标签(tag)不一致,则Response-PDU的errorstatus值设为“wrongEncoding”,errorindex值设为引起失败的变量绑定的索引值。(注意:不是所有的实现策略都会产生这种错误。)6)如果变量绑定的值指定了一个决不可能指派给对象的值,则Response-PDU的errorstatus值设为“wrongValue”,errorindex值设为引起失败的变量绑定的索引值。7)如果变量绑定的名字指定了一个不存在,也不能被创建的对象(尽管一些情况下,有与OBJECT-IDENTIFIER相同前缀(prefix)的一些变量也许能够被创建),则Response-PDU的errorstatus值设为“noCreation”,errorindex值设为引起失败的变量绑定的索引值。8)如果变量绑定的名字指定了一个不存在,也决不可能在此时被创建的变量,(尽管它可以在其他情况下被创建),则Response-PDU的errorstatus值设为“inconsistentName”,errorindex值设为引起失败的变量绑定的索引值。9)如果变量绑定的名字指定了一个存在的变量,但不管它是多么新的一个值,它的值都不能被改变,则Response-PDU的errorstatus值设为“notWritable”,errorindex值设为引起失败的变量绑定的索引值。10)如果变量绑定的值指定了一个在其他一些情况下可以被变量处理,但是目前是不一致的或不能被指派的值,则Response-PDU的errorstatus值设为“inconsistentValue”,errorindex值设为引起失败的变量绑定的索引值。11)在以上步骤的处理过程中,如果给变量绑定指派的值需要占用资源空间而现在又得不到空间,则Response-PDU的errorstatus值设为“resourceUnavailable”,errorindex值设为失败的变量绑定的索引值。12)如果不是以上的原因导致变量绑定过程失败,则Response-PDU的errorstatus值设为“genErr”,errorindex值设为失败的变量绑定的索引值。13)变量绑定的鉴定成功。在第一个步骤完成后,如果所有的变量绑定都已通过鉴定,则Response-PDU的errorstatus值设为“noError”,errorindex值设为0。ZTE中兴版权所有不得外传内部公开▲每个请求的变量绑定中,必要时会生成命名变量(namedvariable),并给它指派特定的值。这些变量的每一个指派和同一个请求下其他的指派同时发生。如果在一个请求中命名了同一个变量多次,并给它指派了不同的值,那么对这个变量的实际指派是专门实现的。只要这些指派中出现一次错误(尽管在它之前的鉴定都正确),那么所有其他的指派都不能完成,Response-PDU被更改为errorstatus值设为“commitFailed”,errorindex值设为引起失败的变量绑定的索引值。当且仅当不可能撤消所有的指派时,Response-PDU被更改为errorstatus值设为“undoFailed”,errorindex值设为0。注意:要尽量避免出现“commitFailed”和“undoFailed”。最后,生成的Response-PDU被压缩至一个报文发送给SetRequest-PDU的发起者。5.4.3SNMPv1对SetRequest报文的处理(参考RFC1157)接收到SetRequest-PDU的SNMPv1协议实体对不同情况作出不同的响应:1)对变量绑定域命名的对象名,它不能从相关MIB视中得到的set操作得到,则接收实体向发起请求方送出与SetRequest有相同格式的GetResponse-PDU,它的error-status为“noSuchName”,error-index为接收到报文的对象名成分的索引(index)。2)对变量绑定域命名的对象名,根据ASN.1语法,值域的内容不能表明一个与请求的类型、长度和与值一致的变量,则接收实体向发起请求方送出与SetRequest有相同格式的GetResponse-PDU,它的error-status为“badValue”,error-index为接收报文的对象名索引。3)如果生成的GetResponse-PDU报文长度超过逻辑上的限制,则接收实体向发起请求方送出与SetRequest有相同格式的GetResponse-PDU,它的error-status为“tooBig”,error-index为0。4)如果对于变量绑定的对象,命名对象的值不能由以上规则修改,则接收实体向发起请求方送出与SetRequest有相同格式的GetResponse-PDU,它的error-status为“genErr”,error-index为接收到报文的对象名索引(index)。如果以上规则都不满足应用,则对于接收到报文的变量绑定的每一个对象名指派相应的值,每个由SetRequest-PDU指定的变量指派应该与由其它同样报文的指派同时相互影响。接收协议实体向发起请求方送出GetResponse-PDU,它的error-status为“noErr”,error-index为0。5.5GetBulkRequest-PDUGetBulkRequest命令可以对大量的数据尤其是表格进行更为有效的读取。与GetNextRequest相比,GetBulkRequest操作中通过网络发送的包更少,基本重复操作仅局限于代理中。如果在代理中可以用指定的值处理相关命令,则返回一个(响应)包从而确认操作有效。若确认操作有效,则错误状态和错误索引字段的值设为0。为GetBulkRequest设定的PDU类型代码为5。除PDU类型代码外,还包含另外4个字段:Request-ID(请求标记)、Non-Repeaters(非重复者)、Max-Repetitions(最大重复)和VariableBingings(变量绑定)ZTE中兴版权所有不得外传GetBulkRequestResponse管理者代理图7GetBulkRequest的处理过程内部公开▲5.5.1GetBulkRequest-PDU报文格式PDU类型TYPE(5)请求标识符RequestID非重复者non-repeaters最大重复max-repetitions变量绑定表Variablebindings\uf0a7请求标识符(RequestID)------产生此字段仅用于监视未完成报文,利用这个标记SNMP能够将输入的响应与发生的相关请求对应起来。\uf0a7非重复者(non-repeaters)------指示变量表中有多少变量不必重复。\uf0a7最大重复(max-repetitions)------定义在代理中GetNext操作应该进行的频度。然后代理将所请求的变量值封装在一个Response-PDU中。如果Response-PDU达到了其最大值,则余下的变量值将被丢弃而必须由管理站再一次请求。\uf0a7变量绑定(Variablebindings)------所需对象标识符在此字段定义。GetBulkRequest命令中对象变量的值用相关的ASN.1值进行编码。5.5.2SNMPv2对GetBulkRequest-PDU报文的处理(参考RFC1905)接收到一个GetBulkRequest-PDU的SNMPv2实体对变量绑定表中的每一个变量绑定进行处理,生成一个RequestID域与请求报文相同的Response-PDU。处理从检查non-repeaters和max-repetitions域的值开始。如果GetBulkRequest-PDU的non-repeaters小于0,则Response-PDU中这个域的值设为0。同样地,如果GetBulkRequest-PDU的max-repetitions小于0,则Response-PDU中这个域的值设为0。对于GetBulkRequest-PDU类型的报文来说,请求报文的每一个变量绑定的成功处理取决于在生成0个或更多个变量的绑定。这就是说,对于GetRequest-PDU、GetNextRequest-PDU、SetRequest-PDU这些类型和与它们相应的Response-PDU中存在的变量绑定的一对一映射在GetBulkRequest-PDU类型的变量绑定映射中不适用。请求报文中的non-repeaters和max-repetitions的值指定了对GetBulkRequest请求的处理方式。请求的变量绑定的总数为N+(MR),其中N为请求的前一部分变量绑定,R是请求的余下部分的变量绑定,对这R个变量绑定中的每一个变量绑定都有M次请求。N取下面两者之中的最小值:1)请求报文中non-repeaters的最小值;2)请求的变量绑定数。M是请求的报文中max-repetitions的值。R取N和0之中的最大值。如果N>0,Response-PDU中这N个变量绑定的每一个变量绑定被如下过程处理:1)变量位于得到的请求报文的所有按字典顺序排序的变量名列表中,并且它的名字是输入的GeBulkRequest变量绑定名的第一个字典顺序的后继(firstlexicographicsuccessor),则相应的变量绑定名和值被设为本地变量名和值送到Response-PDU中发送。2)如果请求的变量绑定名不是从请求中可得到的变量名的字典顺序的后继,则Response-PDU中变量的值设为“endOfMibView”,名字域设为与请求报文相同的变量绑定名。如果M和R均为非零值,则Response-PDU中后面这N+1个变量绑定的每一个变量绑定的处理过程与上面是相似的。对一个循环变量i,0
提供简单网络管理协议SNMP,简单网络管理协议snmp最容易被蛮力攻击会员下载,编号:1700684753,格式为 docx,文件大小为30页,请使用软件:wps,office word 进行编辑,PPT模板中文字,图片,动画效果均可修改,PPT模板下载后图片无水印,更多精品PPT素材下载尽在某某PPT网。所有作品均是用户自行上传分享并拥有版权或使用权,仅供网友学习交流,未经上传用户书面授权,请勿作他用。若您的权利被侵害,请联系963098962@qq.com进行删除处理。