ASN.1语法详解

Chapter 4 ASN.1

《Network management : principles and practice》


4.1 网络数据表示及编码
4.2 ASN.1的基本概念
4.3 基本编码规则

4.1 网络数据表示及编码
ASN.1(Abstract Syntax Notation 1)是一种形式语言。
独立与表示层编码技术,提供统一的网络数据表示。
管理信息
PDU
需要一种对数据类型和数据内容进行描述的语法。
ASN.1很好地表示出数据的含义。
ASN.1提供对传输语法的支持:BER(Basic Encoding
Rule)。
4.2 ASN.1的基本概念
4.2.1 文字约定
ASN.1区分大小写。
跳空格,与布局无关。
注释以--开头,以--或行尾结束。
标识符由大、小写字母,数字和横线组成,如sysName
内部类型标识符全部大写,如BOOLEAN,INTEGER。
用户定义的类型名和模块名以大写字母开头,School 。
4.2.2 ASN.1符号说明
符号 含义
::= 定义为
| 或
-- 后面是注释(行)
{} 清单的开始和结束
[] 标签的开始和结束
() 子类型的开始和结束
.. 范围
4.2.3 抽象数据类型
在ASN.1中,每一个数据类型都有一个标签(tag),
标签的类型分4种:
 通用标签
 应用标签
 上下文专用标签
 私有标签
通用数据类型有20多种,分4大类:

简单类型:由单一成分构成的原子类型。

构造类型:由两种以上成分构成的构造类型。

标签类型:由已知类型定义的新类型。

其他类型:包括CHOICE和ANY两种类型。
一、简单类型
1INTEGER
ASN.1中没有限制整型的位数,可以任意大小。
e.g. PageNumber::=INTEGER
ColorType::=INTEGER{
red (0),
blue (1),
green (2)}
colorA ColorType::=1
2 BOOLEAN
布尔值。取值为TRUE或FALSE。
e.g. Employed::=BOOLEAN
Married::=BOOLEAN
lincoln Married ::= TRUE ,lincoln Married ::= FALSE
3 ENUMERATED
e.g. Month::= ENUMERATED {
January (1),
February (2),
March (3),



December (12) }
hottestMonth Month::=July
--or 7
4 REAL
实数。ASN.1对实数的精度没有限制。每个实数可以用M×BE
表示,即三元组。
{M,B,E}
e.g. AngleInRadians::=REAL
angle1 AngleInRadians::={31415926,10,-7}
5 BIT STRING
位串类型,由零个或多个比特组成的有序位串。可用二进制和
十六进制表示。如: 10010001B,91H
e.g. Occupation::=BIT STRING{
clerk (0),
editor (1),
artist (2),
publisher (3) }
peter Occupation::={editor,artist}
--or "0110B"
6 OCTET STRING
八位位组串,由0个或多个8位位组组成的有序串。可用十进制
(0-255)。二进制和十六进制表示。如:1101000100011010B或
D11AH
e.g. MacAddress::=OCTET STRING(SIZE(6))
pc1 MacAddress::= 11A1D001E001H
7 OBJECT IDENTIFIER
对象标识符。从对象树派生出的一系列点分数字串的形式,用来
表示对象。
e.g. internet OBJECT IDENTIFIER::={iso(1) org(3) dod(6) 1}
directory OBJECT IDENTIFIER::={internet 1}
mgmt OBJECT IDENTIFIER::={internet 2}
experimental OBJECT IDENTIFIER::={internet 3}
private OBJECT IDENTIFIER::={internet 4}
8 NULL
空值类型,当某时刻无法知道数据的标准值,可将值为NULL。
e.g. PatientIdentifier::=SEQUENCE{
name Visiblestring --取自IA5的图形字符组成,不含控制字符
roomNumber CHOICE
{ INTEGER
NULL }}
patient1 PatientIdentifier::={name “peter”,roomNumber 301}
patient2 PatientIdentifier::={name “john”,roomNumber NULL}
CHARACTER STRING
字符串类型。包括:

NumericString

PrintableString

IA5String

VisibleString

