SNMPのコマンド体系
SNMPプロトコルは、管理対象の機器側に登載されるSNMPエージェントとネットワーク管理システム側に登載されるSNMPマネージャのエージェント/マネージャ形式を取っています(図8)。これはLANでよく耳にするクライアント/サーバーに相当し、分散処理化の流れに対応するものです。
SNMPはTCP/IPのコネクションレス型のトランスポートサービスであるUDP(User datagram Protocol)を使用します。これは最も低機能のトランスポートサービスでありデータの到達も保証されていない信頼性の低いものですが、一方で再送レベルを自分で決められる利点もあります。つまり、ネットワークが混雑している時はパケットの再送間隔を伸ばして、管理パケットによるネットワークの更なる混雑を防ぐといった工夫が可能になる訳です。
SNMPはSNMPマネージャがコマンドを発行し、該当するSNMPエージェントがそれに応答するポーリング方式を基本にしていますが、管理対象機器に特定の事象が発生した場合にエージェント側から通知を行なうこともでき、トラップと呼ばれています。トラップも無制限に発生するとネットワークの使用効率が低下しますので、不必要なトラップの発生は制限されなければなりません。そこでSNMPではトラップはマネージャがポーリングのタイミング調整や管理対象に焦点を当てるために利用されると規定しています。
先にも述べた通り、SNMPではGetRequest/GetNextRequest/GetResponse/SetRequest/Trapの5つのコマンドしかサポートされていませんが、ポーリング主体であることと、管理の本質はMIBにあることを考えると必要かつ十分と言えるのではないでしょうか。
●SNMPパケット形式
SNMPのパケット形式を図9に示しますが、SNMPメッセージ部分のコマンドが含まれている領域はPDU(Prototocol Data Unit)と呼ばれています。また、SNMPメッセージの先頭部分にはバージョン番号(Version)とコミュニティ名(Community)が定義され、SNMPマネージャとSNMPエージェントの管理関係の確認に利用されています。バージョン番号とコミュニティ名部分とを合わせて認証ヘッダー(Authentication Header)と呼ぶ場合もあります。
SNMPメッセージはASN.1表記の定義に基づいてコマンドや変数類で校正されていますが、一種の符号化が施されています。これはBER(Basic Encoding Rules)と呼ばれるもので、ASN.1の値をオクテット列(バイトデータ列)に変換する規則を定義しています。BERについての詳細はここでは省略します。
PDUには通常用途とトラップ用途の2つの形式が用意されていますが、ここでは通常のPDUの各フィールドについて説明しておきます。
Request-ID
このフィールドにはあるオペレーション要求を他と区別するための整数値がセットされ、SNMPエージェントはマネージャからの要求に対して同じRequest-ID値で応答します。この仕組みによりマネージャ側は要求したオペレーションに対するエージェント側の応答を簡単に対応づけることができますので、連続したコマンドの発行が可能になります。
Error-Status
このフィールドが"0"の場合は要求したオペレーションが正常に実行されたことを示しますが、それ以外の場合には何らかのエラーが発生しています。
エラーには次の5つが用意されています。
- (エージェントが指定されたオペレーションの結果を1つのSNMPメッセージに入れることができなかったことを示す"tooBig(1)"
- 指定した管理オブジェクトが存在していない場合の"noSuchName(2)"
- 管理オブジェクト変数に対する変更要求値が適切でない場合の"badValue(3)"
- 書き込みが禁止されている管理オブジェクト変数に対して変更要求を行なった場合の"readOnly(4)"
- 他のエラーが発生した場合の"genErr(5)"
Error-Index
エラー発生時に、要求されたオペレーションに含まれているどの管理オブジェクト変数でエラーが発生したかを示すオフセット値です。先頭の変数が"1"となります。
Variable-Bindings
このフィールドには変数のリストが含まれ、複数の変数を指定することが可能です。リストは変数名とその値で1セットになっています。複数の変数を指定した場合、その中でエラーが一つでも発生すると、全ての要求が無効になるので注意が必要です。変数は管理オブジェクトに対応している訳ですが、このフィールドではテーブル変数の様な変数の集合体は定義できません。つまり、MIBの定義でテーブル変数になっている管理オブジェクトは、個々の要素に分けてアクセスしなければなりません。そこで管理オブジェクトの変数要素(インスタンスと呼ばれています)を指定するのに管理オブジェクト名に数字を付加する方式が取られています。管理オブジェクトがテーブルでなければ、".0"を付加します。例えば、"sysDescr.0" と表します。また、テーブルの場合はMIBでの定義に応じた数字の付加が行なわれます。例えば、IPアドレス関連のテーブルではIPアドレスを付加して、"ipAdEntNetMask.128.10.2.3"と表記します。
SNMPのメッセージ長に対しては、484バイト以下のメッセージが受信できることと規定されているだけですが、送信側もこの規約に準じた方が無難と思われます。