snmp报文

1 BRE编码(Basic Encoding Rule)

   基本编码规则使用使用TLV 方式,即Type,Length,Value消息中所表达的信息都用一个Type 域标记一个Legnth 限定值然后是Value ,ASN.1是一种用来描述系统之间传递的信息格式的语言规范被广泛用在通信协议的规格定义中一句话理解ASN.1 和BER即是:“信息的描述基于ASN.1 语法”和“信息的编码基于BER方法”


2 SNMP报文的过程中我们经常用到的是下面的数据类型标识号


snmp报文_第1张图片



各种数据类型的解释
INTEGER 一个变量虽然定义为整型,但也有多种形式。有些整型变量没有范围限制,有些整型变量定义为特定的数值(例如,IP的转发标志就只有允许转发时的或者不允许转发时的这两种),有些整型变量定义一个特定的范围(例如,UDP和TCP的端口号就从0到65535)。
OCTER STRING 0或多个8 bit字节,每个字节值在0~255之间。对于这种数据类型和下一种数据类型的BER编码,字符串的字节个数要超过字符串本身的长度。这些字符串不是以NULL结尾的字符串。
DisplayString 0或多个8bit字节,但是每个字节必须是ASCII码。在MIB-II中,所有该类型的变量不能超过255个字符(0个字符是可以的)。
:) OBJECT IDENTIFIER
:) NULL 代表相关的变量没有值。例如,在get或get-next操作中,变量的值就是NULL,因为这些值还有待到代理进程处去取。
:) IpAddress 4字节长度的OCTER STRING,以网络序表示的IP地址。每个字节代表IP地址的一个字段。
:) PhysAddress OCTER STRING类型,代表物理地址(例如以太网物理地址为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 不透明类型或未知类型
3 SNM规定了5种协议数据单元PDU
(也就是SNMP报文),用来在管理进程和代理之间的交换。
l get-request操作:从代理进程处提取一个或多个参数值
l get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值
l set-request操作:设置代理进程的一个或多个参数值
l get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。
l trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
前面的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程的,为了简化起见,前面3个操作今后叫做get、get-next和set操作。下图描述了SNMP的这5种报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。
SNMP的5种报文操作


snmp报文_第2张图片


4 SNMP报文格式


snmp报文_第3张图片



解释如下:
4.1 Version(版本号):
该字段是TLV 格式的数据块包含3个字节,表示报文的版本号
内容为02-01-XX 其中02 字节是数据类型,对应了表格1 中的Integer 整型数据01是数据长度:1个字节。XX 是数据值,它的取值分别对应SNMP的三种不同的版本。对应关系如下:
XX=0 对应SNMPv1
XX=1 对应SNMPv2c
XX=2 对应SNMPv2
XX=3 对应SNMPv3
4.2 Community(团体名)
字段也是TLV 格式的数据块,其LV 取决于实际的团体名,例如某个SNMPv1 的网管报文的团体名为字符串public, 则编码的二进制为04-06-70-75-62-6c-69-63。
04对应表格1 的Octet string 即字符串型数据。
06对应后面的长度是6个字节。
70-75-62-6c-69-63是“public“的ASCII码值。
从这里可以看出SNMPv1 的团体名是以明文表示的当SNMP。报文被非法截获后团体名就泄漏出去了对网络管理的安全将产生一定的威胁。SNMPv3在网络管理的安全性方面有改进采用MD5 SHA 的认证方法保证安全SNMP 报文的协议数据单元PDU 结构分两类一般网管报文的PDU 和Trap
4.3 一般的PDU报文(非Trap)
报文的 PDU 分别介绍如下:
一般的SNMP 报文的PDU 结构如图2 所示

snmp报文_第4张图片


4.3.1 PDU Type:
SNMP 的Get-Request、Get-Response 等基本命令集的操作类型。
根据PDU的类型,填入0~4中的一个数字(非Trap报文填写0-3),其对应关系如下表所示意图。
PDU类型
PDU类型 名称
0 get-request
1 get-next-request
2 get-response
3 set-request
4 trap
4.3.2 Request ID :
采用02-04-XX-XX-XX-XX 的TLV 数据块用于网管站和被管设备之间传递的SNMP 报文的操作和应答的匹配,这和CAMS服务器与设备之间交互的Radius 报文ID 的功能基本相同,之所以使用报文ID机制来匹配报文,根本原因在于UDP 通信的不可靠特点:基于UDP 的应用程序均应该依靠这种方法维持通信的正常秩序。
4.3.3 Error-status:
采用02-01-00的TLV 数据块用来指示错误类型一般情况下V总是0
差错状态描述
差错状态 名字 说明
0 noError 一切正常
1 tooBig 代理无法将回答装入到一个SNMP报文之中
2 noSuchName 操作指明了一个不存在的变量
3 badValue 一个set操作指明了一个无效值或无效语法
4 readOnly 管理进程试图修改一个只读变量
5 genErr 某些其他的差错
4.3.4 Error-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 格式的

 

你可能感兴趣的:(网络,String,null,Integer,encoding,structure)