更新时间:2022-09-27 16:36
抽象语法(Abstract Syntax Notation,ASN.1)是一种形式语言,它提供统一的网络数据表示,通常用于定义应用数据的抽象语法和应用协议数据单元的结构。在网络管理中,无论是OSI的管理信息结构或是SNMP管理信息库,都是用ASN.1 定义的。
抽象语法表示 ASN.1 定义了一组用来描述OSI网络上所传输的数据结构规则。ASN.1是一种形式语言,它提供统一的网络数据表示,通常用于定义应用数据的抽象语法和应用协议数据单元的结构。在网络管理中,无论是OSI 的管理信息结构或是SNMP管理信息库,都是用ASN.1定义的。
在ASN.1 中,每一个数据类型都有一个标签(tag),标签有类型和值,数据类型是由标签的类型和值唯一确定的。有4种标签:通用标签UNIVERSAL、应用标签APPLICATION、上下文专用标签Context-Specific、私有标签PRIVATE。ANSI.1定义的数据类型有 20 多种,标签类型都是 UNIVERSAL。用ASN.1定义的应用数据在传送过程中要按照一定的规则变换成比特串,这种规则就是基本编码规则(Basic Encoding Rule,BER)。ASN.1 提供了宏定义功能,可用于扩充语法,定义新的类型和值。
表示层的功能是提供统一的网络数据表示。在互相通信的端系统中至少有一个应用实体(如 SNMP、TELNET、FTP 等)和一个表示实体(即ASN.1)。表示实体定义了应用数据的抽象语法,这种抽象语法类似于通常程序设计语言定义的抽象数据类型。应用协议按照预先定义的抽象语法构造协议数据单元,用于和对等系统的应用实体交换信息。表示实体则对应用层数据进行编码,将其转换成二进制的比特串,例如,把十进制数变成二进制数,把字符变成ASCII 码等。比特串由下层的传输实体在网络中传送。在各个端系统内部,应用数据被映像成本地的特殊形式,存储在磁盘上或显示在用户终端上,如图1所示。
这里定义的抽象语法是独立于任何编码技术的,只与应用有关。抽象语法要满足应用的需要,能够定义应用需要的数据类型和表示这些类型的值。ASN.1 是根据当前网络应用的需求制定的标准(原CCITT X.208 和 ISO 8824),但随着网络应用的发展,今后还会开发出新的表示层标准。
数据类型的 ASN.1 描述称为抽象语法,同等表示实体之间通信时对用户信息的描述称为传输语法。为抽象语法指定一种编码规则,便构成一种传输语法。在表示层中,可用这种方法定义多种传输语法。传输语法与抽象语法之间是多—多对应关系,即一种传输语法可用于多种抽象语法的数据传输,而一种抽象语法的数据值可用多种传输语法来传输。对传输语法的要求是支持对应的抽象语法,另外还可以有其他一些属性,例如,支持数据加密或压缩,或者两者都支持。
ASN.1是由原CCITT和ISO共同开发的标准语言,它与应用层一起使用,可在系统间进行数据的传输。在ASN.1 中为每个应用所需的所有数据结构类型进行定义,并将它们组成库。当一个应用想发送一个数据结构时,可以将数据结构与其对应的ASN.1 标识一起传给表示层。以ASN.1 定义作为索引,表示层便知道数据结构的域的类型及大小,从而对它们编码传输;在另一端,接收表示层查看此数据结构的ASN.1 标识,从而了解数据结构的域的类型及大小。这样,表示层就可以实现从通信线路上所用的外部数据格式到接收计算机所用的内部数据格式的转换。
每个应用层协议中的抽象语法与一个能对其进行编码的传输语法的组合,就构成一个表示上下文(Presentation Context)。表示上下文可以在连接建立时协商确定,也可以在通信过程中重新定义。表示层提供定义表示上下文的功能。
作为一种形式语言,ASN.1 有严格的BNF定义。ISO 8824/X.208 标准说明了ASN.1,下面列出ASN.1 文本的书写规则,这些规则叫做文本约定(Lexical Convention)。
(1)多个空格和空行等效于一个空格。
(2)用于表示值和字段的标识符、类型指针和模块名由大小写字母、数字和短线组成。
(3)标识符以小写字母开头。
(4)类型指针和模块名以大写字母开头。
(5)ASN.1定义的内部类型全部用大写字母表示。
(6)关键字全部用大写字母表示。
(7)注释以一对短线(--)开始,以一对短线或行尾结束。
在ASN.1 中,每一个数据类型都有一个标签(tag),标签有类型和值,数据类型是由标签的类型和值唯一确定的,这种机制在数据编码时有用。标签的类型分为以下4种。
通用标签:用关键字UNIVERSAL表示,带有这种标签的数据类型是由标准定义的,适用于任何应用。
应用标签:用关键字APPLICATION表示,是由某个具体应用定义的类型。
上下文专用标签:用关键字 Context-Specific 表示,这种标签在文本的一定范围(如一个结构)中适用。
私有标签:用关键字PRIVATE表示,这是用户定义的标签。
ANSI.1 定义的数据类型有 20 多种,标签类型都是 UNIVERSAL,这些数据类型可分为4大类:
简单类型:由单一成分构成的原子类型,包括 INTEGER,BOOLEAN,REAL,ENUMERATED,BIT STRING,OCTET STRING,NULL,OBJECT IDENTIFIER,CHARACTERSTRING。
构造类型:由两种以上成分构成的构造类型,包括SEQUENCE,SEQUENCE OF,SET,SET OF。
标签类型:由已知类型定义的新类型。
其他类型:包括CHOICE和ANY两种类型。
子类型是由限制父类型的值集合而导出的类型,所以子类型的值集合是父类型的子集。子类型还可以产生子类型。产生子类型的方法有以下6种。
1.单个值(Single Value) :列出子类型可取的各个值。
2.值区间(Value Range) :这种方法只能用于整数和实数,指出子类型可取的区间。
3.允许字符(Permitted Alphabet) :允许字符只能用于字符串类型,限制字符集的取值范围。
4.限制大小(Size Constrained) :可以限制5种类型(BIT STRING,OCTET STRING,CHARACTER STRING,SEQUENCEOF,SET OF)的规模大小。
5.包含子类型(Contained Subtype) :从已有的子类型定义新的子类型,新子类型包含原子类型的全部可能的值。用关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。
6.内部子类型(Inner Subtype) :适用于SEQUENCE,SEQUENCE OF,SET,SET OF和CHOICE类型,主要用于对这些结构类型的元素项进行限制。
ASN.1中的应用类型与特定的应用有关。具体到SNMP这种应用,RFC1155 定义了以下应用类型。
1.NetWorkAddress::=CHOICE {internet IpAddress}
这种类型用 ASN.1 的 CHOICE 构造定义,可以从各种网络地址中选择一种。目前只有Internet地址,即IP地址。
2.IpAddress::=[APPLICATION 0] IMPLICIT OCTET STRING(SIZE(4))
以网络序表示的IP地址。因为它是一个32 位的值,所以定义为4个字节。
3.Counter::=[APPLICATION 1] IMPLICIT INTEGER(0..4294977295)
计数器类型是一个非负整数,其值可增加,但不能减少,达到最大值 232−1 后回零,再从头开始增加。计数器可用于计算收到的分组数或字节数。
4.Gauge::=[APPLICATION 2] INTEGER(0..4294977295)
计量器类型是一个非负整数,其值可增加,也可减少。最大值为232−1,与计数器不同的是计量器达到最大值后不回零,而是锁定在232−1,直到复位,计量器可用于表示存储在缓冲队列中的分组数。
5.TimeTicks::=[APPLICATION 3] INTEGER(0..4294977295)
时钟类型是非负整数,从 1~232−1,时钟单位以 0.01s 递增,可表示从某个事件(如设备启动)开始到目前经过的时间。
6.Opaque::=[APPLICATION 4 ] OCTET STRING
不透明类型即未知数据类型,或者说可以表示任意类型。这种数据编码时按照 OCTET STRING处理,管理站和代理能解释这种类型。
用 ASN.1 表示的变量必须转换为串行的字节流才能在网络中传输。转换文本 ASN.1 语法到机读代码的算法,称为基本编码规则(Basic Encoding Rules,BER)。ASN.1 用BER来描述传输过程中内容,BER在 ISO 8825/X标准中进行了定义。
BER传输语法的格式是TLV三元组,即<标签Tag,长度 Length,值Value>。标签(Tag)字段是关于标签类别和编码格式的信息;长度(Length)字段包含实际的数据;值(Value)字段包含实际的数据。TLV每个域都是一系列八位位组,对于构造结构,其中V还可以是TLV三元组。
BER传输语法是基于八位位组(八位位组由八比特组成,是编码的基本单位)的,自定界的编码,因为其中L明确界定了八位位组的长度。BER是大端编码的,其八位位组中的二进制编号从8到1,约定第8位是最高有效位,第1位是最低有效位。
ASN.1 宏提供了创建“模板”的功能,这也是引入ASN.1 宏的原因。ASN.1 宏使得ASN.1语言具有良好的扩充性。
ASN.1的基本单位是模块,用于定义一个抽象数据类型ASN.1模块实际上是由一组类型定义和值定义组成。类型定义是说明类型的名称和类型的格式,值定义是规定将什么样的具体值赋给某一类型。模块定义的基本形式为
DEFINITIONS::=
BEGIN
EXPORTS
Assignment List
END
其中,Module Identifier 是模块名,模块名的第一个字母必须大写。EXPORTS 结构用于定义其他模块可以移值的类型或值,而 IMPORTS 结构规定了模块中某些定义是从其他模块中移植过来的。
Assignment List 部分包含模块定义的所有类型、值和宏定义。
ASN.1 宏提供了创建“模板”用来定义宏的方法,MIB对象就是采用宏定义模板来定义。下面是定义宏的方法,为此需要区分3个不同的概念。
宏表示:ASN.1 提供的一种表示机制,用于定义宏。
宏定义:用宏表示定义的一个宏,代表一个宏实例的集合。
宏实例:用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型。
宏定义的模板形式为
MACRO::=
BEGIN
TYPE NOTATION::=
VALUE NOTATION::=
END
其中,macroname是宏的名字,必须全部大写。宏定义由类型表示(TYPE NOTATION)、值表示(VALUE NOTATION)和支持产生式(supporting syntax)3部分组成,而最后部分是任选的,是关于宏定义体中类型的详细语法说明。这3部分都由Backus-Naur规范说明。当用一个具体的值代替宏定义中的变量或参数时就产生了宏实例,它表示一个实际的 ASN.1 类型(称为返回的类型),并且规定了该类型可取的值的集合(称为返回的值)。可见宏定义可以看做是类型的类型,或者说是超类型。另一方面也可以把宏定义看做是类型的模板,用这种模板制造出形式相似、语义相关的许多数据类型。这就是宏定义的主要用处。