关键点 :BER编码
PDU类型 |
名称 |
0 |
get-request |
1 |
get-next-request |
2 |
get-response |
3 |
set-request |
4 |
trap |
BER的数据都由三个域构成:
标识域(tag)+长度域(length)+值域(value)。
snmp协议是采用UDP作为下一层的承载协议,而我们都知道UDP并不像TCP一样是一种流,报文是按照顺序到达的,所以需要request-id来做顺序判定。
BOOL(0x01);INT(0x02);OCTSTR(0x04);NULL(0x05);OBJID(0x06);ENUM(0x0A);EQ(0x30);SETOF(0x31);IPADDR (0x40);COUNTER (0x41);GAUGE(0x42);
TIMETICKS(0x43);OPAQUE(0x44);GET(0xA0);GETNEXT(0xA1);GETResp(0xA2);SET(0xA3);TRAP(0xA4);
长度域指明值域的长度,不定长,一般为一到三个字节。其格式可分为短格式和长格式.长度域采用短/长指示器(Short/Long Form)来标明长度指示符是否是单个字节,指示器在bit8上。如果短/长指示器是0,则为短限定格式,低7位包含的就是数据的长度值,长度值在0到127之间;如果短/长指示器是1,则为长限定格式,其低7位的值表示后面紧跟的长度指示值的字节数,而后续字节拼接起来的值就是数据字段的长度,即数据长度。
举例:
length:30 => 1E
length:169 => 81 A9 (a9 == 169 ,81 中的1 表示一个字节 ,8作为标识)
length:1500 => 82 05 DC ( 05dc == 1500 ,82 中的 2 表示两个字节,8作为标识)
0000 30 4b 02 01 00 04 06 70 75 62 6c 69 63 a0 3e 02
0010 01 48 02 01 00 02 01 00 30 33 30 0f 06 0b 2b 06
0020 01 02 01 19 03 02 01 05 01 05 00 30 0f 06 0b 2b
0030 06 01 02 01 19 03 05 01 01 01 05 00 30 0f 06 0b
0040 2b 06 01 02 01 19 03 05 01 02 01 05 00
30 4b :表示整个snmp报文的编码方式为30 ,即是SEQUENCE类型表示snmp报文的长度为4b,即为75
02 01 00 :02表示该字段是INTERGER类型,01表示该字段占用一个字节,00表示版本号为1
04 06 70 75 62 6c 69 63 :04表示该字段为OCTET STRING 类型,06表示该字段的长度 ,70 75 62 6c 69 63 表示 “public”
a0 3e :a是该字段的固定值,0表示这是一个get-request报文,3e 表示PUD还有 62 个字节
02 01 48 : 02表示该字段是INTERGER类型 ,01 表示该字段占用一个字节,48表示request-id 为72
02 01 00 :02表示该字段是INTERGER类型 ,01 表示该字段占用一个字节,00 表示报文的差错状态为 0
02 01 00 :02表示该字段是INTERGER类型 ,01 表示该字段占用一个字节,00 表示报文的差错索引为 0
30 33 : 30 表示编码类型为 30 ,即是SEQUENCE类型,33表示后续 “键 - 值”区域占用 51 个字节
30 0f 06 0b 2b 06 01 02 01 19 03 02 01 05 01 05 00:30 表示编码类型为 30 ,即是SEQUENCE类型,0f 表示该字段共有15个字节,06 表示第一个变量为键,0b表示键长为11个字节,2b 06 01 02 01 19 03 02 01 05 01 表示 1.3.6.1.2.1.25.3.2.1.5.1 , 00 表示该值的字段的长度为0,即为空
30 0f 06 0b 2b 06 01 02 01 19 03 05 01 01 01 05 00 :同上
30 0f 06 0b 2b 06 01 02 01 19 03 05 01 02 01 05 00 : 同上