ASN1基礎(chǔ)-(更新)解析課件_第1頁
ASN1基礎(chǔ)-(更新)解析課件_第2頁
ASN1基礎(chǔ)-(更新)解析課件_第3頁
ASN1基礎(chǔ)-(更新)解析課件_第4頁
ASN1基礎(chǔ)-(更新)解析課件_第5頁
已閱讀5頁,還剩189頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

ASN.1語言基礎(chǔ)知識

ASN.1語言基礎(chǔ)知識本章目錄

1ASN.1的基本概念2ASN.1語法規(guī)范3BER的基本概念

本章目錄1ASN.1的基本概念1ASN.1的基本概念1ASN.1的基本概念

表示層的功能是提供統(tǒng)一的網(wǎng)絡(luò)數(shù)據(jù)表示。在互相通信的端系統(tǒng)中至少有一個應(yīng)用實體(例如FTP、TELNET、SNMP等)和一個表示實體(即ASN.1)。表示實體定義了應(yīng)用數(shù)據(jù)的抽象語法,這種抽象語法類似于通常程序設(shè)計語言定義的抽象數(shù)據(jù)類型。應(yīng)用協(xié)議按照預(yù)先定義的抽象語法構(gòu)造協(xié)議數(shù)據(jù)單元,用于和對等系統(tǒng)的應(yīng)用實體交換信息。表示實體則對應(yīng)用層數(shù)據(jù)進(jìn)行編碼,將其轉(zhuǎn)換成二進(jìn)制的比特串,例如把十進(jìn)制數(shù)變成二進(jìn)制數(shù)、把字符變成ASCII碼等。比特串由下面的傳輸實體在網(wǎng)絡(luò)中傳送。把抽象數(shù)據(jù)變換成比特串的編碼規(guī)則叫做傳輸語法。在各個端系統(tǒng)內(nèi)部,應(yīng)用數(shù)據(jù)被映像成本地的特殊形式,存儲在磁盤上或顯示在用戶終端上,如圖1所示。

網(wǎng)絡(luò)數(shù)據(jù)表示

表示層的功能是提供統(tǒng)一的網(wǎng)絡(luò)數(shù)據(jù)表示。在互相通信的端系統(tǒng)圖1關(guān)于信息表示的通信系統(tǒng)模型

圖1關(guān)于信息表示的通信系統(tǒng)模型

特別需要指出的是,這里提到的抽象語法是獨立于任何編碼技術(shù)的,只與應(yīng)用有關(guān)。抽象語法要能滿足應(yīng)用的需要,能夠定義應(yīng)用需要的數(shù)據(jù)類型和表示這些類型的值。

ASN.1是根據(jù)當(dāng)前網(wǎng)絡(luò)應(yīng)用的需求制定的標(biāo)準(zhǔn)(CCITTX.208和ISO8824),也許隨著網(wǎng)絡(luò)應(yīng)用的發(fā)展,還會開發(fā)出新的表示層標(biāo)準(zhǔn)。另外值得一提的是,對應(yīng)一種抽象語法可以選擇不止一種傳輸語法。對傳輸語法的基本要求是支持對應(yīng)的抽象語法,另外還可以有其他一些屬性,例如支持?jǐn)?shù)據(jù)加密或壓縮,或者兩者都支持。

特別需要指出的是,這里提到的抽象語法是獨立于任何編碼技術(shù)ASN.1語言的概念抽象語法表示(ASN,AbstractSyntaxNotation)是一種獨立于硬件的高級語言ASN.1語法可用來描述各種類型的數(shù)據(jù),包括文本、圖形、視頻與音頻等ASN.1編碼可用來規(guī)范數(shù)據(jù)傳輸過程,解決異構(gòu)網(wǎng)絡(luò)對數(shù)據(jù)理解的二義性ASN.1語言的概念抽象語法表示(ASN,AbstractASN.1支持的編碼規(guī)范

基本編碼規(guī)范(BER,BasicEncodingRules)嚴(yán)格編碼規(guī)范(CER,CanonicalEncodingRules)唯一編碼規(guī)范(DER,DistinguishedEncodingRules)壓縮編碼規(guī)范(PER,PackedEncodingRulesXML編碼規(guī)范(XER,XMLEncodingRules)

ASN.1支持的編碼規(guī)范基本編碼規(guī)范(BER,BasicASN.1的主要應(yīng)用SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)X.400(信息處理服務(wù)協(xié)議)X.500(目錄訪問服務(wù)協(xié)議)H.323(基于分組的多媒體通信VoIP結(jié)構(gòu))RSA(公鑰密碼體制)SET(安全電子商務(wù))ASN.1的主要應(yīng)用SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)2ASN.1語法規(guī)范2ASN.1語法規(guī)范2.1ASN.1數(shù)據(jù)類型簡單類型:直接規(guī)定取值集合的類型,其中不會包括任何組件結(jié)構(gòu)類型:由多個組件構(gòu)成的類型,每個組件是一個簡單類型或結(jié)構(gòu)類型標(biāo)簽類型:主要用于區(qū)分不同類型數(shù)據(jù),特別是SEQUENCE與SET中相同類型的組件2.1ASN.1數(shù)據(jù)類型簡單類型:直接規(guī)定取值集合的類型,ASN.1簡單類型簡單類型類型說明INTEGER整數(shù)型(正、負(fù)整數(shù)與0的集合)BOOLEAN布爾型(True與False的集合)REAL實數(shù)型(正、負(fù)實數(shù)與0的集合)ENUMERATED枚舉型(字符串與值的對應(yīng)關(guān)系)BITSTRING比特流(二進(jìn)制數(shù)組成的比特串)OCTETSTRING字節(jié)流(十六進(jìn)制數(shù)組成的字節(jié)串)NULL空類型(只有一個值null)EXTERNAL自定義類型ASN.1簡單類型簡單類型類型說明INTEGER整數(shù)型(正、ASN.1結(jié)構(gòu)類型結(jié)構(gòu)類型類型說明SEQUENCE多個類型的有序集合(類似C的結(jié)構(gòu))SEQUENCEOF某個類型的有序集合(類似C的數(shù)組)SET多個類型的無序集合(類似SEQUENCE)SETOF某個類型的無序集合(類似SEQUENCEOF)CHOICE多個類型的可選集合(取其中一個類型)ANY任意類型ASN.1結(jié)構(gòu)類型結(jié)構(gòu)類型類型說明SEQUENCE多個類型的SEQUENCE與SEQUENCEOF

SEQUENCE表示多種類型的有序集合Student::==SEQUENCE{NameOCTETSTRING,AgeINTEGER}SEQUENCEOF表示某種類型的有序集合Students::==SEQUENCEOFStudent

SEQUENCE與SEQUENCEOFSEQUENCE表ASN.1標(biāo)簽類型通用類(UniversalClass)應(yīng)用類(ApplicationClass)私有類(PrivateClass)內(nèi)容指定類(Context-specificClass)

ASN.1標(biāo)簽類型通用類(UniversalClass)通用類標(biāo)簽(1)通用類標(biāo)簽類型說明UNIVERSAL1布爾型(BOOLEAN)UNIVERSAL2整數(shù)型(INTEGER)UNIVERSAL3比特流(BITSTRING)UNIVERSAL4字節(jié)流(OCTETSTRING)UNIVERSAL5空類型(NULL)UNIVERSAL6對象標(biāo)識符(OBJECTIDENTIFIER)通用類標(biāo)簽(1)通用類標(biāo)簽類型說明UNIVERSAL1布爾通用類標(biāo)簽(2)通用類標(biāo)簽類型說明UNIVERSAL7對象描述符(OBJECTDESCRIPTION)UNIVERSAL8自定義類型(EXTERNAL)UNIVERSAL9實數(shù)型(REAL)UNIVERSAL10枚舉型(ENUMERATED)UNIVERSAL16有序結(jié)構(gòu)類型(SEQUENCE與SEQUENCEOF)UNIVERSAL17無序結(jié)構(gòu)類型(SET與SETOF)通用類標(biāo)簽(2)通用類標(biāo)簽類型說明UNIVERSAL7對象標(biāo)簽類型的定義方法隱式標(biāo)簽通過改變組件類型的標(biāo)簽生成,隱式標(biāo)簽定義的關(guān)鍵字是IMPLICIT顯式標(biāo)簽通過在組件類型的標(biāo)簽之外添加一個外部標(biāo)簽生成,顯式標(biāo)簽定義的關(guān)鍵字是EXPLICITASN.1語法默認(rèn)使用顯式標(biāo)簽標(biāo)簽類型的定義方法隱式標(biāo)簽通過改變組件類型的標(biāo)簽生成,隱式2.2ASN.1命名方法關(guān)鍵字:有專用名稱,全部字符大寫類型名:數(shù)據(jù)類型名稱,首字符大寫模塊名:模塊名稱,首字符大寫宏名:宏名稱,全部字符大寫對象名:數(shù)據(jù)對象名稱,首字符小寫2.2ASN.1命名方法關(guān)鍵字:有專用名稱,全部字符大寫主要的ASN.1關(guān)鍵字關(guān)鍵字名稱關(guān)鍵字用途DEFINITIONS定義模塊、類型或?qū)ο驧ACRO定義宏BEGIN定義模塊或宏的開始END定義模塊或宏的結(jié)束IMPORTS從其它模塊引用的數(shù)據(jù)類型EXPORTS可被其它模塊引用的數(shù)據(jù)類型IDENTIFIER零與正整數(shù)序列主要的ASN.1關(guān)鍵字關(guān)鍵字名稱關(guān)鍵字用途DEFINITI主要的ASN.1符號

符號名稱符號用途::=模塊、類型、宏定義或?qū)ο筚x值{}相關(guān)項的開始與結(jié)束[]可選項的開始與結(jié)束|可選項中任選其一()子類型的開始與結(jié)束..子類型的取值范圍--注釋部分的開始與結(jié)束…多次重復(fù)的內(nèi)容主要的ASN.1符號符號名稱符號用途::=模塊、類型、宏定2.3ASN.1語法分析

