基本编码规则(BER)
SNMP使用的编码方法是BER(Basic Encoding Rule)。BER是一种编码规格说明,描述如何将 ASN.1 类型的值编码成字节串(string of octets)的方法
SNMP使用的编码方法是BER(Basic Encoding Rule)。BER的数据都由三个域构成:标识域(tag)+长度域(length)+值域(value)。简称TLV格式。在ASN.1中,也称为Identifier-length-content(ILC).
- 标识域(tag):指明数据的类型,占用1个字节,常见的类型有:
#define BER_TYPE_BOOLEAN 0x01 #define BER_TYPE_INTEGER 0x02 #define BER_TYPE_BIT_STRING 0x03 #define BER_TYPE_OCTET_STRING 0x04 #define BER_TYPE_NULL 0x05 #define BER_TYPE_OID 0x06 #define BER_TYPE_SEQUENCE 0x30 #define BER_TYPE_COUNTER 0x41 #define BER_TYPE_GAUGE 0x42 #define BER_TYPE_TIME_TICKS 0x43 #define BER_TYPE_NO_SUCH_OBJECT 0x80 #define BER_TYPE_NO_SUCH_INSTANCE 0x81 #define BER_TYPE_END_OF_MIB_VIEW 0x82 #define BER_TYPE_SNMP_GET 0xA0 #define BER_TYPE_SNMP_GETNEXT 0xA1 #define BER_TYPE_SNMP_RESPONSE 0xA2 #define BER_TYPE_SNMP_SET 0xA3 #define BER_TYPE_SNMP_GETBULK 0xA5 #define BER_TYPE_SNMP_INFORM 0xA6 #define BER_TYPE_SNMP_TRAP 0xA7 #define BER_TYPE_SNMP_REPORT 0xA8
- 长度域(length):指明值域的长度,长度不等,一般为一到三个字节。其格式可分为短格式(后面的值域长度<=127),长格式.
2.1 短格式
length=30=>1E(30没有超过127,长度域为0001 1110)
2.2 长格式
长格式的表示方法: 1(1bit) K(7bit) K个八位组长度(K Byte)
length=169=>81 A9(169超过127,长度域为 1000 0001 1010 1001,169是后8位的值,前8位的第一个1表示这是长格式的表示方法,前8位的后7位表示后面有多少个字节表示针对的长度,这里,是000 0001,后面有一个字节表示真正的长度,1010 1001是169,
length=1500=>82 05 DC(1000 0010 0000 0101 1101 1100,先看第一个字节,表示长格式,后面有2个字节表示长度,这两个字节是0000 0101 1101 1100 表示1500)
3. 值域(value)
1. 整型Integer的编码 integer::=0x02 length{byte}* (*表示重复),最高位代表符号位,去掉多余的0。
例: 1500=>02 02 05 DC
40000=>02 03 00 9C 40
2. 字符串类型的编码 string::=0x04 length{byte}* 例如:04 06 70 75 62 6c 69 63表示字符串public
3.空类型的编码 null::=0x05 0x00
4.对象标识ObjectID(oid)编码 SNMP服务器维护的所有管理信息库(MIB)对象采用ObjectID表示,其编码规则如下:
objectID::=0x06 length {subidentifier}*
(1) subidentifier::= {leadingbyte}* lastbyte
(2) leadingbyte::=1 7bitvalue
(3) lastbyte::=0 7bitvalue
(4) 首两个ID被合并为一个字节X*40+Y
虽然规则很多,但由于大多数子对象标识在0~127,只需按规则(1)、(4)即可;当子对象标识大于127,则按规则(2)、(3)、将其分解为多个字节,最后一个字节的高位为0,其余字节的高位为1
如:1.3.6.1.810.1,根据规则(5),首两个子对象标识1.3被合并为2B(1 *40 +3=40+3=43); 子对象标识810超过127,根据规则(2)、(3)将其拆分为两个字节86 2A (810=11 0010 1010==>1000 0110 0010 1010);
整个MIB被编码为:0x06 0x06 0x2b 0x06 0x01 0x86 0x2a 0x01。如:1.2.840.113549 最终编码如下:06 06 2a 86 48 86 f7 0d
5.sequence组合类型的编码 sequence::=0x30 length{asndata}* 如:30 05 02 01 10 05 00表示一个sequence结构,内含两个成员,其中一个为整型,另一个为空类型(NULL)。