(备用)抽象语法表示ASN课件.ppt
2.1ASN.1引入引入背景在分布式/网络通信应用中,通信设备需要相互传输数据。但是设备可能是由不同厂家生产的,其硬件体系结构、程序语言的语法定义和程序功能实现一般是不相同的。例如,在一台设备中,整形数据类型是16位表示,而在另一台则可能用32位表示。这些差异导致了同一数据对象在不同的设备上被表示为不同的符号串。为了解决以上问题,ISO组织推出了抽象语法表符号(ASN.1(AbstractSyntaxNotationOne),X.208)。ASN.1通过定义若干简单类型和复合类型,使得各个设备对其间交换消息的数据类型有了一致的认识。位于ISO规定的表示层,定义了应用数据的抽象语法,类似于通常程序设计语言定义的抽象数据类型。2/9/20231把这些对象转换成“0”和“1”的比特流的一套规则称为BER(BasicEncodingRules,X.209),说明了如何把每种ASN.1类型的值编码为8bit的octet流。这样,经过ASN.1处理的消息独立于应用环境,就不会因为系统终端的区别而产生歧义。可以将通信编解码设计与开发工作转嫁给ASN.1编译器完成。从而不必在手工编写编解码器。一方面大量减少了缺陷引入,另一方面更是大大加快了系统开发速度2/9/20232关于信息表示的通信系统模型 2/9/20233局部语法、传送语法与抽象语法“语法”实际上就是“符号串解释方法”。局部语法用于数据在端系统中的存储。传送语法位模式(Bitspattern)描述数据是在传输时是如何表示的用于数据在线路上的传输。抽象语法是协议设计者所使用的工具,用于将设计者的思想记录下来,便于交流和讨论。描述通用数据结构允许定义数据类型和值计算机通信的最终目的是传递数据的语义。因此一个数据无论采用何种表示方式,其语义不应改变。2/9/202342.2 ASN.1的基本概念的基本概念ASN.1有严格的BNF定义,便于程序解析ASN.1是描述在网络上传输信息格式的标准方法。每一个数据类型都有一个标签(Tag),标签有类型和值,数据类型是由标签的类型和值惟一决定的,这种机制在数据编码时有用。2/9/202352.2.1 抽象数据类型抽象数据类型标签的类型分为以下4种通用标签:应用标签:上下文专用标签:私有标签:通用标签:用关键字UNIVERSAL表示,带有这种标签的数据类型是由标准定义的,适用于任何应用;2/9/20236一2/9/20237应用标签:用关键字APPLICATION表示,是应用程序组织自定义由某个具体应用定义的类型其;如:Name:=APPLICATION0SEQUENCEinitialnameIA5String;familyNameIA5String;上下文专用标签:这种标签在文本的一定范围(例如一个结构)中适用;私有标签:用关键字PRIVATE表示,这是用户定义的标签,企业自己定义的。2/9/20238数据类型分类ASN.1定义的数据类型有20多种,标签类型都是UNIVERSAL。这些数据类型可分为4大类简单类型:由单一成分构成的原子类型;构造类型:由两种以上成分构成的构造类型;标签类型:由已知类型定义的新类型;其他类型:包括CHOICE和ANY两种类型。2/9/20239ASN.1数据类型-简单类型基本类型包括BOOL、INTEGER、REAL、BITSTRING、OCTETSTRING、ENUMERATED、OBJECTIDENTIFIER、NULL等。BITSTRING是以比特为单位的二进制字符串;OCTETSTRING是以字节为单位的字符串。ENUMERATED是一个定义变量值的集合,变量的值只在列举出来的范围内。OBJECTIDENTIFIER则用来唯一标识ISO/ITU-T定义的对象;NULL是位置符,一般出现CHOICE、SEQUNECE和SET等复合类型中作为一项,其本身没有意义,不需要编码。2/9/202310简单类型-特别提示UTCTime和GeneralizedTime是两种有关时间的类型,其区别是表示时间的形式不同和范围不同,精度不同。UTCTime格式Z表示本地时间是GMT,+表示本地时间落后于GMT,-表示本地时间提前于GMT时间范围19502049,如0007211820532/9/202311GeneralizedTime 本地时间 “YYYYMMDDHHMMSS.fff”格林威治标准时间“YYMMDDHHMMSS.fffZ”和标准时间的差值.“YYYYMMDDHHMMSS.fff+-HHMM”20001231235959.99920001231205959.999Z20001231235959.999+03002/9/202312ASN.1文本的书写规则书写的布局是无效的,多个空格和空行等效于一个空格;用于表示值和字段的标识符、类型指针(类型名)和模块名由大小写字母、数字和短线(Hyphen)组成;2/9/202313ASN.1文本的书写规则标识符以小写字母开头;类型指针和模块名以大写字母开头;ASN.1定义的内部类型全部用大写字母表示;关键字全部用大写字母表示;注释以一对短线(-)开始,以一对短线或行尾结束。2/9/202314重要补充类型定义:=其中:是一个以大写字母开头的标识符;是基于内建类型或在其它地方定义的类型。如:Married:=BOOLEANAge:=INTEGERPicture:=BITSTRING2/9/202315值定义值定义:=其中:是以小写字母开头的标识符;可以是一个类型的名字,也可以是类型描述;值描述,是基于整数、字符串、标识符的组合。如:myageAge:=45sextupleLottery-draw:=7,12,23,31,33,41pairCoordinates:=x5,y-32/9/202316ASN.1数据类型-结构类型复合类型有SEQENCE,SET,CHOICE,SEQUENCEOF,SETOF等。其中SEQUENCE和SET类型可表示一组不同数据类型的集合,相当于C语言中的struct结构体;CHOICE类型是表示选择一组数据类型中的一个,相当于C语言中的union联合体;SEQUENCEOF和SETOF类型定义了同一数据类型元素的集合,相当于C语言中的数组。两者的差别是:SEQUENCEOF内各项元素是有序的,而SETOF结构中各项元素的顺序是任意的。2/9/202317SEQUENCESEQUENCE和SET类型可表示一组不同数据类型的集合,相当于C语言中的struct结构体,可以嵌套SEQUENCE声明如:Description:=SEQUENCEsurnameIA5String,first-nameIA5String,ageINTEGER赋值:johnnyDescription:=surnameSmith,first-nameJohn,age402/9/202318SEQUENCEOFSEQUENCEOF所有成员都是一个类型,数目不定。相当于C语言中的数组。声明:MemberCountries:=SEQUENCEOFPrintableString赋值:eastAsiaMemberCountries:=“China”,“Japan”,“Korean”,“DPR”2/9/202319SET和SETOF定义SET和SETOF的语法是类似的:SetType:=SETElementTypeList|SETSetOfType:=SETOFType|SET和SEQUENCE相比,SET的成员是没有顺序的。2/9/202320标签类型ASN.1的所有类型都带有标签,但这里所谓的标签类型,是指应用或用户加在某个类型上的标签。起码有两种情况需要给一个现有的类型加上标签一个类型可以有多个类型名,如为了使语义更丰富,可能用Employee-name和Customer-name表示同一类型,这样可以给两者指定同一应用标签APPLICATION0。另外,在一个结构类型(序列或集合)中,可以用上下文专用标签区分类型相同的元素。例如集合中有3个同样类型的元素,一个指本人的名字,一个指父亲的名字,另一个指母亲的名字,2/9/202321标签类型-实例Parentage:=SETSubjectName1IMPLICITIA5String,MotherName2IMPLICITIA5StringOPTIONAL,FatherName3IMPLICITIA5StringOPTIONAL2/9/202322标签类型可以是隐含的或明示的,分别用关键字IMPLICIT和EXPLICIT(可省略)表示。隐含标签的语义是用新标签替换老标签,因此编码时只编码新标签。上例中,3个集合元素的上下文标签都是隐含的,因此编码时只编码上下文专用标签。明示标签的语义是在一个基类型上加上新标签,从而导出一个新类型。明示标签类型是把基类型作为惟一元素的构造类型,在编码时,新老标签都要编码2/9/202323其他类型CHOICE和ANY是两个没有标签的类型,因为它们的值是未定的,而且类型也是未定的。当这种类型的变量被赋值时,它们的类型和标签才确定,可以说标签是运行时间确定的。CHOICE是可选类型的一个表,仅其中一个类型可以被采用,产生一个值。CHOICE类型定义为ChoiceType:=CHOICEAlternativeTypeListAlternativeTypeList:=NamedType|AlternativeTypeList,NamedType2/9/202324定义CHOICE类型的例子:EthernetAdapterNumber:=CHOICENULL,OCTETSTRINGANY类型表示任意类型的任意值,与CHOICE类型不同之处在于实际出现的类型也是未知的。如定义SoftwareVersion:=ANY或SoftwareVersion:=ANYDEFINEDBYINTEGER2/9/202325子类型子类型子类型是由限制父类型的值集合而导出的类型,因此子类型的值集合是父类型的子集。子类型还可以再产生子类型。产生子类型的方法有6种2/9/202326产生子类型的方法产生子类型的方法2/9/2023272.3 基本编码规则基本编码规则基本编码规则(BasicEncodingRule)ASN.1的基本编码规则定义了一种或多种把任意ASN.1值表示成字节字符串的方法,缩写为BER。Distinguished Encoding Rules(DER,可辨别编码规则),它定义了使用一个octetstring来表示任何ASN.1值的编码方法。DER用于需要使用唯一的octetstring编码的应用程序2/9/202328BERBER传输语法的格式递归地表示为TLV三元组也可以认为是。2/9/202329用TLV方法进行编码法-T编码的第一个字节表示编码的第一个字节表示ASN.1类型或者用户定义的类型类型或者用户定义的类型比特87654321通用类000简单类型应用类011构造类型上下文类10专用类11类别P/C标记编号1、如果标签的编号大于、如果标签的编号大于30,则后,则后5位全为位全为12、通常,每一个类型值不止一种编码方法、通常,每一个类型值不止一种编码方法2/9/202330BER三种编码方法简单定长方法,结构化定长方法,结构化非定长方法简单定长方法,适用于简单类型及通过对简单类型使用隐式、式标签生成的类型,长度是预知的2/9/202331例例2.12.1 布尔类型有两个值FALSE和TRUE,都用一个字节表示,FALSE是00,TRUE是FF。布尔类型是简单类型,标签为UNIVERSAL 1,因此FALSE编码为 01 01 00而TRUE编码为 01 01 FF其中第二个字节指明值部分的长度为1个字节。2/9/202332例例2.22.2 十进制数256的编码为 02 02 01 00最后两个字节表示十进制值256。2/9/202333例例2.32.3 比特串10101的值在传输时要占用一个字节,5个比特靠左存放,右边3位未用,因此在比特串编码时要用一个字节说明未使用的比特数。于是对10101的编码为 03 02 03 A8第一个字节03表示类型为简单类型的比特串,02表示值部分为两个字节长,第三个字节03说明值部分的最后3个比特未用,最后的A8是值部分。2/9/202334例例2.4 字节串字节串ACE可编码为可编码为 04 02 AC E0 由于字节串总是占用整数个字节,因而不必说明未占用的比特数。没有说明值的位都认为是0,故最后一个字节写为E0,可见字节串类型也遵循靠左存放的原则。2/9/202335例例2.52.5 NULL类型只有一个值,也写做NULL,其标签是UNIVERSAL 5。由于这个类型是空类型,无需存储或传送它的值,因而编码为 05 00第二个字节00表示值长度为0。2/9/202336结构化定长方法结构化定长适用于简单的string类型、结构类型、在二者基础上通过隐式标签生成的类型和任何基础上生成的显式类型编码:标签字节Tag,第六位为12/9/202337例例2.62.6 序列类型SEQUENCEmadeofwood BOOLEAN,length INTEGER的值 madeofwood TRUE,length 62可编码为 30 06 01 01 FF 02 01 3E按照序列的结构可展开如下:Seq Len Val30 06 Bool Len Val 01 01 FF Int Len Val 02 01 3E 2/9/202338例2.8 这个例子说明应用标签的使用。假设我们设计一个安全协议,在这个应用中我们定义了一个口令字类型,并赋予应用标签27:Password:=APPLICATION 27 OCTET STRING对于这个类型的一个值“Sesame”,可得到如下编码:7B 08 04 06 53 65 73 61 6D 65展开后为 App Len Val 7B 08 Oct Len Val 04 06 53 65 73 61 6D 65 S e s a m e2/9/202339显然,应用标签和字节串标签都编码了,因此它是构造类型。为了减少编码中的冗余信息,可使用隐含标签,重新定义如下:Password:=APPLICATION 27 IMPLICIT OCTET STRING则相应的编码为 5B 06 53 65 73 61 6D 65从第一个字节看出它变为简单类型了,因为只有一种类型信息。2/9/202340结果化非定长方法结果化非定长方法,用于简单string类型、结构类型,结构化定长适用于简单的string类型、结构类型、在二者基础上,通过隐式标签生成的类型和任何基础上生成的显式类型,不要求知道值得长度编码长度字节(L)10000000后紧随内容字节(VALUE),以0 x00结束。2/9/202341结果化非定长方法Password:=APPLICATION27IMPLICITOCTETSTRING这个类型的一个值“Sesame”,采用结构非定长的编码5B80536573616D65002/9/202342标签长度字段扩充标签长度字段扩充有两种字段需要扩充一是当标签值大于30时类型字节需要扩充二是当值部分大于一个字节的表示范围时长度字节需要扩充。标签值的扩充方法如下:用5位表示030的编码,当标签值大于等于31时这5位置全1,作为转义符,实际的标签值编码表示在后续字节中。后续字节的左边第一位表示是否为最后一个扩充字节,只有最后一个扩充字节的左边第一位置0,其余扩充字节的左边第一位置1。每个扩充字节只用了7位表示标签值的编码,可表示为下面的形式2/9/202343标签长度字段扩充标签长度字段扩充标签值10110010101111001可编码为1111110000101110010100111100100000 1111011111 用后续字节表示标签值表示标签值0302/9/202344长度字节的扩充长度字节的扩充方法是:小于127的数用长度字节的右边7位表示,最左边的一位置0。大于等于127的数用后续若干字节表示,原来的长度字节第一位置1,其余7位指明后续用于表示长度的字节数,即采用下面的形式:00000000 011111101 表示0126 指明后续用于表示长度的字节数 2/9/202345如果内容长度为25510,则可表示为1000000111111111值得注意的是,长度字节可表示的最大值为126,而不是127,值127是为以后扩充保留的。2/9/202346SNMP的Get-request报文ASN.1编码 V2B 06 01 02 01 01 01 00L08 TOBJECT IDENTIFIER TNULLL00 L01 TSEQUENCE L0Cname value TOCTET STRINGL01V00 V70 75 62 6C 69 63 TA0 L1CGet-request-PDU-V L06 L0E L04 TINTEGER L01 Message-TSEQUENCEMessage-L 29Message-VVersionCommunityGet-request-PDUrequest-iderror-statuserror-indexvariable-bindings V05 AE 56 02 V00 TSEQUENCE OF TINTEGER V00VarBindrequest-ID“public”1.3.6.1.2.1.1.1.02/9/2023472.4ASN.1宏定义宏定义模块定义格式如下:DEFINITIONS:=BEGINEXPORTSIMPORTSAssignmentListEND其中:Modulereference是模块名,可以跟随对于的对象标识符,首字符必修大写。EXPORTS这个模块中的定义可能被其他模块引入IMPORTS定义由其他模块引入AssignmentList这个模块中将定义类型分配、值分配及宏定义2/9/202348模块举例RFC1156-MIBDEFINITIONS:=BEGINIMPORTSmgmt,NetworkAddress,IpAddress,Counter,Gauge,TimeTicksFROMRFC1155-SMIOBJECT-TYPEFROMRFC-1212;mibOBJECTIDENTIFIER:=mgmt1systemOBJECTIDENTIFIER:=mib1interfacesOBJECTIDENTIFIER:=mib2atOBJECTIDENTIFIER:=mib3ipOBJECTIDENTIFIER:=mib4icmpOBJECTIDENTIFIER:=mib5tcpOBJECTIDENTIFIER:=mib6udpOBJECTIDENTIFIER:=mib7egpOBJECTIDENTIFIER:=mib8-略END2/9/202349ASN.1宏定义宏定义的一般形式MACRO:=BEGINTYPENOTATION:=VALUENOTATION:=ENDmacroname是宏的名字,必修全部大写。宏定义由类型表示(TYPENOTATION)、值表示(VALUENOTATION)和支持产生式(supporting-productions)3部分组成,最后一部分任选2/9/202350宏定义可以看作是类型的类型,或者说是超类型。另一方面,也可以把宏定义看作是类型的模板,可以用这种模板制造出形式相似、语义相关的许多数据类型,这就是宏定义的主要用处。2/9/2023512/9/202352为什么要用宏定义假设我们经常需要使用整数对,于是我们定义一个ASN.1类型:Pair-integers:=SEQUENCE(INTEGER,INTEGER)如果我们还需要使用字节串对,也可以定义相应的类型:Pair-octet-string:=SEQUENCE(OCTETSTRING,OCTETSTRING)2/9/202353小结ASN.1的基本概念ASN是一种用途广泛的抽象语法描述语言,SNMP广泛使用其描述,深入学习对SNMP大有益处标签基本编码规则宏定义2/9/202354宏定义示例2/9/202355拟留作业和思考题:通过互联网检索ASN.1使用,并找出一个例子来理解ASN.1的应用作业:网络管理的基本功能2.1表示层的功能是什么?抽象语法和输出语法有什么不同2/9/202356