asn浅析--简单介绍

asn1是一种自组织自定义的数据结构,它是自洽的,几乎不需要外界的参与就能自己解释自己,这就做到了与机器无关,与应用无关,尽可能的与环境无关,这就是它最大的优势。那么到底什么是asn结构呢,简单说它就是一个嵌套的三元组,复杂得说它可以写一本厚书,甚至好几本。所以还是简单的理解它吧,以下用asn指代其最显然的编码形式--ber格式,因为本文基于ber格式介绍,并不涉及更多抽象语法方面的asn定义,asn的三元组就是{类型,长度,值},所谓的可嵌套值得是每个三元组中的“值”同时又可以表示为新的三元组,是否表示为新的更小的三元组以及它到底是什么要看它的“类型”是什么,所谓的嵌套仅限于“值”这个字段,那么“类型”和“长度”有什么说头呢?实际上它们很有说头,这里面有好几个问题需要解决,首先就是谁来规定“类型”和“长度”的类型和长度,如果说固定化它们那么可扩展性肯定不佳,如果说靠外界程序规定那么它们就依赖了外界而不再是自洽的了,因此就需要它们本身也是可以自我解释的,也许是歌德尔的不完备性在普遍的起作用吧,想让asn完全的自恰是不可能的,必须靠外界给予硬性规定,但是这种规定必须做到最小化和标准化,因此这最小化的规定由国际标准组织来规定,于是就有了ASN.1标准。
asn1以字节为基础,定义1个字节为“类型”和“长度”的元长度,首先考虑“类型”,从高位到低位的规定:8位和7位两位定义class,一共四种,第6位表示后面的“值”是基本类型还是复合类型,再后面的5位表示一个tag,如果我们把class想象成大的类型,那么tag就是该大类中的小类,但是如果5个字节不够了怎么办,实际上如果你第5位为1,那么就说明接下来的字节还是表示tag,直到最高位不为1为止结束tag;接下来就是“长度”了,一个字节仅能表示最多一个字节的长度,如果长度超过256怎么办?解决办法就是只要“长度”的最高位为1,那么此字节表示的就是“长度”的长度,这样就可以定义更长的长度了;接下来的“值”要么是一个确定的数字要么是上面三元组的重复。
上面描述的就是asn的最基本的理念,如果问asn最成功的地方在哪里,答案就是越复杂的协议用asn定义越方便,我们知道应用层协议是最复杂的,要比底层协议复杂的多,于是很多应用层协议都是用asn1定义的,典型的如H323,snmp,ssl(osi定义在表示层),用asn而不是类似ip等底层协议的方式是因为应用层协议充满了变数。它和分层协议模型相比有何不同以及有何优势,且待下回分解。

你可能感兴趣的:(介绍)