什麼是ASN.1 – 抽象語法表示法?概念、運作方式
ASN.1,即抽象語法表示法一,是國際標準化組織 (ISO) 標準,它提供了一種將人類可讀符號編碼為壓縮二進位形式的機制。抽象語法表示法 1 (ASN.1) 是 X.400 和 X.500 規格的一部分,提供格式化和編碼 X.400 型電子郵件訊息的標準方法,以便透過網路傳輸。更一般地說,ASN.1 是一種指定用於任何形式的串行傳輸的抽象對象的方法。
ASN.1還用於在簡單網路管理協定(SNMP)的管理資訊庫(MIB)檔案中定義物件。
ASN.1
怎麼運作
ASN.1 在語法上類似於程式語言,它允許定義不同的資料類型、資料結構、陣列、類別和其他類似於 C++ 程式語言中的結構。開放系統互連 (OSI) 參考模型的呈現層 (第 6 層) 使用 ASN.1 作為標準,以指定此層應用程式之間交換資訊的語法。ASN.1 資料類型可以是簡單的,也可以是結構化的。
ASN.1 資料結構以十六進位表示法編碼為八位元組。然後,這些結構作為二進位資訊透過網路傳輸。
八位元組編碼規則 (OER) 的設計易於實施,並產生比基本編碼規則 (BER) 產生的編碼更緊湊的編碼。除了減少開發編碼器/解碼器的工作量之外,使用 OER 還可以降低頻寬利用率(儘管不如打包編碼規則那麼多)、節省 CPU 週期並降低編碼/解碼延遲。
亞型
通常,設計人員只打算 ASN.1 類型值的某些子集在某些情況下有效。例如,在以百分比形式傳達濕度測量時,只有 0 到 100 範圍內的數字有效,或者在傳達郵遞區號時,只允許具有特定字元且長度在特定範圍內的字串。也許當某些協定訊息在特定上下文中使用時,選擇性校驗和欄位將不存在。
這些都是約束的範例,可以透過定義合適父類型的子類型來表示。這是透過在父項的符號中附加適當的子類型規格來完成的。結果本身就是一個類型,可以在允許類型的任何地方使用。(因此,子類型規範也可以應用於子類型,在這種情況下,它可能有助於進一步減少值集)。子類型規格由一或多個子類型值集組成,以 “|” 分隔(發音為“或”)。整個列表位於圓括號(())中。
例如:
Weekend ::= DaysOfTheWeek (saturday | sunday)
類型 Weekend 是透過將子類型規格附加至父類型 DaysOfThe Week 來定義。子類型規格 (圓括弧中的運算式) 會定義哪些 DaysOfTheWeek 的值也是 Weekend 的值。
有六種不同的值集表示法。其中兩個適用於所有父類型,其他僅適用於特定父類型。
適用於所有母系類型的值集表示法是單一值及包含子類型。前一種表示法只是父類型的某個值,結果值集僅由該值組成。例如上述 “星期六” 和 “星期日”,每個值都是 DaysOfTheWeek 的單一值。所包含的子類型表示法包括關鍵字 INCLUDES,後面接著相同母項類型的一些其他子類型,並表示由該子類型中所有值組成的值集。
例如,給定:
LongWeekend ::= DaysOfTheWeek
(INCLUDES Weekend | monday)
類型 LongWeekend 包含三個值 saturday、sunday 和 monday,這是其定義中使用的值集的聯集。每個值集都會定義父類型值的某些子集。產生的子類型具有這些子集聯集中的值,這些值必須是非空的。
值範圍表示法可用來子類型化其值已排序的任何類型 (例如,整數類型) 。它涉及指定範圍的下限和上限。
大小範圍可以包含在值具有已定義大小的任何類型 (例如,位字串類型) 。在這裡,值集包含其大小 (以適當單位測量) 在指定範圍內的所有值。
字母限制只能套用至字串類型,且只容許由某些字元子集所形成的值。
最後,可以使用內部子類型來定義結構化類型的值集(例如,集合和類型集)。這裡的值集包括其組件值滿足特定約束的所有值。
名稱
ASN.1 中的數個物件類別具有可參考的名稱。我們實際上已經遇到了上述每種名稱的示例,如下所示:
類型參考:天氣報告
值參考:sample報告
標識符:濕度
像這些例子一樣,選擇名稱對人類讀者具有意義非常重要。事實上,如果名稱選擇正確(並遵循適當的佈局約定),那麼即使不精通該語言的人也可以通常掌握 ASN.1 某些部分的本質。
ASN.1 中的所有名稱都是從同一組字元抽取的字串,即:
大寫字母:ABCDEFGHIJKLMNOPQRSTUVWXYZ
小寫字母:abcdefghijklmnopqrstuvwxyz
十進制數字:0123456789
連字符:–
名稱中的第一個字元必須是字母。名稱中字母的大小寫很重要,因此「邊框」和「邊框」是不同的名稱。事實上,首字母的大小寫具有特殊意義,因為類型引用(以及模組引用,見下文)必須以大寫字母開頭,而值引用和標識符必須以小寫字母開頭。然而,使用兩個或多個名稱並不是一個好主意,這些名稱僅因某些字母的大小寫而不同。
必須選擇使用者選擇的名稱,以避免與 ASN.1 的保留字(包括該語言的大部分關鍵字)發生衝突。由於關鍵字通常為大寫,因此在名稱中使用小寫字母可以輕鬆遵守這一點,並且通常也使名稱更具可讀性。名稱的長度沒有上限,這允許使用適當的短語作為物件的名稱。
合法(且可能適當)名稱的範例如下:
-
未格式化郵政地址
-
存取控制清單
-
前十字韌帶
-
溫度
-
MverifyPDU
-
創紀錄低
-
ib-g3傳真非基本參數
這些範例中的前幾個可用來做為類型參照,其他範例則可作為識別碼或值參照使用。
請注意,在這些範例中使用了兩種不同的約定來形成多字名稱,因為空格在名稱中無效,因此不能用來分隔各個作品。