Snmpv1 v2报文格式详细介绍 【转载】

 

http://blog.csdn.net/zkx928/article/details/38396317

 

SNMP代理和管理站通过SNMP协议中的标准消息进行通信,每个消息都是一个单独的数据报。SNMP使用UDP(用户数据报协议)作为第四层协议(传输协议),进行无连接操作。SNMP消息报文包含两个部分:SNMP报头和协议数据单元PDU。

 

 

    BER作为ANS.1的基本编码规则,描述具体的ANS.1对象如何编码为比特流在网络上进行传输。BER编码规则由三部分组成:

 

l  INTEGER:一个整数

l  OCTER STRING: 0或多个8bit字节,每个字节在0~255之间取值

l  DisplayString:0或多个8bit字节,每个字节必须是ASCII码。在MIB-II中,所有该类型变量不能超过255个字符(0个字符可以)

l  NULL:代表相关的变量没有值

l  IpAddress:4字节长的OCTER STRING,以网络字节序表示IP地址

l  PhyAddress:6字节长的OCTER STRING,代表物理地址

l  Counter:非负整数,可以从0递增到232-1()。达到最大值后归0

l  TimeTicks:时间计数器,以0.01秒为单位递增,不同的变量可以有不同的递增幅度。所以在定义这种类型的变量时需要制定递增幅度

C语言中的结构体类似

l  SEQUENCE OF:一个向量,参见后面ANS.1语法详细介绍章节

 PDU类型其实包含两个字节,第一个字节表示真实的PDU的类型;第二个字节表示后面报文所占的字节总数。针对SNMPv1,这个字段取值如下:

PDU类型

   名 称

0

get-request

1

get-next-request

2

get-response

3

set-request

4

trap

 也就是说,trap的类型是4。但是在数据报文中,该字段一般表示为ax,其中x取[0,4],即a0~a3表示相应的get、set等操作,a4表示trap报文。这里除了类型字段意外,其他字段均采用BER编码方式:


 

实战演练之报文格式分析

    Trap报文格式和上述图5所展示的结构有些差别,这里我们只分析SNMPv1和SNMPv2的Trap报文格式。trap报文前面的部分都一样,区别在PDU协议数据单元部分。


    trap类型”可以取以下值,其中0~6是已定义的特定trap,7及其以后的类型由供应商自定义。

 

trap类型

名称

描述信息

0

coldStart

代理进程对自己初始化

1

warmStart

代理进程对自己重新初始化

2

linkDown

一个接口已从工作状态变为故障状态(报文中的第一个变量标识此接口)

3

linkUp

一个接口已从故障状态变为工作状态(报文中的第一个变量标识此接口)

4

authenticationFailure

从SNMP管理进程收到无效共同体的报文

5

egpNeighborLoss

一个EGP邻站已变为故障状态(报文中的第一个变量包含邻站IP地址)

6

enterpriseSpecific

在这个特定的代码段中查找trap信息


SNMPv1原始报文内容:

00 23 5a 9e 58b9 08 00 0c02 01 00 a06 0a 2b 06 01 04 01 bf 08 03 02 0a 02 01 00 43 01 0e   

00 23 5a 9e 58 b9

00 4c 41 49 50 55

08 00 ,为IP数据报

45 00 00 48 00 00 40 00 40 11 a5 4e c0 a80a 01 c0 a80a 05 0c

0c 00 00 a2 00 34 ff e0

n  30 表示SNMP消息是ASN.1的SEQUENCE类型;

n  2a 表示该SNMP报文的总长度是42(0x2a)个字节,该字段所表示的报文长度起始于它后面的第一个字节直到报文结束;

02 01 00 表示版本号,可见其确实为BER编码方式。02表示该字段是INTEGER类型;01表示该字段占1个字节;00表示版本号,该值为“版本号-1”;

04 06 70 75 62 6c 69 63 表示团体名,04表示该字段为OCTETSTRING类型;06表示该字段占6个字节;70 75 62 6c 69 63表示团体名的ANSII码的十六进制形式,这里是“public”;

a4 1d 其中a4中的“4”表示这是一个trap报文,a4又叫报文的标签标记;1d表示后面还有29(0x1d)个字节的数据;

06 0a 2b 06 01 04 01 bf 08 03 02 0a 企业OID标识。06表示该字段是个对象标识符,OBJECTIDENTIFIER;0a表示该字段占10(0x0a)个字节;关于SNMP的OID的编码方式有些奇特:例如1.3.6.1.2…. 取前两个数字分别记为x和y。编码时40*x+y,这里x=1,y=3,因此结果为40*1+3=43,即表示十六进制的2b。因此,这里的企业OID编码即为1.3.6.1.4.1.8072.3.2.10;

40 04 c0 a80a 01 同样40表示该字段为OCTET STRING 类型;04表示IP地址占4个字节;IP地址为192.168.10.1;

02 01 00 其中00表示trap类型为coldStart;

02 01 00 其中00表示我们指定的trap即specific-trap也为coldStart类型;

43 01 0e 43表示为TimeTicks类型;01表示该字段占1个字节;0e即十进制的14表示时间标签为0.14秒,这里时间计数器以0.01秒递增;

30 00 30表示“键-值”值对的编码类型为SEQUENCE;00表示该字段占0个字节,即没有该字段。

SNMPv2的Trap报文格式如图8所示:

 

SNMPv2原始报文内容:

00 23 5a 9e 58b9 45 00 00 7b 00 00 40 00 40 11 a5 1b c0 a8 0a01 c0 a8 0a05  01 00 a2 0067 04 bb 5d 01 04 70 75 62 6c 69 63021773 2c fb 01 02 00 42 0d 08 43 0e 17 0a 06 2b 06 01 0603 01 01 05 01 18 0a06 2b 06 01 04 01 bf 08 03 02 0a

 

00 23 5a 9e 58 b9

00 4c 41 49 50 55

IP头: UDP头: 01 00 a2 00 67 04 bb

xx 标注长度;xx 标注真正的数据。

n  5d 整个SNMP报文的编码方式为30,即SEQUENCE类型,报文长度93(0x5d)字节;

02 01 版本号 n  06 70 75 62 6c69 63  即英文的“public”;

a7 50 a7表示trap类型为7,即厂商自定义trap;50表示PDU区段占80(0x50)字节;

02 17 73 2c fb 请求ID为17 73 2c fb 十进制的393424123;

02 00 错误状态0;

02 00 错误索引0;

30 30 即SEQUENCE类型;“变量名-值”所占总字节0x n  0d 08 43 0e 第一个“名-值”对区段编码方式2b 06 01 02 01 01 03 00,为1.3.6.1.2.1.1.3.0;第一个变量值为0x0e,即14;

30 06 2b 06 01 06 03 01 01 04 0100 09 2b 06 01 06 03 01 01 05 01 第二个“名-值”对;变量名1.3.6.1.6.3.1.1.4.1.0;变量值1.3.6.1.6.3.1.1.5.1;

30 06 2b 06 01 06 03 01 01 04 0300 0a2b 06 01 04 01 bf 08 03 02 0a 第三个“名-值”对;变量名1.3.6.1.6.3.1.1.4.3.0;变量值1.3.6.1.4.1.8072.3.2.10;

posted @ 2016-10-09 08:59  Kconfig  阅读(1652)  评论(0)    收藏  举报