网络管理:抽象语法表示 ASN.1


表示层#

由于应用数据定义不同,给通信共享造成了障碍,表示层担负了消除这种障碍的任务。表示层的功能是提供统一的网络数据表示,如同应用程序和网络之间的翻译官。也就是说当网络传输流量时,表示层将流量表示为有意义的数据,解决了信息的语法表示并采用统一格式。也就是,说数据的压缩、解压、加密、解密都在该层完成。

由于应用层数据繁多,并且存在多种字符集编码的情况,表示层通过 ASN.1 进行数据的表示,并且在会话层用 BER 编码 ASN.1 的数据。应用协议按照预先定义的抽象语法构造协议数据单元,用于和对等系统进行通信。表示实体则对应用层数据进行编码,变成二进制的比特串,例如把十进制数变成二进制数、把字符变成 ASCII 码等,比特串由下面的传输实体在网络中传送。在各个端系统内部,应用数据被映像成本地的特殊形式,存储在磁盘上或显示在用户终端上。

ASN.1#

ASN.1 概念#

Abstract Syntax Notation One(ASN.1)抽象语法标记是一种数据定义语言,描述了对数据进行表示、编码、传输和解码的数据格式。它用于定义网络管理系统中的管理信息库(MIB)、应用程序的数据结构和协议数据单元(PDU)。
抽象语法是独立于任何编码技术的,只与应用有关。抽象语法必须满足应用的需要,能够定义应用需要的数据类型和表示这些类型的值。ASN.1 是根据当前网络应用的需求制定的标准,随着网络应用的发展,还会出现新的表示层标准。

ASN.1 的应用场景#

ASN.1 独立于机器,独立于程序语言,独立于应用程序的内部表示。应用于定义任何数字信息,包括音频、视频、图片、数据等。它可以解决以下 3 个场景

  1. 程序语言之间数据类型不同;
  2. 不同机器平台之间数据的存储方式不同;
  3. 不同种类的计算机内部数据表示不同。

例如一个 ASN.1 对个人信息记录的定义如下,可以等看完下面的内容后再回头试着读懂。

书写规则#

  1. 书写的布局是无意义的,多个空格和空行等效于一个空格;
  2. 用于表示值和字段的标识符、类型指针(类型名)和模块名由大小写字母、数字和短线组成;
  3. 标识符以小写字母开头;
  4. 类型指针和模块名以大写字母开头;
  5. ASN.1 定义的内部类型全部用大写字母表示;
  6. 关键字全部用大写字母表示;
  7. 注释以一对短线(-)开始,以一对短线或行尾结束。

在 ASN.1 中,用符号 ::= 表示产生式,读做“定义为”。

ASN.1 标签类型#


在ASN.1中,每一个数据类型都有一个标签(tag),标签有类型和值集合两种属性。标签的类型分为以下4种:

标签类型 说明
通用标签 UNIVERSAL 由标准定义的,适用于任何应用
应用标签 APPLICATION 由某个具体应用定义的类型
上下文专用标签 在文本的一定范围(例如一个结构)中适用
私有标签 PRIVATE 用户定义的标签

ASN.1 数据类型#


ASN.1定义的数据类型有 20 多种,标签类型都是 UNIVERSAL。ASN.1 定义的通用类型标签如下所示:

这些数据类型可分为 4 大类:

数据类型 说明
简单类型 由单一成分构成的原子类型
构造类型 由两种以上成分构成的构造类型
标签类型 由已知类型定义的新类型
其他类型 包括 CHOICE 和 ANY 两种类型

简单类型#

除了 UNIVERSAL 16 和 UNIVERSAL 17 之外的标签都是简单类型,特点是可以直接定义它们的值的集合,可以把这些类型作为原子类型构造新的数据类型。

第一组-基本类型#

简单类型可以分为 4 组,第一组包括 BOOLEAN、INTEGER、BIT STRING、OCTET STRING、REAL 和 ENUMERATED 等,可以称之为基本类型。定义整数类型的例子如下:

Copy Highlighter-hljs
EthernetNumberCollisionsRange::=INTEGER{minimum(0),maximum(1000)}

值得一提的是枚举类型 ENUMERATED,它是整数列表,对每个元素(整数)取名。其中整数只是符号,不能做算术运算。定义枚举类型的例子如下:

Copy Highlighter-hljs
EthernetAdapterStatus::=ENUMERATED{normal(0),degraded(1),offline(2),failed(3)}

第二组-字符串类型#

第二组包括各种字符串类型,标签为 UNIVERSAL 18~22 和 UNIVERSAL 25~27,都是 OCTET STRING 类型的子集。

第三组-信息对象类型#

第三组包括 OBJECT IDENTIFIER 和 Object Descriptor 两种类型,泛指网络中传输的任何信息对象,例如标准文档、抽象语法和传输语法、数据结构和管理对象等。

数据类型 说明
OBJECT IDENTIFIER 对象 由一个整数序列组成,它唯一地标识一个对象
Object Descriptor 以人工可读的形式描述信息对象的语义

第四组#

数据类型 说明
NULL 空类型,没有值,只占用结构中的一个位置,该位置可能出现或不出现数据。
EXTERNAL 外部类型,即标准之外的文档定义的类型
UTCTime (世界通用时)格式 YYMMDDhhmmss,加后缀表示本地时间
GeneralizedTime 格式是 yyyymmddhhmmss.x,加后缀可表示本地时间

构造类型#

构造类型有序列和集合两种,分别用 SEQUENCE 和 SEQUENCE OF 表示不同类型和相同类型元素的序列,分别用 SET 和 SET OF 表示不同类型和相同类型元素的集合。序列和集合的区别是前者的元素是有序的,而后者是无序的。

