网络管理基础知识学习(二)

第二课时:抽象语法表示

一、学习速览

  • 数据表示
  • ASN.1语法
  • ASN.1基本编码规则BER
  • 宏定义

二、抽象语法表示的两个概念

(一)抽象语法表示ASN.1

  • Abstract Syntax Notation(ASN.1)是一种形式语言。
  • 提供统一的网络数据表示,用于定义应用数据的抽象语法和应用协议数据单元的结构。
  • OSI或SNMP管理信息库,都是用ASN.1定义的。

(二)基本编码规则BER

  • Basic Encoding Rule(BER)是一种编码规则。
  • 用ASN.1定义的应用数据在传送过程中按照BER变换成比特串。

三、网络数据表示

(一)数据具有语法语义两个方面

  • 语法:指数据的表示形式,或者说构成数据的规则。
  • 语义:指数据的内容及其含义。
  • 同样的语义有不同的语法表示。

(二)数据表示的一般步骤

  • 确定要表示信息的数据类型。
  • 对于不同类型的数据定义不同的操作。
  • 任何类型的数据最终都将被表示成为比特序列

备注比特序列不能说明它自身表示哪一种类型的数据,它所代表的意义会因计算机体系结构、程序设计语言等因素的不同而不同。

(三)网络数据的表示格式

1、不同计算机系统的数据表示格式不同

(1)原因

网络中不同类型的计算机交互通信时,采用的 “语法”不同,这种差异决定了同一数据对象在不同计算机中被表示为不同的比特序列。

(2)示例

2、需要统一的网络数据表示格式

(1)原因

  • 为了保证同一数据对象在不同计算机中语义的正确性,实现在不同应用系统之间的信息交换。
  • 对于网络中n个异体的节点能互通,我们需要为每个节点编写(n-1)个编解码程序,即需要总数为n*(n-1)个编解码程序。

(四)表示层

1、表示层的作用

(1)具体作用

  • 为了保证同一数据对象在不同计算机中语义的正确性,实现在不同应用系统之间的信息交换。两个系统在传输数据前需要协商共用的编码方式。表示层负责在两个应用系统间进行编码协商和实际信息编码

  • 可以实现从通信线路上所用的外部数据格式到接收计算机所用的内部数据格式的转换。

(2)实现过程

  • 在ASN.1中为每个应用所需的所有数据结构类型下了定义,并将它们组成库;
  • 当一个应用想发送一个数据结构时,可以将数据结构与其对应的ASN.1标识一起传给表示层;
  • 以ASN.1定义作为索引,表示层便知道数据结构的域的类型及大小,从而对它们编码传输;
  • 在另一端,接收表示层查看此数据结构的ASN.1 标识,从而了解数据结构的域的类型及大小;
  • 表示层这样就可以实现从通信线路上所用的外部数据格式到接收计算机所用的内部数据格式的转换。

(3)示意图

2、表示层的基本概念

(1)抽象语法(Abstract Syntax )

数据类型的ASN.1描述称为抽象语法。定义了数据的常用结构(包括不同的数据类型),独立于任何编码技术的,只与应用有关。

(2)传输语法(Transfer Syntax)

提供从抽象语法表示的数据到比特序列,以及其相反操作的方法。

(3)编码规则(Encoding Rule)

提供了如何将抽象语法映射为传输语法。

(五)其他规则和概念

1、在互相通信的端系统中至少有一个应用实体(如SNMP、TELNET、 FTP等)和一个表示实体(即ASN.1)。

2、表示实体:定义了应用数据的抽象语法;对应用层数据进行编码,将其转换成二进制的比特串进行传送。

3、应用协议:按照预先定义的抽象语法构造协议数据单元,用于交换信息。

4、 传输语法:是数据在传输过程中的实际表示,通常为字节流。因此,提供从抽象语法表示的数据到比特序列,以及其相反操作的方法。

6、关于信息表示的通信系统模型:

备注ASN.1其实是高层表示方法;Ber相当于一种编码算法。

三、ASN.1语法

(一)ASN.1语法的概述和相关概念

1、ASN.1的由来

(1)ASN.1是由原CCITT和ISO共同开发的标准语言,可在系统间进行数据的传输。