數(shù)據(jù)類型定義(DataTypeDefinition)宏定義(MacroDefinition)模塊定義(ModuleDefinition)2.3ASN.1語法分析數(shù)據(jù)類型定義(DataTypeASN.1數(shù)據(jù)類型定義(1)--基本類型定義<typename>::=<type>--子類型定義<typename>::=<type>(<constraint>)--SEQUENCE類型定義<typename>::=SEQUENCE{<type><name>,<type><name>,…}--SEQUENCEOF類型定義<typename>::=SEQUENCEOF<type><name>ASN.1數(shù)據(jù)類型定義(1)--基本類型定義ASN.1數(shù)據(jù)類型定義(2)Counter::=INTEGER--基本類型定義IpAddress::=OCTETSTRINGifEntry::=SEQUENCE{--SEQUENCE類型定義ifIndexINTEGER,ifDescrOCTETSTRING,ifTypeINTEGER,ifMtuINTEGER,ifSpeedGauge,ifPhysAddressOCTETSTRING,ifAdminStatusINTEGER,ifOperStatusINTEGER,ifLastChangeTimeTicks,ifInOctetsCounter,ifInUcastPktsCounter,ifInNUcastPktsCounter,ifInDiscardsCounter,ifInErrorsCounter,ifInUnknownProtosCounter,ifOutOctetsCounter,ifOutUcastPktsCounter,ifOutNUcastPktsCounter,ifOutDiscardsCounter,ifOutErrorsCounter}ifTable::=SEQUENCEOFifEntry--SEQUENCEOF類型定義

ASN.1數(shù)據(jù)類型定義(2)Counter::=INTASN.1數(shù)據(jù)賦值switchNumberCounter::=24--基本類型賦值switchAddressIpAddress::=switchEntry::=SEQUENCE{--SEQUENCE類型賦值ifIndex24,ifDescr"ethernet-csmacd",ifType6,ifMtu1500,ifSpeed10000000,ifPhysAddress"08-01-00-2A-10-C3",ifAdminStatus1,ifOperStatus1,ifLastChange6000,ifInOctets60000,ifInUcastPkts1200,ifInNUcastPkts600,ifInDiscards10,ifInErrors6,ifInUnknownProtos0,ifOutOctets120000,ifOutUcastPkts2000,ifOutNUcastPkts400,ifOutDiscards6,ifOutErrors2}ASN.1數(shù)據(jù)賦值switchNumberCounterASN.1宏定義(1)<macroname>MACRO::=BEGIN--數(shù)據(jù)類型語法TYPENOTATION::=<syntaxofnewtype>--數(shù)據(jù)賦值語法VALUENOTATION::=<syntaxofnewvalue><AssignmentList>--輔助語法END

ASN.1宏定義(1)<macroname>MACROASN.1宏定義(2)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"ENDASN.1宏定義(2)OBJECT-TYPEMACRO:ASN.1宏賦值sysDescrOBJECT-TYPESYNTAXOCTETSTRINGACCESSread-onlySTATUSmandatory::={system1}ASN.1宏賦值sysDescrOBJECT-TYPE宏表示下面介紹定義宏的方法,為此我們需要區(qū)分以下3個不同的概念。●宏表示:ASN.1提供的一種表示機(jī)制,用于定義宏;●宏定義:用宏表示定義的一個宏,代表一個宏實例的集合;●宏實例:用具體的值代替宏定義中的變量而產(chǎn)生的實例,代表一種具體的類型。宏表示宏定義的一般形式如下:

<macroname>MACRO::=BEGIN

TYPENOTATION::=<new-type-syntax>VALUENOTATION::=<new-value-syntax><AssignmentList>END宏定義的一般形式如下:其中的macroname后是宏的名字,必須全部大寫。宏定義由類型表示(TYPENOTATION)、值表示(VALUENOTATION)和AssignmentList3部分組成,而最后一部分是任選的。這3部分都由Backus-Naur范式說明。當(dāng)用一個具體的值代替宏定義中的變量或參數(shù)時就產(chǎn)生了宏實例,它表示一個實際的ASN.1類型(叫做返回的類型),并且規(guī)定了該類型可取的值的集合(叫做返回的值)。可見宏定義可以看作是類型的類型,或者說是超類型。另一方面,也可以把宏定義看作是類型的模板,可以用這種模板制造出形式相似、語義相關(guān)的許多數(shù)據(jù)類型,這就是宏定義的主要用處。

其中的macroname后是宏的名字,必須全部大寫。宏定義由下面是取自RFC1155的關(guān)于對象類型的宏定義,其中包含兩個支持產(chǎn)生式: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下面是取自RFC1155的關(guān)于對象類型的宏定義,其中包宏定義示例關(guān)于為什么要用宏定義,我們通過一個比較深入的例子來說明。假設(shè)我們經(jīng)常需要使用整數(shù)對,于是我們定義一個ASN.1類型:

Pair-integers::=SEQUENCE(INTEGER,INTEGER)如果我們還需要使用字節(jié)串對,也可以定義相應(yīng)的類型:

Pair-octet-string::=SEQUENCE(OCTETSTRING,OCTETSTRING)宏定義示例進(jìn)一步假設(shè)我們可能需要使用各種各樣的數(shù)對,例如實數(shù)-實數(shù)對、整數(shù)-實數(shù)對、整數(shù)-字節(jié)串對、實數(shù)-布爾型對等,甚至數(shù)對中的一個成分還可能是另外一個數(shù)對或其他具有復(fù)雜構(gòu)造的成分。是否必須定義這許多數(shù)對類型呢?答案是否定的。簡化類型定義的方法是使用宏定義。我們定義一個宏P(guān)AIR,它是一個類型對:

PAIRTYPE-X=typeTYPE-Y=type進(jìn)一步假設(shè)我們可能需要使用各種各樣的數(shù)對,例如實數(shù)-實數(shù)對應(yīng)的值表示采用下面的形式:

(X=value,Y=value)用一個已有的類型代替其中的變量type,可得到宏實例,即新的類型:

T1::=PAIRTYPE-X=INTEGER

TYPE-Y=BOOLEAN

T2::=PAIRTYPE-X=VisibleString TYPE-Y=T1則下面的值屬于T1類型:

(X=3,

Y=TRUE)對應(yīng)的值表示采用下面的形式:下面的值是T2類型:

(X="Name",Y=(X=4,Y=FALSE))顯然,只要用已知的類型代替關(guān)鍵字type,就可以得到需要的數(shù)對類型。下圖給出了PAIR的宏定義,關(guān)于其中的表示方法說明如下:

(1)加引號的字符串在宏實例中保持不變,它的作用是指明類型變量的位置。

(2)可以用任何ASN.1類型名代替變量Local-type-1和Local-type-2,從而產(chǎn)生一個代表新類型的宏實例。關(guān)鍵字type指明了實施這種替換的位置。

下面的值是T2類型:

(3)在任何宏實例中,Local-value-1位置包含一個Local-type-1類型的值,同理Local-value-2位置包含一個Local-type-2類型的值,這就是新類型的值。

(4)關(guān)鍵字VALUE用于指明一個位置,其后緊跟的類型就是值的類型,亦即對宏定義產(chǎn)生的任何值必須按照這種類型編碼,本例中值的類型是SEQUENCE。

(3)在任何宏實例中,Local-value-1位置包ASN1基礎(chǔ)-(更新)解析課件ASN.1模塊定義(1)

<modulename>DEFINITIONS::=BEGINEXPORTS--本模塊中可供其它模塊引用的定義IMPORTS--本模塊使用從其它模塊引用的定義AssignmentList--宏、類型定義與對象賦值END

ASN.1模塊定義(1)<modulename>DEFASN.1模塊定義(2)

RFC1155-SMIDEFINITIONS::=BEGINEXPORTSinternet,directory,mgmt,experimental,private,enterprises,OBJECT-TYPE,ObjectName,ObjectSyntax,SimpleSyntax,ApplicationSyntax,NetworkAddress,IpAddress,Counter,Gauge,TimeTicks,Opaque;--thepathtotherootinternetOBJECTIDENTIFIER::={isoorg(3)dod(6)1}directoryOBJECTIDENTIFIER::={internet1}mgmtOBJECTIDENTIFIER::={internet2}experimentalOBJECTIDENTIFIER::={internet3}privateOBJECTIDENTIFIER::={internet4}enterprisesOBJECTIDENTIFIER::={private1}

ASN.1模塊定義(2)RFC1155-SMIDEFINASN.1模塊定義(3)

--definitionofobjecttypesOBJECT-TYPEMACRO::=BEGINTYPENOTATION::="SYNTAX"type(TYPEObjectSyntax)"ACCESS"Access"STATUS"StatusVALUENOTATION::=value(VALUEObjectName)Access::="read-only"|"read-write"|"write-only"|"not-accessible"Status::="mandatory"|"optional"|"obsolete"ENDASN.1模塊定義(3)--definitionoASN.1模塊定義(4)

--namesofobjectsintheMIBObjectName::=OBJECTIDENTIFIER--syntaxofobjectsintheMIBObjectSyntax::=CHOICE{simpleSimpleSyntax,application-wideApplicationSyntax}SimpleSyntax::=CHOICE{numberINTEGER,stringOCTETSTRING,ObjectOBJECTIDENTIFIER,emptyNULL}ApplicationSyntax::=CHOICE{addressNetworkAddress,counterCounter,gaugeGauge,ticksTimeTicks,arbitraryOpaque}ASN.1模塊定義(4)--namesofobjeASN.1模塊定義(4)

--application-widetypesNetworkAddress::=CHOICE{internetIpAddress}IpAddress::=[APPLICATION0]IMPLICITOCTETSTRING(SIZE(4))Counter::=[APPLICATION1]IMPLICITINTEGER(0..4294967295)Gauge::=[APPLICATION2]IMPLICITINTEGER(0..4294967295)TimeTicks::=[APPLICATION3]IMPLICITINTEGER(0..4294967295)Opaque::=[APPLICATION4]IMPLICITOCTETSTRINGEND

ASN.1模塊定義(4)--application-模塊定義

ASN.1中的模塊類似于C語言中的結(jié)構(gòu),用于定義一個抽象數(shù)據(jù)類型。可以用名字引用一個已定義的模塊,例如模塊定義了一個抽象語法,應(yīng)用實體把模塊名傳送給表示服務(wù),說明其APDU的格式。模塊定義的基本形式為<modulereference>DEFINITIONS::=BEGINEXPORTSIMPORTSAssignmentList

END模塊定義其中的modulereference是模塊名,可以跟隨對應(yīng)的對象標(biāo)識符。EXPORTS構(gòu)造指明該模塊可以出口的部分,而IMPORTS構(gòu)造指明該模塊需要引用的其他類型和值。AssignmentList部分包含模塊定義的所有類型、值和宏定義。下面是一個模塊定義的例子:

LanNetworkModule{isoorgdodinternetprivateenterprisesXenterprises95}DEFINITIONSEXPLICITTAGS::=BEGINEXPORTSLanNetworkName::=SEQUENCEOFRelativeDistinguishedName--EndofEXPORTSIMPORTS其中的modulereference是模塊名,可以跟隨對

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}ENDRelativeDistinguishedNameFR表1ASN.1定義的通用類型

