BER Basic Encoding Rules について


 SNMP がどれくらい帯域を消費するかを調べるために、SNMP の中身について調べていました。 すると、BER というものを少し理解する必要がでてきました。 簡単でわかり易いドキュメントを見つけたので概要を訳して(約して)見ました。
 しかし、、、内容はあんまり簡単ではなかった、、、まぁ、ご一読ください。

Basic Encoding Rules


うぅぅ....ね、熱があるぅ :-

 データタイプをビットやバイトに変換するためのコンパイルのやり方は基本符号化規則( BER )と呼ばれる。 あるいは BER は SNMP と LDAP の転送のための構文と言うべきか。BER と ANS.1 考案したのは同じ人々である (ネットワークの管理者だけではない)。それ以来、手に手を携えて歩んでいる。このことによって物事は簡単になる。 しかし BER は仕組みはいったいどのようなものなのか。たくさんのデータタイプを取り扱わなければならないが。 それに何百ものプロトコルも。まったくまごつかせる。BER を知るためにさっさと始めよう。 ここでは SNMP と LDAP における ANS.1 の BER についてだけ論じることにしよう。

 BER は「識別子(identifier)」として使われる。識別子は一つ一つのデータタイプに割り当てられた一意なコードである。 識別子はデータタイプの呼出しコードのようなものである。この識別子を使ってデータタイプを区別する。 データタイプはさらにグループに分類される。BER についてさらに説明する前に、識別子について簡単に説明しよう。 例えば図書館にある本は秩序なく並べられているだろうか?明らかに違う。 (もしそうなら新しい司書をお願いした方がいい。)図書館の本はあらかじめ定義された主題や ISBN 番号のようなものによっていろいろなグループに分類されている。 BER の考案者はそのやり方に大いに触発されて同じことをした。BER は4つに分類される。

  1. 汎用 どのプロトコルでも使用可。基本データタイプ(INTERGER, OCTECT string, OBJECT IDENTIFIER, NULL)は汎用。SEQUENCE のような基礎的な構成のものも汎用。

  2. 特定(応用) 特定のアプリケーションでの使用可。例えば、IpAddress というデータタイプは TCP/IP ネットワーク管理を通してのみ有効。

  3. 範囲限定(コンテキスト特定) このデータタイプは別のデータタイプに含まれる。その中でのみ識別子は一意。

  4. 個別(私用) 企業が独自に定義したデータタイプとして ANS.1 を使うことができる。

    ※上記の( )内は『TCP/IP ネットワーク管理入門』の訳によります。( )の左側はわたしの案です。 それぞれ、元の英語は、universal, application, context-specific, private です。意味から考えると本の訳は少しわかりにくいと思うのですが、 どうでしょうか?

BER の識別子

Bit No.87654321意味
 00      汎用
 01      特定
 10      範囲限定(コンテキスト特定)
 11      個別
   0     基本データタイプ
   1     基本データタイプ以外

 8番目と7番目のビットで BER の分類を示す。これらのビットは上の表のようになる。 6番目のビットはデータタイプが基本的なものかそうでないかを示す。残りのビットはデータタイプの番号を表す。 以下の表にいくつかの例を挙げる。

10 進表現2 進表現 
0200000010INTEGER
0400000100OCTET STRING
1600010000SEQUENCE

 データの長さを表すときには、構造標識のすぐ後のバイトか、INTEGER などという表現そのものが長さを表すために使われる。 ということは、BER では1バイト分の長さ、つまり 255 バイト分の長さしか表現できないのか。違う。 BER はもっとうまく作られている。長さが1バイトを超えたら、構造標識のすぐ次のバイトの8番目のビットに1が設定され、 またその次のバイトが長さを表すようになる。例えば、0ABCDH ( 43981 )バイトという長さは次のように表現される。

16 進表現2 進表現 
3000110000構造標識
8210000010長さが2バイトを超えることを示す
AB
10101011本当の長さ
CD
11001101

 このようにして無数のデータタイプに一意な数字を割り当てることができ、 分類名とタイプ名に加えてデータタイプが一意に識別される。 このようなルールがプロトコルに関わりなく全面的に採用されている。 このような背景を知ることは BER の基本を知るために有効だと思われる。 さあ、BER がいろいろなプロトコルにおいてどのように使われているかをのぞきに行こう。


オリジナル英文ドキュメントはここ。もうありません。


BER SNMP


まだ、風邪でくらくらするぅ....

 すでに説明したように BER 識別子の残りの5ビットはデータタイプの番号を表す。5ビットしか使えないので、 直接表現できる数は 30 である。この制限によって SNMP における BER の実装は安全なものになる。つまり、 SNMP は 30 以上のデータタイプを持てない。30 を超えたら、SNMP はもはや簡素なものとは言えないのではないか。 自らの重みで沈んでしまうであろう。
 ※ SNMP は簡素な(シンプル)ネットワーク管理プロトコルという意味です。

汎用で基本データタイプの例
 16 進表現2 進表現
INTEGER0200000010
BIT STRING0300000011
OCTET STRING0400000100
NULL0500000101
OBJECT IDENTIFIER0600000110

汎用で基本のデータタイプ外の例
 16 進表現2 進表現
SEQUENCE3000110000

SNMP 特定で基本データタイプの例
 16 進表現2 進表現
IpAddress4001000000
Counter(Counter32 in SNMPv2)4101000001
Gauge(Gauge32 in SNMPv2)4201000010
TimeTicks4301000011
Opaque4401000100
NsapAddress4501000101
Counter64(SNMPv2 でのみ有効)4601000110
Uinteger32(SNMPv2 でのみ有効)4701000111

SNMP 範囲限定で基本データタイプ外の例
 16 進表現2 進表現
GetRequest-PDUA010100000
GetNextRequest-PDUA110100001
GetResponse-PDU
(SNMPv2 における Response-PDU)
A210100010
SetRequest-PDUA310100011
Trap-PDU(SNMPv2 では廃止)A410100100
GetBulkRequest-PDU(SNMPv2 で追加)A510100101
InformRequest-PDU(SNMPv2 で追加)A610100110
SNMPv2-Trap-PDU(SNMPv2 で追加)A710100111

 識別子の値を使うことによって SNMP のエージェントと簡単にやりとりができるし、応答することもできる。 このようにして世界中のネットワーク管理者の悪い(そして悲しい)労働環境は ANS.1 と BER によって軽減されている。

 原文では以下にシミュレーションプログラムの紹介があり、そのステップへ進むことが薦められている。


オリジナル英文ドキュメントはここ。これもないです。