複製鏈接
請複製以下鏈接發送給好友

抽象語法

鎖定
抽象語法(Abstract Syntax Notation,ASN.1)是一種形式語言,它提供統一的網絡數據表示,通常用於定義應用數據的抽象語法和應用協議數據單元的結構。在網絡管理中,無論是OSI的管理信息結構或是SNMP管理信息庫,都是用ASN.1 定義的。
中文名
抽象語法
外文名
Abstract Syntax Notation
別    名
ASN.1
作    用
提供統一的網絡數據表示
基本組成單元
模塊

抽象語法介紹

抽象語法表示 ASN.1 定義了一組用來描述OSI網絡上所傳輸的數據結構規則。ASN.1是一種形式語言,它提供統一的網絡數據表示,通常用於定義應用數據的抽象語法和應用協議數據單元的結構。在網絡管理中,無論是OSI 的管理信息結構或是SNMP管理信息庫,都是用ASN.1定義的。
在ASN.1 中,每一個數據類型都有一個標籤(tag),標籤有類型和值,數據類型是由標籤的類型和值唯一確定的。有4種標籤:通用標籤UNIVERSAL、應用標籤APPLICATION、上下文專用標籤Context-Specific、私有標籤PRIVATE。ANSI.1定義的數據類型有 20 多種,標籤類型都是 UNIVERSAL。用ASN.1定義的應用數據在傳送過程中要按照一定的規則變換成比特串,這種規則就是基本編碼規則(Basic Encoding Rule,BER)。ASN.1 提供了宏定義功能,可用於擴充語法,定義新的類型和值。

抽象語法網絡數據

圖1 圖1
表示層的功能是提供統一的網絡數據表示。在互相通信的端系統中至少有一個應用實體(如 SNMPTELNETFTP 等)和一個表示實體(即ASN.1)。表示實體定義了應用數據的抽象語法,這種抽象語法類似於通常程序設計語言定義的抽象數據類型。應用協議按照預先定義的抽象語法構造協議數據單元,用於和對等系統的應用實體交換信息。表示實體則對應用層數據進行編碼,將其轉換成二進制的比特串,例如,把十進制數變成二進制數,把字符變成ASCII 碼等。比特串由下層的傳輸實體在網絡中傳送。在各個端系統內部,應用數據被映像成本地的特殊形式,存儲在磁盤上或顯示在用户終端上,如圖1所示。
這裏定義的抽象語法是獨立於任何編碼技術的,只與應用有關。抽象語法要滿足應用的需要,能夠定義應用需要的數據類型和表示這些類型的值。ASN.1 是根據當前網絡應用的需求制定的標準(原CCITT X.208 和 ISO 8824),但隨着網絡應用的發展,今後還會開發出新的表示層標準。
數據類型的 ASN.1 描述稱為抽象語法,同等表示實體之間通信時對用户信息的描述稱為傳輸語法。為抽象語法指定一種編碼規則,便構成一種傳輸語法。在表示層中,可用這種方法定義多種傳輸語法。傳輸語法與抽象語法之間是多—多對應關係,即一種傳輸語法可用於多種抽象語法的數據傳輸,而一種抽象語法的數據值可用多種傳輸語法來傳輸。對傳輸語法的要求是支持對應的抽象語法,另外還可以有其他一些屬性,例如,支持數據加密或壓縮,或者兩者都支持。 [1] 

抽象語法ASN.1語法