(2)表示、编码、传输和解码数据结构的关键,是要有一种足够灵活的、适应各种类型应用的标准数据结构描写方法。为此,OSI中提出了一种标记法,叫做抽象语法标记1,简称为ASN.1。发送时将ASN.1数据结构编码成位流,这种位流的格式叫做抽象语法

2、ASN.1语法的作用

(1)示意图

(2)表示上下文

  • 传输语法抽象语法之间是多——多对应关系,即一种传输语法可用于多种抽象语法的数据传输,而一种抽象语法的数据值也可用多种传输语法来传输。
  • 每个应用层协议中的抽象语法与一个能对其进行编码的传输语法的组合,就构成一个表示上下文(PRESentation Context)。
  • 表示上下文可以在表示连接建立时协商确定,也可以在通信过程中重新定义。
  • 表示层提供定义表示上下文的设施。

3、ASN.1的文本约定

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

4、ASN.1符号

5、常用的ASN.1关键字

(二)ASN.1学习引入

1、ASN.1的两个根本问题

  • 数据类型
  • 编码规则:基本编码规则(Basic Encoding Rules ,BER)

2、示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
struct Student  //声明一个结构体类型Student 
{
int num;
char name[20];
char sex;
int age;
float score;
char address[30];
};
学生的学号、姓名、性别、年龄、成绩、家庭地址

Student ::= SEQUENCE {
num INTEGER,
name OCTET STRING,
age INTEGER,
score REAL,
address OCTET STRING,
}

3、C语言的数据类型

(三)抽象数据类型

1、标签

(1)在ASN.1中,每一个数据类型都有一个标签(tag)。标签有类型和值,数据类型由标签的类型和值唯一确定。

(2)标签的类型分为以下4种:

  • 通用标签:UNIVERSAL表示,由标准定义的。
  • 应用标签:APPLICATION表示,是由某个具体应用定义的类型。
  • 上下文专用标签:Context-Specific表示,这种标签在一定范围中适用。
  • 私有标签:PRIVATE表示,用户定义的标签。

2、ANSI.1定义的数据类型

ANSI.1定义的数据类型有20多种,标签类型都是UNIVERSA,如下图所示:

3、数据类型的分类:可分为4大类

  • 简单类型:由单一成分构成的原子类型,包括INTEGER,BOOLEAN,…
  • 构造类型:由两种以上成分构成的构造类型,包括SEQUENCE, SEQUENCE OF,…
  • 标签类型:由已知类型定义的新类型。
  • 其他类型:包括CHOICE和ANY两种类型。

4、简单类型

(1)INTEGER

  • 例2.1:Number ::=INTEGER

(2)BOOLEAN

  • 例2.2:Married ::=BOOLEAN

(3)REAL实数类型,对精度没有限制。

  • 可以表示为科学计数法: M×BE,其中尾数M和指数E可以取任何正或负整数值,基数B可以取2或10。

(4)ENUMERATED枚举类型,实际上是一组个数有限的整数值。

  • 可以给每个整型值赋予不同的意义。

  • 例2.3

1
2
3
4
5
6
7
8
Week ::=ENUMERATED {
Monday (1),
Tuesday (2),
Wednesday (3),
Thursday (4),
Friday (5),
Saturday (6),
Sunday (7) }
  • 例2.4:对于SNMP的MIB中,在获取响应信息中的错误状态如下所示
1
2
3
4
5
6
7
ErrorStatus::= ENUMERATED {
noError (0),
tooBig (1),
noSuchname (2),
badValues (3),
readOnly (4),
genError (5) }

(5)BIT STRING位串类型,由0个或多个比特组成的有序位串。

  • 位串的值可以由对应的二进制或十六进制串表示。
  • 例如:10100010B或A2H 都是位串类型的有效数值。

(6)OCTET STRING八位位组串,由0个或多个8位位组组成的有序串。

  • 和位串类型一样,八位位组串也可以用对应的二进制或十六进制串表示。

(7)OBJECT IDENTIFIER对象标识符,从对象树派生出的一系列点分数字串的形式,用来标识对象。

  • 在ASN.1中对象集合按照树形结构组织,树的每个分支被赋予一个整数标识。
  • 对象标识符是从根节点开始到对象节点路径上边标识的顺序连接,它是对象的唯一标识
  • 根节点以下有3个节点,分别是ccitt(0)iso(1)joint-isoccitt(2),它们向下又可细分,如iso的子节点包括standard (0),registration-authority(1),member-body(2),org(3)。
  • 其中org(3)下面的子节点internet就定义了最常使用的管理对象
  • 例2.5