定义序列#

定义序列的语法如下,其中 NamedType 是类型指针,序列的每一成分类型可跟关键字 OPTIONAL (任选)或 DEFAULT (默认值),COMPONENTS OF 子句用于指示另一个被包含的类型。

Copy Highlighter-hljs
SequenceType::=SEQUENCE{ElementTypeList}| SEQUENCE {}

定义 SEQUENCE OF 类型的语法:

Copy Highlighter-hljs
SequenceOfType::=SEQUENCE OF Type | SEQUENCE

定义序列类型的例子如下:

定义集合#

定义 SET 和 SET OF 的语法是类似的:

Copy Highlighter-hljs
SetType::=SET {ElementTypeList}| SET {} SetOfType::=SET OF Type | SET

定义集合类型的例子如下:

标签类型#

该类型是应用或用户加在某个类型上的标签,对于一个应用标签 [APPLICATION X],一个类型可以有多个类型名。
结构类型(序列或集合)中,可用上下文专用标签区分类型相同的元素,例如集合中有 3 个同样类型的元素,分别指本人、父亲、母亲的名字,可以用 [1]、[2] 和 [3] 表示。

其他类型#

CHOICE 和 ANY 是没有标签的类型,因为它们的类型和值未定,当这种类型的变量被赋值时,其类型和标签确定(运行时确定)。
CHOICE 类型是可选类型列表,仅其中一个类型可被采用,产生一个值。

Copy Highlighter-hljs
ChoiceType::= CHOICE{AlternativeTypeList}


ANY 类型表示任意类型的任意值,实际出现的类型也是未知的.

Copy Highlighter-hljs
AnyType::=ANY | ANY DEFINED BY identifier

子类型#


子类型是由限制父类型的值集合而导出的类型,子类型的值集合是父类型的子集,子类型还可以再产生子类型。产生子类型的方法有 6 种:

单个值#

列出子类型可取的各个值。如定义小素数为整数类型的子集:

Copy Highlighter-hljs
SmallPrime::=INTEGER(2|3|5|7|11|13|15|17|19|23|29)

包含子类型#

用关键字 INCLUDES,说明被定义的类型包含了已有类型的所有的值。例如:

Copy Highlighter-hljs
First-half::=Months(INCLUDES First-quarter | INCLUDES Second-quarter)

值区间#

仅应用于整数和实数类型,指出取值区间。PLUS-INFINITY 和 MINUS-INFINITY 分别表示正、负最大值,MAX 和 MIN 分别表示父类型可允许的最大值和最小值,区间可以是闭区间或开区间(加上符号“<”)。例如:

Copy Highlighter-hljs
PositiveInteger::=INTEGER(0<..PLUS-INFINITY) PositiveInteger::=INTEGER(1..PLUS-INFINITY) PositiveInteger::=INTEGER(0<..MAX) PositiveInteger::=INTEGER(1..MAX)

这四个定义是等价的。

可用字符#

用于字符串类型,限制可使用的字符集。例:

Copy Highlighter-hljs
TouchToneButtons::=IA5String(FROM("0"|"1"|"2"|"3"|"4"|"5"|"6"|"8"|"9"|"*"|"#"))

限制大小#

可对5种类型限制其规模大小,例如限制比特串、字节串或字符串的长度,限制构成序列或集合的元素(同类型)个数等。例如参数表包含最多 12 个参数:

Copy Highlighter-hljs
ParameterList::=SET SIZE(0..12) OF Parameter

内部子类型#

假定有一种协议数据单元:

Copy Highlighter-hljs
PDU::=SET{ alpha[0] INTEGER, beta [1] IA5String OPTIONAL, gamma[2] SEQUENCE OF Parameter, delta[3] BOOLEAN }

例如子类型定义为要求布尔值必须是 FALSE,整数值必须是负的:

Copy Highlighter-hljs
TestPDU::=PDU(WITH COMPONENTS{....delta(FALSE),alpha(MIN.. <0)})

子类型定义为要求 beta 参数必须出现,其值为 5 或 12 个字符组成的串:

Copy Highlighter-hljs
FurtherTestPDU::=TestPDU(WITH COMPONENTS{....beta(SIZE 5|12) PRESENT})

宏定义#

模块定义#

模块类似于 C 语言中的结构体,用于定义一个抽象数据类型。模块定义的形式为:

Copy Highlighter-hljs
<modulereference> DEFINITIONS::= //模块名和标识符 BEGIN EXPORTS //出口部分 IMPORTS //模块引用的类型和值 AssignmentList //模块定义的类型、值和宏定义 END

宏表示#

宏定义可以看作类型的类型(超类型),也可以看类型的模板,可用于制造形式相似、语义相关的数据类型。

概念 说明
宏表示 ASN.1提供的一种表示机制,用于定义宏
宏定义 用宏表示定义的一个宏,代表一个宏实例的集合
宏实例 用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型

宏定义的一般形式如下:

Copy Highlighter-hljs
<macroname> MACRO::= //宏名字(全大写) BEGIN TYPE NOTATION::=<new-type-syntax> //类型表示 VALUE NOTATION::=<new-value-syntax> //值表示 [<supporting-productions>] //支持产生式 END

参考资料#

《计算机网络管理(第三版)》雷震甲 编著,西安电子科技大学出版社

posted @   乌漆WhiteMoon  阅读(2844)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
历史上的今天:
2020-04-28 数据结构:最小生成树
点击右上角即可分享
微信分享提示
CONTENTS