ASN.1是由原CCITT和ISO共同開發的標準語言,它與應用層一起使用,可在系統間進行數據的傳輸。在ASN.1 中為每個應用所需的所有數據結構類型進行定義,並將它們組成庫。當一個應用想發送一個數據結構時,可以將數據結構與其對應的ASN.1 標識一起傳給表示層。以ASN.1 定義作為索引,表示層便知道數據結構的域的類型及大小,從而對它們編碼傳輸;在另一端,接收表示層查看此數據結構的ASN.1 標識,從而瞭解數據結構的域的類型及大小。這樣,表示層就可以實現從通信線路上所用的外部數據格式到接收計算機所用的內部數據格式的轉換。
每個應用層協議中的抽象語法與一個能對其進行編碼的傳輸語法的組合,就構成一個表示上下文(Presentation Context)。表示上下文可以在連接建立時協商確定,也可以在通信過程中重新定義。表示層提供定義表示上下文的功能。
作為一種形式語言,ASN.1 有嚴格的BNF定義。ISO 8824/X.208 標準説明了ASN.1,下面列出ASN.1 文本的書寫規則,這些規則叫做文本約定(Lexical Convention)。
(1)多個空格和空行等效於一個空格。
(2)用於表示值和字段的標識符、類型指針和模塊名由大小寫字母、數字和短線組成。
(3)標識符以小寫字母開頭。
(4)類型指針和模塊名以大寫字母開頭。
(5)ASN.1定義的內部類型全部用大寫字母表示。
(6)關鍵字全部用大寫字母表示。
(7)註釋以一對短線(--)開始,以一對短線或行尾結束。

抽象語法抽象數據類型

在ASN.1 中,每一個數據類型都有一個標籤(tag),標籤有類型和值,數據類型是由標籤的類型和值唯一確定的,這種機制在數據編碼時有用。標籤的類型分為以下4種。
通用標籤:用關鍵字UNIVERSAL表示,帶有這種標籤的數據類型是由標準定義的,適用於任何應用。
應用標籤:用關鍵字APPLICATION表示,是由某個具體應用定義的類型。
上下文專用標籤:用關鍵字 Context-Specific 表示,這種標籤在文本的一定範圍(如一個結構)中適用。
私有標籤:用關鍵字PRIVATE表示,這是用户定義的標籤。
ANSI.1 定義的數據類型有 20 多種,標籤類型都是 UNIVERSAL,這些數據類型可分為4大類:
簡單類型:由單一成分構成的原子類型,包括 INTEGER,BOOLEAN,REAL,ENUMERATED,BIT STRING,OCTET STRING,NULL,OBJECT IDENTIFIER,CHARACTERSTRING。
構造類型:由兩種以上成分構成的構造類型,包括SEQUENCE,SEQUENCE OF,SET,SET OF。
標籤類型:由已知類型定義的新類型。
其他類型:包括CHOICE和ANY兩種類型。 [2] 

抽象語法子類型

子類型是由限制父類型的值集合而導出的類型,所以子類型的值集合是父類型的子集。子類型還可以產生子類型。產生子類型的方法有以下6種。
1.單個值(Single Value) :列出子類型可取的各個值。
2.值區間(Value Range) :這種方法只能用於整數和實數,指出子類型可取的區間。
3.允許字符(Permitted Alphabet) :允許字符只能用於字符串類型,限制字符集的取值範圍。
4.限制大小(Size Constrained) :可以限制5種類型(BIT STRING,OCTET STRING,CHARACTER STRING,SEQUENCEOF,SET OF)的規模大小。
5.包含子類型(Contained Subtype) :從已有的子類型定義新的子類型,新子類型包含原子類型的全部可能的值。用關鍵字INCLUDES,説明被定義的類型包含了已有類型的所有的值。
6.內部子類型(Inner Subtype) :適用於SEQUENCE,SEQUENCE OF,SET,SET OF和CHOICE類型,主要用於對這些結構類型的元素項進行限制。

抽象語法應用類型

