目录

 一. ASN.1基本信息

▐ ASN.1编码规则

二. ASN.1语法规范

▐ ASN.1的关键字

▐ ASN.1的符号

▐ ASN.1的数据类型

▐ 示例


一. ASN.1基本信息

ASN.1(Abstract Syntax Notation One)是一种国际标准(由ITU-T X.680系列建议定义),用于描述数据的结构。它主要用于定义和编码传输协议中的数据,以确保不同系统间的数据交换。

ASN.1语法可用来描述各种类型的数据,包括文本、图形、视频与音频等。通常用于定义应用数据的抽象语法和PDU的结构。比如SNMP中使用ASN.1进行管理信息结构SMI的定义和管理数据库MIB的定义。ASN.1编码可用来规范数据传输过程,解决异构网络对数据理解的二义性。

ASN.1最初是ITU针对电信协议设计而制定,后来被ISO接受成为国际标准。

ASN.1的主要应用:

  • 网络协议:ASN.1被广泛用于各种网络协议,如SNMP(Simple Network Management Protocol)、LDAP(Lightweight Directory Access Protocol)和X.500目录服务。它帮助定义和编码数据,使不同的系统可以互相通信。

  • 电信系统:在电信行业,ASN.1用于信令协议,如SS7(Signaling System No. 7)和GSM(Global System for Mobile Communications)。它确保不同电信设备之间的互操作性。

  • 安全协议:ASN.1被用于许多安全协议,如X.509数字证书和SSL/TLS。它帮助定义和编码证书、密钥和其他安全相关的数据结构。

  • 金融系统:在金融行业,ASN.1用于标准化各种交易和信息交换协议,如ISO 20022标准。这有助于不同金融机构之间的信息交换和处理。

  • 多媒体通信:ASN.1还用于多媒体通信协议,如H.323和H.264,用于视频会议、VoIP和其他实时通信应用。

  • 智能卡:在智能卡应用中,ASN.1用于定义和传输数据,如在电子护照和支付卡中。

  • 数据交换格式:ASN.1可用于定义通用数据交换格式,使不同系统能够理解和处理相同的数据结构。

▐ ASN.1编码规则

ASN.1的广泛应用得益于其灵活性和扩展性,以及它支持多种编码规则,如BER(Basic Encoding Rules)、DER(Distinguished Encoding Rules)和PER(Packed Encoding Rules),以满足不同应用的需求。ASN.1 提供了多种编码规范,以适应不同应用的需求。主要的编码规范包括:

  1. BER(Basic Encoding Rules)

    • 基本编码规则,是ASN.1的最基本编码规则,灵活且容易实现。
    • 使用标签类型(Type)、长度(length)和内容(value)三部分来表示数据。
    • BER的灵活性也意味着它可能会生成冗长的编码,不适合对效率要求高的场合。
  2. DER(Distinguished Encoding Rules)

    • 区别编码规则,是BER的子集,消除了BER中的不确定性,确保了唯一的编码方式。
    • 用于需要唯一编码的场合,如数字证书(X.509)和加密协议。
  3. CER(Canonical Encoding Rules)

    • 规范编码规则,与DER类似,但用于无限长字符串的情况下。
    • 通过规范化处理,确保编码的唯一性,适用于一些需要数据一致性的应用。
  4. PER(Packed Encoding Rules)

    • 紧凑编码规则,通过优化编码来减少数据的长度,适合对带宽敏感的场合。
    • 有两种变体:对齐(Aligned PER)和非对齐(Unaligned PER),对齐的编码会以八位字节为单位,而非对齐则不会。
  5. XER(XML Encoding Rules)

    • XML编码规则,将ASN.1描述的数据结构编码为XML格式,便于与基于XML的系统进行互操作。
    • 易于阅读和调试,但比其他编码规则更加冗长。
  6. OER(Octet Encoding Rules)

    • 八位字节编码规则,旨在提供一种高效且容易解析的编码规则。
    • 适用于需要紧凑和快速解析的应用场合。
  7. JER(JSON Encoding Rules)

    • JSON编码规则,将ASN.1描述的数据结构编码为JSON格式。
    • 适用于与基于JSON的系统和应用进行互操作。

这里对于BER编码的具体讲解可以查看:图文解析ASN.1中BER编码:结构类型、编码方法、编码实例


二. ASN.1语法规范

ASN.1(Abstract Syntax Notation One)的语法规范定义了一种描述数据结构的方式,其语法类似于编程语言中的声明和定义。

文字约定:

  • 区分大小写
  • 跳空格
  • 注释以--开头,以--结束或行尾结束
  • 标识符由大小写字母,数字和横线组成
  • 内部标识符(关键字)全部大写
  • 用户定义的类型名和模块名以大写字母开头
  • 宏名称全部大写
  • 变量名(数据对象)以小写字母开头