1
2
3
4
5
6
7
internet  OBJECT IDENTIFIER ::= { 
iso(1)
org(3)
dod(6)
1 }
对象标识符的值是1.3.6.1
iso.org.dod.1

(8)NULL:空值类型。

  • 它仅包含一个值:NULL,主要用于位置的填充
  • 如果某个时刻无法得知数据的准确值,简单的方法就是将这一数据定义为NULL类型。
  • 还可以用NULL表示序列中可能缺省的某个元素。

(9)CHARACTER STRING:字符串类型。

  • ASN.1中定义了一些字符集不完全相同的CHARACTER STRING类型,不同类型包含的字符集不同。
  • 标准ASCII字符可以分为G集(图形符号集,ASCII字符编号范围是33~126)和C集(控制符号集,ASCII字符编号范围是0~31)。空格符(编号32)和删除符(编号127)同时属于两个符号集。

5.构造类型

构造类型有序列集合两种:

  • 分别用SEQUENCESEQUENCE OF表示不同类型和相同类型元素的序列。
  • 分别用SETSET OF表示不同类型和相同类型元素的集合。
  • 序列和集合的区别是前者的元素是有序的,而后者是无序的。

(1)SEQUENCE,序列类型,是包含0个或多个组成元素的有序列表。

  • 列表的不同元素可以分属于不同的数据类型。每个元素由元素名和元素类型组成,元素类型可以是简单类型,也可以是定义的其他构造类型。
  • 元素类型标识符后可以跟OPTIONALDEFAULT
  • OPTIONAL表示在构造类型的赋值过程中,该元素可以出现,也可以不出现。
  • DEFAULT表示在构造类型的赋值过程中,该元素没有指定值时的缺省值。
  • COMPONENTS OF表示将另一个类型的成员插入到当前类型中。
  • 例2.6如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
AirlineFlight ::=SEQUENCE { 
airline IA5STRING,
flight IA5STRING,
seats SEQUENCE {
maximum INTEGER,
occupied INTEGER,
vacant INTEGER,
},
airport SEQUENCE {
origin IA5STRING,
stop[0] IA5STRING OPTIONAL,
stop[1] IA5STRING OPTIONAL,
destination IA5STRING
},
crewsize ENUMERTAED {
six (6),
eight (8),
ten (10)},
cancel BOOLEAN DEFAULT FALSE
}

它的一个实例是:

airplane1 AirlineFlight ::={ airline "china",
flight "C3416",
seats {320 ,280,40},
airport { original "Qingdao",stop[0] "TaiYuan",destination
"WuLuMuQi"},
crewsize 10
}
或 airplane1 :: ={"china" , "C3416" , {320 , 280 , 40} , { original "Qingdao",stop[0] "TaiYuan",destination "WuLuMuQi"},10}

(2)SEQUENCE OF,单纯序列(数组)类型。

  • 即序列中的各项都属于同一类型,可以看作是SEQUENCE类型的特例。
  • 例2.7:定义了座位号类型Seats,因为座位号都是整数,所以可以使用单纯序列类型。
1
Seats ::=SEQUENCE OF INTEGER

(3)SET,集合类型。

  • 是包含0个或多个组成元素的无序集合。
  • 这些元素的顺序无任何意义,但是它们之间必须是不相同的,组成元素的类型可以为不同的ASN.1类型。
  • 例2.8
1
2
3
4
5
6
7
8
9
10
11
Student ::=SET {
number INTEGER,
name IA5STRING,
age INTEGER,
gender ENUMBERTED {male(0), female(1)},
major IA5STRING
}

{20040320,"LiYong",19,{0},"Network Engine"},
{20040720,"WangHua",20,{1},"Computer Application"},
它们都属于Student类型的同一个实例。

(4)SET OF,单纯集合类型。

  • 是包含0个或多个组成元素的无序集合,同单纯序列类型类似,这些组成元素必须为相同的ASN.1类型。
  • 例2.9