ASN.1中的應用類型與特定的應用有關。具體到SNMP這種應用,RFC1155 定義了以下應用類型。
1.NetWorkAddress::=CHOICE {internet IpAddress}
這種類型用 ASN.1 的 CHOICE 構造定義,可以從各種網絡地址中選擇一種。目前只有Internet地址,即IP地址。
2.IpAddress::=[APPLICATION 0] IMPLICIT OCTET STRING(SIZE(4))
以網絡序表示的IP地址。因為它是一個32 位的值,所以定義為4個字節。
3.Counter::=[APPLICATION 1] IMPLICIT INTEGER(0..4294977295)
計數器類型是一個非負整數,其值可增加,但不能減少,達到最大值 232−1 後回零,再從頭開始增加。計數器可用於計算收到的分組數或字節數。
4.Gauge::=[APPLICATION 2] INTEGER(0..4294977295)
計量器類型是一個非負整數,其值可增加,也可減少。最大值為232−1,與計數器不同的是計量器達到最大值後不回零,而是鎖定在232−1,直到復位,計量器可用於表示存儲在緩衝隊列中的分組數。
5.TimeTicks::=[APPLICATION 3] INTEGER(0..4294977295)
時鐘類型是非負整數,從 1~232−1,時鐘單位以 0.01s 遞增,可表示從某個事件(如設備啓動)開始到目前經過的時間。
6.Opaque::=[APPLICATION 4 ] OCTET STRING
不透明類型即未知數據類型,或者説可以表示任意類型。這種數據編碼時按照 OCTET STRING處理,管理站和代理能解釋這種類型。

抽象語法基本編碼規則

用 ASN.1 表示的變量必須轉換為串行的字節流才能在網絡中傳輸。轉換文本 ASN.1 語法到機讀代碼的算法,稱為基本編碼規則(Basic Encoding Rules,BER)。ASN.1 用BER來描述傳輸過程中內容,BER在 ISO 8825/X標準中進行了定義。
BER傳輸語法的格式是TLV三元組,即<標籤Tag,長度 Length,值Value>。標籤(Tag)字段是關於標籤類別和編碼格式的信息;長度(Length)字段包含實際的數據;值(Value)字段包含實際的數據。TLV每個域都是一系列八位位組,對於構造結構,其中V還可以是TLV三元組。
BER傳輸語法是基於八位位組(八位位組由八比特組成,是編碼的基本單位)的,自定界的編碼,因為其中L明確界定了八位位組的長度。BER是大端編碼的,其八位位組中的二進制編號從8到1,約定第8位是最高有效位,第1位是最低有效位

抽象語法宏定義

ASN.1 宏提供了創建“模板”的功能,這也是引入ASN.1 宏的原因。ASN.1 宏使得ASN.1語言具有良好的擴充性。

抽象語法模塊定義

ASN.1的基本單位是模塊,用於定義一個抽象數據類型ASN.1模塊實際上是由一組類型定義和值定義組成。類型定義是説明類型的名稱和類型的格式,值定義是規定將什麼樣的具體值賦給某一類型。模塊定義的基本形式為
DEFINITIONS::=
BEGIN
EXPORTS
Assignment List
END
其中,Module Identifier 是模塊名,模塊名的第一個字母必須大寫。EXPORTS 結構用於定義其他模塊可以移值的類型或值,而 IMPORTS 結構規定了模塊中某些定義是從其他模塊中移植過來的。
Assignment List 部分包含模塊定義的所有類型、值和宏定義。

抽象語法宏表示

ASN.1 宏提供了創建“模板”用來定義宏的方法,MIB對象就是採用宏定義模板來定義。下面是定義宏的方法,為此需要區分3個不同的概念。
宏表示:ASN.1 提供的一種表示機制,用於定義宏。
宏定義:用宏表示定義的一個宏,代表一個宏實例的集合。
宏實例:用具體的值代替宏定義中的變量而產生的實例,代表一種具體的類型。
宏定義的模板形式為
MACRO::=
BEGIN
TYPE NOTATION::=
VALUE NOTATION::=
END
其中,macroname是宏的名字,必須全部大寫。宏定義由類型表示(TYPE NOTATION)、值表示(VALUE NOTATION)和支持產生式(supporting syntax)3部分組成,而最後部分是任選的,是關於宏定義體中類型的詳細語法説明。這3部分都由Backus-Naur規範説明。當用一個具體的值代替宏定義中的變量或參數時就產生了宏實例,它表示一個實際的 ASN.1 類型(稱為返回的類型),並且規定了該類型可取的值的集合(稱為返回的值)。可見宏定義可以看做是類型的類型,或者説是超類型。另一方面也可以把宏定義看做是類型的模板,用這種模板製造出形式相似、語義相關的許多數據類型。這就是宏定義的主要用處。 [3] 
參考資料