基本编码规则(BER)
在具体系统中,我们需要用具体的编码规则将ASN.1语法表示的抽象数据转换成具体的比特流。SNMP使用的编码方法是BER(Basic Encoding Rule)。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个八位组长度(K Byte)例: length=30=>1E(30没有超过127,长度域为0001 1110) length=169=>81 A9(169超过127,长度域为 1000 0001 1010 1001,169是后9位的值,前八位的第一个1表示这是长格式的表示方法,前八位的后七位表示后面有多少个字节表示针对的长度,这里,是000 0001,后面有一个字节表示真正的长度,1010 1001是169,后面的值有169个字节长。) length=1500=>82 05 DC(1000 0010 0000 0101 1101 1100,先看第一个字节,表示长格式,后面有2个字节表示长度,这两个字节是0000 0101 1101 1100 表示1500)
5.3 值域的编码规则
5.3.1 整型Integer的编码 integer::=0x02 length{byte}* (*表示重复) 整型数据值域用补码表示,去掉多余的零(正数)或一(负数)。值域最高位为符号位。例: 1500=>02 02 05 DC 21500= >02 02 FA 24
5.3.2 对象标识ObjectID编码 SNMP服务器维护的所有管理信息库(MIB)对象采用ObjectID表示,如,1.3.6.1.2.1.1.1表示MIB库中的设备描述SysDesc变量,其编码规则如下: objectID::=0x06 length {subidentifier}* (1) subidentifier::= {leadingbyte}* lastbyte (2) leadingbyte::=1 7bitvalue (3) lastbyte::=0 7bitvalue (4) 首两个ID被合并为一个字节X*40+Y (5) 虽然规则很多,但由于大多数子对象标识在0~127,只需按规则(1)、(5)即可;当子对象标识大于127,则按规则(2)、(3)、(4)将其分解为多个字节,最后一个字节的高位为零,其余字节的高位为一。如:1.3.6.1.810.1,根据规则(5),首两个子对象标识1.3被合并为2B(1 3 40+3=43);子对象标识810超过127,根据规则(2)、(3)、(4)将其拆分为两个字节86 2A (810=11 0010 1010==>1000 0110 0010 1010);整个MIB被编码为:0x06 0x06 0x2b 0x06 0x01 0x86 0x2a 0x01。
5.3.3 sequence组合类型的编码 sequence::=0x30 length{asndata}* 如:30 05 02 01 10 05 00表示一个sequence结构,内含两个成员,其中一个为整型,另一个为空类型(NULL)。
5.3.4 空类型的编码 null::=0x05 0x00
5.3.5 字符串类型的编码 string::=0x04 length{byte}* 例如:04 06 70 75 62 6c 69 63表示字符串public
实例: 30 3c 02 01 00 04 06 70 75 62 6c 69 63 a2 2f 02 01 10 02 01 00 02 01 00 30 24 30 22 06 08 2b 06 01 02 01 01 01 00 04 16 53 54 41 52 20 53 77 69 74 63 68 20 53 32 38 30 30 20 56 34 2e 30
根据第2节BER编码规则和3.1节SNMP数据报格式,我们对数据进行分解:
SNMP Length=60 <=30 3c
Version=1 <= 02 01 00
Community=public<=04 06 70 75 62 6c 69 63
PDU Type=Get response length=2f <=a2 2f Request ID=6 <= 02 01 10
Error status=(No error) <= 02 01 00
Error index=0 <= 02 01 00
Variable List length=24<=30 24
Item1 Length=22<=30 22
Object={1.3.6.1.2.1.1.1.0}<=06 08 2b 06 01 02 01 01 01 00
Value=STAR Switch S2800 V4.0<=04 16 53 54 41 52 20…
整个报文的含义为SNMP GetReply sysDescr= STAR Switch S2800 V4.0