1
2
VipSeats ::=SET OF INTEGER 
vipseats VipSeats ::={60,80,120}

6.标签类型

(1)注意事项

传输数据,一定要避免接收方收到数据解码时出现不清楚的地方。具体说,接收方要明确知道每个收到数据的类型,所以要对各类型进行系统性的编号。这个编号(即tag)是类型的标识符,在ASN.1中每种类型的tag是唯一的。 

(2)组成

标签类型由一个标签类(class)和一个标签号(class number)组成。

(3)分类,标签类型有4种:

  • 通用类(UNIVERSAL)
  • 应用类(APPLICATION)
  • 私有类(PRIVATE)
  • 上下文无关类(CONTEX-SPECIFIC)。

备注:通用类标签是ASN.1标准定义的,除了CHOICEANY类型之外,所有的简单类型和结构类型都具有统一分配的唯一标签。加标签后的类型实质上是一个新的类型,它和原来的类型在结构上是一样的,但是是不同的类型,举例如下:

例2.10

1
2
Number ::=[ UNIVERSAL 2]INTEGER
valA Number::=200603

7.其他类型

CHOICEANY是两个没有标签的类型,因为它们的值是未定的,而且类型也是未定的。当这种类型的变量被赋值时,它们的类型和标签才能确定。

(1)CHOICE,选择类型,包含一个可供选择的数据类型列表。

CHOICE类型的每个值都是其中某一数据类型的值。数据可能在不同情况下取不同的值,若这些可能的类型能够在事先都知道,那么就可以使用CHOICE类型。

例2.11

1
2
3
4
5
6
7
Prize ::= CHOICE{
car IA5STRING,
cash INTEGER,
nothing BOOLEAN
}

由于奖项的种类是可以预知的,分别为nothing TRUE,car“Lincoln” 和cash 25000。

(2)ANY

ANY类型和选择类型(具有确定的数据类型选择范围)不同,若在定义数据时不能确定数据的类型,可以使用ANY类型。ANY型可以被任何ASN.1类型置换。

例2.12

1
2
3
4
5
6
7
Book::=SEQUENCE{
author IA5STRING,
reference ANY
}

{author "Martin" ,reference IA5STRING "ISBN007895"}和
{author "Martin", reference INTEGER 1998} 都是Book的正确实例。

(四)子类型

1、子类型的定义

子类型是由限制父类型的值集合而导出的类型,所以子类型的值集合是父类型的子集。

2、子类型产生子类型的方法

子类型还可以产生子类型,产生子类型的方法有以下6种:

(1)单个值(Single Value)

  • 列出子类型可取的各个值。
  • 例如,TestResule::=INTEGER(0|1|2)表示TestResult可以取0、1或2中的一个值。

(2)值区间(Value Range)

  • 这种方法只能用于整数和实数,指出子类型可取的区间。
  • 例如,EmployeeNumber::=INTEGER(1000..20000)表示该变量取整数值,范围为1000~20000。

(3)允许字符(Permitted Alphabet)

  • 允许字符只能用于字符串类型,限制字符集的取值范围。
  • 例如,House Size::= IA5STRING(FROM(“0” | “1” | “2” | “3” |“4” | “5” | “6” | “7” | “8” | “9”)SIZE(5))表示该变量可取的值是5个数字组成的字符串。

(4)限制大小(Size Constrained)

  • 可以限制5种类型(BIT STRING,OCTET STRING,CHARACTER STRING,SEQUENCE OF,SET OF)的规模大小。
  • 例如, WorkstationNumber::=OCTET STRING(SIZE(32))表示该变量的值为32个字节的串。

(5)包含子类型(Contained Subtype)

  • 从已有的子类型定义新的子类型,新子类型包含原子类型的全部可能的值。用关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。

  • 例如,

1
2
3
4
5
Months::=ENUMERATED{January (1),February (2),March(3),
April(4) ,May(5),June(6),July(6),August(8), September(9),October(10),November(11),December (12)}
First-quarter::=Months(January,February,March)
Second-quarter::=Months(April,May,June)
First-half::=Months(INCLUDES First-quarter | INCLUDES Secondquarter)

(6)内部子类型(Inner Subtype)

  • 适用于SEQUENCE,SEQUENCE OF,SET,SET OF和CHOICE类型,主要用于对这些结构类型的元素项进行限制。

  • 例如,下面定义的协议数据单元(PDU)类型。

