ASN.1详解 r囧r小猫 2023-01-16 02:38 337阅读 0赞 Chapter 4 ASN.1 《Network management : principles and practice》 4.1 网络数据表示及编码 4.2 **ASN.1**的基本概念 4.3 基本编码规则 4.1 **[网络][Link 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][http_www.cnblogs.com_zhangsf_archive_2013_08_26_3283159.html] [Link 1]: http://blog.csdn.net/shanzhizi/article/category/1157892 [http_www.cnblogs.com_zhangsf_archive_2013_08_26_3283159.html]: http://www.cnblogs.com/zhangsf/archive/2013/08/26/3283159.html
还没有评论,来说两句吧...