Abstract Syntax Notation One
出典: フリー百科事典『ウィキペディア(Wikipedia)』
Abstract Syntax Notation One(ASN.1)とは、電気通信やコンピュータネットワークでのデータ構造の表現・エンコード・転送・デコードを記述する標準的かつ柔軟な記法である。マシン固有の技法などに依存せず、曖昧さのない記述を可能とする形式規則を提供する。
1984年、CCITT X.409: 1984 の一部として、ISOとITU-Tが策定した。ASN.1 はその適用範囲の広さから、1988年に X.208 として独立することとなった。1995年、改訂版が X.680 シリーズとなっている。
目次 |
[編集] データ転送における ASN.1
ASN.1 は情報の抽象構文を定義するが、情報の符号化方法を限定するものではない。抽象構文をASN.1で記述されたデータを転送する際の ASN.1 符号化規則が各種用意されている。
ASN.1 の標準符号化規則として以下のものがある。
- Basic Encoding Rules (BER)
- Canonical Encoding Rules (CER)
- Distinguished Encoding Rules (DER)
- XML Encoding Rules (XER)
- Packed Encoding Rules (PER)
- Generic String Encoding Rules (GSER)
ASN.1記法と特定のASN.1符号化規則を使うことで、マシンのアーキテクチャや実装言語に依存しない形式で、ネットワーク上のアプリケーション間でやりとりするデータ構造を定めることができる。
X.400 電子メール、X.500 あるいは LDAP ディレクトリ・サービス、H.323(VoIP)、SNMP、BACnet といったアプリケーション層のプロトコルは ASN.1 を使ってProtocol Data Unitを規定する。UMTSでも使われている。他にも ASN.1 の応用範囲は様々である[1]。
[編集] 例
ASN.1 記法で FooProtocol のデータ構造を定義したものを以下に示す。
FooProtocol DEFINITIONS ::= BEGIN FooQuestion ::= SEQUENCE { trackingNumber INTEGER, question VisibleString } FooAnswer ::= SEQUENCE { questionNumber INTEGER, answer BOOLEAN } END
これが Foo プロトコル作成者が公開する仕様となる。ASN.1 はプロトコルの手順(流れ)を定義しない。その部分は文章で説明される。
ここで、Foo プロトコル準拠のメッセージを他の誰かに送るとする。このメッセージ(PDU)は以下のようになっている。
myQuestion FooQuestion ::= { trackingNumber 5, question "Anybody there?" }
このメッセージをネットワーク経由で送るには、これをビット列に符号化しなければならない。ASN.1 にはそのためのアルゴリズムが各種用意されていて、「符号化規則(encoding rule)」と呼ばれている。最も単純な規則は Distinguished Encoding Rules (DER) である。
Foo プロトコル仕様では、どの符号化規則を採用するかを明確に決めておかなければならない。それによって、Foo プロトコルのユーザー間で(例えば)DER を使うという共通認識ができる。
[編集] DER による符号化例
上掲のデータ構造を DER 形式に符号化すると次のようになる。
30 -- タグ SEQUENCE 13 -- オクテット長 02 -- タグ INTEGER 01 -- オクテット長 05 -- 値 1a -- タグ VisibleString 0e -- オクテット長 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f -- 値(ASCII での "Anybody there?")
すなわち、DER での符号化パターンは「型-長さ-値」の組の羅列である。従って、符号化によって得られるのは以下の21オクテットのデータ列である。
30 13 02 01 05 1a 0e 41 6e 79 62 6f 64 79 20 74 68 65 72 65 3f
ASN.1 と DER の関わる範囲はここまでである。これを実際に転送する方法は ASN.1 とは無関係に決められる(つまり、TCPを使おうと他のプロトコルを使おうと関係ない)。受信側は受信したオクテット列を DER に従ってデコードできる。
[編集] XER による符号化例
同じ ASN.1 データ構造を XER (XML Encoding Rules) で符号化し、人間にも読める形式にすることもできる。例の場合、以下の108オクテットになる。
<FooQuestion> <trackingNumber>5</trackingNumber> <question>Anybody there?</question> </FooQuestion>
[編集] PER による符号化例
Packed Encoding Rules を使うと、以下のように 16 オクテット以内に符号化できる。
01 05 0e 83 bb ce 2d f9 3c a0 e9 a3 2f 2c af c0
[編集] ASN.1 とその他のデータ構造定義
通信プロトコルのメッセージを定義する場合、ASN.1 では主にバイナリ符号化規則が使われる。
他のインターネットでよく使われるアプリケーション層のプロトコル(HTTPやSMTP)では、メッセージ定義にはタグと値が使われ、時にはABNF記法が使われる。それらの定義には符号化も含まれるが、テキストによる符号化である。
これら2つの手法はそれぞれに利点があり、議論が数多く行われてきた。ASN.1 の手法は効率がよいとされており、Packed Encoding Rules ではさらにコンパクトな符号化を実現できる。テキストを使った手法は実装が容易でデバッグが容易とされている(人間が符号化されたメッセージを読めるため)。Megaco(H.248)プロトコルでは、どちらの符号化がよいかを決められず、ASN.1 に基づいた符号化と ABNF に基づいた符号化の両方が定義されている。
ASN.1 の XML Encoding Rules (XER) はこのギャップを埋めるべく、ASN.1 記法で定義された構造をテキスト符号化する方法を提供する。類似の Generic String Encoding Rules は特にユーザーとのやりとりのために定義された符号化規則である。
[編集] ASN.1 の実際の利用
ASN.1 コンパイラを使って、ASN.1 記法によるコードから、等価なデータ構造を表現する適当なコード(例えばC言語のソースコード)を生成する場合もある。このコードとランタイムライブラリにより、符号化されたデータ構造と言語が理解できる表現の間で双方向の変換が可能となる。あるいは、人間の手でエンコード・デコードのルーチンを書く場合もある。
[編集] 標準
ASN.1記法を説明した標準 (free download from the ITU-T website):
- 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符号化規則を説明した標準 (free download from the ITU-T website):
- 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.693 | ISO/IEC 8825-4 (XER)
- ITU-T Rec. X.694 | ISO/IEC 8825-5 (XSD mapping)
- RFC 3641 (GSER)
- JIS X 5603:1990 ASN.1仕様
- JIS X 5604:1990 ASN.1基本符号化規則仕様
- JIS X 5605-1:1998 基本記法
- JIS X 5605-2:1998 情報オブジェクト
- JIS X 5605-3:1998 制約
- JIS X 5605-4:1998 パラメータ化
- JIS X 5606-1:1998 符号化規則(BER、CER、DER)
- JIS X 5606-2:1998 符号化規則(PER)
[編集] 関連項目
[編集] 参考文献
この記述は GNU Free Documentation License のもとに公開されているコンピュータ用語辞典『 Free On-line Dictionary of Computing (FOLDOC) 』に基づいています。
[編集] 外部リンク
- The ASN.1 Consortium
- A comprehensive ASN.1 information site
- asn1c, ASN.1 のソースコードをC言語のソースコードに変換するオープンソースのコンパイラ
- pyasn1: ASN.1 のデータ型とコーデックのPythonによる実装
- A Layman's Guide to a Subset of ASN.1, BER, and DER: ASN.1, BER および DER の入門的文書
- BinaryNotes: オープンソースの ASN.1 フレームワーク。Java および .NET 向け。
- ASN.1 バイナリ変換規則(BER)
- ASN.1概要