1
2
3
4
PDU::=SET { alpha [0] INTEGER,
Beta [1] IA5STRING OPTIONAL,
Gamma [2] SEQUENCE OF parameter,
Delta [3] BOOLEAN i8}

(五)应用类型

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)

计数器类型是一个非负整数,其值可增加,但不能减少,达到最大值2^32−1后回零,再从头开始增加。计数器可用于计算收到的分组数或字节数。

4、Gauge::=[APPLICATION 2] INTEGER(0..4294977295)

计量器类型是一个非负整数,其值可增加,也可减少。最大值为2^32−1 ,与计数器不同的是计量器达到最大值后不回零,而是锁定在2^32−1 ,直到复位,计量器可用于表示存储在缓冲队列中的分组数。

5、TimeTicks::=[APPLICATION 3] INTEGER(0..4294977295)

时钟类型是非负整数,从1~2^32−1 ,时钟单位以0.01s递增,可表示从某个事件(如设备启动)开始到目前经过的时间。

6、Opaque::=[APPLICATION 4 ] OCTET STRING

不透明类型即未知数据类型,或者说可以表示任意类型。这种数据编码时按照OCTET STRING处理,管理站和代理能解释这种类型。

三、ASN.1基本编码规则BER

(一)几条前提

  • 用ASN.1表示的变量必须转换为串行的字节流才能在网络中传输。
  • 基本编码规则(Basic Encoding Rules,BER):转换文本ASN.1语法到机读代码的算法
  • ASN.1用BER来描述传输过程中内容
  • BER在ISO 8825/X标准中进行了定义,指明了每种数据类型中每个数据的值的表示。
  • 发送端用 BER 编码,将用 ASN.1 所表述的报文转换成惟一的比特序列。接收端用 BER 进行解码,得到该比特序列所表示的ASN.1 报文。

(二)BER编码结构

1、BER传输语法的格式

(1)BER传输语法的格式是TLV三元组<标签Tag,长度 Length,值Value>

  • 标签(Tag)字段是关于标签类别和编码格式的信息;
  • 长度(Length)字段表示值(Value)字段的数据长度
  • 值(Value)字段包含实际的数据。

(2)示意图

(3)BER传输语法是基于八位组(由8比特组成,是编码的基本单位)大端编码的。其八位组中的二进制编号从8到1,高8位在左,约定第8位是最高有效位,第1位是最低有效位,示意图如下:

2、标签字段

(1)标签字段的结构示意图

(2)标签的编码

(3)标签字段的具体含义

3、长度字段

(1)BER编码中Length表示Value部分所占八位组的个数

(2)格式主要有两大类:确定格式不确定格式

  • 在确定格式中又分为短、长两种格式。
  • 采用确定格式,当长度不大于127时,Length只在一个八位组中编码;当长度大于127时,在多个八位组中编码,此时第一个八位组低七位表示的是Length所占的长度,后续八位组表示Value 的长度。
  • 采用不确定格式时,Length所在八位组固定编码为0x80,在Value后以两个0x00结尾。可以在编码没有完全结束的情况下,可以先发送部分消息给对方。

(3)编码规则

  • 若编码是简单类型,则使用确定格式。
  • 短格式:长度字段仅一个八位组,最高位为0。
  • 长格式:长度字段包含多个八位组,第1个字节最高位为1,其余7位表示后面有多少字节来表示值字段的长度。例如,25510 可表示为10000001 11111111
  • 若编码是构造类型,并且编码立即可用,则既可以使用确定格式,也可以使用非确定格式,由发送者选择。
  • 若编码是构造类型,但编码不是立即可用,则使用非确定格式。

4、值字段

内容字段由0个或多个八位组组成,并根据不同类型数据值的不同规定对它们进行编码。

(二)编码举例

以UNIVERSAL Tag和短型Value为例,介绍各种类型的BER编码,重点关注Value部分。

1、BOOLEAN

  • 布尔值的编码是简单类型,其值由1个八位组组成;
  • FALSE的编码是01 01 00;TRUE的编码是 01 01 FF;
  • 其中第一个字节表示布尔类型的标签(UNIVERSAL 1);
  • 第二个字节表示值部分的长度为1个字节;
  • 第三个字节表示布尔值。

