ASN.1探索 - 3 编码规则与传输语法(3 - PER)
时间:2023-03-04 09:30:00
本章主要介绍BER和PER两种编码规则及其衍生规则。
3.3PER
BER编码因其大小成本过高而受到批评。与真实编码数据相比,平均需要增加50%额外数据。正式这个原因推动了PER(Packed Encoding Rules)诞生。同样的协议,PER编码与BER相比在大小上至少有40%到60%改进。所以在VoIP、视频电话、多媒体、3G广泛应用于需要高速数据传输的领域。
3.3.1基本规则
PER编码规则的黄金定律是:obtain the most compact encoding using encoding rules as simple as possible”。
与BER三元组用于中递归TLV
因为Length可以省略(甚至Value也可以省略),所以不能从编码中知道边界,所以解码器必须知道抽象描述才能正确解码。PER编码中没有Tag域,因此PER扩展符必须在描述中明确添加,不再缺乏省份支持扩展。
只有当长度没有时SIZE当固定或数据长度非常重要时,它是正确的Length编码;对SEQUENCE或者SET当类型值编码时,在总结前添加一个bitmap识别可选成员是否出现;同样,在编码中CHOICE在选择成员之前,将添加一个序号来指示其位置。
和BER相比,PER使编解码器处理时间相对较少(但处理速度不到两倍),传输速度更快。
3.3.2 四种变形
PER编码规则可以分为基本的(Basic)和规范的(Canonical)两类,每一类又可以分为对齐(Aligned)和不对齐(Unaligned)两种。规范形式的优势在CER和DER中已经讨论过了,主要用在中继接力系统和安全系统等使用数字签名的场合。在基本形式中,一个抽象值可能有多个PER编码。但是,在有限测试后,我们知道基本形式编码器要比规范形式编码器速度更快。
对齐方式下,为了保持八位组对齐,可以增加值为0的比特。不对齐方式则编码更为紧凑,但是在编解码时需要花费更多的处理时间。不对齐方式下,不会检查八位组的对齐情况,只在整个数据编码结束后,才进行补位。
注意对齐和不对齐两种方式不能互通,即只能用同种的解码器解码同种编码器编码后的码流。在四种变形中,基本不对齐方式编码是最紧凑的。按照紧凑性降低的顺序,后续依次为:规范不对齐方式,基本对齐方式和规范对齐方式。
在表示层传输上下文协商中,我们需要用Object Identifier指明具体采用的是哪种变形。具体值,请参考第二章中Object Identifier注册树。
3.3.3 PER可见子类型约束
为了最大限度的压缩编码,PER需要依赖ASN.1描述中的子类型约束。约束增加的越具体,PER越能得到更优化的编码。而且PER会使用到的约束都是经常使用的约束,这样也使得PER编译器容易实现。此外,这些约束都是编译器在编译过程中“静态”使用的,不会增加实际编解码过程处理时间。
我们称这类约束为PER可见约束(PER-Visible Constraints),它们只包含下表所列:
Table 3-3 PER可见约束
类型 |
PER可见约束 |
BOOLEAN |
无 |
NULL |
无 |
INTEGER |
单值约束、值域约束、类型包含约束、约束组合、约束扩展 |
ENUMERATED |
无 |
REAL |
无 |
BIT STRING、OCTET STRING |
SIZE约束、约束组合、约束扩展 |
OBJECT IDENTIFIER |
无 |
NumericString、PrintableString、VisibleString、ISO646String、 IA5String、UniversalString、 BMPString |
FROM约束、SIZE约束、类型包含约束、约束组合、SIZE约束中的扩展 |
not-known-multiplier character string types |
无 |
GeneralizedTime、UTCTime、ObjectDescriptor |
无 |
open types |
无 |
SEQUENCE、SET |
无 |
SEQUENCE OF、SET OF |
SIZE、约束组合、约束扩展 |
CHOICE |
无 |
EXTERNAL |
无 |
EMBEDDED PDV、CHARACTER STRING |
WITH COMPONENTS |
open types指引用到一个类型域、一个可变类型的值域、或者一个可变类型值集合域。即引用到信息对象类中的类型。
不在上表中的,都不是PER可见约束, PER编译器也就不做相应优化。
3.3.4 数的编码
我们考察一个非负数的四种形式的编码,因为自然数常出现在长度域L、bitmap的大小、CHOICE中的序号以及INTEGER类型边界中。
对于INTEGER类型,PER可见约束之一是值域约束。对于有值域约束(bmin..bmax)的值n,如果下边界bmin足够大,PER编码n- bmin的代价就更小。如下:
Figure 3-26 有约束自然数的基本编码规则
I. 有约束数编码
有约束指值域的上、下边界都有限。如果d=1,即只有一个值,则收、发双方都知道,那么就没有编码的必要。
在对齐方式下:∞
l 当2≤d≤255,n- bmin的编码占用log2d个比特。这些比特添加在待发送比特域之后,不进行八位组对齐,不编码L;
l 当d=256,n- bmin的编码占用一个八位组,不编码L;
l 当257≤d≤65,536,n- bmin的编码占用两个八位组,不编码L;
l 当65,537≤d,n- bmin的编码占用log256d个八位组,并且在前面增加L的编码。
在不对齐方式下:
n- bmin的编码占用log2d个比特,不编码L。
II. 半约束数编码
半约束指值域没有上边界(上边界为+∞)。
n- bmin的编码占用log256d个八位组,并且在前面增加L的编码。
III. 无约束数编码
无约束指值域没有下边界(即使存在上边界)。
按照BER中整数的编码方式编码,并且在前面增加L的编码。
IV. 常见小自然数编码
这种情况经常出现在对表征SEQUENCE、SET类型可选成员的Bitmap长度进行编码时;或者CHOICE类型序号编码时。这种长度相当小,但是却没有一种限定。
l 当0≤n≤63时,n以6个比特编码,并且在前面增加一个0比特(八位组不对齐):
l 当64≤n时,n以半约束数方式编码,下边界为0,并且在前面增加一个1比特:
3.3.5 长度域编码
与BER中长度域表征编码的八位组数不同,在PER的长度域出现下,如果编码为比特串则表征比特位数;如果编码为八位组串(OCTET STRING和open类型)则表征八位组个数;如果编码为known-multiplier character string则表征字符数;如果是SEQUENCE OF或者SET OF则表征成员个数。
每当ASN.1描述中 对类型通过(SIZE(lmin..lmax))做大小限定时(lmax可以是+∞),长度l的值要按照3.3.4 中的规则编码。作为特例,当lmin =lmax≤65,535时,长度不需要发送,因为解码器知道该长度。
对齐方式下:
l 当l是一个bitmap的长度,l-1作为常见小自然数编码;
l 当lmax≤65,535,l作为有约束的数编码(约束为(lmin..lmax));
l 当65,535≤lmax,或者lmax是无穷大:
- 当l≤127,l以一个八位组编码(八位组对齐),最高比特位为0;
-当128≤l≤16,383,l以两个八位组编码(八位组对齐),最高两个比特位为10;
-当16,384≤l,整个编码以f*16K为单位分割(f取值为1,2,3或者4)。除最后的片段外,其余每段,长度都以一个八位组编码,最高两个比特位为11。如果编码恰好时16K的整倍数,则在最后补充一个全空的八位组;否则最后一个片段按照前两条进行编码。例如占147,457个单元的编码可以为:
不对齐方式下:
l 当l是一个bitmap的长度,l-1作为常见小自然数编码;
l 当lmax≤65,535,l-lmin以占用log2(lmin-lmax+1)个比特编码;
l 当65,534≤lmax-lmin,或者上边界为无穷大:
-当l≤127,l以八比特编码,最高比特位为0;
-当128≤l≤16,383,l以十六比特编码,最高两个比特位为10;
-当16,384≤l,编码方式域对齐类似,但是不是八位组对齐的。
当类型有可扩展的SIZE约束,并且待发送值不在该约束扩展的根部分,则长度l作为半约束数编码(即lmin=0, lmax =+∞)。
3.3.6 各类型编码
I. BOOLEAN
以一个比特编码,1为TRUE,0为FLASE。
直接编码,不编码长度,也不做八位组对齐。
II. NULL
不编码。
如果NULL是作为CHOICE的一个选项或者SEQUENCE、SET可选成员值出现,则已经有bitmap能表征。
III. INTEGER
假设INTEGER类型拥有有效的值域范围(bmin..bmax),当描述中INTEGER类型有至少一个可扩展的PER可见约束(PER-Visible Constraint),在编码时会在前面增加一个前导(Preamble)比特(不考虑八位组是否对齐)。当