ASN.1编码规则(BER和PER)

在通信系统中,为了让通信双方对通信媒介中传输的信息产生一致的理解,通信双方就必须明确所交换的信息类型与格式,ASN.1便是ITU-T为支持这种要求而制定的。在目前的通信领域中,由ASN.1所描述的信息或信息流若要在网络的各节点间进行传送,就必须先在发送端对他进行编码,转换成物理媒介(网络)可以传输的八位位组(OCTET)串的形式,然后才能通过网络发送到目的节点;接收端再按约定的规则对其进行解码,把它从8位位组串的形式恢复成应用实体直接可用的形式,从而完成信息的传输和接收

  1. ASN.1的基本编码规则BER(Basic Encoding Rules)

    ISO在推出ASN.1的同时也推出了基本编码规则BER。实际上这是一种传送语法,它可以把复杂的用抽象语法描述的数据结构表示成简单的数据流,从而便于在通信线路上传送。

    BER以8bit为一个基本传送单位。对于每个所传送的值,无论是基本类型还是构造类型,都由TLV三个字段组成,TLV分别指类型标识符域(TAG),数据长度域(LENGTH)和数据域(VALUE)字段。其中,数据域可以多重嵌套其他数据元素的TLV字段,BER编码的具体格式如下所示

    类型标识符域(T) 数据长度域(L)
    T L V T L V
    数据域(V)
    • 类型标识符域占用一个字节,从低位为1开始编号,8和7位表示Tag类型,第6位是0表示编码类型是基本类型,第5 ~ 1位是Tag值,各个位表示的意义如下:
      bit 取值 表示含义
      8 ~ 7 0    0 Universal (简单类型)
      0    1 Application(应用类型)
      1    0 context-specific(上下文类型)
      1    1 private(专用类型)
      6 0 原始类型
      1 构造类型
      5 ~ 1   TAG值
    • 数据长度域拥有短形式和长形式两种
      1. 短形式的数据长度域只有一个字节,第8位为0,其他低7位给出数据长度。
      2. 长形式的数据长度域有 2 ~ 127个字节第一个字节的的第8位为1,其他低7位给出后面该域使用的字节的数量,从该域的第二个字节开始给出数据的长度
    • 数据域给出了具体的数据值。该域的编码对不同的数据类型不一样
  2. ASN.1的紧缩编码规则PER(Packet Encoding Rules)

    BER解决了不同终端系统之间的表示问题,但也带来了大量的冗余信息增加了通信量的开销。对应用而言,编码开销出现在编码格式TLV三个字段的每个部分。紧缩编码规则(Packed Encoding Rules, PER)就是在BER的基础上,以减少编码开销为目的而设计的编码规则。
    使用PER的一个重要的前提是,用户数据是单个ASN.1类别,且接收方也有一个相同的ASN.1描述。基于此,PER可以抛弃BER按步就班的编码规则,省略对数据结构的编码,PER编码仍然采用TLV格式,尽管类型和长度字段经常可以忽略。与BER编码相比PER编码主要使用了三方面减小编码结果长度的技术,省略类型标识符,长度段的编码更加精简和对数字类型的编码更加精简。

    • 省略类型标识符
      省略类型标识符在编码中似乎是一个重在部分,但实际上通常是不必要的,由于网络通信双方都遵循统一的网络协议,因此它们不可以从数据结构中推导出特定元素的类型和标识,就可以在编码中省略类型标识符
    • 长度段的编码更加精简
      BER的长度段的编码都是字节,而且BER长度的编码不考虑具体条件,然而PER的长度字段根据编码的类型的不同,有不同的单位。这些单位可以是比特、字节、元素、字符等,这也是PER利用数据结构已知的优势来减少编码量的又一方式;而且根据具体的条件限制,PER的长度段还可以大幅度削减,譬如当数据类型的长度固定时,该数据项的长度可以不编码。
    • 对数字类型的编码更加精简
      在对Integer等数字类型(包括Integer和一些类型的长度值编码的情况)进行编码时,BER采取的是直接对数值进行编码;而PER采取的是对数据的偏移值offset进行编码。所谓偏移值就是实际值减去下界的值。例如:Integer(123456789 ... 123456790),在PER编码中123456790的offset=1,因此PER只需对1进行编码,这样对于那些下界类型很大的整数,可以节省大量字节,且编码本身非常简洁。

你可能感兴趣的:(ASN.1编码规则(BER和PER))