GeneralString
e.g. NumString::= NnmericString
str1 NumString ::= “123456790”
Surname ::= PrintableString
person1 Surname ::= “John”
二、构造类型
9 SEQUENCE
序列类型。是包含零个或多个组成元素的有序列表,列表的不
同元素可以分属性不同的数据类型。
e.g. AirlineFlight::=SEQUENCE{
airline IA5string,
--取自IA5的字符组成,它与ASCII码基本相同
flight Numericstring, --包含数据0到9以及空格,不包含控制字符集
seats SEQUENCE{
maximum INTEGER,
occupied INTEGER,
vacant
INTEGER},
airport SEQUENCE {
origin IA5string,
stop1 [0] IA5string OPTIONAL,
stop2 [1] IA5string OPTIONAL,
destination IA5string },
crewsize ENUMERATED {
six (6),
eight (8),
ten (10) },
cancle BOOLEAN DEFAULT FALSE }
airplane1 AirlineFlight::={airline "china",
flight "1106",
seats {320,280,40},
airport {origin "Beijing", destination
"Shanghai"},
crewsize 10 }
或 ::= {"china", "1106", {320,107,213}, {"Beijing", "Shanghai"},10}
10 SEQUENCE OF
单纯序列(数组)类型。即序列中的各项都属于是同一类型的
ASN.1类型。
e.g. Seats::=SEQUENCE OF INTEGER
11 SET
集合类型。是包含零个或多个组成元素的无序集合,元素顺序
无意义,类型可以不相同。
e.g. Person::=SET {name IA5string,
age
INTEGER,
female BOOLEAN}
personA Person::={"maggie",4,ture} 、{true, "maggie",4} 、
{4,true, " maggie "}
12 SET OF
单纯集合类型,是包含零个或多个组成元素的无序集合。
e.g. Vipseats::=SET OF INTEGER
vipseatset Vipseats::={340,342,345}
三、标签类型
Exuniv::=[UNIVERSAL 2] INTEGER
valA Exuniv ::=9
Exappl::=[APPLICATION 0] INTEGER
valB Exappl ::=10
Expriv::=[PRIVATE 1] INTEGER
valC Expriv::=11
Excont::= SET{ type1 [0] INTEGER OPTIONAL,
type2 [1] INTEGER OPTIONAL }
四、其他类型
13 CHOICE
选择类型。包含一个可供选择的数据类型列表。对于类型能够
在事先都知道,可用此类型。
e.g. Prize::=CHOICE
{ car IA5string,
cash INTEGER,
nothing BOOLEAN }
peter Prize::=TRUE 或者
John Prize::= “ Lincoln ” 或者
Sam Prize::= 25000
14 ANY
如果在定义数据时还不能确定数据类型,可以使用ANY型。
ANY型可以被任何ASN.1类型置换。
e.g. TextBook::=SEQUENCE
{ author IA5string,
reference ANY}
实例:book1 TextBook ::= { author "shakespeare ",
reference IA5string " ISBN0669123757 "}
book2 TextBook ::= { author "shakespeare ",
reference INTEGER 1988}
4.2.4 子类型
通过对某些类型加以限制,可以定义它们的子类型(subtype)。子
类型的值集合是其父类型值集合的子集。
(1) 单个值
在定义中列举出所有可能的取值,e.g.
TestResult ::=INTEGER(1|2|3|4)
sp1 TestResult ::= 2
(2) 大小限制
通过限制父类型中元素的个数定义新类型或规模。
e.g. WorkstationNumber::=OCTET STRING(SIZE(6))
BitField ::= BIT STRING(SIZE(12))
map1 BitField ::= „100110100100‟B
map2 BitField ::= „9A4‟H
(3) 取值范围(值区间)
只适用于整数和实数类型,
e.g. NoID::=INTEGER(1..100)
PositiveInteger ::=INTEGER(0<..MAX)
PositiveInteger ::=INTEGER(1..MAX)
(4) 可用字符
只用于字符串类型,限制字符集的取值范围。
DigitString ::=IA5String(FROM(0)|(1)|(2)|(3)|(4)|(5)|
(6)|(7)|(8)|(9))
str2 DigitString ::= “46732”
(5) Inner Subtyping (内部类型)
适用于SEQUENCE,SEQUENCE OF,SET,SET OF和CHOICE类,主要用于对
这些结构类型的元素项进行限制。
e.g. PDU::=set{ alpha [0] INTEGER,
beta
[1] IA5striong OPTIONAL,
gamma [2] SEQUENCE OF parameter,
delta
[3] BOOLEAN }
TestPDU::=PDU(WITH COMPONENTS{alpha(min..<0),...,delta(FALSE)})
(6) 包含子类型
要用到关键字INCLUDES,说明被定义的新子类型包含原子类型的全部可能值。
e.g. Months::=ENUMERATED{jaunary(1),february(2),...,december(12)}
First-quarter::=Months(january,february,march);
Second-quarter::=Months(april,may,june)
First-half::=Months (INCLUDES First-quarter|INCLUDE Second-quarter)
jan First-quarter ::= 1
4.2.5 应用类型
ASN.1中的应用类型与特定的应用有关,根据网络管理的实际特点,
RFC1155定义了6种SNMP应用类型。
(1) NetworkAddress::=CHOICE{internet IpAddress} --可从各种网络地
址中选择一种,目前只有Internet地址,即IP地址。
(2) IpAddress::=[APPLICATION 0] IMPLICIT OCTET STRING(SIZE(4))
(3) Counter::= [APPLICATION 1] IMPLICIT INTEGER(0..4294967295)
(4) Gauge::=[APPLICATION 2] IMPLICIT INTEGER(0..4294967295)
(5) TimeTicks::=[APPLICATION 3] IMPLICIT INTEGER(0..4294967295)
(6) Opaque::= [APPLICATION 4] OCTET STRING --arbitrary ASN.1
value 不透明类型
4.3 基本编码规则
用ASN.1语言书写的变量必须转换为串行的字节流才能在网络中传输。为此,
ASN.1又提供了基本编码规则(BER)来描述传输过程中内容的表示。
约定


