コンテンツにスキップ

Abstract Syntax Notation One

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Tiyoringo (会話 | 投稿記録) による 2008年12月11日 (木) 21:53個人設定で未設定ならUTC)時点の版 (: 見出しレベルの修正)であり、現在の版とは大きく異なる場合があります。

Abstract Syntax Notation OneASN.1)とは、電気通信コンピュータネットワークでのデータ構造の表現・エンコード・転送・デコードを記述する標準的かつ柔軟な記法である。マシン固有の技法などに依存せず、曖昧さのない記述を可能とする形式規則を提供する。

1984年、CCITT X.409: 1984 の一部として、ISOITU-Tが策定した。ASN.1 はその適用範囲の広さから、1988年X.208 として独立することとなった。1995年、改訂版が X.680 シリーズとなっている。

データ転送における ASN.1

ASN.1 は情報の抽象構文を定義するが、情報の符号化方法を限定するものではない。抽象構文をASN.1で記述されたデータを転送する際の ASN.1 符号化規則が各種用意されている。

ASN.1 の標準符号化規則として以下のものがある。

ASN.1記法と特定のASN.1符号化規則を使うことで、マシンのアーキテクチャや実装言語に依存しない形式で、ネットワーク上のアプリケーション間でやりとりするデータ構造を定めることができる。

X.400 電子メールX.500 あるいは LDAP ディレクトリ・サービスH.323VoIP)、SNMPBACnet といったアプリケーション層のプロトコルは 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 では主にバイナリ符号化規則が使われる。

他のインターネットでよく使われるアプリケーション層のプロトコル(HTTPSMTP)では、メッセージ定義にはタグと値が使われ、時には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)

関連項目

参考文献

この記事は2008年11月1日以前にFree On-line Dictionary of Computingから取得した項目の資料を元に、GFDL バージョン1.3以降の「RELICENSING」(再ライセンス) 条件に基づいて組み込まれている。

外部リンク