zoukankan      html  css  js  c++  java
  • ASN.1详解

    Chapter 4 ASN.1

    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(苏布拉马尼亚 ) ,
    《Network management : principles and practice》
  • 相关阅读:
    数据库课程设计心得【3】存储过程的运用
    看BBC研究大脑的科教片中“放松产生灵感”的笔记
    成功干掉“恶心的U盘自动运行病毒免疫目录”!共享方法,让更多的人干掉这东西!
    分享一大堆最新dot net asp.net c# 电子书下载 , 英文原版的。经典中的经典
    SQL学习之 对GROUP BY 和 HAVING 的理解 学习笔记
    关于Theme中.skin与css需要理清的关系
    最近的学习笔记,记录一些通俗易懂的学习类文章。更像是好资料参与索引。
    关于DNN Module开发学习以来的一点总结
    工具发布!QQ空间阅读与备份工具
    被忽视的大道理
  • 原文地址:https://www.cnblogs.com/zhangsf/p/3283159.html
Copyright © 2011-2022 走看看