![](https://csdnimg.cn/release/download_crawler_static/86605876/bg1.jpg)
ASN.1 编码规则详解
1 简介
注释:
本章的内容主要翻译自《ASN.1 Communication between Heterogeneous Systems》和
《ASN.1 Complete》。
ASN.1 – Abstract Syntax Notation dot one,抽象记法 1。数字 1 被 ISO 加在 ASN 的后边,
是为了保持 ASN 的开放性,可以让以后功能更加强大的 ASN 被命名为 ASN.2 等,但至今也没有出
现。
不同体系的系统,不同编程语言之间,都存在通讯障碍。如 Figure 1-1a)所示极端情况下,
为了保证网络中 n 个异体的节点能互通,我们需要为每个节点编写(n-1)个编解码程序,即需要
总数为 n*(n-1)个编解码程序。在 b)所示极端情况下,为了保证互通,需要为每个节点编写 1
个编码和 1 个解码程序,即总数为 2n 个编解码程序。
Figure 1-1 两种类型的通讯方式
对于给定的记法描述,ASN.1 编译器能执行并产生如 Figure 1-2 图中虚线部分,这样我
们以有限的代价就能完成相当多数量系统之间的互连。
![](https://csdnimg.cn/release/download_crawler_static/86605876/bg2.jpg)
Figure 1-2 语法三元组:实际语法、抽象语法和传输语法
图中实际语法(Concrete Syntax)是指诸如 C、Objective Caml 等这样实际编程语言,抽
象语法(Abstract Syntax)指 ASN.1,传输语法(Transfer Syntax)指表示层交换数据的表示
方法。从抽象语法到传输语法,由 ASN.1 编译器按照编解码规则实现。通俗来讲,抽象语法就是
协议采用 ASN.1 规范描述的描述文本;传输语法就是实际通讯系统间的码流。
Figure 1-3 抽象语法与传输语法
其实在早期的一些标准如 ASCII,它们既定义了抽象语法(比如字母 A),又定义了传输语
法(0x41)。ASN.1 分离了这两种概念,以便可以选择一种适合要求的编解码方法。系统可以选
择编码方法以使信息传送时效率很高,或者具有很高的可靠性,等等。另一方面,定义好的编码
规则也会很大地节约应用协议开发人员的时间,特别是当牵涉到的数据结构很复杂的时候。当使
用 ASN.1 的项目较多时,这种节约更加明显,因为编解码程序可以只开发一次但很多应用程序都
可以用它。
我们可以看出,可以将通信编解码设计与开发工作转嫁给 ASN.1 编译器完成。从而不必在
手工编写编解码器。一方面大量减少了缺陷引入,另一方面更是大大加快了系统开发速度(不用
编写编解码器,也不同详细调试,维护代价也很小)。
![](https://csdnimg.cn/release/download_crawler_static/86605876/bg3.jpg)
Figure 1-4 转嫁编解码器工作给 ASN.1 编译器
讨论 ASN.1 就不得不先提到标准组织 ISO 和 ITU。
1.2 ISO 简介
国际标准组织(ISO – International Organization for Standardization)于 1946 年在美
国成立,其负责制定众多领域的国际标准;但除电气、电子和电子工艺领域外,这些主要是 IEC
(International Electrotechnical Commission)负责。
ISO 汇集了一百多个代表其自己国家的标准委员会(称之为 NB – National Body),ANSI
(American National Standard Institute)代表美国,AFNOR (Association Francaise de
NORmalisation)代表法国,BSI(British Standard Institute)代表英联邦,等等。其它一些
组织可以参加讨论,提出议案,但不能参加投票。
Figure 1-5 ISO 组织结构
如 Figure 1-5 所示,ISO 共分为 172 个技术委员会 Technical Committee (TC)负责相应
标准化领域。 所有议题都在子委员会 SubCommittees 中共享,Subcommittee 又分为工作组
Working Groups(WG)。
![](https://csdnimg.cn/release/download_crawler_static/86605876/bg4.jpg)
到 1987 年,著名的 OSI 标准就是 TC97 的成果,称之为“Telecommunications and
Information Exchange Between Systems”。在 1987 年,ISO 和 IEC 两个标准化组织一致认为都
应当关注信息技术 Information Technology,因此成立了一个联合技术委员会称为 JTC1。JTC1
的秘书处由 ANSI 负责。
Figure 1-6 JTC1 组织结构示意图
在 ASN.1 标准刚刚受到关注时,基于历史原因,ASN.1 主要来自于 CCITT 的成果,有很多提
案来自 CCITT。在 80 年代,ISO 在 1990 年左右成为主角前,两个委员会的确有过合作。
1.3 ITU 简介
国际电信联盟 ITU(International Telecommunication Union)总部位于日内瓦,于 1947
年成为联合国的专设机构,其前身为成立于 1865 年的国际电报联盟(International Telegraph
Union)。ITU 汇集了 188 个代表其国家的公共电信运营商和大约 450 个来自私有部门称之为
RPOA(Registered Private Operating Authorities)的成员(如 AT&T, Bell 电话等)。来自
其它组织的运营商也被接收,但不具有投票权利。
ITU 的目标是:“to promote and to offer technical assistance to developing countries
in the field of telecommunications, and also to promote the mobilization of the material
![](https://csdnimg.cn/release/download_crawler_static/86605876/bg5.jpg)
and financial resources needed for implementation, and to promote the extension of the
benefits of the new telecommunication technologies to all the world's inhabitants”。
ITU 有 5 个常设组织,其中一个为 CCITT(Consultative Committee on International
Telephony and Telegraphy)负责电信网络,如有线传输语音,数据和电视。在 1992 年 ITU 重组
后,CCITT 成为了 ITU-T(ITU-Telecommunication Standardization Sector)。
ITU-T 发布的建议都是以一个字母开头(每个领域一个字母编号)和一个数字作为参考号。
我们通常关注的有:
F: Non-Telephone Telecommunications Services;
H: Audiovisual and Multimedia Systems;
Q: Switching and Signalling;
T: Terminals for Telematic Services;
V: Data Communications Over the Telephone Network;
X: Data Networks and Open System Communications;
Z: Programming Languages.
到 1992 年,所有 CCITT 已经通过其委员会多次论证后的建议每四年发布一次(即使某
些部分还未完成),其封面用不同的颜色(即黄皮书、红皮书、兰皮书和白皮书):黄色
代表 1976-1980,红色代表 1980-1984,蓝色代表 1984-1988,白色代表 1988-1992。
ITU-T 现在是当某个标准稳定后单独发布。此外,自 1994 年开始,为了防止出现不一
致,ISO/IEC 和 ITU-T 都是联合发布标准文本(各用不同的参考号)。 不一致的情况在
ASN.1 中出现过。
ITU-T 分为研究组 SG(Study Group),其中:
SG VII,“Data Networks and Open System Communications”,课题广
泛,包括互连(比如 ASN.1),X.25 网络标准,X.400 Email 姓名地址录标准,网络安
全和网络管理等。
SG VIII,“Terminals for Telematic Services”负责 Teletex,Videotex 和
字符集等。
每个 SG 的工作又被划分为问题 Question:其中一些相当有名,比如涉及 OSI 模型的
Q24/7;另外一些则是对以发布标准的更为精确的更新。每个问题最终结束于一个新标准或者一
个现有标准的补充。
1.4 ASN.1 历史
开始于 1982 年夏天,许多开发应用层标准的人意识到他们面临同一个问题:数据结构变得
越来越复杂,难以用预定的规程来编解码比特或者字节(在 1978 年,OSI 中术语 Open 是至关重
要的)。如同编译器取代了汇编器,通常认为编码器应当从描述 Specification 自动产生,这样
使得描述也等效为一种计算机程序。
1.4.1 诞生