写在前面的话:
前几天刚完成公司的一个项目,期间遇到一些非技术性问题,第一个就是数据类型的定义,虽然这些不干扰项目的正常进行,本人大概有强迫症,想着还是要把这个问题搞清楚,这才是一个码农该有的态度。本文章第一版本适用于想简单了解ASN.1的童鞋们,如果想要深入该领域请移步Google,或者点击下方的下载链接 1, 2,里面有关于ASN.1的详细介绍。
一.概述
1.ASN.1是什么?
ASN.1是抽象语法标记的缩写,英文全称为Abstract Syntax Notation DotOne,是用来描述抽象数据类型的语法规范,定义了一种对数据进行表示、编码和传输的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的应用程序。
2.为什么需要ASN.1?
看了上面的叙述,你有可能觉得会更懵,还不如不看。不要着急,这就是为什么写这一节的理由。当你明白为什么需要ASN.1的时候,上面晦涩的概念便很好理解。
在互联网中,不同体系架构的系统和多种编程语言为系统间的通讯带来了障碍。例如,系统A向系统B发送一个消息,虽然在物理层传输的时候是由0和1构成的码流,但是B在解析消息时,可能会因为边界对齐方式、数据在内存中存放的方式以及不同编程语言对于同一类数据的不同定义等而解析错误。因此,B需要解码器将A发出的消息转换为可以被自己正确解析的数据。这样一来就解决了系 统之间通讯的问题。但是,互联网中的系统很多,在极端情况下,为了保证网络中n个异体的节点互 通,我们需要为每个节点编写(n-1)个编解码程序,即需要总数为n*(n-1)个编解码程序,如图Fig 1。 这样不利于互联网的发展,因此,有人提出了另一种思路,即所有系统都用一种统一的规范和标准传输和解析数据,在极端情况下,为了保证互通,需要为每个节点编写1个编码和1个解码程序,即总数为2n个编解码程序如图,Fig 2。这样我们以有限的代价就能完成相当多数量系统之间的互连。
![]() |
![]() |
3.特点
我们可以看出,可以将通信编解码设计与开发工作转嫁给ASN.1编译器完成。从而不必在手工编写编解码器。一方面大量减少了缺陷引入,另一方面更是大大加快了系统开发速度(不用编写编解码器,也不同详细调试,维护代价也很小)3。
二.语法三元组
两个系统在传输数据前需要协商共用的编码方式。表示层负责在两个应用系统间进行编码协商和实际信息编码。为了达到这个目的,ASN.1定义了下面三个语法:
1) 抽象语法:定义了数据的常用结构,并且建立了和应用层对话所依赖的框架。
2) 传输语法:定义两个系统间基于各自会话层的表示层间交换数据的表示方法(实际通讯系统间的码流)。
3) 编码语法:提供从抽象语法到传输语法和其相反操作的方法。
![]() |
三.应用
网络管理系统中的管理信息库、应用程序的数据结构、协议数据单元(PDU)、X509证书
四.参考文献
- [2] ASN.1 学习
- [3] ASN.1
- [4] ASN.1 Complete
Note:4和5是国外的PDF书目,感兴趣的童鞋可以下载下来看,不过是全英文版本的,英文不错的可以研究一下