您好,欢迎访问三七文档
SNMP的协议分析(ccnupq)1BRE编码(BasicEncodingRule)基本编码规则使用使用TLV方式,即Type,Length,Value消息中所表达的信息都用一个Type域标记一个Legnth限定值然后是Value,ASN.1是一种用来描述系统之间传递的信息格式的语言规范被广泛用在通信协议的规格定义中一句话理解ASN.1和BER即是:“信息的描述基于ASN.1语法”和“信息的编码基于BER方法”2SNMP报文的过程中我们经常用到的是下面的数据类型标识号各种数据类型的解释INTEGER一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号就从0到65535)。OCTERSTRING0或多个8bit字节,每个字节值在0~255之间。对于这种数据类型和下一种数据类型的BER编码,字符串的字节个数要超过字符串本身的长度。这些字符串不是以NULL结尾的字符串。DisplayString0或多个8bit字节,但是每个字节必须是ASCII码。在MIB-II中,所有该类型的变量不能超过255个字符(0个字符是可以的)。OBJECTIDENTIFIERNULL代表相关的变量没有值。例如,在get或get-next操作中,变量的值就是NULL,因为这些值还有待到代理进程处去取。IpAddress4字节长度的OCTERSTRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。PhysAddressOCTERSTRING类型,代表物理地址(例如以太网物理地址为6个字节长度)。Counter非负的整数,可从0递增到232—1(4294976295)。达到最大值后归0。Gauge非负的整数,取值范围为从0到4294976295(或增或减)。达到最大值后锁定直到复位。例如,MIB中的tcpCurrEstab就是这种类型的变量的一个例子,它代表目前在ESTABLISHED或CLOSE_WAIT状态的TCP连接数。TimeTicks时间计数器,以0.01秒为单位递增,但是不同的变量可以有不同的递增幅度。所以在定义这种类型的变量的时候,必须指定递增幅度。例如,MIB中的sysUpTime变量就是这种类型的变量,代表代理进程从启动开始的时间长度,以多少个百分之一秒的数目来表示。SEQUENCE这一数据类型与C程序设计语言中的“structure”类似。一个SEQUENCE包括0个或多个元素,每一个元素又是另一个ASN.1数据类型。例如,MIB中的UdpEntry就是这种类型的变量。它代表在代理进程侧目前“激活”的UDP数量(“激活”表示目前被应用程序所用)。在这个变量中包含两个元素:IpAddress类型中的udpLocalAddress,表示IP地址。INTEGER类型中的udpLocalPort,从0到65535,表示端口号。SEQUENDEOF这是一个向量的定义,其所有元素具有相同的类型。如果每一个元素都具有简单的数据类型,例如是整数类型,那么我们就得到一个简单的向量(一个一维向量)。但是我们将看到,SNMP在使用这个数据类型时,其向量中的每一个元素是一个SEQUENCE(结构)。因而可以将它看成为一个二维数组或表。Opague不透明类型或未知类型3SNM规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。get-request操作:从代理进程处提取一个或多个参数值get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值set-request操作:设置代理进程的一个或多个参数值get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。前面的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程的,为了简化起见,前面3个操作今后叫做get、get-next和set操作。下图描述了SNMP的这5种报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。SNMP的5种报文操作4SNMP报文格式SNMP报文格式解释如下:4.1Version(版本号):该字段是TLV格式的数据块包含3个字节,表示报文的版本号内容为02-01-XX其中02字节是数据类型,对应了表格1中的Integer整型数据01是数据长度:1个字节。XX是数据值,它的取值分别对应SNMP的三种不同的版本。对应关系如下XX=0对应SNMPv1XX=1对应SNMPv2cXX=2对应SNMPv2XX=3对应SNMPv3{0x30,0x37,2,1,0,4,6,0x70,0x75,0x62,0x6c,0x69,0x63,0xa0,0x26,2,4,0,0,0,0,2,1,0,2,1,0,0x30,0x1c,0x30,0x0c,6,8,0x2b,6,1,2,1,1,1,0,5,0};/*get_request报文编码*/4.2Community(团体名)字段也是TLV格式的数据块,其LV取决于实际的团体名,例如某个SNMPv1的网管报文的团体名为字符串public,则编码的二进制为04-06-70-75-62-6c-69-63。04对应表格1的Octetstring即字符串型数据。06对应后面的长度是6个字节。70-75-62-6c-69-63是“public“的ASCII码值。从这里可以看出SNMPv1的团体名是以明文表示的当SNMP。报文被非法截获后团体名就泄漏出去了对网络管理的安全将产生一定的威胁。SNMPv3在网络管理的安全性方面有改进采用MD5SHA的认证方法保证安全SNMP报文的协议数据单元PDU结构分两类一般网管报文的PDU和Trap4.3一般的PDU报文(非Trap)报文的PDU分别介绍如下:一般的SNMP报文的PDU结构如图2所示4.3.1PDUType:SNMP的Get-Request、Get-Response等基本命令集的操作类型。根据PDU的类型,填入0~4中的一个数字(非Trap报文填写0-3),其对应关系如下表所示意图。PDU类型PDU类型名称0get-request1get-next-request2get-response3set-request4trap4.3.2RequestID:采用02-04-XX-XX-XX-XX的TLV数据块用于网管站和被管设备之间传递的SNMP报文的操作和应答的匹配,这和CAMS服务器与设备之间交互的Radius报文ID的功能基本相同,之所以使用报文ID机制来匹配报文,根本原因在于UDP通信的不可靠特点:基于UDP的应用程序均应该依靠这种方法维持通信的正常秩序。{0x30,0x37,2,1,0,4,6,0x70,0x75,0x62,0x6c,0x69,0x63,0xa0,0x26,2,4,0,0,0,0,2,1,0,2,1,0,0x30,0x1c,0x30,0x0c,6,8,0x2b,6,1,2,1,1,1,0,5,0};/*get_request报文编码*/4.3.3Error-status:采用02-01-00的TLV数据块用来指示错误类型一般情况下V总是0差错状态描述差错状态名字说明0noError一切正常1tooBig代理无法将回答装入到一个SNMP报文之中2noSuchName操作指明了一个不存在的变量3badValue一个set操作指明了一个无效值或无效语法4readOnly管理进程试图修改一个只读变量5genErr某些其他的差错4.3.4Error-index:02-01-XX的TLV数据块。用来表示产生错误的变量。当出现noSuchName、badValue或readOnly的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移。var-bindings字段包含众多的变量对偶var_n表示变量n的标识,value_n表示变量n的取值。其中的var_n基本上就是SNMP的管理变量,是SNMP操作的基本对象,也即下文所述的OID(ObjectIdentifier),每个OID标识一个管理变量OID符合TLV格式,但是OID的V部分不再符合TLV格式。其编码方式在下节讲述。Value_n表示OID的取值部分,其编码方法是TLV格式的4.4Trap报文Trap网管报文的PDU结构如图所示4.4.1PDUType(PDU类型)Trap报文的PUD类型必填写44.4.2enterprise(企业)填入trap报文的网络设备的对象标识符。此对象标识符肯定是在图3的对象命名树上的enterprise结点{1.3.6.1.4.1}下面的一棵子树上。4.4.3agent-address代理的IP地址4.4.4generic-trap共分为下表中的7种。trap类型描述trap类型名字说明0coldStart代理进行了初始化1warmStart代理进行了重新初始化2linkDown一个接口从工作状态变为故障状态3linkUp一个接口从故障状态变为工作状态4authenticationFailure从SNMP管理进程接收到具有一个无效共同体的报文5egpNeighborLoss一个EGP相邻路由器变为故障状态6enterpriseSpecific代理自定义的事件,需要用后面的“特定代码”来指明当使用上述类型2、3、5时,在报文后面变量部分的第一个变量应标识响应的接口。4.4.5specific-code(特定代码)指明代理自定义的时间(若trap类型为6),否则为0。4.4.6timestamp(时间戳)指明自代理进程初始化到trap报告的事件发生所经历的时间,单位为10ms。例如时间戳为1908表明在代理初始化后1908ms发生了该时间。4.4.7variable-bindings(变量绑定)Trap报文的variable-bindings和普通的SNMP报文的含义相同。实际上核心内容就是OID5基本编码规则(BRE)在具体系统中,我们需要用具体的编码规则将ASN.1语法表示的抽象数据转换成具体的比特流。SNMP使用的编码方法是BER(BasicEncodingRule)。BER的数据都由三个域构成:标识域(tag)+长度域(length)+值域(value)。5.1标识域(tag)的编码规则标识域指明数据的类型,占用1个字节,常见的类型有:BOOL(0x01);INT(0x02);OCTSTR(0x04);NULL(0x05);OBJID(0x06);ENUM(0x0A);SEQ(0x30);SETOF(0x31);IPADDR(0x40);COUNTER(0x41);GAUGE(0x42);TIMETICKS(0x43);OPAQUE(0x44)。5.2长度域的编码规则长度域指明值域的长度,不定长,一般为一到三个字节。其格式可分为短格式(后面的值域没有超过127长)和长格式,如下所示短格式的表示方法:0(1bit)长度(7bit)长格式的表示方法:1(1bit)K(7bit)K个八位组长度(KByte)例:length=30=1E(30没有超过127,长度域为00011110)length=169=81A9(169超过127,长度域为1000000110101001,169是后9位的值,前八位的第一个1表示这是长格式的表示方法,前八位的后七位表示后面有多少个字节表示针对的长度,这里,是0000001,后面有一个字节表示真正的长度,10101001是169,后面的值有169个字节长。)length=1500=8205DC(100000100000010111
本文标题:SNMP的协议分析
链接地址:https://www.777doc.com/doc-2849828 .html