表1ASN.1定義的通用類型表2ASN.1定義的通用類型

表2ASN.1定義的通用類型

1.簡單類型

表2.1中除了UNIVERSAL16和UNIVERSAL17之外都是簡單類型。

這些類型的共同特點是可以直接定義它們的值的集合,可以把這些類型作為原子類型構(gòu)造新的數(shù)據(jù)類型。簡單類型還可以分為4組。第一組包括BOOLEAN、INTEGER、BITSTRING、OCTETSTRING、REAL和ENUMERATED等。這一組可以叫做基本類型,它們的值已經(jīng)在表2.1中列出了。需要說明的是,實數(shù)可以表示為科學(xué)計數(shù)法:

M×BE

1.簡單類型M×BE其中尾數(shù)M和指數(shù)E可以取任何正/負(fù)整數(shù)值,基數(shù)B可取2或10。枚舉類型ENUMERATED是一個整數(shù)的表,每一個整數(shù)有一個名字。與此類似的是,對于某些整數(shù)類型的值也可以定義一個名字,但這兩種類型是有區(qū)別的。對整數(shù)可以進(jìn)行算術(shù)運算,但對枚舉類型卻不能進(jìn)行任何算術(shù)運算,也就是說,枚舉類型的值只是用整數(shù)表示的一個符號,而不具有整數(shù)的性質(zhì)。下面是定義枚舉類型和定義整數(shù)類型的例子:EthernetAdapterStatus::=ENUMERATED{normal(0),degraded(1),offline(2),failed(3)}EthernetNumberCollisionsRange::=INTEGER{minimum(0),maximum(1000)}其中尾數(shù)M和指數(shù)E可以取任何正/負(fù)整數(shù)值,基數(shù)B可取2在ASN.1中,用符號::=表示產(chǎn)生式,讀做“定義為”。顯然,EthernetNumberCollisionsRange類型的變量只能取兩個整數(shù)值:0和1000。第二組包括各種字符串類型,標(biāo)簽為UNIVERSAL18~22和UNIVERSAL25~27,這些類型都可以看作是OCTETSTRING類型的子集,它們都是采納其他標(biāo)準(zhǔn)的類型。

