资源描述
ASN.1和基本编码规则
作者:亢朝峰 业务四室
摘 要:该文说明了ASN.1和基本编码规则(BER)的原理和应用。文中,首先描述了 ASN.1,并给出了几种常见类型的相应的例子,来说明ASN.1的应用;接着对基本编码规则(BER), 通过对MAP中的LocationRequest的请求操作消息的参数进行编码的具体实现,来说明基本编码规则的工作原理。总之,ASN.1和基本编码规则实际中有非常广泛的应用。
关键词:ASN.1 基本编码规则 MAP消息 LocationRequest
ASN.1作为一种数据表示标准产生于20世纪80年代早期的开放系统互联Internet网络模型,但OSI模型并没有得到广泛的应用,而ASN.1标准继续使之发展,今天在实际中已有大量应用,这些应用包括:
Ø 3G移动系统:
使用ASN.1标准 数据交换的第三代移动通信网络。这一系统基于UMTS(通用移动通信系统)标准,其使用了ASN.1和分组编码标准(PER)。
Ø IP语音:
在通信领域中的另一个重要应用是通过包转换网络(如因特网)传递语音数据。多媒体数据信号编解码器(CODEC)标准(H.323等等)基于ASN.1并且使用于分组编码标准来获取理想的数据传输速率。
Ø 安全应用:
因特网安全授权同样也使用了ASN.1。高级编码标准在数据表示方面形成了 一个方便的、平台无关的标准,比加密要优越。PKIX、PKCS和X.509也是我们所熟悉的标准,它们也是基于ASN.1的。
Ø 传统通信网络:
ASN.1和基本编码规则(BER)已经在主要通信领域流行了很长一段时间,所有的ss7到ISDN的一切都使用了ASN.1 BER信息在各种类型的设备和计算机之间传递信号。
Ø 军事和空间应用:
美国国家宇航局(NASA)在其航空通信网规范中,也正在使用ASN.1和分组编码规则作为空对地或地对空协议。
一、概述
众所周知,抽象是解决软件开发问题的有效手段。利用抽象,设计人员可以定义系统的一个部分而不用关注这个部门实际上是如何实现或者表达的。这一方法使得实现open,它简化了定义过程,使得在实现部件之前可以声明某些“公理”、并且在设计高层部件时假定下层部件是可以实现的。抽象是现代多数软件规范的特点。
作为当今最复杂的系统之一,开放系统互联(OSI)是一个包含了大量抽象的例子。OSI是一个国际通用的标准体系,从物理层一直到用户层,规划了计算机之间的互联。高层次的对象被抽象定义,并将由底层的对象来实现。比如,某层的一个服务可能需要在计算机之间传递某个抽象对象;某一底层则可能提供关于0、1字符串的实现,利用一些编码规则把高层的抽象对象转换成这些字符串。
OSI的说明抽象对象的方法叫做抽象语法标记(ASN.1,在X.208中定义),而用0、1字符来表示这样的对象的规则集合叫做基本编码规则(BER)。ASN.1是一个很灵活的标记法,它允许定义众多的数据类型——从整数和位串等简单类型到如集合、序列等的结构,还可以是其它复杂定义的类型。BER描述了如何将ASN.1类型表示和编码成八位字节串。通常不止一种编码给定数据的方法,另一种叫做DER(Distinguished Encoding Rules)的编码集合,它是BER的子集,其特点是给每一个ASN.1值一个唯一的编码。
图1.1 说明了抽象语法、编码规则之间的关系。从图中可以看出,抽象语法利用一些正式的规则来描述各种用户数据;而编码规则采用适当的方法将用抽象语法描述的用户对象定义为适合物理传输信道传输的格式。
图1.1 抽象语法、编码规则之间的关系
二、抽象语法标记(ASN.1)
ASN.1(Abstract Syntax Notation One)是一种用于描述结构化客体结构和内容的语言。它定义在ISO 8824或ITU-T X.208中。ASN.1类似于高级程序设计语言的数据描述部分。它提供若干语言构件用以定义类型和值,类型对应结构,值对应内容。但和其他程序设计语言不同的是,ASN.1的类型不需要机器实现。
一个ASN.1的值可以用不同的方法表示:打印值是用打印的形式表示的ASN.1的值,对人而言,它是一种严格的表示法,因为它不必依赖任何机器的体系结构;本地值是由程序设计语言或系统用来表示ASN.1的值;传送值表示传送中的ASN.1的值,它是ASN.1值的比特流形式,是根据一组称之为传送文法(Transfer Syntax)的规则而得到的。ASN.1值的表示法决定了它的开发性和互操作性,并成为一种通用的信息交换的表示法。
ASN.1可以定义各种各样的简单类型数据,也可以定义十分复杂的数据结构类型。
2.1 ASN.1的模块
ASN.1的基本单位是模块(module)。ASN.1模块实际上是由一组类型定义和值定义组成的。类型定义就是说明类型的名称和类型的格式,值定义则是规定将什么样的具体值赋给某一类型的变量。
ASN.1模块的一般格式如下:
ModuleDefinition ::=
ModuleIdentifier
DEFINITIONS
TagDefault
“::=”
BEGIN
EXPORTS
IMPORTS
AssignmentList
END
其中,
ModuleIdentifier是模块标识符,也就是模块的名称( 模块名的第一个字母必须大写);
IMPORTS结构规定了模块中某些定义是从其他模块中移植过来的;
EXPORTS结构用于定义其他模块可以移植的类型或值。
类型定义和值定义是通过类型分配(type assignment)和值分配(value assignment)来完成的。类型分配和值分配包含于模块的AssignmentList中。类型分配和值分配的格式如下:
类型定义
语法:<type name> := type
类型的赋值:
<value name> <type> ::= <value>
2.2 简单类型
1.INTEGER
整数类型。与一般程序设计语言不同的是,ASN.1中没有限制整型的位数。也就是说,INTEGER可以是任意大小的整数。
定义一个整型类型Counter
Couter := INTEGER
IpAddress := Octetstring
变量的赋值:
例子:
ipInReceives Counter ::= 2450
2.BOOLEAN
布尔型。取值为TURE或FALSE.
3.REAL
实数类型。和整型一样,ASN.1中对实数的精度没有限制。每个实数都可以表示为M*BE,即三元组{M,B,E}的形式,其中M是尾数,B是级数,E是指数。
4.ENUMERATED
枚举类型。枚举类型实际上是一组个数有限的整型值。可一个每个整型值赋以不同的意义。
5.BIT STRING
位串类型,由零个或多个比特组成的有序位串。位串的值可以由对应的二进制或者十六进制串表示。其中左边的位由较高的权重。
6.OCTET STRING
八位位组串。由零个或多个八位位组组成的有序串。八位位串可以用十进制、二进制或者十六进制表示。
7.OBJECT IDENTIFIER
对象标识符。从对象树派生出的一系列点分数字串的形式,用来标识对象。
8.NULL
空值类型。这是最简单的一种类型,它仅包含一个值――NULL。主要由于位置的填充。如果某时刻无法得知数据的准确值,那么最简单的方法就是将这一数据定义为NULL类型。
9.CHARACTER STRING
字符串类型。ASN.1中定义了一些字符集不完全相同的CHARACTER STRING类型。不同类型包含的字符集不同。字符串由双引号扩起。
字符串类型包括:
Ø NumericString:包含数字0到9以及空格;
Ø PrintableSting:包含所有大小写字母、数字、标点和空格;
Ø IA5String:由取自IA5(5号国际字符表)的字符组成,它和ASCII码基本相同;
Ø VisibleString:由取自IA5的图形字符组成;
Ø GeneralString:包含所有的标准字符。
2.2 构造类型
1. SEQUENCE
序列类型,是包含零个或者多个组成元素的有序列表。列表的不同元素可以属于不同的数据类型。
结构类型定义
SequenceType ::=
SEQUENCE{ElementTypeList} |
SEQUENCE{ }
ElementTypeList ::=
ElementType |
ElementTypeList,ElementType
ElementType ::=
NamedType |
NamedType OPTIONAL |
NamedType DEFAULT Value |
COMPONENTS OF Type
有序列表的每个元素是由元素名称和元素类型组成。元素类型可以是简单类型,也可以是定义的其他构造类型。元素类型标识符后可以跟OPTIONAL或DEFAULT关键字。OPTIONAL关键字表示在序列类型的实例中该元素可以出现,也可以不出现。DEFAULT关键字表示序列类型的实例中该元素具有事先指定的缺省值。COMPONENTS OF 关键字表示它包含了给定序列中的所有组成元素。
例子:
UserAccount ::= SEQUENCE {
username VisibleString,
password VisibleString,
accountNr INTEGER
}
结构赋值:
SequenceValue ::=
{ElementValueList} |
{ }
ElementValueList ::=
NamedValue |
ElementValueList,NamedValue
例子:
myAccount UserAccount ::= {
username "steffen",
password "jane51",
accountNr 4711
}
2. SEQUENCE OF
单纯序列(数组)类型。即序列中的各项属于同一类型的ASN.1类型。
SequenceOfType ::= SEQUENCE OF Type |
SEQUENCE
例子:
MemberCountries ::= SEQUENCE OF VisibleString
赋值:
SequenceOfValue ::= {ValueList} | { }
ValueList ::=
Value |
ValueList,Value
euMembers MemberCountries ::= {
"Austria", "Belgium", "Denmark",
"Finland", "France", "Germany",
"Greece", "Ireland", "Italy",
"Luxembourg", "The Netherlands",
"Portugal", "Spain", "Sweden",
"United Kingdom"
}
3. SET
集合类型,是包含零个或者多个组成元素的无序集合。这些元素的顺序无任何意义,但是他们之间必须是不相同的,组成元素的类型可以为不同的ASN.1类型。
SetType ::=
SET{ElementTypeList} |
SET{ }
例子:
UserAccount ::= SET {
username VisibleString,
password VisibleString,
accountNr INTEGER
}
赋值:
SetValue ::= {ElementValueList} | { }
例子:
myAccount UserAccount ::= {
username "steffen",
password "jane51",
accountNr 4711
}
4. SET OF
单纯集合类型,是包含零个或者多个组成元素的无序集合。这些组成元素必须为相同的ASN.1类型。
SetOfType ::= SET OF Type |
SET
例子:
Keywords ::= SET OF VisibleString
赋值:
SetOfValue ::= {ValueList} | { }
例子:
someASN1Keywords Keywords ::=
{"INTEGER", "BOOLEAN", "REAL"}
5. CHOINCE
选择类型,包含一个可供选择的数据类型列表。CHOICE类型的每一个值都是其中某一数据类型的值。数据可以在不同情况下取不同的值。
6. ANY
如果在定义数据时还不能确定数据的类型,可以使用ANY型。ANY型可以被任何ASN.1类型置换。
7. Tagged
标签类型。标签时一个标签类(class)和一个标签号(class number)组成。标签号是十进制非负整数。共有四种不同的标签类型。
Ø 通用类标签是ASN.1标准定义的,除了CHOICE和ANY类型之外,所有的简单类型和结构类型都具有统一分配的唯一标签。
Ø 应用类是为具体应用协议标准定义的,在ASN.1模块中必须是唯一的。
Ø 私有类仅对某个企业有效,它必须在该企业内是唯一的。
Ø 上下文有关类主要由于消除歧义性,它在结构的上下文必须是唯一的。
2.3 子类型
通过对某些类型加以限制,可以定义他们的子类型(subtype)。子类型的值集合是其父类型值集合的子集。定义子类型的过程可以嵌套。
2.4其他类型
1. GeneralizedTime
表示时间的类型,它有三种不同的表示方法:
Ø 表示本地时间
Ø 通用时间标准(UTC)
Ø 通过计算本地时间和UTC时间的差值来表示时间
2. UTCTime
UTCTime也是表示时间的,只是精度不同,它只能精确到分或者秒。
3. External
外部类型,其可区分值不能从其外部特征导出,但能够从一个值的编码中导出,这些值可以,但不必用ASN.1描述,因而其编码也可以不必使用ASN.1编码规则。
4. Object descriptor
对象描述符,点分数字串形式的对象标识符不具备可读性,为了更好的描述对象,可以使用对象描述符。对象描述符以可读文本的形式简单地介绍对象。但是对象描述符不具有唯一标识性,因此不能取代对象标识符作为对象的标识。
三、基本编码规则
ASN.1数据值的编码由按下列顺序排列的四部分组成:标识符八比特组、
图3.1 ASN.1编码的结构
长度八比特组、内容八比特组以及内容结束八比特组。如图3.1所示。其中
内容八比特组只有当长度八位组的值要求内容八比特组出现时才出现。
3.1 标识符八比特组
标识符八比特组对数据值类型的ASN.1标记进行编码。ASN.1标记由标记类和序号组成。标记类占据高三位比特位。第8、7比特的内容由表3.1所决定。第6比特置“1”表示编码方式为构造编码方式,置“0”表示编码方式为元编码方式,其余第5至第1比特表示序号(二进制整数,第5比特为最高比特),如图3.2所示。若序号大于或等于31,则此5比特置“1”,表示后随一个或多个后继八比特组,后继八比特组除最后一个八比特组之外的每个八比特组的第8比特置“1”,最后一个八比特组的第8比特置“0”,以第一个后继八比特组的第7比特为最高比特,最后一个八比特组的第1比特为最后一个比特,表示标记序号的无符号二进制整数的编码,如图3.3所示。
3.2 长度八比特组
用长度八比特组表示内容八比特组中的八比特组数。长度八比特组分为确定形和非确定形两种。其划分依据是:若编码为元编码则用确定形;若编码是构造的且都是立即可用的,则可用确定形或非确定形,由发送端选择;若编码是构造的且不都是立即可用的,则用非确定形。
对于确定型,长度八比特组又分为长形式和短形式两种。只有当内容八比特组的组数小于或等于127时,才使用短形式。在短形式中,长度八比特组由单个比特组组成,其中第8比特为“0”,第七比特至第1比特是内容八比特组中的八比特组组数的编码。在长形式中,长度八比特组由一个初始八比特组和一个或几个后继八比特组组成。初始八比特组的第8比特置“1”,第七至1比特为长度八比特组为后继八比特组的组数的编码;后继八比特组的编码等于内容八比特组中的八比特组数的无符号二进制整数编码。确定形的编码如图3.4所示。
对于非确定型,长度八比特组由单个八比特组80h组成,表示由内容结束八比特组结束内容八比特组。非确定形编码如图3.5所示。
3.3内容八比特组
由零、一个或多个八比特组组成的数据值编码。内容八比特组的编码依赖于数据值的类型。
3.4 内容结束八比特
在非确定型编码时出现,由两个零八比特组组成,如图3.5所示。
四、MAP中基本编码规则的应用
由协议ANSI TIA/EIA—41D第六章,所有的MAP消息(包括操作请求和操作响应)都是SET类型。消息可能为空(一般是操作响应),如InterSystemAnswer操作的响应为空。若消息不为空,则带有一个或多个参数,这些参数或为必选项,或为可选项。
4.1 参数结构定义
以LocationRequest的请求操作为例,其在协议IA/EIA/IS-771 中数据结构描述如下:
由上表可知:该消息共有13个参数,其中4个必选参数,9个可选参数,因此在编码时它的参数个数为:4-13。
相应的根据协议ANSI TIA/EIA—41D和ASN.1规则,在程序中的数据结构定义如下:
/* 6.4.2.27 Locationrequest */
typedef struct {
cmBillID_T tBillID;
cmBCDDigitsL_T tDigits;
cmMSCID_T tMscid;
BYTE bSysTypeCode;
BITS btCPNFlag : 1;
BITS btCPN1Flag: 1;
BITS btCPN2Flag: 1;
BITS btCPSFlag : 1;
BITS btMscinFlag : 1;
BITS btPcssnFlag : 1;
BITS btRNDFlag : 1;
BITS btRPNFlag : 1; /*added in 771 */
BITS btRSFlag : 1;
BITS btTATFlag : 1;
BITS btTCFlag : 1;
BITS btTTFlag : 1; /*added in 771 */
BITS btWCFlag : 1; /*added in 771 */
BITS btRsv: 3;
cmCallPartName_T tCallPartName;
cmCPNumDig1_T tCPNumDig1;
cmCPNumDig2_T tCPNumDig2;
cmCPSubaddr_T tCPSubaddr;
cmMSCIN_T tMscin;
cmPCSSN_T tPcssn;
cmRedirNumDig_T tRedirNumDig;
cmRedirPartName_T tRedirPartName; /*added in 771 */
cmRedirSubaddr_T tRedirSubaddr;
BYTE bTermAccType;
cmTranCapa_T tTranCapa;
cmTrigType_T tTrigType; /*added in 771 */
cmWINCapa_T tWINCapa; /*added in 771 */
} cmLocReqReq_T;
4.2 参数结构编码
利用基本编码规则将这个结构进行编码,结果如下(改数据来自实验局的真实码流):
81 07 00 0D 01 00 04 24 00 84 0A 01 00 21
0B 31 33 39 09 00 03 95 03 00 0D 01 96 01 27
9F 50 0A 02 30 21 0B 31 33 39 09 00 F1 9F 5E
0C 00 01 61 0F 64 00 03 39 39 19 00 F0 9F 20
05 09 27 27 27 08 9F 77 01 FC 9F 7B 02 FF 3E
9F 82 17 01 20 BF 82 18 0C 9F 82 15 03 FF FF
1F 9F 82 19 01 03
下面对各个参数的编码(长生码流)过程进行具体说明:
1.参数tBillID
第一部分:
在协议TIA/EIA-41的表Table 112 TIA/EIA-41 MAP Parameter Identifiers 中可以查到Parameter Identifier Code为1 0 0 0 0 0 0 1B(二进制),也就是0x81(十六进制),可以得到
81:计费ID
第二部分
由基本编码规则可知,第二部分是长度八比特组,同样在协议TIA/EIA-41的6.5.2.16
节Figure 23 BillingID parameter可知,其长度为7,可以得到长度八比特组为0X07
07:参数长度
第三部分
由基本编码规则可知,第三部分是内容八比特组,其长度为7:
00 0D 01 00 04 24 00
同理,可以对其他参数进行编码。
2.参数tDigits
84:数字(拨号)
0A:参数长度
01 00 21 0B 31 33 39 09 00 03
3.参数tMscid
95:MSCID(始发系统)
03:参数长度
00 0D 01
4.参数bSysTypeCode
96:系统类型码
01:参数长度
27
5.参数tCPNumDig1
9F 50:主叫号码数字1
0A:参数长度
02 30 21 0B 31 33 39 09 00 F1
6.参数tMscin
9F 5E:MSC识别数字
0C:参数长度
00 01 61 0F 64 00 03 39 39 19 00 F0
7.参数tPcssn
9F 20:PC-SSN(始发)
05:参数长度
09 27 27 27 08
8.参数bTermAccType
9F 77:终端接入类型
01:参数长度
FC:
9.参数tTranCapa
9F 7B:处理能力
02:参数长度
FF 3E
10.参数tTrigType
9F 82 17:Trige Type
01:参数长度
20
11.参数tWINCapa
BF 82 18:WINCapa
0C:参数长度
12.参数TrigCapa
9F 82 15:TrigCapa
03:参数长度
FF FF 1F:
13.参数tWINCapa
9F 82 19:WINOperCapa
01:参数长度
03:内容
五、总结
在文中,介绍了ASN.1和基本编码规则在协议中的基本规定,主要是对协议X.208和X.208的一个简单总结概括。然后以MAP协议中LocationRequest的请求操作参数为例给出了根据ASN.1定义出的相应的数据结构,然后用基本编码规则进行了编码。通过这个例子给出了ASN.1和基本编码规则的应用思路,希望对正在进行相关工作的同事有点小小的帮助。
附注
1. ASN.1的正式标准文件及其编码规则由国际电信联盟电信分部(ITU-T)和国际标准化组织(ISO)/国际电气技术委员会(IEC)联合颁布。
Ø 介绍X.680(12/97)-信息技术-抽象语法符号1(ASN.1):基本语法规范
Ø 介绍X.681(12/97)-信息技术-抽象语法符号1(ASN.1):信息对象规范
Ø 介绍X.682(12/97)-信息技术-抽象语法符号1(ASN.1):约束规范
Ø 介绍X.683(12/97)-信息技术-抽象语法符号1(ASN.1):ASN.1规范的参数化
Ø 介绍X.690(12/97)-信息技术-ASN.1编码规范:关于基本编码规则(PER),规范编码规则(CER)和高效编码规则(DER)的说明
Ø 介绍X.690(12/97)-信息技术-ASN.1编码规范:分组编码规则(PER)的说明
这些标准的早期版本:
Ø 介绍X.208(11/88)-抽象语法符号1(ASN.1)说明
Ø 介绍X.209(11/88)-抽象语法符号1(ASN.1)基本编码规则说明
2.表示法
在协议X.208中,经常用到的符号说明:
Ø [i]n1[/i] 宽体斜体表示一个变量
Ø [ ] 方括号表示一个条款是可选的
Ø { } 大括号表示相关条款
Ø | 竖条表示可以在一组值中任选
Ø ... 省略号表示多次重复
Ø = 等号表示条目由一些子条目来表达。
3.CDMA所用的协议
Ø ANSI TIA/EIA—41D:北美的CDMA数字蜂窝移动通信网的协议
Ø IA/EIA/IS-771:有关无线智能网(WIRELESS INTELLIGENT NETWORK)的协议
展开阅读全文