目录
一. 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 提供了多种编码规范,以适应不同应用的需求。主要的编码规范包括:
-
BER(Basic Encoding Rules):
- 基本编码规则,是ASN.1的最基本编码规则,灵活且容易实现。
- 使用标签类型(Type)、长度(length)和内容(value)三部分来表示数据。
- BER的灵活性也意味着它可能会生成冗长的编码,不适合对效率要求高的场合。
-
DER(Distinguished Encoding Rules):
- 区别编码规则,是BER的子集,消除了BER中的不确定性,确保了唯一的编码方式。
- 用于需要唯一编码的场合,如数字证书(X.509)和加密协议。
-
CER(Canonical Encoding Rules):
- 规范编码规则,与DER类似,但用于无限长字符串的情况下。
- 通过规范化处理,确保编码的唯一性,适用于一些需要数据一致性的应用。
-
PER(Packed Encoding Rules):
- 紧凑编码规则,通过优化编码来减少数据的长度,适合对带宽敏感的场合。
- 有两种变体:对齐(Aligned PER)和非对齐(Unaligned PER),对齐的编码会以八位字节为单位,而非对齐则不会。
-
XER(XML Encoding Rules):
- XML编码规则,将ASN.1描述的数据结构编码为XML格式,便于与基于XML的系统进行互操作。
- 易于阅读和调试,但比其他编码规则更加冗长。
-
OER(Octet Encoding Rules):
- 八位字节编码规则,旨在提供一种高效且容易解析的编码规则。
- 适用于需要紧凑和快速解析的应用场合。
-
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类型。
本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见