ASN.1語法詳解

Chapter 4 ASN.1

《Network management : principles and practice》


4.1 網絡數據表示及編碼
4.2 ASN.1的基本概念
4.3 基本編碼規則

4.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章