ASN.1

在電信和電腦網絡領域，ASN.1（Abstract Syntax Notation One) 是一套標準，是描述數據的表示、編碼、傳輸、解碼的靈活的記法。它提供了一套正式、無歧義和精確的規則以描述獨立於特定電腦硬體的對象結構。

## 標準簡介

ASN.1是ISO和ITU-T的聯合標準，最初是1984年的CCITT X.409:1984的一部分。由於其廣泛應用，1988年ASN.1移到獨立標準X.208，1995年進行全面修訂後變成X.680系列標準。

ASN.1本身只定義了表示資訊的抽象句法，但是沒有限定其編碼的方法。各種ASN.1的編碼規則提供了由ASN.1描述其抽象句法的數據的值的傳送語法（具體表達）。標準的ASN.1編碼規則有：

- 基本編碼規則（BER，Basic Encoding Rules）
- 規範編碼規則（CER，Canonical Encoding Rules）
- 唯一編碼規則（DER，Distinguished Encoding Rules）
- 壓縮編碼規則（PER，Packed Encoding Rules）
- XML編碼規則（XER，XML Encoding Rules）

為了使ASN.1能夠描述一些原先沒有使用ASN.1定義，因此不適用上述任一編碼規則的數據傳輸和表示的應用和協議，另外製訂了ECN來擴展ASN.1的編碼形式。ECN可以提供非常靈活的表明方法，但還沒有得到普遍應用。

ASN.1與特定的ASN.1編碼規則一起通過使用獨立於電腦架構和程式語言的方法來描述數據結構，為結構化數據的交互提供了手段，特別是在網路環境的應用程式。

## 應用

應用層協議如X.400（email）、X.500和LDAP（目錄服務）、H.323（VoIP）和SNMP使用 ASN.1 描述它們交互的協議數據單元。在UMTS的接入和非接入層也有廣泛的應用。ASN.1的其他應用領域參見此處。

## 工具

這裡列舉了很多ASN.1的自由或者商業的工具。

給定了協議內容並選定了編碼規則，很多工具可以生成讀（解碼）寫（編碼）PTU的C/C++、Java、C#、Python等原始碼。

ASN.1是一種和平台、語言無關的描述語言，可以使用很多ASN.1的翻譯工具，將ASN.1翻譯成為C, C++, Java等代碼。用於跨平台編程的protocol buffers和Apache Thrift具有類似功用。

## 範例

FooProtocol 結構的定義係使用 ASN.1 表示法:

```
FooProtocol DEFINITIONS ::= BEGIN

    FooQuestion ::= SEQUENCE {
        trackingNumber INTEGER,
        question       IA5String
    }

    FooAnswer ::= SEQUENCE {
        questionNumber INTEGER,
        answer         BOOLEAN
    }

END
```

ASN.1沒有定義的談話流動。這是協議的文本描述。

假設消息，符合與foo的協議將被發送到接收方。這種特定的消息（PDU）:

```
myQuestion FooQuestion ::= {
    trackingNumber     5,
    question           "Anybody there?"
}
```

要通過網路發送上述消息，需要編碼成位元字串（string of bits）。ASN.1定義了不同的演算法來完成這項任務，被稱為編碼規則。有很多，最簡單的一個是DER.

Foo協議規範應明確名稱一套編碼規則的使用，Foo的協議，使用者 知道他們應該使用哪一個。

### DER的編碼範例

下面顯示DER編碼格式（皆16進位）的數據結構:

```
30 -- 標籤說明 SEQUENCE
13 -- octets長度

02 -- 標籤說明 INTEGER
01 -- octets長度
05 -- value

16 -- 標籤說明 IA5String
0e -- octets長度
41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f -- value 
("Anybody there?" in ASCII)
```

(Note: DER uses a pattern of type-length-value triplets)

人們實際上得到的是21個octets:

```
30 13 02 01 05 16 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f
```

ASN.1 的範圍與 DER 結束於此. It is possible to transmit the encoded message to the party by any means (utilizing TCP or any other protocol). The party should be able to decode the octets back using DER.

### XER編碼的範例

另外，它是可能的編碼用XER (ASN.1) 來獲取更多人類可讀性 "over the wire". 可以產生下列的 108 octets:

```
<FooQuestion>
    <trackingNumber>5</trackingNumber>
    <question>Anybody there?</question>
</FooQuestion>
```

### PER 範例（未對齊）

另外，採用壓縮編碼規則（Packed Encoding Rules）, 會產生下列 122 bits (小於16 octets):

```
01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0
```

## 標準下載

（從ITU-T網站免費下載）

描述ASN.1記法的標準：

- ITU-T Rec. X.680 | ISO/IEC 8824-1
- ITU-T Rec. X.681 | ISO/IEC 8824-2
- ITU-T Rec. X.682 | ISO/IEC 8824-3
- ITU-T Rec. X.683 | ISO/IEC 8824-4

描述ASN.1編碼規則的標準

- ITU-T Rec. X.690 | ISO/IEC 8825-1 (BER, CER and DER)
- ITU-T Rec. X.691 | ISO/IEC 8825-2 (PER)
- ITU-T Rec. X.692 | ISO/IEC 8825-3 (ECN)
- ITU-T Rec. X.693 | ISO/IEC 8825-4 (XER)

ASN.1標準列表

## 參見

- TTCN
- ECN
- Federal Standard 1037C
- MIL-STD-188。

本條目部分或全部內容出自以GFDL授權發佈的《自由線上電腦詞典》（FOLDOC）

- The ASN.1 Consortium
- ASN.1 C, C++, Java Tools
- Online ASN.1 decoder Free online tool.
- ASN.1 IDE, Editor, Compilers
- ASN.1 相關站點
- 參考資料
- 其他
- ASN.1教程
- 微軟知識庫 《XGEN: A 簡短簡介 BER 和 ASN 1》

## 外部連結

- ASN.1 Made Simple
- ASN.1
- A Layman's Guide to a Subset of ASN.1, BER, and DER

## 基本資料

- 車隊名稱：抽象句法符號一
- 狀態：已生效
- 開始年：1984
- 版本：(02/21)
- version_date：February 2021
- 組織：ITU-T
- 有關標準：X.690
- 網站：https://www.itu.int/rec/T-REC-X.680/