▐ ASN.1的关键字

以下是ASN.1关键字及其含义的表格:

关键字 含义
INTEGER 表示整型数据。
BOOLEAN 表示布尔型数据,其值可以是TRUE或FALSE。
BIT STRING 表示位串,由一系列的位组成。
OCTET STRING 表示字节串,由一系列的字节组成。
NULL 表示空值。
OBJECT IDENTIFIER 表示对象标识符,用于唯一标识一个对象。
SEQUENCE 表示序列类型,可以包含多个字段,字段可以是任意ASN.1类型。
SET 类似于序列,但是元素的顺序不重要。
CHOICE 表示选择类型,只能选择其中一个选项。
ANY 表示任意类型。
ENUMERATED 表示枚举类型,其值是预先定义的一组常量。
SEQUENCE OF 表示序列类型,包含多个相同类型的元素。
SET OF 类似于SEQUENCE OF,但是元素的顺序不重要。
OPTIONAL 表示可选字段。
DEFAULT 表示字段的默认值。
EXPLICIT 表示显式标签。
IMPLICIT 表示隐式标签。
TAGS 用于定义数据类型的标签。
DEFINITIONS 开始定义数据结构的关键字。
END 结束定义的关键字。

这个表格提供了ASN.1中常用关键字的基本概述,帮助理解和使用ASN.1进行数据结构的定

▐ ASN.1的符号

以下是ASN.1中一些常用符号及其含义的表格:

符号 含义
{} 定义一个模块或类型的定义块
::= 用于定义类型或值的赋值操作符
` `
( ) 用于定义SEQUENCE或SEQUENCE OF中的字段
[ ] 用于定义OPTIONAL或DEFAULT字段的标签
< > 用于定义ANY类型时指定具体的类型
... 表示省略号,用于省略重复的模式或序列
; 用于分隔多个定义或语句
" " 用于字符串字面量中的空格
' ' 用于枚举值中的分隔符
%x 用于定义OCTET STRING类型中的十六进制值
%d 用于定义INTEGER类型中的十进制值
%o 用于定义INTEGER类型中的八进制值
%b 用于定义BIT STRING类型中的二进制值

这些符号在ASN.1的语法中扮演着重要的角色,它们帮助定义数据结构和数据类型,以及如何组织和解释数据。

▐ ASN.1的数据类型

ASN.1提供了丰富的数据类型,用于定义网络协议和数据交换格式,这些部分内容在上述的关键字中也有提到。

简单类型:直接规定取值集合的类型

  • INTEGER:表示整数值。
  • BOOLEAN:表示布尔值(TRUE或FALSE)。
  • BIT STRING:表示位的序列。
  • OCTET STRING:表示字节序列。
  • NULL:表示空值。
  • OBJECT IDENTIFIER:表示对象标识符,用于唯一标识一个对象或类型。
  • ENUMERATED:表示从一组预定义的枚举值中选择。

结构类型:也叫构造类型,由多个组件构成的类型,每个组件是一个简单类型或者结构类型

  • SEQUENCE:序列类型,包含有序的字段集合。
  • SET:集合类型,包含无序的字段集合。
  • SEQUENCE OF:表示相同类型的元素序列。
  • SET OF:表示相同类型的元素集合
  • CHOICE:表示从多个选项中选择一个。
  • ANY:表示任意ASN.1类型。

标签类型

▐ 示例

以下是一些ASN.1语法的示例,展示了基本数据类型和构造类型的使用:

简单类型定义

PersonName ::= OCTET STRING
Age ::= INTEGER

复杂类型定义

Person ::= SEQUENCE {
    name    PersonName,
    age     Age,
    gender  ENUMERATED { male(0), female(1) },
    address OCTET STRING OPTIONAL
}

CHOICE类型

ContactInfo ::= CHOICE {
    phoneNumber OCTET STRING,
    emailAddress OCTET STRING
}

SEQUENCE OF类型

PhoneNumbers ::= SEQUENCE OF OCTET STRING

约束:ASN.1允许对类型进行约束,例如限制整数的取值范围:

Age ::= INTEGER (0..120)

下面是一个包含所有上述元素的完整ASN.1定义示例:

Person ::= SEQUENCE {
    name    OCTET STRING,
    age     INTEGER (0..120),
    gender  ENUMERATED { male(0), female(1) },
    contactInfo CHOICE {
        phoneNumber OCTET STRING,
        emailAddress OCTET STRING
    },
    addresses SEQUENCE OF OCTET STRING OPTIONAL
}

Company ::= SEQUENCE {
    companyName OCTET STRING,
    employees   SEQUENCE OF Person
}
  • Person类型定义了一个人,包括姓名、年龄、性别、联系信息和可选的地址列表。
  • Company类型定义了一个公司,包括公司名称和员工列表,每个员工都是一个Person类型。



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