抽象语法符号ASN.1(Abstract Syntax Notation One)
一、ASN.1 (Abstract Syntax Notation One)
ASN.1包括两部分:数据描述语言(ISO 8824)和数据编码规则(ISO 8825)。ASN.1的数据描述语言允许用户自定义基本的数据类型,并可以通过简
单的数据类型组成更复杂的数据类型。ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER)、规范编码规
则(CER)、可识别编码规则(DER)、压缩编码规则(PER)和 XML编码规则(XER)。
ASN.1中定义的数据类型既有简单的基本数据类型,也有复杂的结构类型。
- 基本类型是不可再再分的,包括:
- 布尔型(BOOLEAN)
- 整型(INTEGER)
- 实型(REAL)
- 位串类型(BITSTRING)
- 8位位组类型(OCTET STRING)
- 枚举类型(ENUMERATED)
- 空类型(NULL)
- 对象标识符(OBJECT IDENTIFIER)
- 除基本类型,ASN.1还定义了多种复杂的结构类型,例如:
- SEQUENCE:有序的数据集合(序列),由不同类型的数据组成。SEQUENCE结构强调内部成员的排序
- SEQUENCE OF:有序的数据集合,类似于C语言的数组,由同一类型的数据组成。
- SET:由不同类型的数据组成的集合,用来描述复杂的信息对象,对内部成员的顺序不作要求,类似于C语言的结构体类型
- CHOICE:选择结构,在列出的内部成员中,只能选择其中之一,类似于C语言中的共用体类型
二、基本编码规则BER(Basic Encoding Rules)
BER把复杂的用抽象语法描述的数据结构表示成简单的数据流,从而便于在通信线路上传送。BER以8bit为一个基本传送单位。对于每个所传送的
值,无论是基本类型还是构造类型,都由TLV三个字段组成,TLV分别指类型标识符域(Tag),数据长度域(Length)和数据域(Value)字段。
其中,数据域可以多重嵌套其他数据元素的TLV字段,BER编码的具体格式如下所示
类型标识符域(T) | 数据长度域(L) |
|
- Tag占用一个字节,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值 - 数据长度域拥有短形式和长形式两种
- 短形式的数据长度域只有一个字节,第8位为0,其他低7位给出数据长度。
- 长形式的数据长度域有 2 ~ 127个字节。第一个字节的的第8位为1,其他低7位给出后面该域使用的字节的数量,从该域的第二个字节开始给出数据的长度
- 数据域给出了具体的数据值。该域的编码对不同的数据类型不一样
三、压缩编码规则PER(Packet Encoding Rules)
BER带来了大量的冗余信息增加了通信量的开销。对应用而言,编码开销出现在编码格式TLV三个字段的每个部分。PER在BER的基础上,以减
少编码开销为目的而设计的编码规则。
使用PER的一个重要的前提是,用户数据是单个ASN.1类别,且接收方也有一个相同的ASN.1描述。基于此,PER可以抛弃BER按步就班的编码规则,
省略对数据结构的编码,PER编码仍然采用TLV格式,PER编码主要使用了三个减小编码长度的技术
- 省略类型标识符
省略类型标识符在编码中似乎是一个重在部分,但实际上通常是不必要的,由于网络通信双方都遵循统一的网络协议,因此它们不可以从数据结构中推导出特定元素的类型和标识,就可以在编码中省略类型标识符 - 长度段的编码更加精简
BER的长度段的编码都是字节,而且BER长度的编码不考虑具体条件,然而PER的长度字段根据编码的类型的不同,有不同的单位。这些单位可以是比特、字节、元素、字符等,这也是PER利用数据结构已知的优势来减少编码量的又一方式;而且根据具体的条件限制,PER的长度段还可以大幅度削减,譬如当数据类型的长度固定时,该数据项的长度可以不编码。 - 对数字类型的编码更加精简
在对Integer等数字类型进行编码时,BER采取的是直接对数值进行编码;而PER采取的是对数据的偏移值offset进行编码。所谓偏移值就是实际值减去下界的值。例如:Integer(123456789 ... 123456790),在PER编码中123456790的offset=1,因此PER只需对1进行编码,这样对于那些下界类型很大的整数,可以节省大量字节,且编码本身非常简洁。