2、NULL

  • 空值的编码是简单类型,不需要使用值八位组,相应的长度值0;
  • 空值的标签是UNIVERSAL 5,所以编码为05 00。
  • 如图所示:

3、INTEGER

  • 整数值的编码是简单类型,其值由1个或多个八位组组成;
  • 整数值采用二进制补码形式编码;
  • 补码从高位到低位排列在值的第一字节的第8位到第1位,第二字节的第8位到第1位,以下按顺序类推;
  • 编码取需要的最小字节数,因此不可能出现第一字节的所有位和第二字节的第8位全0或全1的情况;
  • 对于正数,如果最高比特位为0则直接编码;
  • 如果为1,则在最高比特位之前增加一个全0的八位组;
  • 对于负数,先取绝对值,再取反,最后加1。
  • 例如1:0的编码02 01 00;127的编码 02 01 7F。其中第一个字节表示整数类型的标(UNIVERSAL 2),第二个字节表示值部分的长度为1个字节。
  • 例如2:128的编码02 02 00 80;256的编码02 02 01 00。其中第一个字节表示整数类型的标签(UNIVERSAL 2),第二个字节表示值部分的长度为2个字节,第三个字节和第四个字节表示值的大小。
  • 例如3:−128的编码 02 01 80;−129的编码02 02 FF 7F。
  • 如图为127、256、−129的BER编码:

4、REAL

  • 实数值的编码是简单类型,其值由1个或多个八位位组组成。
  • 如果实数值为0,则不需要使用值八位位组,相应长度值为0,则编码为09 00。如果实数值不为0,则使用“B”作为编码的基。基可以由发送者选择。如果“B”是2,8或16,则选择二进制编码;如果“B”是10,则选择字符编码。
  • 采用二进制编码时,分为尾数编码和指数编码两部分
  • 尾数编码的部分信息和指数编码的长度由第一个值八位组指定,后面接着是指数编码字段,剩余的值字段是尾数编码的其他部分。如果尾数不为0,那么它由符号S、非负整数值B和二进制比例因子F来表示,即M= S × B × 2F,0≤F<4,S = ±1
  • S由第一个值八位组的位7表示,S = −1则位7等于1,否则位7等于0。位6和位5根据基数B进行编码。基数为2,编码为00;基数为8,编码为11,基数为16,编码为10。位4和位3是比例因子的无符号二进制表示。
  • 位2和位1对指数编码的形式,如下图所示:

  • 值字段的剩余部分将整数值N编码成无符号二进制。
  • 当使用十进制编码(位8和位7等于00)时,按ISO 6093的规定进行编码。其中第一个值八位组的位6到位1规定使用ISO 6093的何种编码形式,如下图所示:

  • 当对特别实数值进行编码(位8和位7等于01)时,只需要一个值八位组即可。特别实数值是指正无穷(PLUS-INFINITY)和负无穷(MINUS-INFINITY),它们的编码如下图所示:

5、BIT STRING

  • 位串值的编码可以是简单类型,也可以是构造类型
  • 简单编码的值八位组包含一个初始八位组,取值为0到7,表征这个值最后补位的个数。由发送方决定补位采用0还是1。后面跟0个、1个或多个后继八位组。位串的第一位置于第一个后继八位组的第8位,以下顺序类推构造编码的值八位组由0个、1个或多个数据值的完整编码组成。每个这样的编码都包括标识、长度和值字段。每个数据值的编码通常采用简单编码,如下图所示:

  • 采用构造编码则为:
1
2
23 80 03 03 000A3B
03 05 045F291CD0
  • 将位串值拆为(0A3B)(045F291CD)两部分,如下图所示:

6、OCTET STRING

  • 字节串值的编码与BIT STRING类似,但是不需要增加表征补充位个数的八位组。例如,字节串ACE可编码为04 02 AC E0,而字符串“ACE”编码为16 03 414345,如下图所示:

