基本编码规则(BER)---SNMP

基本编码规则(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).

  1. 标识域(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
    
  2. 长度域(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

                                             基本编码规则(BER)---SNMP_第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)。

 

你可能感兴趣的:(网络编程,基础理论)