八位位组:八比特组成
八位位组的二进制位编号从8到1,第8位为最高有效位,第1位位最低有效位
编码结构
标签八位位组
长度八位位组
 标签(tag)字段:关于标签类别和编码格式的信息。
 长度(Length)字段:定义内容字段的长度。
 值(Value)字段:包含实际的数据 。
内容八位位组
1. 标签字段
标签字段对标签类别、标签号和编码格式进行编码。
8
7
标签类别
6
5
4
P/C
1 1 1 1 1
2
1
标签号
P/C
前导八位位组
类别
3
后继八位位组
1
1
+
1
+
0
+
= 标签号
e.g. UNIVERSAL 10 编码:00 0 01010
APPLICATION 35 (构造类型) 编码:01 1 11111 0 0 100011
2. 长度字段
用来表示值字段的八位位组数。
确定格式。(编码时知道长度;长格式和短格式)
长度字段分类
不确定格式。
规则如下:
 若编码是简单类型,则使用确定格式;
若编码是构造的,并且编码立即可用,既可以使用确定格式,也可以使用不
确定格式,由发送者选择;
若编码是构造的,但编码不是立即可用,则使用不确定格式。
短格式:e.g. L=38 编码:00100110
长格式:e.g. L=201 编码: 10000001 11001001
不确定格式:10000000
3. 值字段
由零个或多个八位位组组成,并按不同类型数据值的不同规定对它们进行编
码。
(1) 布尔值的编码
由1个字节组成。FALSE为00;TRUE为FF。
e.g. TRUE的编码:01 01 FF
FALSE 的编码:01 01 00
(2) 整数编码
值字段一个或多个八位位组组成,整数值采用二进制补码形式编码。
e.g. 0 编码 02 01 00
127 编码 02 01 7F
256 编码 02 02 01 00
-129 编码 02 02 FF 7F
(3) 空值的编码
空值的标签 UNIVERSAL 5, 编码 05 00
(4) 位串值的编码
简单类型
构造类型
e.g. (0A3B5F291CD)16
简单类型编码:03 07 04 0A3B5F291CD0
构造类型编码:将位串值拆为(0A3B)16和(5F291CD)16
23 80
03 03 000A3B
03 05 04 5F291CD0
00 00
(5) 对象标识符的编码
对象标识符值的编码是简单类型。
第一个编码子标识符的数值:(X*40)+Y
e.g. 对象标识符 {joint-iso-ccitt 100 2},即{2,100,3}
编码:06 03 813403 H
(6) 八位位组串和字符串类型值的编码
e.g. IA5String类型字符串“ACE” 编码 16 03 41 43 45 H
八位位组串“ACE0” 编码 04 02 AC E0 H
(7) 序列值的编码
序列值的编码是构造类型。
e.g. 序列类型{name IAString, ok BOOLEAN},值{name “smith”, ok
TRUE}
编码:30 0A
16 05 73 6D 69 74 68
01 01 FF
(8) 集合值的编码
集合类型的元素是无序的,有多种编码。
e.g. 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
Key Point:BER
Homework:P89, 1,3,15
English References:
Mani Subramanian(苏布拉马尼亚 ) ,


来自:http://www.cnblogs.com/zhangsf/archive/2013/08/26/3283159.html

猜你喜欢

转载自blog.csdn.net/u010990478/article/details/76567116