• 1.15 MB
  • 2022-04-29 14:29:17 发布

最新安工大网管技术第二章PPT课件PPT课件

  • 87页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'安工大网管技术第二章PPT课件 1.网络系统的发展,怎么进行异种(异构)?信息间的通信?2.为什么用ASN.1?现有的数据结构表达方式不可以吗?3.传输语法与BER. namevalueGet-request报文?协议?ASN.1编码?V010306010201010100L09TOBJECTIDENTIFIERTNULLL00L01TSEQUENCE?L0CL0EL04TINTEGERL01request-iderror-statuserror-indexvariable-bindingsTINTEGERV05AE5602V00TSEQUENCEOF?TINTEGERV00VarBindTA0L1DGetRequest-PDUrequest-ID1.3.6.1.2.1.7.1.0GetRequest-PDU和七层协议的关系? ASN.1表示数据例子例如:数据类型特点?Report::=SEQUENCE{authorOCTETSTRING,titleOCTETSTRING,bodyOCTETSTRING,biblioBibliography} 在这个例子中,"Report"是由名字类型的信息组成的,而SEQUENCE表示消息是许多数据单元构成的,前三个数据单元的类型是OCTETSTRING,而最后一个数据类型则下面的ASN.1语法表示它的意义:Bibliography::=SEQUENCE{authorOCTETSTRINGtitleOCTETSTRINGpublisherOCTETSTRINGyearOCTETSTRING} 2.2ASN.1的基本概念ASN.1文本的书写规则,这些规则叫做文本约定:(1)书写的布局是无效的,多个空格和空行等效于一个空格;(2)用于表示值和字段的标识符、类型指针(类型名)和模块名由大小写字母、数字和短线组成; (3)标识符以小写字母开头;(4)类型指针和模块名以大写字母开头;(5)ASN.1定义的内部类型全部用大写字母表示;(6)关键字全部用大写字母表示;(7)注释以一对短线(--)开始,以一对短线或行尾结束。ASN.1的特点? 2.2.1抽象数据类型在ASN.1中,每一个数据类型都有一个标签(Tag)?,标签有类型和值(见表2.1),数据类型是由标签的类型和值惟一决定的,这种机制在数据编码时有用。标签的类型分为以下4种:●通用标签●应用标签●上下文专用标签●私有标签 ASN.1定义的数据类型有20多种,标签类型都是UNIVERSAL,如表2.1所示。这些数据类型可分为4大类。●简单类型(?)●构造类型●标签类型●其他类型(CHOICE、ANY) 表2.1ASN.1定义的通用类型? 表2.1ASN.1定义的通用类型? 第一组BOOLEAN、INTEGER、BITSTRING、OCTETSTRING、REAL、ENUMERATED.枚举类型的值只是用整数表示的一个符号,而不具有整数的性质。下面是定义枚举类型的例子:EthernetAdapterStatus::=ENUMERATED{normal(0),degraded(1),offline(2),failed(3)}1.简单类型 第二组包括各种字符串类型,标签为UNIVERSAL18~22和UNIVERSAL25~27(表示字符类型为何如此多的类型?)第三组包括OBJECTIDENTIFIER和ObjectDescriptor两种类型。第四组包含4种类型。NULL是空类型,EXTERNAL是外部类型,UTCTime和GeneralizedTime是两种有关时间的类型,其区别是表示时间的形式不同。例如20000721182053.7是GeneralizedTime类型的一个值,表示2000年7月21日,当地时间18点20分53.7秒。20000721182053.7Z表示同样的时间,但是加了符号Z,则表示UTC时间。 2.构造类型构造类型有序列和集合两种,分别用SEQUENCE和SEQUENCEOF表示不同类型和相同类型元素的序列,分别用SET和SETOF表示不同类型和相同类型元素的集合。他们的区别是什么? 下面是定义序列类型的例子:EthernetCollisionsCounter::=SEQUENCE{highValueINTEGER,lowValue INTEGER}TokenRingTokensLost::=SEQUENCE{highValue INTRGER,lowValue INTEGER}LanSimpleCounterLimits::=SEQUENCE{ethernetCounter1 COMPONENTSOFEthernetCollisionsCounter,tokenRingCounter1 COMPONENTSOFTokenRingTokensLost} 下面是定义集合类型的例子:LanWorkstationSerialNumbers::=OCTETSTRING(SIZE(32))LanSegment::=SETOFLanWorkstationSerialNumbersMacAddresses::=OCTETSTRING(SIZE(6))EthernetNetworks::=SETOFMacAddressesTokenRingNetworks::=SETOFLanSegmentLanNetwork::=SET{etherNet[0]IMPLICITEthernetNetworks,tokenNet[1]IMPLICITTokenRingNetworks} 3.标签类型Exuniv::=[UNIVERSAL2]INTEGERExappl::=[APPLICATION0]INTEGERExpriv::=[PRIVATE1]INTEGER标签由一个标签类和一个标签号组成。指应用或用户加在某个类型上的标签。加上一个标签后就是一个新的类型。标签类型作用?例如集合中有3个同样类型的元素,一个指本人的名字,一个指父亲的名字,另一个指母亲的名字,分别为其指定不同的上下文专用标签[1]、[2]和[3]以示区别,参见下例: Parentage::=SET{SubjectName[1]IMPLICITIA5String,MotherName[2]IMPLICITIA5StringOPTIONAL,FatherName[3]IMPLICITIA5StringOPTIONAL}在编码中注意:Expriv::=[PRIVATE1]IMPLICITINTEGERExpriv::=[PRIVATE1](EXPLICIT)INTEGER新老标签编码? 4.其他类型(他们类型的作用?)CHOICE和ANY是两个没有标签的类型,下面是定义CHOICE类型的例子:EthernetAdapterNumber::=CHOICE{NULL,OCTETSTRING} ANY类型表示任意类型的任意值例1,我们可以定义SoftwareVersion::=ANY例2,TextBook::=SEQUENCE{authorIA5String,referenceANY} 实例{author“sfssfs”,referenceIA5String“42342sf”}{author“sfssfs”,referenceINTEGER1988} 2.2.2子类型子类型是由限制父类型的值集合而导出的类型,因此子类型的值集合是父类型的子集。子类型还可以再产生子类型。(面向对象) 1.单个值这种方法就是列出子类型可取的各个值。例如,我们可以定义小素数为整数类型的子集:SmallPrime::=INTEGER(2|3|5|7|11|13|15|17|19|23|29)另外,如果定义Months为枚举类型:Months::=ENUMERATED{january(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和Second-quarter为Months的子类型:First-quarter::=Months(january,february,march)Second-quarter::=Months(april,may,june) 2.包含子类型(与前者的区别?)这里要用到关键字INCLUDES,说明被定义的类型包含了已有类型的所有的值。例如下面的定义:First-half::=Months(INCLUDESFirst-quarter|INCLUDESSecond-quarter) 3.值区间(?)这种方法只能应用于整数和类型,指出子类型可取值实数的区间。在下面的定义中PLUS-INFINITY和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-INFINITY..<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.限制大小可以限制其规模大小,例如限制比特串、字节串或字符串的长度,限制构成序列或集合的元素(同类型)个数等。例如公共数据网的地址由5~14个数字组成,这个规定可用下面的定义表示:It1DataNumber::=DigitString(SIZE(5..14)) 6.内部子类型(约束)这种方法可用于序列、集合和CHOICE类型。这是一种很复杂的子类型关系,下面用例子说明。假定有一种协议数据单元:PDU::=SET{alpha[0]INTEGER,beta[1]IA5StringOPTIONAL,gamma[2]SEQUENCEOFParameter,delta[3]BOOLEAN} 下面定义的子类型测试协议数据单元要求布尔值必须是FALSE,整数值必须是负的:TestPDU::=PDU(WITHCOMPONENTS{....delta(FALSE),alpha(MIN..<0)})FurtherTestPDU::=TestPDU(WITHCOMPONENTS{....beta(SIZE5|12)PRESENT})??? FurtherTestPDU::=TestPDU(WITHCOMPONENTS{....beta(SIZE5|12)PRESENT})另外一个测试子类型要求beta参数必须出现,其值为5或12个字符组成的串: 2.2.3数据结构示例下面是一个数据结构示例。图2.2(a)是关于个人记录的非形式描述,其中包括姓名、头衔、雇员编号、雇佣日期、配偶姓名和子女数等6项信息,而且对每个子女也要给出姓名和出生日期。图2.2(b)是用ASN.1描述个人记录的抽象语法?(c)个人记录的一个值 图2.2ASN.1表示的抽象语法(a)个人记录;(c)个人记录的一个值 图2.2(b)是用ASN.1描述个人记录的抽象语法 2.3基本编码规则2.3.1简单编码基本编码规则(BasicEncodingRule)把ASN.1表示的抽象类型值编码为字节串,这种字节串的结构为类型-长度-值,简称TLV(Type-Length-Value),而且值部分还可以递归地再编码为TLV结构。 用TLV方法进行编码把各种数据元素表示为以下三个字段组成的八位位组序列:(1)T字段,即标识符八位位组(identifieroctet),用于标识标记。(2)L字段,即长度用八位位组(lengthoctet),用于标识后面V字段的长度。(3)V字段,即内容八位位组(contentoctet),用于标识数据元素的值。 TLV中的T字段定义数据的类型字节1可变可变标记T长度L值V类别格式编号位215数据元素 图2.3传输语法的第一个字节 编码的第一个字节表示ASN.1类型或用户定义的类型,其结构如图2.3所示。前两位用于区分4种标签;第三位用于区分简单类型和构造类型;其余5位表示标签的值,如果标签的值大于30,则这5位为全1,标签值表示在后续字节中。 例2.1布尔类型有两个值FALSE和TRUE,都用一个字节表示,FALSE是00,TRUE是FF。布尔类型是简单类型,标签为UNIVERSAL1,因此FALSE编码为010100而TRUE编码为0101FF其中第二个字节指明值部分的长度为1个字节。 例2.2十进制数256的编码为? 例2.2十进制数256的编码为02020100最后两个字节表示十进制值256。 例2.3比特串10101的值在传输时要占用一个字节,5个比特靠左存放,右边3位未用,因此在比特串编码时要用一个字节说明未使用的比特数。于是对10101的编码为030203A8第一个字节03表示类型为简单类型的比特串,02表示值部分为两个字节长,第三个字节03说明值部分的最后3个比特未用,最后的A8是值部分。 例2.4字节串ACE可编码为0402ACE0由于字节串总是占用整数个字节,因而不必说明未占用的比特数。没有说明值的位都认为是0,故最后一个字节写为E0,可见字节串类型也遵循靠左存放的原则。 例2.5NULL类型只有一个值,也写做NULL,其标签是UNIVERSAL5。由于这个类型是空类型,无需存储或传送它的值,因而编码为0500第二个字节00表示值长度为0。此种类型以前在哪见过?图?为何有此类型?在该图中是何意义? 例2.6IPAddress192.1.2.3,其T字段是40改标签也属于Universal类型,V字段需要4字节表示,因此得出IPAddress192.1.2.3的TLV编码是4004C0010203。 例2.7序列类型SEQUENCE{madeofwoodBOOLEAN,lengthINTEGER}的值{madeofwoodTRUE,length62}可编码为30060101FF02013E按照序列的结构可展开如下:30?SeqLenVal3006?BoolLenVal0101FFIntLenVal02 01 3E 例2.8集合类型SET{breadthINTEGER,bentBOOLEAN}的值{breadth7,bentFALSE}可编码为? 例2.8集合类型SET{breadthINTEGER,bentBOOLEAN}的值{breadth7,bentFALSE}可编码为3106020107010100编码3106020107010100 例2.8这个例子说明应用标签的使用。假设我们设计一个安全协议,在这个应用中我们定义了一个口令字类型?,并赋予应用标签27:Password::=[APPLICATION27]OCTETSTRING对于这个类型的一个值“Sesame”,可得到如下编码:7B080406536573616D65展开后为(App)TagLenVal7B?7B08TagLenVal0406536573616D65Sesame 为了减少编码中的冗余信息,可使用隐含标签,重新定义如下:Password::=[APPLICATION27]IMPLICITOCTETSTRING则相应的编码为5B?5B06536573616D65从第一个字节看出它变为简单类型了,因为只有一种新类型信息。 2.3.2字段扩充有两种字段需要扩充,一是当标签值大于30时类型字节需要扩充,二是当值部分大于一个字节的表示范围时长度字节需要扩充。 1.对标签值的扩充方法如下:我们用5位表示0~30的编码,当标签值大于等于31时这5位置全1,作为转义符,实际的标签值编码表示在后续字节中。后续字节的左边第一位表示是否为最后一个扩充字节,只有最后一个扩充字节的左边第一位置0,其余扩充字节的左边第一位置1。这样,每个扩充字节只用了7位表示标签值的编码,可表示为下面的形式:??(如何解释意思?) ×××00000×××11110×××11111用后续字节表示标签值…表示标签值0~30例如,标签值10110010101111001可编码为000010110010101111001×××11111100001011100101001111001 2.对长度字节的扩充方法是:小于127的数用长度字节的右边7位表示,最左边的一位置0。大于等于127的数用后续若干字节表示,原来的长度字节第一位置1,其余7位指明后续用于表示长度的字节数,即采用下面的形式:00000000011111101×××××××…=>?…表示0~126指明后续用于表示长度的字节数 例如,L长度为(255)10可表示为L=>1000000111111111TLV那么256长度要用几个字节表示长度?可表示为多少? 那么256要用几个字节表示长度?可表示为多少?100000100000000100000000指出V字段长度=256字节指出后续字节数=2后续字节数=2L标志位标志位:长度:长度值 TLV中的L字段 定义V字段的长度指出V字段长度=2字节00000010100000100000000100000110单字节的L字段指出V字段长度=262字节多字节的L字段指出后续字节数=2后续字节数=2263呢?简单的计算方法? namevalueGet-request报文ASN.1编码???V010306010201010100L09TOBJECTIDENTIFIERTNULLL00L01TSEQUENCEL0DL0FL04TINTEGERL01request-iderror-statuserror-indexvariable-bindingsTINTEGERV05AE5602V00TSEQUENCEOFTINTEGERV00VarBindTA0L1DGetRequest-PDUrequest-ID1.3.6.1.2.1.7.1.0GetRequest-PDU 十六进制编码A01D//A0编码?020405AE5602//request-id020100//error-status020100//error-index300F//SEQUENCEOF300D//SEQUENCE0609010306010201070100//OBJECTIDENTIFIER0500//NULL请问各个长度(L)之间有什么关系?如何用ASN.1定义该结构?层次关系?SequenceSequenceOf? Get-request报文的ASN.1定义形式Get-request-PDU::=[0]IMPLICITSEQUENCE{Request-idINTEGERError-statusINTEGER{0…18}Error-indexINTEGER{0…max-bindings}Variable-bindingsVarBindList}VarBindList::=SEQUENCEOFVarBindVarBind::=SEQUENCE{nameOBJECTINDETIFIERvalueNULL}//SEQUENCEOF和SEQUENCE两种结构的区别?标签值? 2.4ASN.1宏定义2.4.1模块定义模块定义的基本形式为DEFINITIONS::=BEGINEXPORTSIMPORTSAssignmentListEND意义何在? 一个模块定义的例子:?LanNetworkModule{isoorgdodinternetprivateenterprisesXenterprises95}DEFINITIONSEXPLICITTAGS::=BEGINEXPORTSLanNetworkName::=SEQUENCEOFRelativeDistinguishedName--EndofEXPORTSIMPORTS RelativeDistinguishedNameFROMInformationFramework{ioint-iso-ccittDs(5)modules(1)informationFramework(1)}--EndofIMPORTSMacAddresses::=OCTETSTRING(SIZE(6))LanWorkstationSerialNumbers::=OCTETSTRING(SIZE(32))LanSegment::=SETOFLanWorkstationSerialNumbersEthernetNetworks::=SETOFMacAddressesTokenRingNetworks::=SETOFLanSegmentLanNetwork::=SET{etherNet[0]IMPLICITEthernetNetworks,tokenNet[1]IMPLICITTokenRingNetworks}END 2.4.2宏表示●宏表示:ASN.1提供的一种表示机制,用于定义宏;●宏定义:用宏表示定义的一个宏,代表一个宏实例的集合;●宏实例:用具体的值代替宏定义中的变量而产生的实例,代表一种具体的类型。模块定义和上面哪种定义有关系?有什么关系? 宏定义的一般形式如下:MACRO::=BEGINTYPENOTATION::=VALUENOTATION::=END 下面是取自RFC1155的关于对象类型的宏定义,包含两个支持产生式子。OBJECT-TYPEMACRO::=BEGINTYPENOTATION::="Syntax"type(TYPEObjectSyntax)"ACCESS"Access"STATUS"StatusVALUENOTATION::=value(VALUEObjectName)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(OCTETSTRING,OCTETSTRING) 简化类型定义的方法是使用宏定义。我们定义一个宏PAIR,它是一个类型对:PAIRTYPE-X=typeTYPE-Y=type 对应的值表示采用下面的形式:(X=value,Y=value)T0::=PAIRTYPE-X=INTEGERTYPE-Y=INTEGER用一个已有的类型代替其中的变量type,可得到宏实例,即新的类型:T1::=PAIRTYPE-X=INTEGERTYPE-Y=BOOLEANT2::=PAIRTYPE-X=VisibleStringTYPE-Y=T1则下面的值属于T1类型:(X=3,Y=TRUE) 下面的值是T2类型:(X="Name",Y=(X=4,Y=FALSE))显然,只要用已知的类型代替关键字type,就可以得到需要的数对类型。图2.5给出了PAIR的宏定义 图2.5宏定义示例 习题一.简答题1.抽象语法和传输语法各有什么作用?2.ASN.1定义的数据类型分为哪几类?二.选择题1.ASN.1是一种A.通信协议B.形式语言C.操作系统D.网络管理标准 2.下列不属于简单类型的是A.INTEGERB.NULLC.SEQUECED.OCTETSTRING3.下列选项和PositiveInteger::=INTEGER(1<..PLUS-INFINITY)等价的是A.PositiveInteger::=INTEGER(3..PLUS-INFINITY) B.PositiveInteger::=INTEGER(2..PLUS-INFINITY)C.PositiveInteger::=INTEGER(1..MAX)D.PositiveInteger::=INTEGER(2<..MAX)4.OCTETSTRING类型对应的值集合是A.0或多个字节组成的序列B.0或多个比特组成的序列C.国际标准字符集5D.通用字符集 5.在ASN.1中,每一个数据类型都有一个标签,通用标签的关键字是A.UNIVERSALB.ALLICATIONC.PRIVATED.DEFAULT三、解答题1.根据BER,布尔类型的FALSE的编码为(十六进制数表示)?2.根据BER,十进制数257的编码为(十六进制数表示)? 3.根据BER,比特串10100的编码为(十六进制数表示)?4.根据BER,序列类型SEQUENCE{madeofwoodBOOLEAN,lengthINTEGER}的值{madeofwoodFALSE,length61}可编码为?5.根据BER,标签值10110011100010101可编码为xxx11111….(二进制数表示)?6.在ASN.1中,IP地址(IPAddress)=131.21.14.2,试求ASN.1编码。 7.用ASN.1描述Get-request-PDU的数据结构。8.对长度字节的扩充方法中若value的长度Length达到263,请问怎么对Length字段进行编码,写出二进制表示。 '