4. Protocol Specification
4. プロトコル仕様
ネットワーク管理プロトコルは、エージェントの MIB の変数を検査または変更できるアプリケーション プロトコルです。
プロトコル エンティティ間の通信はメッセージの交換によって実現され、各メッセージは ASN.1 の基本的なエンコード規則を使用して単一の UDP データグラム内で完全かつ独立して表現されます (セクション 3.2.2 で説明)。 メッセージは、バージョン識別子、SNMP コミュニティ名、およびプロトコル データ ユニット (PDU) で構成されます。プロトコル エンティティは、トラップを報告するメッセージを除くすべてのメッセージ (つまり、Trap-PDU を含むメッセージを除くすべてのメッセージ) について、プロトコル エンティティが関連付けられているホスト上の UDP ポート 161 でメッセージを受信します。トラップを報告するメッセージは、さらに処理するために UDP ポート 162 で受信される必要があります。 このプロトコルの実装では、長さが 484 オクテットを超えるメッセージを受け入れる必要はありません。 ただし、可能な限り実装でより大きなデータグラムをサポートすることをお勧めします。
SNMP のすべての実装は、GetRequest-PDU、GetNextRequest-PDU、GetResponse-PDU、SetRequest-PDU、および Trap-PDU の 5 つの PDU をサポートすることが必須です。
RFC1157-SNMP DEFINITIONS ::= BEGIN
IMPORTS
ObjectName, ObjectSyntax, NetworkAddress, IpAddress, TimeTicks
FROM RFC1155-SMI;
-- top-level message
Message ::=
SEQUENCE {
version -- version-1 for this RFC
INTEGER {
version-1(0)
},
community -- community name
OCTET STRING,
data -- e.g., PDUs if trivial
ANY -- authentication is being used
}
-- protocol data units
PDUs ::=
CHOICE {
get-request
GetRequest-PDU,
get-next-request
GetNextRequest-PDU,
get-response
GetResponse-PDU,
set-request
SetRequest-PDU,
trap
Trap-PDU
}
-- the individual PDUs and commonly used
-- data types will be defined later
END
4.1. 手順の要素
このセクションでは、SNMP を実装するプロトコル エンティティのアクションについて説明します。ただし、準拠した実装の内部アーキテクチャを制約するものではないことに注意してください。
以下のテキストでは、トランスポート アドレスという用語が使用されます。 UDP の場合、トランスポート アドレスは IP アドレスと UDP ポートで構成されます。 SNMP をサポートするために他のトランスポート サービスが使用される場合があります。 このような場合、トランスポート アドレスの定義はそれに応じて行う必要があります。
メッセージを生成するプロトコル エンティティのトップレベルのアクションは次のとおりです。
-
まず、適切な PDU (GetRequest-PDU など) を ASN.1 オブジェクトとして構築します。
-
次に、この ASN.1 オブジェクトをコミュニティ名とともに、その送信元トランスポート アドレスと宛先トランスポート アドレスを、目的の認証スキームを実装するサービスに渡します。 この認証サービスは、別の ASN.1 オブジェクトを返します。
-
次に、プロトコル エンティティは、コミュニティ名と結果の ASN.1 オブジェクトを使用して、ASN.1 メッセージ オブジェクトを構築します。
-
この新しい ASN.1 オブジェクトは、ASN.1 の基本的なエンコード規則を使用してシリアル化され、トランスポート サービスを使用してピア プロトコル エンティティに送信されます。
同様に、メッセージを受信するプロトコル エンティティのトップレベルのアクションは次のとおりです。
-
受信データグラムの基本的な解析を実行して、ASN.1 メッセージ オブジェクトに対応する ASN.1 オブジェクトを構築します。解析が失敗した場合、データグラムは破棄され、それ以上のアクションは実行されません。
-
次に、SNMP メッセージのバージョン番号を検証します。不一致がある場合、データグラムは破棄され、それ以上のアクションは実行されません。
-
次に、プロトコル エンティティは、ASN.1 メッセージ オブジェクトで見つかったコミュニティ名とユーザー データを、データグラムの送信元および宛先トランスポート アドレスとともに、必要な認証スキームを実装するサービスに渡します。 このエンティティは別の ASN.1 オブジェクトを返すか、認証の失敗を通知します。 後者の場合、プロトコル エンティティはこの失敗を認識し、(おそらく)トラップを生成し、データグラムを破棄し、それ以上のアクションは実行しません。
-
次に、プロトコル エンティティは、認証サービスから返された ASN.1 オブジェクトに対して基本的な解析を実行し、ASN.1 PDU オブジェクトに対応する ASN.1 オブジェクトを構築します。 解析が失敗した場合、データグラムは破棄され、それ以上のアクションは実行されません。 それ以外の場合は、名前付き SNMP コミュニティを使用して、適切なプロファイルが選択され、それに応じて PDU が処理されます。 この処理の結果、メッセージが返された場合、応答メッセージの送信元トランスポート アドレスは、元の要求メッセージの送信先トランスポート アドレスと同一である必要があります。
4.1.1. 共通構造
プロトコルの 6 つの PDU タイプを紹介する前に、頻繁に使用される ASN.1 構造のいくつかを考慮することが適切です。
-- request/response information
RequestID ::=
INTEGER
ErrorStatus ::=
INTEGER {
noError(0),
tooBig(1),
noSuchName(2),
badValue(3),
readOnly(4)
genErr(5)
}
ErrorIndex ::=
INTEGER
-- variable bindings
VarBind ::=
SEQUENCE {
name
ObjectName,
value
ObjectSyntax
}
VarBindList ::=
SEQUENCE OF
VarBind
RequestID は、未処理のリクエストを区別するために使用されます。 RequestID を使用すると、SNMP アプリケーション エンティティは受信応答を未処理の要求と関連付けることができます。 信頼性の低いデータグラム サービスが使用されている場合、RequestID は、ネットワークによって複製されたメッセージを識別する簡単な手段も提供します。
ErrorStatus のゼロ以外のインスタンスは、リクエストの処理中に例外が発生したことを示すために使用されます。 このような場合、ErrorIndex は、リスト内のどの変数が例外を引き起こしたかを示すことで追加情報を提供することがあります。
変数という用語は、管理対象オブジェクトのインスタンスを指します。 変数バインディング (VarBind) は、変数の名前と変数の値の組み合わせを指します。 VarBindList は、変数名と対応する値の単純なリストです。 一部の PDU は変数の名前のみを考慮し、その値は考慮しません (例: GetRequest-PDU)。 この場合、バインディングの値部分はプロトコル エンティティによって無視されます。 ただし、値の部分には有効な ASN.1 構文とエンコーディングが必要です。 このようなバインディングの値部分には、ASN.1 値 NULL を使用することをお勧めします。
4.1.2. GetRequest-PDU
GetRequest-PDU の形式は次のとおりです。
GetRequest-PDU ::=
[0]
IMPLICIT SEQUENCE {
request-id
RequestID,
error-status -- always 0
ErrorStatus,
error-index -- always 0
ErrorIndex,
variable-bindings
VarBindList
}
GetRequest-PDU は、SNMP アプリケーション エンティティの要求があった場合にのみ、プロトコル エンティティによって生成されます。
GetRequest-PDU を受信すると、受信プロトコル エンティティは、以下のリストにある該当するルールに従って応答します。
-
variable-bindings フィールドで指定されたオブジェクトの名前が、該当する MIB ビューで get 操作に使用できるオブジェクトの名前と正確に一致しない場合、受信エンティティは受信メッセージの送信元へ同じ形式の GetResponse-PDU を送信します。ただし、error-status フィールドの値は noSuchName、error-index フィールドの値は受信メッセージ内の当該オブジェクト名コンポーネントのインデックスとします。
-
variable-bindings フィールドで名前が付けられたオブジェクトの場合、そのオブジェクトが集約型 (SMI で定義されている) である場合、受信側エンティティは、error-status フィールドの値が noSuchName であり、error-index フィールドの値が受信メッセージ内のオブジェクト名コンポーネントのインデックスであることを除いて、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。メッセージ。
-
以下で説明するように生成された GetResponse-PDU のサイズがローカル制限を超える場合、受信エンティティは、error-status フィールドの値が tooBig であり、error-index フィールドの値がゼロであることを除いて、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。
-
variable-bindings フィールドで名前が指定されたオブジェクトについて、前述の規則のいずれにも当てはまらない理由でオブジェクトの値を取得できない場合、受信側エンティティは、error-status フィールドの値が genErr であり、error-index フィールドの値が受信メッセージ内のオブジェクト名コンポーネントのインデックスであることを除き、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。メッセージ。
前述のルールがいずれも適用されない場合、受信プロトコル エンティティは、受信メッセージの変数バインディング フィールドで指定されたオブジェクトごとに、GetResponse-PDU の対応するコンポーネントがその変数の名前と値を表すように、受信メッセージの発信者に GetResponse-PDU を送信します。 GetResponse-PDU の error-status フィールドの値は noError で、error-index フィールドの値は 0 です。 GetResponse-PDU の request-id フィールドの値は、受信したメッセージの値です。
4.1.3. GetNextRequest-PDU
GetNextRequest-PDU の形式は、PDU タイプの表示を除き、GetRequest-PDU と同一です。 ASN.1 言語:
GetNextRequest-PDU ::=
[1]
IMPLICIT SEQUENCE {
request-id
RequestID,
error-status -- always 0
ErrorStatus,
error-index -- always 0
ErrorIndex,
variable-bindings
VarBindList
}
GetNextRequest-PDU は、SNMP アプリケーション エンティティの要求があった場合にのみ、プロトコル エンティティによって生成されます。
GetNextRequest-PDU を受信すると、受信プロトコル エンティティは、以下のリストにある該当するルールに従って応答します。
-
variable-bindings フィールド内のいずれかのオブジェクト名について、その名前が辞書編集上、関連する MIB ビューで取得操作に使用できるオブジェクトの名前より前にない場合、受信側エンティティは、error-status フィールドの値が noSuchName であることを除き、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。 error-index フィールドは、受信メッセージ内のオブジェクト名コンポーネントのインデックスです。
-
以下で説明するように生成された GetResponse-PDU のサイズがローカル制限を超える場合、受信エンティティは、error-status フィールドの値が tooBig であり、error-index フィールドの値がゼロであることを除いて、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。
-
variable-bindings フィールドで指定されたオブジェクトについて、前述のどの規則にも該当しない理由により、そのオブジェクトの辞書順の後続オブジェクトの値を取得できない場合、受信エンティティは受信メッセージの送信元へ同じ形式の GetResponse-PDU を送信します。ただし、error-status フィールドの値は genErr、error-index フィールドの値は受信メッセージ内の当該オブジェクト名コンポーネントのインデックスとします。
前述のルールがいずれも適用されない場合、受信プロトコル エンティティは、受信メッセージの発信者に GetResponse-PDU を送信します。これにより、受信メッセージの variable-bindings フィールドの名前ごとに、GetResponse-PDU の対応するコンポーネントが、関連する MIB ビューで取得操作に使用できるすべてのオブジェクトの名前の辞書編集順に、その名前を持つオブジェクトの名前と値が値とともに表示されます。指定されたコンポーネントの名前フィールドの、その値の直接の後継者。 GetResponse-PDU の error-status フィールドの値は noError であり、errorindex フィールドの値は 0 です。 GetResponse-PDU の request-id フィールドの値は、受信したメッセージの値です。
4.1.3.1. 表走査の例
GetNextRequest-PDU の重要な用途の 1 つは、MIB 内の情報の概念テーブルを横断することです。このタイプの SNMP メッセージのセマンティクスと、MIB 内のオブジェクト タイプの個々のインスタンスを識別するプロトコル固有のメカニズムにより、あたかも表形式の構成を享受しているかのように、MIB 内の関連オブジェクトにアクセスできます。
以下に示す SNMP 交換により、SNMP アプリケーション エンティティは、特定のネットワーク要素のルーティング テーブル内の各エントリの宛先アドレスとネクスト ホップ ゲートウェイを抽出する可能性があります。このルーティング テーブルに 3 つのエントリがあるとします。
Destination NextHop Metric
10.0.0.99 89.1.1.42 5
9.1.2.3 99.0.0.3 3
10.0.0.51 89.1.1.42 5
管理ステーションは、指定された OBJECT IDENTIFIER 値を要求された変数名として含む GetNextRequest-PDU を SNMP エージェントに送信します。
GetNextRequest ( ipRouteDest, ipRouteNextHop, ipRouteMetric1 )
SNMP エージェントは GetResponse-PDU で応答します。
GetResponse (( ipRouteDest.9.1.2.3 = "9.1.2.3" ),
( ipRouteNextHop.9.1.2.3 = "99.0.0.3" ),
( ipRouteMetric1.9.1.2.3 = 3 ))
管理ステーションは次のように続けます。
GetNextRequest ( ipRouteDest.9.1.2.3,
ipRouteNextHop.9.1.2.3,
ipRouteMetric1.9.1.2.3 )
SNMP エージェントは次のように応答します。
GetResponse (( ipRouteDest.10.0.0.51 = "10.0.0.51" ),
( ipRouteNextHop.10.0.0.51 = "89.1.1.42" ),
( ipRouteMetric1.10.0.0.51 = 5 ))
管理ステーションは次のように続けます。
GetNextRequest ( ipRouteDest.10.0.0.51,
ipRouteNextHop.10.0.0.51,
ipRouteMetric1.10.0.0.51 )
SNMP エージェントは次のように応答します。
GetResponse (( ipRouteDest.10.0.0.99 = "10.0.0.99" ),
( ipRouteNextHop.10.0.0.99 = "89.1.1.42" ),
( ipRouteMetric1.10.0.0.99 = 5 ))
管理ステーションは次のように続けます。
GetNextRequest ( ipRouteDest.10.0.0.99,
ipRouteNextHop.10.0.0.99,
ipRouteMetric1.10.0.0.99 )
テーブルにはそれ以上のエントリがないため、SNMP エージェントは、既知のオブジェクト名の辞書編集順で次にあるオブジェクトを返します。 この応答は、ルーティング テーブルの終了を管理ステーションに通知します。
4.1.4. GetResponse-PDU
GetResponse-PDU の形式は、PDU タイプの表示を除き、GetRequest-PDU と同一です。 ASN.1 言語:
GetResponse-PDU ::=
[2]
IMPLICIT SEQUENCE {
request-id
RequestID,
error-status
ErrorStatus,
error-index
ErrorIndex,
variable-bindings
VarBindList
}
GetResponse-PDU は、このドキュメントの他の場所で説明されているように、GetRequest-PDU、GetNextRequest-PDU、または SetRequest-PDU の受信時にのみプロトコル エンティティによって生成されます。
GetResponse-PDU を受信すると、受信側プロトコル エンティティはその内容を SNMP アプリケーション エンティティに提示します。
4.1.5. SetRequest-PDU
SetRequest-PDU の形式は、PDU タイプの表示を除き、GetRequest-PDU と同一です。 ASN.1 言語:
SetRequest-PDU ::=
[3]
IMPLICIT SEQUENCE {
request-id
RequestID,
error-status -- always 0
ErrorStatus,
error-index -- always 0
ErrorIndex,
variable-bindings
VarBindList
}
SetRequest-PDU は、SNMP アプリケーション エンティティの要求があった場合にのみ、プロトコル エンティティによって生成されます。
SetRequest-PDU を受信すると、受信側エンティティは、以下のリストにある該当するルールに従って応答します。
-
variable-bindings フィールドで名前が指定されたオブジェクトについて、そのオブジェクトが関連する MIB ビューでのセット操作に使用できない場合、受信側エンティティは、error-status フィールドの値が noSuchName であり、error-index フィールドの値が受信メッセージ内のオブジェクト名コンポーネントのインデックスであることを除いて、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。メッセージ。
-
variable-bindings フィールドで指定されたオブジェクトの場合、値フィールドの内容が、ASN.1 言語に従って、変数に必要な型、長さ、および値と一致しない場合、受信側エンティティは、error-status フィールドの値が badValue であることを除き、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。 error-index フィールドは、受信したメッセージ内のオブジェクト名のインデックスです。
-
以下で説明するように生成された Get Response タイプのメッセージのサイズがローカル制限を超える場合、受信エンティティは、error-status フィールドの値が tooBig であり、error-index フィールドの値がゼロであることを除いて、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。
-
variable-bindings フィールドで指定されたオブジェクトについて、前述の規則のいずれにも当てはまらない理由で、指定されたオブジェクトの値を変更できない場合、受信側エンティティは、error-status フィールドの値が genErr であり、error-index フィールドの値が受信メッセージ内のオブジェクト名コンポーネントのインデックスであることを除き、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。メッセージ。
前述のルールがいずれも当てはまらない場合、受信メッセージの variable-bindings フィールドで指定されたオブジェクトごとに、対応する値が変数に割り当てられます。 SetRequest-PDU で指定された各変数の割り当ては、同じメッセージで指定された他のすべての割り当てに関して同時に設定されたかのように実行される必要があります。
次に、受信エンティティは、生成されたメッセージの error-status フィールドの値が noError であり、error-index フィールドの値がゼロであることを除き、同じ形式の GetResponse-PDU を受信メッセージの発信者に送信します。
4.1.6. Trap-PDU
Trap-PDU の形式は次のとおりです。
Trap-PDU ::=
[4]
IMPLICIT SEQUENCE {
enterprise -- type of object generating
-- trap, see sysObjectID in [5]
OBJECT IDENTIFIER,
agent-addr -- address of object generating
NetworkAddress, -- trap
generic-trap -- generic trap type
INTEGER {
coldStart(0),
warmStart(1),
linkDown(2),
linkUp(3),
authenticationFailure(4),
egpNeighborLoss(5),
enterpriseSpecific(6)
},
specific-trap -- specific code, present even
INTEGER, -- if generic-trap is not
-- enterpriseSpecific
time-stamp -- time elapsed between the last
TimeTicks, -- (re)initialization of the network
-- entity and the generation of the
trap
variable-bindings -- "interesting" information
VarBindList
}
Trap-PDU は、SNMP アプリケーション エンティティの要求時にのみプロトコル エンティティによって生成されます。 SNMP アプリケーション エンティティが SNMP アプリケーション エンティティの宛先アドレスを選択する手段は実装固有です。
Trap-PDU を受信すると、受信側プロトコル エンティティはその内容を SNMP アプリケーション エンティティに提示します。 Trap-PDU の variable-bindings コンポーネントの重要性は実装に固有です。
generic-trap フィールドの値の解釈は次のとおりです。
4.1.6.1. coldStart Trap
coldStart(0) トラップは、エージェントの構成またはプロトコル エンティティの実装が変更される可能性があるように、送信側プロトコル エンティティが自身を再初期化していることを示します。
4.1.6.2. warmStart Trap
warmStart(1) トラップは、エージェント構成もプロトコル エンティティの実装も変更されないように、送信側プロトコル エンティティ自体が再初期化されていることを示します。
4.1.6.3. linkDown Trap
linkDown(2) トラップは、送信側プロトコル エンティティが、エージェントの構成で表される通信リンクの 1 つでの障害を認識したことを示します。
linkDown タイプの Trap-PDU には、variable-bindings の最初の要素として、影響を受けるインターフェイスの ifIndex インスタンスの名前と値が含まれます。
4.1.6.4. linkUp Trap
linkUp(3) トラップは、エージェントの構成で表される通信リンクの 1 つが起動したことを送信側プロトコル エンティティが認識したことを示します。
linkUp タイプの Trap-PDU には、variable-bindings の最初の要素として、影響を受けるインターフェイスの ifIndex インスタンスの名前と値が含まれます。
4.1.6.5. authenticationFailure Trap
authenticationFailure(4) トラップは、送信プロトコル エンティティが適切に認証されていないプロトコル メッセージのアドレスであることを示します。 SNMP の実装はこのトラップを生成できなければなりませんが、実装固有のメカニズムを通じてそのようなトラップの送信を抑制できなければなりません。
4.1.6.6. egpNeighborLoss Trap
egpNeighborLoss(5) トラップは、送信プロトコル エンティティが EGP ピアであった EGP ネイバーがダウンとしてマークされ、ピア関係が取得されなくなったことを示します。
egpNeighborLoss タイプの Trap-PDU には、variable-bindings の最初の要素として、影響を受けるネイバーの egpNeighAddr インスタンスの名前と値が含まれます。
4.1.6.7. enterpriseSpecific Trap
enterpriseSpecific(6) トラップは、送信側プロトコル エンティティが企業固有のイベントが発生したことを認識していることを示します。 specific-trap フィールドは、発生した特定のトラップを識別します。
Return: RFC 1157 Home