版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第二章 抽象语法表示ASN.1,2.1 网络 数据表示 ? 2.2 ASN.1的基本概念 2.3 基本编码规则 2.4 ASN.1宏定义,1.网络系统的发展,怎么进行 异种 (异构)?信息间的通信? 2.为什么用ASN.1?现有的数据结构表达方式不可以吗? 3.传输语法与BER.,2.1 网络数据表示,_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 体现什么思想? 和SNMP协议、数据类型是什么关系?,ASN.1描述了一种对数据进行表示、编码、传输和解码的数据格式。它提供了一整套正规的格式用于描述对象的结构,而不管语言上如何执行及这些数据的具体指代,也不用去管到底是什么样的
2、应用程序。,ASN.1是什么?,在任何需要以数字方式发送信息的地方,ASN.1 都可以发送各种形式的信息(声频、视频、数据等等)。 ASN.1 和特定的 ASN.1 编码规则推进了结构化数据的传输,尤其是网络中应用程序之间的结构化数据传输,它以一种独立于计算机架构和语言的方式来描述数据结构。,ASN.1 取得成功的一个主要原因是它与几个标准化编码规则相关,如基本编码规则(BER) -X.209 、规范编码规则(CER)、识别名编码规则(DER)、压缩编码规则(PER)和 XER 编码规则(XER)。 这些编码规则描述了如何对 ASN.1 中定义的数值进行编码,以便用于传输,而不管计算机、编程语
3、言或它在应用程序中如何表示等因素。,1.在互相通信的端系统中至少有一个应用实体和一个表示实体。 2.把抽象数据变换成比特串的编码规则叫做传输语法。 如图2.1所示。,网络数据表示,图2.1 关于信息表示的通信系统模型,name value,Get-request 报文?协议? ASN.1 编码?,V 01 03 06 01 02 01 01 01 00,L 09,T OBJECT IDENTIFIER,T NULL,L 00,L 01,T SEQUENCE?,L 0C,L 0E,L 04,T INTEGER,L 01,request-id,error-status,error-index,va
4、riable-bindings,T INTEGER,V 05 AE 56 02,V 00,T SEQUENCE OF?,T INTEGER,V 00,VarBind,T A0,L 1D,GetRequest -PDU,request-ID,1. 3. 6. 1. 2. 1. 7. 1. 0,GetRequest-PDU,和七层协议的关系?,ASN.1表示数据例子,例如:数据类型特点? Report := SEQUENCE author OCTET STRING, title OCTET STRING, body OCTET STRING, biblio Bibliography ,在这个例子中
5、,Report是由名字类型的信息组成的,而SEQUENCE表示消息是许多数据单元构成的,前三个数据单元的类型是OCTET STRING,而最后一个数据类型则下面的ASN.1语法表示它的意义: Bibliography := SEQUENCE author OCTET STRING title OCTET STRING publisher OCTET STRING year OCTET STRING ,2.2 ASN.1的基本概念,ASN.1文本的书写规则,这些规则叫做文本约定: (1)书写的布局是无效的,多个空格和空行等效于一个空格; (2) 用于表示值和字段的标识符、类型指针(类型名)和模块
6、名由大小写字母、数字和短线组成;,(3) 标识符以小写字母开头; (4) 类型指针和模块名以大写字母开头; (5) ASN.1定义的内部类型全部用大写字母表示; (6) 关键字全部用大写字母表示; (7) 注释以一对短线(- -)开始,以一对短线或行尾结束。 ASN.1的特点?,2.2.1 抽象数据类型 在ASN.1中,每一个数据类型都有一个标签(Tag)?,标签有类型和值(见表2.1),数据类型是由标签的类型和值惟一决定的,这种机制在数据编码时有用。标签的类型分为以下4种: 通用标签 应用标签 上下文专用标签 私有标签,ASN.1定义的数据类型有20多种,标签类型都是UNIVERSAL,如表
7、2.1所示。这些数据类型可分为4大类。 简单类型(?) 构造类型 标签类型 其他类型 (CHOICE、ANY),表2.1 ASN.1定义的通用类型,?,表2.1 ASN.1定义的通用类型,?,第一组BOOLEAN、INTEGER、BIT STRING、OCTET STRING、REAL、ENUMERATED. 枚举类型的值只是用整数表示的一个符号,而不具有整数的性质。下面是定义枚举类型的例子: EthernetAdapterStatus:=ENUMERATEDnormal(0),degraded(1), offline(2),failed(3),1. 简单类型,第二组包括各种字符串类型,标签为
8、UNIVERSAL 1822和UNIVERSAL 2527(表示字符类型 为何如此多的类型?),第三组包括OBJECT IDENTIFIER和Object Descriptor两种类型。,第四组包含4种类型。NULL是空类型,EXTERNAL是外部类型,UTCTime和GeneralizedTime是两种有关时间的类型,其区别是表示时间的形式不同。,例如 20000721182053.7是GeneralizedTime类型的一个值,表示2000年7月21日,当地时间18点20分53.7秒。20000721182053.7Z表示同样的时间,但是加了符号Z,则表示UTC时间。,2. 构造类型 构造
9、类型有序列和集合两种,分别用SEQUENCE和SEQUENCE OF表示不同类型和相同类型元素的序列,分别用SET和SET OF表示不同类型和相同类型元素的集合。 他们的区别是什么?,下面是定义序列类型的例子: EthernetCollisionsCounter:=SEQUENCE highValue INTEGER, lowValueINTEGER TokenRingTokensLost:=SEQUENCE highValueINTRGER, lowValueINTEGER LanSimpleCounterLimits:=SEQUENCE ethernetCounter1 COMPONENT
10、S OF EthernetCollisionsCounter, tokenRingCounter1COMPONENTS OF TokenRingTokensLost,下面是定义集合类型的例子: LanWorkstationSerialNumbers:=OCTET STRING(SIZE(32) LanSegment:=SET OF LanWorkstationSerialNumbers MacAddresses:=OCTET STRING(SIZE(6) EthernetNetworks:=SET OF MacAddresses TokenRingNetworks:=SET OF LanSeg
11、ment LanNetwork:=SET etherNet 0 IMPLICIT EthernetNetworks, tokenNet 1 IMPLICIT TokenRingNetworks ,3. 标签类型 Exuniv:=UNIVERSAL 2 INTEGER Exappl:=APPLICATION 0 INTEGER Expriv:=PRIVATE 1 INTEGER 标签由一个 标签类 和 一个 标签号 组成。 指应用或用户加在某个类型上的标签。加上一个标签后就是一个新的类型。标签类型作用? 例如集合中有3个同样类型的元素,一个指本人的名字,一个指父亲的名字,另一个指母亲的名字,分别
12、为其指定不同的上下文专用标签1、2和3以示区别,参见下例:,Parentage:=SET SubjectName1 IMPLICIT IA5String, MotherName 2 IMPLICIT IA5String OPTIONAL, FatherName 3 IMPLICIT IA5String OPTIONAL 在编码中注意: Expriv:=PRIVATE 1 IMPLICIT INTEGER Expriv:=PRIVATE 1 (EXPLICIT) INTEGER 新老标签编码?,4. 其他类型(他们类型的作用?) CHOICE和ANY是两个没有标签的类型, 下面是定义CHOICE
13、类型的例子: EthernetAdapterNumber:=CHOICENULL, OCTET STRING,ANY类型表示任意类型的任意值 例1,我们可以定义 SoftwareVersion:=ANY 例2,TextBook:=SEQUENCE author IA5String, reference ANY ,实例, author “sfssfs”, reference IA5String “42342sf” author “sfssfs”, reference INTEGER 1988 ,2.2.2 子类型 子类型是由限制父类型的值集合而导出的类型,因此子类型的值集合是父类型的子集。子类型
14、还可以再产生子类型。(面向对象),1. 单个值 这种方法就是列出子类型可取的各个值。例如,我们可以定义小素数为整数类型的子集: SmallPrime:=INTEGER(2|3|5|7|11|13|15|17|19|23|29) 另外,如果定义Months为枚举类型: Months:=ENUMERATEDjanuary(1),february(2),march(3),april(4),may(5), june(6),july(7),august(8),september(9),october(10), november(11),december(12),则可以定义First-quarter和Se
15、cond-quarter为Months的子类型: First-quarter:=Months(january,february,march) Second-quarter:=Months(april,may,june),2. 包含子类型(与前者的区别?) 这里要用到关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。例如下面的定义: First-half:=Months(INCLUDES First-quarter | I NCLUDES Second-quarter),3. 值区间( ?) 这种方法只能应用于整数和类型,指出子类型可取值实数的区间。在下面的定义中PLUS-INF
16、INITY和MINUS-INFINITY分别表示正、负最大值,MAX和MIN分别表示父类型可允许的最大值和最小值,区间可以是闭区间或开区间。如果是开区间,则加上符号“”。因此下面4个定义是等价的: PositiveInteger:=INTEGER(0.PLUS-INFINITY) PositiveInteger:=INTEGER(1.PLUS-INFINITY) PositiveInteger:=INTEGER(0.MAX) PositiveInteger:=INTEGER(1.MAX),同理,下面4个定义也是等价的: NegativeInteger:=INTEGER(MINUS-INFINI
17、TY.0) NegativeInteger:=INTEGER(MINUS-INFINITY.-1) NegativeInteger:=INTEGER(MIN.0) NegativeInteger:=INTEGER(MIN.-1),4. 可用字符(与单个值?区别?) 这种方法只能用于字符串类型,限制可使用的字符集。下面是两个限制可用字符的例子: TouchToneButtons:=IA5String(FROM(0|1|2|3|4| 5|6|8|9|*|#) DigitString:=IA5String(FROM(0|1|2|3|4| 5|6|8|9),5. 限制大小 可以限制其规模大小,例如限制
18、比特串、字节串或字符串的长度,限制构成序列或集合的元素(同类型)个数等。例如公共数据网的地址由514个数字组成,这个规定可用下面的定义表示: It1DataNumber:=DigitString(SIZE(5.14),6. 内部子类型(约束) 这种方法可用于序列、集合和CHOICE类型。这是一种很复杂的子类型关系,下面用例子说明。假定有一种协议数据单元: PDU:=SETalpha0 INTEGER, beta 1 IA5String OPTIONAL, gamma2 SEQUENCE OF Parameter, delta 3 BOOLEAN,下面定义的子类型测试协议数据单元要求布尔值必须是
19、FALSE,整数值必须是负的: TestPDU:=PDU(WITH COMPONENTS.delta(FALSE),alpha(MIN. 0) FurtherTestPDU:=TestPDU(WITH COMPONENTS.beta(SIZE 5|12) PRESENT) ?,FurtherTestPDU:=TestPDU(WITH COMPONENTS.beta(SIZE 5|12) PRESENT) 另外一个测试子类型要求beta参数必须出现,其值为5或12个字符组成的串:,2.2.3 数据结构示例 下面是一个数据结构示例。 图2.2(a)是关于个人记录的非形式描述,其中包括姓名、头衔、雇
20、员编号、雇佣日期、配偶姓名和子女数等6项信息,而且对每个子女也要给出姓名和出生日期。 图2.2(b)是用ASN.1描述个人记录的抽象语法? (c) 个人记录的一个值,图2.2 ASN.1表示的抽象语法 (a) 个人记录; (c) 个人记录的一个值,图2.2(b)是用ASN.1描述个人记录的抽象语法,2.3 基本编码规则,2.3.1 简单编码 基本编码规则(Basic Encoding Rule)把ASN.1表示的抽象类型值编码为字节串,这种字节串的结构为类型-长度-值,简称TLV(Type-Length-Value),而且值部分还可以递归地再编码为TLV结构。,用 TLV 方法进行编码,把各种
21、数据元素表示为以下三个字段组成的八位位组序列: (1) T 字段,即标识符八位位组(identifier octet),用于标识标记。 (2) L 字段,即长度用八位位组(length octet),用于标识后面 V 字段的长度。 (3) V 字段,即内容八位位组(content octet),用于标识数据元素的值。,TLV 中的 T 字段定义数据的类型,字节 1 可变 可变,标记 T 长度 L 值 V,类 别 格 式 编 号,位 2 1 5,数据元素,图2.3 传输语法的第一个字节,编码的第一个字节表示ASN.1类型或用户定义的类型,其结构如图2.3所示。前两位用于区分4种标签;第三位用于区
22、分简单类型和构造类型;其余5位表示标签的值,如果标签的值大于30,则这5位为全1,标签值表示在后续字节中。,例2.1 布尔类型有两个值FALSE和TRUE,都用一个字节表示,FALSE是00,TRUE是FF。布尔类型是简单类型,标签为UNIVERSAL 1,因此FALSE编码为 01 01 00 而TRUE编码为 01 01 FF 其中第二个字节指明值部分的长度为1个字节。,例2.2 十进制数256的编码为 ?,例2.2 十进制数256的编码为 02 02 01 00 最后两个字节表示十进制值256。,例2.3 比特串10101的值在传输时要占用一个字节,5个比特靠左存放,右边3位未用,因此在
23、比特串编码时要用一个字节说明未使用的比特数。于是对10101的编码为 03 02 03 A8 第一个字节03表示类型为简单类型的比特串,02表示值部分为两个字节长,第三个字节03说明值部分的最后3个比特未用,最后的A8是值部分。,例2.4 字节串ACE可编码为,04 02 AC E0,由于字节串总是占用整数个字节,因而不必说明未占用的比特数。没有说明值的位都认为是0,故最后一个字节写为E0,可见字节串类型也遵循靠左存放的原则。,例2.5 NULL类型只有一个值,也写做NULL,其标签是UNIVERSAL 5。由于这个类型是空类型,无需存储或传送它的值,因而编码为 05 00 第二个字节00表示
24、值长度为0。 此种类型以前在哪见过?图? 为何有此类型?在该图中是何意义?,例2.6,IPAddress 192.1.2.3,其 T 字段是 40 改标签也属于Universal类型,V 字段需要 4 字节表示,因此得出 IPAddress 192.1.2.3 的 TLV 编码是 40 04 C0 01 02 03。,例2.7 序列类型SEQUENCEmadeofwood BOOLEAN, length INTEGER的值 madeofwood TRUE,length 62可编码为 30 06 01 01 FF 02 01 3E 按照序列的结构可展开如下: 30?,Seq Len Val 30
25、 06? Bool Len Val 01 01 FF Int Len Val 02 01 3E,例2.8 集合类型SETbreadth INTEGER, bent BOOLEAN的值breadth 7, bent FALSE可编码为?,例2.8 集合类型SETbreadth INTEGER, bent BOOLEAN的值breadth 7, bent FALSE可编码为 31 06 02 01 07 01 01 00 编码 31 06 02 01 07 01 01 00,例2.8 这个例子说明应用标签的使用。假设我们设计一个安全协议,在这个应用中我们定义了一个口令字类型?,并赋予应用标签27:
26、 Password:=APPLICATION 27 OCTET STRING 对于这个类型的一个值“Sesame”,可得到如下编码: 7B 08 04 06 53 65 73 61 6D 65 展开后为 (App) Tag Len Val 7B? 7B 08 Tag Len Val 04 06 53 65 73 61 6D 65 S e s a m e,为了减少编码中的冗余信息,可使用隐含标签,重新定义如下: Password:=APPLICATION 27 IMPLICIT OCTET STRING 则相应的编码为 5B? 5B 06 53 65 73 61 6D 65 从第一个字节看出它变
27、为简单类型了,因为只有一种新类型信息。,2.3.2 字段扩充 有两种字段需要扩充,一是当标签值大于30时类型字节需要扩充,二是当值部分大于一个字节的表示范围时长度字节需要扩充。,1.对标签值的扩充方法如下:我们用5位表示030的编码,当标签值大于等于31时这5位置全1,作为转义符,实际的标签值编码表示在后续字节中。 后续字节的左边第一位表示是否为最后一个扩充字节,只有最后一个扩充字节的左边第一位置0,其余扩充字节的左边第一位置1。这样,每个扩充字节只用了7位表示标签值的编码,可表示为下面的形式:?(如何解释意思?),例如,标签值10110010101111001可编码为 0000101 100
28、1010 1111001 11111 10000101 11001010 01111001,2.对长度字节的扩充方法是:小于127的数用长度字节的右边7位表示,最左边的一位置0。大于等于127的数用后续若干字节表示,原来的长度字节第一位置1,其余7位指明后续用于表示长度的字节数,即采用下面的形式:,例如,L长度为(255)10可表示为 L= 10000001 11111111 T L V 那么256长度 要用几个字节表示长度?可表示为多少?,那么256 要用几个字节表示长度?可表示为多少?,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,指出 V
29、 字段长度 = 256 字节,指出后续字节数 = 2,后续字节数 = 2,L,标志 位,标志位:长度:长度值,TLV 中的 L 字段定义 V 字段的长度,指出 V 字段长度 = 2 字节,0,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,1,0,单字节的 L 字段,指出 V 字段长度 = 262 字节,多字节的 L 字段,指出后续字节数 = 2,后续字节数 = 2,263呢?简单的计算方法?,name value,Get-request 报文 ASN.1 编码?,V 01 03 06 01 02 01 01 01 00,L
30、09,T OBJECT IDENTIFIER,T NULL,L 00,L 01,T SEQUENCE,L 0D,L 0F,L 04,T INTEGER,L 01,request-id,error-status,error-index,variable-bindings,T INTEGER,V 05 AE 56 02,V 00,T SEQUENCE OF,T INTEGER,V 00,VarBind,T A0,L 1D,GetRequest -PDU,request-ID,1. 3. 6. 1. 2. 1. 7. 1. 0,GetRequest-PDU,十六进制编码,A0 1D /A0编码? 0
31、2 04 05 AE 56 02 /request-id 02 01 00 /error-status 02 01 00 /error-index 30 0F / SEQUENCE OF 30 0D /SEQUENCE 06 09 01 03 06 01 02 01 07 01 00 / OBJECT IDENTIFIER 05 00 / NULL 请问各个长度(L)之间有什么关系? 如何用ASN.1定义该结构?,层次关系?,Sequence Sequence Of?,Get-request 报文的ASN.1定义形式,Get-request-PDU:=0 IMPLICIT SEQUENCE R
32、equest-id INTEGER Error-status INTEGER018 Error-index INTEGER0max-bindings Variable-bindings VarBindList VarBindList:=SEQUENCE OF VarBind VarBind:=SEQUENCE name OBJECT INDETIFIER value NULL / SEQUENCE OF 和SEQUENCE 两种结构的区别?,标签值?,2.4 ASN.1宏定义,2.4.1 模块定义 模块定义的基本形式为 DEFINITIONS := BEGIN EXPORTS IMPORTS
33、AssignmentList END,意义何在?,一个模块定义的例子:?,LanNetworkModuleiso org dod internet private enterprises Xenterprises 95 DEFINITIONS EXPLICIT TAGS:= BEGIN EXPORTS LanNetworkName:=SEQUENCE OF RelativeDistinguishedName-End of EXPORTS IMPORTS,RelativeDistinguishedName FROM InformationFrameworkioint-iso-ccitt Ds(5
34、) modules(1) informationFramework(1) -End of IMPORTS MacAddresses:=OCTET STRING(SIZE(6) LanWorkstationSerialNumbers:=OCTET STRING(SIZE(32) LanSegment:=SET OF LanWorkstationSerialNumbers EthernetNetworks:=SET OF MacAddresses TokenRingNetworks:=SET OF LanSegment LanNetwork:=SET etherNet 0 IMPLICIT Eth
35、ernetNetworks, tokenNet 1 IMPLICIT TokenRingNetworks END,2.4.2 宏表示 宏表示:ASN.1提供的一种表示机制,用于定义宏; 宏定义:用宏表示定义的一个宏,代表一个宏实例的集合; 宏实例:用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型。 模块定义和上面哪种 定义有关系?有什么关系?,宏定义的一般形式如下: MACRO:= BEGIN TYPE NOTATION:= VALUE NOTATION:= END,下面是取自RFC 1155的关于对象类型的宏定义,包含两个支持产生式子。 OBJECT-TYPE MACRO:= B
36、EGIN TYPE NOTATION:=Syntax type(TYPE ObjectSyntax) ACCESS Access STATUS Status VALUE NOTATION:= value(VALUE ObjectName) Access:= read-only |read-write |write-only |not-accessible Status:= mandatory |optional |obsolete END,2.4.3 宏定义示例 关于为什么要用宏定义? 假设我们经常需要使用整数对,于是我们定义一个ASN.1类型: Pair-integers:=SEQUENCE(INTEGER,INTEGER) 如果我们还需要使用字节串对,也可以定义相应的类型: Pair-octet-string:=SEQUENCE(OCTET STRING, OCTET STRING),简化类型定义的方法是使用宏定义。我们定义一个宏PAIR,它是一个类型对: PAIR TYPE-X=type
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- GB/T 31987-2026电子气体锗烷
- 3-9门窗基础工程
- 2025年甲醇燃料加注站安全距离
- 护理观察在手术室护理中的应用
- 河北省衡水名校2026届高三下学期5月份学情调研化学试卷(含解析)
- 热敏电阻器制造工安全宣传水平考核试卷含答案
- 日用化学用品配方师QC管理评优考核试卷含答案
- 2026年新科教版高中高一历史上册第三单元隋唐科举制创立卷含答案
- 玻璃钢制品手糊工岗前品质考核试卷含答案
- 2026年新科教版高中高二数学上册第三单元空间向量求线面角卷含答案
- 2026年江苏苏锡常镇四市高三下学期二模英语试卷和答案
- 2026年4月23日四川省宜宾市五方面人员选拔笔试真题及答案深度解析
- 2026广东建设职业技术学院第二批招聘6人备考题库附答案详解(考试直接用)
- 2026年科级干部任职资格政治理论考核要点
- GB/T 17498.6-2026室内固定式健身器材第6部分:跑步机附加的特殊安全要求和试验方法
- 义务教育均衡发展质量监测八年级物理综合试卷
- 国家义务教育质量监测四年级英语模拟试题(2套含解析)
- 《低空经济应用技术》课件全套 第1-15章 低空经济概论-智慧城市
- 《捡拾垃圾我先行》教学课件-2025-2026学年人美版(新教材)小学劳动技术三年级下册
- 2026年及未来5年中国美容美发机构行业发展监测及投资战略研究报告
- 2025至2030中国钛合金航空航天领域应用拓展研究报告
评论
0/150
提交评论