分类: 网络与安全
2017-07-12 16:42:14
原文地址:SNMP报文解析 作者:zhangheidan
1. ①Ⅰ3,4源端口,值不定。
②Ⅰ5,6目的端口,对于snmp固定为161.
③Ⅰ行3-10为udp报文头部
2. Ⅰ11为标识域,标识该报文为snmp报文
ASN.1 提供了一些基本的预定义数据类型。SNMP报文中经常用到的ASN.1数据类型如下表所示
ASN.1类型 |
对应编码值 |
说明 |
Integer |
0x02 |
表示一个有符号的任意精度的标量,它的编码是可移植,平台无关的 |
Octet string |
0x04 |
八位位组串,保存字节数组 |
Null |
0x05 |
空类型,实际上是”占位符”, 它是含有空白选项的选择修改器所特有 |
Object identifier |
0x06 |
对象标识符类型即SNMP中的OID |
Sequence |
0x30 |
是一种用来把相关数据元素收集为一个独立的可解码元素的简单方法 |
常見的類型有:BOOL(0×01)、INT(0×02)、OCTSTR(0×04)、NULL(0×05)、OBJID(0×06)、ENUM(0x0A)、SEQ(0×30)、SETOF(0×31)、IPADDR(0×40)、COUNTER(0×41)、GAUGE(0×42)、TIMETICKS(0×43)、OPAQUE(0×44)。
3. Ⅰ12为snmp报文长度,从Ⅰ13到Ⅳ2为(38)10等于(26)16。
长度域指明值域的长度,不定长,一般为1到3个字节。根据编码的实际长度,ASN.1定义了两种长度编码(length encoding)方法,长编码和短编码。
编码字节的最高位代表的是短编码还是长编码;而低7位则形成一个长度立即数。
<1>. 短编码。
在短编码中,值域的长度必须小于128字节。长度立即数用来表示值域的长度。例如,对于一个长度为65 (0×41)的值域进行编码,其长度编码字节只需简单的设置为0×41即可。因为其最高位是0,则解码器可以判断出这是短编码,而且长度是65。
<2>. 长编码。
在长编码中,定义了附加的抽象数据来对长度进行编码,它仅适用于所有长度为128字节或以上的值域。在这种模式下,长度立即数存储的是为了表示长度所需的字节数。这个长度必须以big-endian格式进行编码。(其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。)。
例如,为一个长度为47310 (0xB8CE)的值域进行编码,因为它的长度大于127, 所以要采用长编码方式。实际的长度需要两个字节来表示。则,长度编码字节为0×82; 然后用big-endian格式存储的长度值为0xB8 0xCE。则全部长度编码为 0×82 B8 CE。(TLV方式 1000 0010)
4. Ⅰ13-15为snmp协议类型,此处使用TLV表示方式。
TLV 方式是BER编码规则使用的方式
TLV 方式:{Type,Length,Value}。Type 域标记,一个Legnth 长度限定值,然后是Value。
SNMP协议用于两台设备之间的信息传递,而这两台设备也就是两个系统各种各样。为实现信息传递,就必须对传输数据进行规范和约定,使其与具体的设备和系统独立开来。为此,SNMP采用了ASN.1(Abstract Syntax Notation One)——抽象语法标记。
ASN.1是一种ISO/ITU-T标准,描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。ISO 协议套中的应用层协议使用了 ASN.1 来描述它们所传输的 PDU,包括 SNMP协议。
ASN.1有多种标准编码规则。在SNMP协议中,ASN.1采用了BER(Basic Encoding Rule)标准化编码规则对传输数据进行编码。
Ⅰ13-15 02 01 01 02为Integer 01指value值长度为1 01指get-request请求
SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。
PDU类型
PDU类型 |
名称 |
0 |
get-request |
1 |
get-next-request |
2 |
get-response |
3 |
set-request |
4 |
trap |
①get-request操作:从代理进程处提取一个或多个参数值
②get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值
③set-request操作:设置代理进程的一个或多个参数值
④get-response操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。
⑤trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。
前面的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程的,为了简化起见,前面3个操作今后叫做get、get-next和set操作。图4描述了SNMP的这5种报文操作。请注意,在代理进程端是用熟知端口161俩接收get或set报文,而在管理进程端是用熟知端口162来接收trap报文。
5. Ⅰ16-Ⅱ7为共同体字符串,依然使用TLV方式。
6. Ⅱ8 a0
1 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
上下文标签 |
Sequences |
0标识get-resquest |
7. Ⅱ9 为get-request报文长度, Ⅱ10到Ⅳ2为(25)10等于(19)16。
8. Ⅱ13-15差错状态,使用TLV方式。
差错状态描述
差错状态 |
名字 |
说明 |
0 |
noError |
一切正常 |
1 |
tooBig |
代理无法将回答装入到一个SNMP报文之中 |
2 |
noSuchName |
操作指明了一个不存在的变量 |
3 |
badValue |
一个set操作指明了一个无效值或无效语法 |
4 |
readOnly |
管理进程试图修改一个只读变量 |
5 |
genErr |
某些其他的差错 |
9. Ⅲ3-Ⅳ2变量绑定列表,使用TLV方式。Ⅲ5-Ⅳ2为(14)10等于(0e)16。
10. Ⅲ5-Ⅳ2变量绑定列表,使用TLV方式。Ⅲ7-Ⅳ2为(12)10等于(0c)16。
11. Ⅲ7-Ⅲ16变量绑定name,使用TLV方式。Ⅲ9-Ⅲ16为(8)10等于(08)16。
12. Ⅳ1-2变量绑定列表结束,使用TLV方式。0x05为NULL,长度0。