在ASN.1中,用符號::=表示產(chǎn)生式,讀做“定義為”。第三組包括OBJECTIDENTIFIER和ObjectDescriptor兩種類型。我們用對象類型泛指網(wǎng)絡(luò)中傳輸?shù)娜魏涡畔ο?,例如?biāo)準(zhǔn)文檔、抽象語法和傳輸語法、數(shù)據(jù)結(jié)構(gòu)和管理對象等都可以歸入信息對象范疇。OBJECTIDENTIFIER類型的值是一個對象標(biāo)識符,由一個整數(shù)序列組成,它惟一地標(biāo)識一個對象。對象描述符(ObjectDescriptor)則以人工可讀的形式描述信息對象的語義。

第三組包括OBJECTIDENTIFIER和Objec第四組包含4種類型。NULL是空類型,它沒有值,只占用結(jié)構(gòu)中的一個位置,該位置可能出現(xiàn)或不出現(xiàn)數(shù)據(jù)。EXTERNAL是外部類型,即標(biāo)準(zhǔn)之外的文檔定義的類型。UTCTime和GeneralizedTime是兩種有關(guān)時間的類型,其區(qū)別是表示時間的形式不同。前者(世界通用時)分別用兩位數(shù)字表示年、月和日(即YYMMDD),然后是時、分和秒(即hhmmss),最后可以說明是否為本地時間;而后者用4位數(shù)字表示年,用兩位數(shù)字表示月和日,最后也可以說明是否為本地時間。例如20000721182053.7是GeneralizedTime類型的一個值,表示2000年7月21日,當(dāng)?shù)貢r間18點20分53.7秒。而值20000721182053.7Z表示同樣的時間,但是加了符號Z,則表示UTC時間。如果寫為20000721182053.7+0800則除了表示同樣的當(dāng)?shù)貢r間外,還說明了加8小時可以得到UTC時間。

第四組包含4種類型。NULL是空類型,它沒有值,只占用結(jié)

2.構(gòu)造類型構(gòu)造類型有序列和集合兩種,分別用SEQUENCE和SEQUENCEOF表示不同類型和相同類型元素的序列,分別用SET和SETOF表示不同類型和相同類型元素的集合。序列和集合的區(qū)別是前者的元素是有序的,而后者是無序的。我們可以定義任何已知類型的序列,定義序列的語法是:

2.構(gòu)造類型SequenceType::=SEQUENCE{ElementTypeList}|SEQUENCE{}ElementTypeList::=ElementType|ElementTypeList,ElementTypeElementType::=NamedType |NamedTypeOPTIONAL |NamedTypeDEFAULTValue |