7、OBJECT IDENTIFIER

  • 对象标识符值的编码是简单类型,值八位组是互相连接的子标识符编码的表。每个子标识符标识为一个或多个八位组。每个八位组的第8位指示它是否是该系列的最后一个,最后八位组的第8位为0,其他八位组的第8位为1,第1至7位组合起来作子标识符的编码。

  • 第一个编码子标识符的数值从被编码的对象标识符值中的前两个子标识符值得出,使用公式:(X × 40) + Y。其中X和Y是前两个子标识符的值。因此,编码子标识符数比实际对象全部字标识符数少1。

  • 对象标识符{ joint-iso-ccitt 100 3},即{ 2 100 3},计算得到2 × 40 + 100 = 180,因此按照{180 3}编码为:06 03 813403H。其中第一个字节表示对象标识符类型的标签(UNIVERSAL 6),第二个字节表示值部分的长度为3个字节。该对象标识符的BER编码如下图所示:

8、SEQUENCE

  • 序列值的编码是构造类型。值八位组由序列类型ASN.1定义中列出的每个类型的一个数据值得完整编码组成,除非该类型带有关键字“OPTIONAL”“DEFAULT”,否则这些值的编码可以不出现。例如,序列类型{name IA5String ok BOOLEAN},值{name “john” ,ok TRUE},可以编码为:30 0A16 05 73 6D 69 74 68 01 01 FF。
  • 按照序列结构可以展开为下图所示:

9、SET

  • 与SEQUENCE类似,但是由于集合类型的元素是无序的,故有多种编码,成员顺序由发送者决定。
  • 例如,SET{breadth INTEGER,bent BOOLEAN}的值{breadth 7, bent FALSE}的编码为:31 06 02 01 07 01 01 00;也可以是31 06 01 01 00 02 01 07。成员的顺序可以改变。

四、宏定义

  • ASN.1宏提供了创建“模块”的功能,这也是引入ASN.1的原因。ASN.1宏使得ASN.1语言具有良好的扩充。
  • ASN.1模块是针对某一特定应用,由一组相关的ASN.1类型定义语句和赋值语句组成的命名集合。使用ASN.1,必须在模块中定义类型并赋值。不同模块中定义的数据类型可以相互引用。
  • 宏定义,实际上是使用一个固定的格式,用户可以在这个格式中填写类型符号和值符号的产生式,创造新的类型。宏定义有两部分内容,类型的语法符号书写规则和该类型的值符号规则,即类型和值的符号如何书写。

