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等底層協定的方式是因為應用層協定充滿了變數。它和分層協定模型相比有何不同以及有何優勢,且待下回分解。
本文轉自 dog250 51CTO部落格,原文連結:http://blog.51cto.com/dog250/1271947