COMPONENTSOFTypeSequenceType::=SEQUENCE{Elemen在這個表達(dá)式中,NamedType是一個類型指針。序列的每一成分類型可能跟隨關(guān)鍵字OPTIONAL(表示任選)或DEFAULT(表示默認(rèn)值)。COMPONENTSOF子句用于指示另外一個被包含的類型。定義SEQUENCEOF類型的語法如下:

SequenceOfType::=SEQUENCEOFType|SEQUENCE在這個表達(dá)式中,NamedType是一個類型指針。序列的下面是定義序列類型的例子:EthernetCollisionsCounter::=SEQUENCE{highValueINTRGER,lowValue

INTEGER}TokenRingTokensLost::=SEQUENCEOF{highValue

INTRGER,lowValue

INTEGER}LanSimpleCounterLimits::=SEQUENCE{ethernetCounter1

COMPONENTSOFEthernetCollisionsCounter,tokenRingCounter1

COMPONENTSOF

TokenRingTokensLost}下面是定義序列類型的例子:定義SET和SETOF的語法是類似的:SetType::=SET{ElementTypeList}|SET{}SetOfType::=SETOFType|SET定義SET和SETOF的語法是類似的:下面是定義集合類型的例子:LanWorkstationSerialNumbers::=OCTETSTRING(SIZE(32))LanSegment::=SETOFLanWorkstationSerialNumbersMacAddresses::=OCTETSTRING(SIZE(6))EthernetNetworks::=SETOFMacAddressesTokenRingNetworks::=SETOFLanSegmentLanNetwork::=SET{etherNet[0]IMPLICITEthernetNetworks,

tokenNet[1]IMPLICITTokenRingNetworks}下面是定義集合類型的例子:

3.標(biāo)簽類型雖然ASN.1的所有類型都帶有標(biāo)簽,但這里所謂的標(biāo)簽類型,是指應(yīng)用或用戶加在某個類型上的標(biāo)簽。起碼有兩種情況需要給一個現(xiàn)有的類型加上標(biāo)簽:首先是一個類型可以有多個類型名,例如為了使語義更豐富,可能用Employee-name和Customer-name表示同一類型,這樣可以給兩者指定同一應(yīng)用標(biāo)簽[APPLICATION0]。另外,在一個結(jié)構(gòu)類型(序列或集合)中,可以用上下文專用標(biāo)簽區(qū)分類型相同的元素。例如集合中有3個同樣類型的元素,一個指本人的名字,一個指父親的名字,另一個指母親的名字,分別為其指定不同的上下文專用標(biāo)簽[1]、[2]和[3]以示區(qū)別,參見下例:

3.標(biāo)簽類型Parentage::=SET{SubjectName[1]IMPLICITIA5String,MotherName[2]IMPLICITIA5StringOPTIONAL,FatherName[3]IMPLICITIA5StringOPTIONAL}Parentage::=SET{標(biāo)簽類型可以是隱含的或明示的,分別用關(guān)鍵字IMPLICIT和EXPLICIT(可省略)表示。隱含標(biāo)簽的語義是用新標(biāo)簽替換老標(biāo)簽,因此編碼時只編碼新標(biāo)簽。上例中,3個集合元素的上下文標(biāo)簽都是隱含的,因此編碼時只編碼上下文專用標(biāo)簽。明示標(biāo)簽的語義是在一個基類型上加上新標(biāo)簽,從而導(dǎo)出一個新類型。事實上,明示標(biāo)簽類型是把基類型作為惟一元素的構(gòu)造類型,在編碼時,新老標(biāo)簽都要編碼,可見隱含標(biāo)簽可以產(chǎn)生較短的編碼。但明示標(biāo)簽也是有用的,特別用于基類型未定時,例如基類型為CHOICE或ANY類型。

標(biāo)簽類型可以是隱含的或明示的,分別用關(guān)鍵字IMPLICI

4.其他類型

CHOICE和ANY是兩個沒有標(biāo)簽的類型,因為它們的值是未定的,而且類型也是未定的。當(dāng)這種類型的變量被賦值時,它們的類型和標(biāo)簽才確定,可以說標(biāo)簽是運行時間確定的。

CHOICE是可選類型的一個表,僅其中一個類型可以被采用,產(chǎn)生一個值。事實上CHOICE類型是所有成分類型的聯(lián)合,這些成分類型是已知的,但是在定義時尚未確定。CHOICE類型定義為

ChoiceType::=CHOICE{AlternativeTypeList}

AlternativeTypeList::=NamedType|AlternativeTypeList,NamedType4.其他類型下面是定義CHOICE類型的例子:

EthernetAdapterNumber::=CHOICE{NULL,OCTETSTRING}

ANY類型表示任意類型的任意值,與CHOICE類型不同之處在于實際出現(xiàn)的類型也是未知的,通常記為

AnyType::=ANY|ANYDEFINEDBYidentifier例如,我們可以定義

SoftwareVersion::=ANY或SoftwareVersion::=ANYDEFINEDBYINTEGER下面是定義CHOICE類型的例子:子類型子類型是由限制父類型的值集合而導(dǎo)出的類型,因此子類型的值集合是父類型的子集。子類型還可以再產(chǎn)生子類型。產(chǎn)生子類型的方法有6種,如表3所示。

子類型表3產(chǎn)生子類型的方法

表3產(chǎn)生子類型的方法

1.單個值這種方法就是列出子類型可取的各個值。例如,我們可以定義小素數(shù)為整數(shù)類型的子集:

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)}1.單個值則可以定義First-quarter和Second-quarter為Months的子類型:First-quarter::=Months(january,february,march)Second-quarter::=Months(april,may,june)則可以定義First-quarter和Second-quar

2.包含子類型這里要用到關(guān)鍵字INCLUDES,說明被定義的類型包含了已有類型的所有的值。例如下面的定義:

First-half::=Months(INCLUDESFirst-quarter|INCLUDESSecond-quarter)另外,也可以直接列出被包含的值,例如

First-third::=Months(INCLUDESFirst-quarter|april)2.包含子類型

3.值區(qū)間這種方法只能應(yīng)用于整數(shù)和實數(shù)類型,指出子類型可取值的區(qū)間。在下面的定義中PLUS-INFINITY和MINUS-INFINITY分別表示正、負(fù)最大值,MAX和MIN分別表示父類型可允許的最大值和最小值,區(qū)間可以是閉區(qū)間或開區(qū)間。如果是開區(qū)間,則加上符號“<”。因此下面4個定義是等價的:

PositiveInteger::=INTEGER(0<..PLUS-INFINITY)PositiveInteger::=INTEGER(1..PLUS-INFINITY)PositiveInteger::=INTEGER(0<..MAX)

PositiveInteger::=INTEGER(1..MAX)3.值區(qū)間同理,下面4個定義也是等價的:

NegativeInteger::=INTEGER(MINUS-INFINITY..<0)NegativeInteger::=INTEGER(MINUS-INFINITY..-1)NegativeInteger::=INTEGER(MIN..<0)

NegativeInteger::=INTEGER(MIN..-1)同理,下面4個定義也是等價的:

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"))4.可用字符

5.限制大小可以對5種類型限制其規(guī)模大小,例如限制比特串、字節(jié)串或字符串的長度,限制構(gòu)成序列或集合的元素(同類型)個數(shù)等。例如X.25(分組交換協(xié)議)公共數(shù)據(jù)網(wǎng)的地址由5~14個數(shù)字組成,這個規(guī)定可用下面的定義表示:

It1DataNumber::=DigitString(SIZE(5..14))下面的定義說明一個參數(shù)表包含最多12個參數(shù):

ParameterList::=SETSIZE(0..12)OFParameter5.限制大小

6.內(nèi)部子類型這種方法可用于序列、集合和CHOICE類型。這是一種很復(fù)雜的子類型關(guān)系,下面用例子說明。假定有一種協(xié)議數(shù)據(jù)單元:PDU::=SET{alpha[0]INTEGER,beta[1]IA5StringOPTIONAL,gamma[2]SEQUENCEOFParameter,

delta[3]BOOLEAN}6.內(nèi)部子類型下面定義的子類型測試協(xié)議數(shù)據(jù)單元要求布爾值必須是FALSE,整數(shù)值必須是負(fù)的:

TestPDU::=PDU(WITHCOMPONENTS{....delta(FALSE),alpha(MIN..<0)})

另外一個測試子類型要求beta參數(shù)必須出現(xiàn),其值為5或12個字符組成的串:

FurtherTestPDU::=TestPDU(WITHCOMPONENTS{....beta(SIZE5|12)PRESENT})

下面定義的子類型測試協(xié)議數(shù)據(jù)單元要求布爾值必須是FALS內(nèi)部子類型還可以用于序列,例如:

Text-block::=SEQUENCEOFVisibleString

Address::=Text-block(SIZE(1..6)|WITHCOMPONENT(SIZE(1..32)))這個例子說明地址包含1~6個Text-block,每一個Text-block包含1~32個字符。

內(nèi)部子類型還可以用于序列,例如:數(shù)據(jù)結(jié)構(gòu)示例下面是取自CCITTX.208的一個數(shù)據(jù)結(jié)構(gòu)示例。圖2(a)是關(guān)于個人記錄的非形式描述,其中包括姓名、頭銜、雇員編號、雇傭日期、配偶姓名和子女?dāng)?shù)等6項信息,而且對每個子女也要給出姓名和出生日期。圖2(b)是用ASN.1描述個人記錄的抽象語法。其中對雇員編號的定義為

EmployeeNumber::=[APPLICATION2]IMPLICITINTEGER數(shù)據(jù)結(jié)構(gòu)示例其中,EmployeeNumber被定義為整數(shù)類型,而且加上了應(yīng)用標(biāo)簽APPLICATION2。IMPLICIT表示隱含的,因此編碼時只編碼應(yīng)用標(biāo)簽,不必編碼整數(shù)類型的標(biāo)簽UNIVERSAL2。對Date類型的定義也是類似的,它被說明為ISO646定義的字符串類型,注釋YYYYMMDD提示了日期的書寫格式。

Name是序列類型,由3個元素組成,各個元素的名字分別為givenName、initial和

familyName。ChildInformation是集合類型,其中的第一個元素沒有名字,只有類型。第二個元素的名字為dateOfBirth,其類型為Date。Date類型還出現(xiàn)在PersonnelRecord的定義中,在這兩個地方被分別賦予上下文專用的標(biāo)簽[0]和[1]。

其中,EmployeeNumber被定義為整數(shù)類型,而且加上最后,個人記錄的整體結(jié)構(gòu)被定義為含有6個元素的集合,該集合的最后一個成分為同類型元素的序列,默認(rèn)值為空序列。ASN.1不僅提供了表示數(shù)據(jù)結(jié)構(gòu)的手段,而且給出了表示抽象數(shù)據(jù)類型值的方法,圖2(c)表示出個人記錄的一個具體值。

最后,個人記錄的整體結(jié)構(gòu)被定義為含有6個元素的集合,該集圖2ASN.1表示的抽象語法(a)個人記錄;(b)個人記錄的抽象語法;(c)個人記錄的一個值

圖2ASN.1表示的抽象語法3BER的基本概念3BER的基本概念BER編碼的概念

BER(BasicEncodingRule)是ASN.1語言支持的主要編碼規(guī)范。BER編碼用于完成數(shù)據(jù)的編碼,避免數(shù)據(jù)在異構(gòu)網(wǎng)絡(luò)中傳輸時出現(xiàn)二義性在SNMP網(wǎng)絡(luò)管理中,發(fā)送方通過ASN.1語法構(gòu)造SNMP消息,將SNMP消息按BER編碼后發(fā)送,接收方對BER編碼解碼獲得SNMP消息