(一)模块定义

  • ASN.1的基本单位是模块,类似于C语言中的结构,用于定义一个抽象数据类型ASN.1。模块实际上是由一组类型定义和值定义组成。模块定义的基本形式为:
    `

    1
    2
    3
    4
    5
    6
    <模块名> DEFINITIONS ::=
    BEGIN
    EXPORTS
    IMPORTS
    <模块体>
    END
  • 其中,模块名的第一个字母必须大写。EXPORTS结构用于定义其他模块可以移值的类型或值,而IMPORTS结构规定了模块中某些定义是从其他模块中移植过来的。

  • 模块体部分包含模块定义的所有类型、值和宏定义。

  • 模块定义例子

(二)宏表示

1、ASN.1宏提供了创建“模板”用来定义宏的方法,MIB对象就是采用宏定义模板来定义。下面介绍定义宏的方法,为此需要区分3个不同的概念。

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

2、举例如下:

1
2
3
4
5
6
<macroname>  MACRO ::=
BEGIN
TYPE NOTATION::=
VALUE NOTATION::=
<支持产生式>
END
  • 其中,macroname是宏的名字,必须全部大写。
  • 宏定义由类型表示、值表示和支持产生式3部分组成,由Backus-Naur 规范说明。
  • 当用一个具体的值代替宏定义中的变量或参数时就产生了宏实例,它表示一个实际的ASN.1类型(称为返回的类型),并且规定了该类型可取的值的集合(称为返回的值)。
  • 可以把宏定义看做是类型的模板,用这种模板制造出形式相似、语义相关的许多数据类型。
  • 实例:FC1212的宏OBJECT-TYPE的定义

(三)宏实例的定义

  • 当用一个具体的值代替宏定义中的变量(或参数)时就产生了宏实例,它表示一个实际的ASN.1类型(称为返回的类型),并且规定了该类型可取的值的集合(称为返回的值)。宏实例(即ASN.1类型)的定义首先是对象名,然后是宏定义的名字,最后是宏定义规定的宏体部分。
  • 实例:对象定义-例2.14,2.15。

五、小结

  • 抽象语法表示ASN.1定义了一组用来描述网络上所传输的数据结构规则。在ASN.1中,每一个数据类型都有一个标签,包括标有类型和值。
  • ANSI.1定义的数据类型有20多种,标签类型都是UNIVERSAL。
  • 用ASN.1定义的应用数据在传送过程中要按照一定的规则变换成比特串,这种规则就是基本编码规则(Basic Encoding Rule,BER)。
  • ASN.1提供了宏定义功能,可用于扩充语法,定义新的类型和值。

六、第二课时作业

(一)单选题

1、在ASN.1的数据类型分类中由已知类型定义的新类型是( )。

A、简单类型

B、构造类型

C、标签类型

D、其它类型

我的答案:C

2、计算机网络管理中提供统一的网络数据表示的形式语言是( )。

A、ASN.1

B、Java

C、C语言

D、ASP

我的答案:A

3、( )的功能提供统一的网络数据表示。

A、应用层

B、表示层

C、传输层

D、网络层

我的答案:B

4、ASN.1中,标签的类型可分为( )。

A、简单标签、通用标签、上下文专用标签、应用标签

B、简单标签、应用标签、上下文专用标签、私有标签

C、通用标签、应用标签、上下文专用标签、私有标签

D、通用标签、构造标签、上下文专用标签、私有标签

我的答案:C

5、以下对ASN.1的数据类型描述正确的是 ( )。

A、每个数据类型(包括CHOICE和ANY)都有标签

B、分别用SEQUENCE和SEQUENCE OF表示相同类型和不同类型元素的序列

C、分别用SET和SET OF表示不同类型和相同类型元素的集合

D、隐含标签的语义是在一个基本类型上加上新标签,从而导出一个新类型

我的答案:D

(二)填空题

1、( )用于定义应用数据,它类似程序设计语言定义的抽象数据类型。

我的答案: 第一空:ASN.1

2、在ASN.1中,每一个数据类型都有一个标签(tag),标签有( )和( )。

我的答案: 第一空:类型 第二空:值

3、ASN.1定义的数据类型可分为4类:分别为( )、( )、( )、( )。

我的答案: 第一空:简单类型 第二空:构造类型 第三空:标签类型 第四空:其他类型

4、序列:用( )表示不同类型元素的序列,用( )表示相同类型元素的序列。

我的答案: 第一空:SEQUENCE 第二空:SEQUENCE OF

5、( )把ASN.1表示的抽象类型值编码为字节串。

我的答案: 第一空:OCTET STRING

(三)简答题

1、布尔类型有两个值FALSE和TRUE,分别写出FALSE和TRUE的编码。

我的答案

1
2
3
FALSE:010100

TRUE:0101FF

2、表示层的功能是什么?抽象语法和传输语法各有什么作用?

我的答案

1
2
3
4
5
表示层的功能:为了保证同一数据对象在不同计算机中语义的正确性,实现在不同应用系统之间的信息交换。两个系统在传输数据前需要协商共用的编码方式。表示层负责在两个应用系统之间进行编码协商和实际信息编码。

抽象语法的作用:定义了数据的常用结构(包括不同的数据类型)。

传输语法的作用:提供从抽象语法表示的数据到比特序列,以及其相反操作的方法。

3、用基本编码规则对长度字段L编码:L = 18,L = 180,L = 1044。

我的答案

1
L=18,00010010;L=180,10000001 10110100;L=1044,10001000 10010100。

4、用基本编码对数据编码:标签值 = 1011001010,长度 = 255。

正确答案

1
00011111 10000101 01001010 10000001 11111111

5、写出一个ASN.1的模块,该模块以SEQUENCE数据类型指定monthsOfYear,并以VisibleString类型指定一年中的每一个月(month1,month2,…)。写出ASN.1对于结构的描述,并写出对于值的描述。

我的答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
monthsOfYear :: = SEQUENCE{

Month1 VisibleString,

Month2 VisibleString,

Month3 VisibleString,

Month4 VisibleString,

Month5 VisibleString,

Month6 VisibleString,

Month7 VisibleString,

Month8 VisibleString,

Month9 VisibleString,

Month10 VisibleString,

Month11 VisibleString,

Month12 VisibleString }
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×