BER編碼的概念BER(BasicEncodingR

基本編碼規(guī)則(BasicEncodingRule)把ASN.1表示的抽象類型值編碼為字節(jié)串,這種字節(jié)串的結(jié)構(gòu)為類型-長度-值,簡稱TLV(Type-Length-Value),而且值部分還可以遞歸地再編碼為TLV結(jié)構(gòu),這樣就具有了表達(dá)復(fù)雜結(jié)構(gòu)的能力。

BER編碼的概念

基本編碼規(guī)則(BasicEncodingRule)BER編碼的基本結(jié)構(gòu)

BER編碼采用(TLV,TypeLengthValue)結(jié)構(gòu),每個字節(jié)按類型(Type)、長度(Length)與數(shù)值(Value)順序編碼

BER編碼的基本結(jié)構(gòu)BER編碼采用(TLV,TypeLe類型字節(jié)的結(jié)構(gòu)類型字節(jié)的第7與第8位表示標(biāo)簽類型,數(shù)值00表示通用類,數(shù)值01表示應(yīng)用類第6位表示簡單類型或結(jié)構(gòu)化類型,數(shù)值0表示簡單類型,數(shù)值1表示結(jié)構(gòu)化類型第1至第5位表示標(biāo)簽號,對簡單類型是通用類標(biāo)簽號,對其它類型是自定義標(biāo)簽號

類型字節(jié)的結(jié)構(gòu)類型字節(jié)的第7與第8位表示標(biāo)簽類型,數(shù)值00表圖3傳輸語法的第一個字節(jié)圖3傳輸語法的第一個字節(jié)編碼的第一個字節(jié)表示ASN.1類型或用戶定義的類型,其結(jié)構(gòu)如圖3所示。前兩位用于區(qū)分4種標(biāo)簽;第三位用于區(qū)分簡單類型和構(gòu)造類型;其余5位表示標(biāo)簽的值,如果標(biāo)簽的值大于30,則這5位為全1,標(biāo)簽值表示在后續(xù)字節(jié)中。關(guān)于標(biāo)簽值字段擴(kuò)充的方法稍后說明,這里先介紹幾個簡單編碼例,其中的數(shù)值都是十六進(jìn)制數(shù)。

編碼的第一個字節(jié)表示ASN.1類型或用戶定義的類型,其結(jié)例1

布爾類型有兩個值FALSE和TRUE,都用一個字節(jié)表示,F(xiàn)ALSE是00,TRUE是FF。布爾類型是簡單類型,標(biāo)簽為UNIVERSAL1,因此FALSE編碼為

010100而TRUE編碼為

0101FF其中第二個字節(jié)指明值部分的長度為1個字節(jié)。

例1布爾類型有兩個值FALSE和TRUE,都用一個字

例2

十進(jìn)制數(shù)256的編碼為

02020100最后兩個字節(jié)表示十進(jìn)制值256。

例2十進(jìn)制數(shù)256的編碼為

例3

比特串10101的值在傳輸時要占用一個字節(jié),5個比特靠左存放,右邊3位未用,因此在比特串編碼時要用一個字節(jié)說明未使用的比特數(shù)。于是對10101的編碼為

030203A8第一個字節(jié)03表示類型為簡單類型的比特串,02表示值部分為兩個字節(jié)長,第三個字節(jié)03說明值部分的最后3個比特未用,最后的A8是值部分。

例3比特串10101的值在傳輸時要占用一個字節(jié),5個例4字節(jié)串ACE可編碼為

0402ACE0由于字節(jié)串總是占用整數(shù)個字節(jié),因而不必說明未占用的比特數(shù)。沒有說明值的位都認(rèn)為是0,故最后一個字節(jié)寫為E0,可見字節(jié)串類型也遵循靠左存放的原則。

例4字節(jié)串ACE可編碼為0402ACE0

例5NULL類型只有一個值,也寫做NULL,其標(biāo)簽是UNIVERSAL5。由于這個類型是空類型,無需存儲或傳送它的值,因而編碼為

0500第二個字節(jié)00表示值長度為0。

例5NULL類型只有一個值,也寫做NULL,其標(biāo)簽是

例6

序列類型SEQUENCE{madeofwoodBOOLEAN,lengthINTEGER}的值{madeofwoodTRUE,length62}可編碼為

30060101FF02013E按照序列的結(jié)構(gòu)可展開如下:

SeqLenVal3006BoolLenVal0101FFIntLenVal02

01

3E例6序列類型SEQUENCE{madeofwood例7集合類型SET{breadthINTEGER,bentBOOLEAN}的值{breadth7,bentFALSE}可編碼為

3106020107010100由于集合類型的元素是無序的,因而也可以編碼為

3106010100020107例7集合類型SET{breadthINTEGER,例8這個例子說明應(yīng)用標(biāo)簽的使用。假設(shè)我們設(shè)計一個安全協(xié)議,在這個應(yīng)用中我們定義了一個口令字類型,并賦予應(yīng)用標(biāo)簽27:

Password::=[APPLICATION27]OCTETSTRING對于這個類型的一個值“Sesame”,可得到如下編碼:

7B080406536573616D65展開后為

AppLenVal7B08OctLenVal

0406536573616D65

Sesame例8這個例子說明應(yīng)用標(biāo)簽的使用。假設(shè)我們設(shè)計一個安全顯然,應(yīng)用標(biāo)簽和字節(jié)串標(biāo)簽都編碼了,因此它是構(gòu)造類型。為了減少編碼中的冗余信息,可使用隱含標(biāo)簽,重新定義如下:

Password::=[APPLICATION27]IMPLICITOCTETSTRING則相應(yīng)的編碼為

5B06536573616D65從第一個字節(jié)看出它變?yōu)楹唵晤愋土耍驗橹挥幸环N類型信息。顯然,應(yīng)用標(biāo)簽和字節(jié)串標(biāo)簽都編碼了,因此它是構(gòu)造類型。為圖4個人記錄的編碼圖4個人記錄的編碼ASN.1語言基礎(chǔ)知識

ASN.1語言基礎(chǔ)知識本章目錄

1ASN.1的基本概念2ASN.1語法規(guī)范3BER的基本概念

本章目錄1ASN.1的基本概念1ASN.1的基本概念1ASN.1的基本概念

表示層的功能是提供統(tǒng)一的網(wǎng)絡(luò)數(shù)據(jù)表示。在互相通信的端系統(tǒng)中至少有一個應(yīng)用實體(例如FTP、TELNET、SNMP等)和一個表示實體(即ASN.1)。表示實體定義了應(yīng)用數(shù)據(jù)的抽象語法,這種抽象語法類似于通常程序設(shè)計語言定義的抽象數(shù)據(jù)類型。應(yīng)用協(xié)議按照預(yù)先定義的抽象語法構(gòu)造協(xié)議數(shù)據(jù)單元,用于和對等系統(tǒng)的應(yīng)用實體交換信息。表示實體則對應(yīng)用層數(shù)據(jù)進(jìn)行編碼,將其轉(zhuǎn)換成二進(jìn)制的比特串,例如把十進(jìn)制數(shù)變成二進(jìn)制數(shù)、把字符變成ASCII碼等。比特串由下面的傳輸實體在網(wǎng)絡(luò)中傳送。把抽象數(shù)據(jù)變換成比特串的編碼規(guī)則叫做傳輸語法。在各個端系統(tǒng)內(nèi)部,應(yīng)用數(shù)據(jù)被映像成本地的特殊形式,存儲在磁盤上或顯示在用戶終端上,如圖1所示。

網(wǎng)絡(luò)數(shù)據(jù)表示

表示層的功能是提供統(tǒng)一的網(wǎng)絡(luò)數(shù)據(jù)表示。在互相通信的端系統(tǒng)圖1關(guān)于信息表示的通信系統(tǒng)模型

圖1關(guān)于信息表示的通信系統(tǒng)模型

特別需要指出的是,這里提到的抽象語法是獨立于任何編碼技術(shù)的,只與應(yīng)用有關(guān)。抽象語法要能滿足應(yīng)用的需要,能夠定義應(yīng)用需要的數(shù)據(jù)類型和表示這些類型的值。

ASN.1是根據(jù)當(dāng)前網(wǎng)絡(luò)應(yīng)用的需求制定的標(biāo)準(zhǔn)(CCITTX.208和ISO8824),也許隨著網(wǎng)絡(luò)應(yīng)用的發(fā)展,還會開發(fā)出新的表示層標(biāo)準(zhǔn)。另外值得一提的是,對應(yīng)一種抽象語法可以選擇不止一種傳輸語法。對傳輸語法的基本要求是支持對應(yīng)的抽象語法,另外還可以有其他一些屬性,例如支持?jǐn)?shù)據(jù)加密或壓縮,或者兩者都支持。

特別需要指出的是,這里提到的抽象語法是獨立于任何編碼技術(shù)ASN.1語言的概念抽象語法表示(ASN,AbstractSyntaxNotation)是一種獨立于硬件的高級語言ASN.1語法可用來描述各種類型的數(shù)據(jù),包括文本、圖形、視頻與音頻等ASN.1編碼可用來規(guī)范數(shù)據(jù)傳輸過程,解決異構(gòu)網(wǎng)絡(luò)對數(shù)據(jù)理解的二義性ASN.1語言的概念抽象語法表示(ASN,AbstractASN.1支持的編碼規(guī)范

基本編碼規(guī)范(BER,BasicEncodingRules)嚴(yán)格編碼規(guī)范(CER,CanonicalEncodingRules)唯一編碼規(guī)范(DER,DistinguishedEncodingRules)壓縮編碼規(guī)范(PER,PackedEncodingRulesXML編碼規(guī)范(XER,XMLEncodingRules)

ASN.1支持的編碼規(guī)范基本編碼規(guī)范(BER,BasicASN.1的主要應(yīng)用SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)X.400(信息處理服務(wù)協(xié)議)X.500(目錄訪問服務(wù)協(xié)議)H.323(基于分組的多媒體通信VoIP結(jié)構(gòu))RSA(公鑰密碼體制)SET(安全電子商務(wù))ASN.1的主要應(yīng)用SNMP(簡單網(wǎng)絡(luò)管理協(xié)議)2ASN.1語法規(guī)范2ASN.1語法規(guī)范2.1ASN.1數(shù)據(jù)類型簡單類型:直接規(guī)定取值集合的類型,其中不會包括任何組件結(jié)構(gòu)類型:由多個組件構(gòu)成的類型,每個組件是一個簡單類型或結(jié)構(gòu)類型標(biāo)簽類型:主要用于區(qū)分不同類型數(shù)據(jù),特別是SEQUENCE與SET中相同類型的組件2.1ASN.1數(shù)據(jù)類型簡單類型:直接規(guī)定取值集合的類型,ASN.1簡單類型簡單類型類型說明INTEGER整數(shù)型(正、負(fù)整數(shù)與0的集合)BOOLEAN布爾型(True與False的集合)REAL實數(shù)型(正、負(fù)實數(shù)與0的集合)ENUMERATED枚舉型(字符串與值的對應(yīng)關(guān)系)BITSTRING比特流(二進(jìn)制數(shù)組成的比特串)OCTETSTRING字節(jié)流(十六進(jìn)制數(shù)組成的字節(jié)串)NULL空類型(只有一個值null)EXTERNAL自定義類型ASN.1簡單類型簡單類型類型說明INTEGER整數(shù)型(正、ASN.1結(jié)構(gòu)類型結(jié)構(gòu)類型類型說明SEQUENCE多個類型的有序集合(類似C的結(jié)構(gòu))SEQUENCEOF某個類型的有序集合(類似C的數(shù)組)SET多個類型的無序集合(類似SEQUENCE)SETOF某個類型的無序集合(類似SEQUENCEOF)CHOICE多個類型的可選集合(取其中一個類型)ANY任意類型ASN.1結(jié)構(gòu)類型結(jié)構(gòu)類型類型說明SEQUENCE多個類型的SEQUENCE與SEQUENCEOF

SEQUENCE表示多種類型的有序集合Student::==SEQUENCE{NameOCTETSTRING,AgeINTEGER}SEQUENCEOF表示某種類型的有序集合Students::==SEQUENCEOFStudent

SEQUENCE與SEQUENCEOFSEQUENCE表ASN.1標(biāo)簽類型通用類(UniversalClass)應(yīng)用類(ApplicationClass)私有類(PrivateClass)內(nèi)容指定類(Context-specificClass)

ASN.1標(biāo)簽類型通用類(UniversalClass)通用類標(biāo)簽(1)通用類標(biāo)簽類型說明UNIVERSAL1布爾型(BOOLEAN)UNIVERSAL2整數(shù)型(INTEGER)UNIVERSAL3比特流(BITSTRING)UNIVERSAL4字節(jié)流(OCTETSTRING)UNIVERSAL5空類型(NULL)UNIVERSAL6對象標(biāo)識符(OBJECTIDENTIFIER)通用類標(biāo)簽(1)通用類標(biāo)簽類型說明UNIVERSAL1布爾通用類標(biāo)簽(2)通用類標(biāo)簽類型說明UNIVERSAL7對象描述符(OBJECTDESCRIPTION)UNIVERSAL8自定義類型(EXTERNAL)UNIVERSAL9實數(shù)型(REAL)UNIVERSAL10枚舉型(ENUMERATED)UNIVERSAL16有序結(jié)構(gòu)類型(SEQUENCE與SEQUENCEOF)UNIVERSAL17無序結(jié)構(gòu)類型(SET與SETOF)通用類標(biāo)簽(2)通用類標(biāo)簽類型說明UNIVERSAL7對象標(biāo)簽類型的定義方法隱式標(biāo)簽通過改變組件類型的標(biāo)簽生成,隱式標(biāo)簽定義的關(guān)鍵字是IMPLICIT顯式標(biāo)簽通過在組件類型的標(biāo)簽之外添加一個外部標(biāo)簽生成,顯式標(biāo)簽定義的關(guān)鍵字是EXPLICITASN.1語法默認(rèn)使用顯式標(biāo)簽標(biāo)簽類型的定義方法隱式標(biāo)簽通過改變組件類型的標(biāo)簽生成,隱式2.2ASN.1命名方法關(guān)鍵字:有專用名稱,全部字符大寫類型名:數(shù)據(jù)類型名稱,首字符大寫模塊名:模塊名稱,首字符大寫宏名:宏名稱,全部字符大寫對象名:數(shù)據(jù)對象名稱,首字符小寫2.2ASN.1命名方法關(guān)鍵字:有專用名稱,全部字符大寫主要的ASN.1關(guān)鍵字關(guān)鍵字名稱關(guān)鍵字用途DEFINITIONS定義模塊、類型或?qū)ο驧ACRO定義宏BEGIN定義模塊或宏的開始END定義模塊或宏的結(jié)束IMPORTS從其它模塊引用的數(shù)據(jù)類型EXPORTS可被其它模塊引用的數(shù)據(jù)類型IDENTIFIER零與正整數(shù)序列主要的ASN.1關(guān)鍵字關(guān)鍵字名稱關(guān)鍵字用途DEFINITI主要的ASN.1符號

符號名稱符號用途::=模塊、類型、宏定義或?qū)ο筚x值{}相關(guān)項的開始與結(jié)束[]可選項的開始與結(jié)束|可選項中任選其一()子類型的開始與結(jié)束..子類型的取值范圍--注釋部分的開始與結(jié)束…多次重復(fù)的內(nèi)容主要的ASN.1符號符號名稱符號用途::=模塊、類型、宏定2.3ASN.1語法分析

數(shù)據(jù)類型定義(DataTypeDefinition)宏定義(MacroDefinition)模塊定義(ModuleDefinition)2.3ASN.1語法分析數(shù)據(jù)類型定義(DataTypeASN.1數(shù)據(jù)類型定義(1)--基本類型定義<typename>::=<type>--子類型定義<typename>::=<type>(<constraint>)--SEQUENCE類型定義<typename>::=SEQUENCE{<type><name>,<type><name>,…}--SEQUENCEOF類型定義<typename>::=SEQUENCEOF<type><name>ASN.1數(shù)據(jù)類型定義(1)--基本類型定義ASN.1數(shù)據(jù)類型定義(2)Counter::=INTEGER--基本類型定義IpAddress::=OCTETSTRINGifEntry::=SEQUENCE{--SEQUENCE類型定義ifIndexINTEGER,ifDescrOCTETSTRING,ifTypeINTEGER,ifMtuINTEGER,ifSpeedGauge,ifPhysAddressOCTETSTRING,ifAdminStatusINTEGER,ifOperStatusINTEGER,ifLastChangeTimeTicks,ifInOctetsCounter,i

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論