TCPコネクションの状態は、tcpサブツリーの「tcpConnectionTable」「tcpListenerTable」にある。前者は「現在接続中のコネクション」、後者は「LISTENしている(待ち受け状態にある)コネクション」を示す。
これらはテーブル構造をとっているが、ここまで説明してきたように、インデックス番号に「1」「2」といった連番ではなく、IPアドレスやポート番号を採用している。
ここでは、現在のコネクション数を示す「tcpConnectionTable」を見てみよう。実際にsnmpwalkを使って、tcpConnectionTableを調べると、例えば次のようになる。
$ snmpwalk -Of -c hogeprivate -v 1 localhost .tcpConnectionTable
.iso.org.dod.internet.mgmt.mib-2.tcp.tcpConnectionTable.tcpConnectionEntry.tcpConnectionState.ipv4."192.168.0.170".34327.ipv4."72.21.40.11".80 = INTEGER: closeWait(8)
〜中略〜
.iso.org.dod.internet.mgmt.mib-2.tcp.tcpConnectionTable.tcpConnectionEntry.tcpConnectionState.ipv6."00:00:00:00:00:00:00:00:00:00:ff:ff:c0:a8:00:aa".22.ipv6."00:00:00:00:00:00:00:00:00:00:ff:ff:c0:a8:00:6c".53807 = INTEGER: established(5)
.iso.org.dod.internet.mgmt.mib-2.tcp.tcpConnectionTable.tcpConnectionEntry.tcpConnectionProcess.ipv4."192.168.0.170".34327.ipv4."72.21.40.11".80 = Gauge32: 0
〜中略〜
.iso.org.dod.internet.mgmt.mib-2.tcp.tcpConnectionTable.tcpConnectionEntry.tcpConnectionProcess.ipv6."00:00:00:00:00:00:00:00:00:00:ff:ff:c0:a8:00:aa".22.ipv6."00:00:00:00:00:00:00:00:00:00:ff:ff:c0:a8:00:6c".53807 = Gauge32: 0
この例は、自身のIPアドレスが「192.168.0.170」ならびに「00:00:00:00:00:00:00:00:00:00:ff:ff:c0:a8:00:aa」であり、
という状況を示している。
この結果から分かるように、表6に示したTCPコネクションの状態を示すオブジェクトのインスタンスは、
tcpConnectionTable.tcpConnectionEntry.tcpConnectionState.ローカルIP種別.ローカルIP.ローカルポート.リモートIP種別.リモートIP.リモートポート
という書式で示される。
同様にしてコネクションを利用しているプロセスIDを保持するオブジェクトのインスタンスは、
tcpConnectionTable.tcpConnectionEntry.tcpConnectionProcess.ローカルIP種別.ローカルIP.ローカルポート.リモートIP種別.リモートIP.リモートポート
である。
つまりインデックス番号として、「ローカルIP種別.ローカルIP.ローカルポート.リモートIP種別.リモートIP.リモートポート」が採用されていることが分かる。
このようにIPアドレスやポート番号がインデックスとして採用されているのは、tcpConnectionTableが、次のように定義されているためだ。
tcpConnectionTable OBJECT-TYPE
SYNTAX SEQUENCE OF TcpConnectionEntry
〜中略〜
::= { tcp 19 }
tcpConnectionEntry OBJECT-TYPE
SYNTAX TcpConnectionEntry
〜中略〜
INDEX { tcpConnectionLocalAddressType,
tcpConnectionLocalAddress,
tcpConnectionLocalPort,
tcpConnectionRemAddressType,
tcpConnectionRemAddress,
tcpConnectionRemPort }
::= { tcpConnectionTable 1 }
TcpConnectionEntry ::= SEQUENCE {
tcpConnectionLocalAddressType InetAddressType,
tcpConnectionLocalAddress InetAddress,
tcpConnectionLocalPort InetPortNumber,
tcpConnectionRemAddressType InetAddressType,
tcpConnectionRemAddress InetAddress,
tcpConnectionRemPort InetPortNumber,
tcpConnectionState INTEGER,
tcpConnectionProcess Unsigned32
}
ここから分かるように、インデックスとして、「tcpConnectionLocalAddressType」「tcpConnectionLocalAddress」「tcpConnectionLocalPort」「tcpConnectionRemAddressType」「tcpConnectionRemAddress」「tcpConnectionRemPort」が順に設定されているために、このような書式となるわけだ。
この構造を図示すると、次のようになる。
ここでは示さないが、同様にLISTENしているTCP情報を保持するtcpListenerTableも、
IP種別.アドレス.ポート番号
という書式のインデックスを用いる。
ここまでMIBのオブジェクトのアクセス方法について説明してきた。
単一値であれば「.0」を付ければよいが、構造体の場合には、SMIを調べて、どんなインデックスが採用されているのかを調べる必要があるので、やや複雑だ。
この記事では、詳しくOIDの構造を説明したが、実際には、親のOIDを指定してsnmpwalkコマンドを実行し、ツリーを調べて、アタリを付けていくというのが、現実的かもしれない。記事の関係上、MIB-IIツリーに関しては、「system」「interface」「tcp」という3つのサブツリーしか説明できなかったが、ほかのサブツリーも同様にしてアクセスできるので必要に応じて試してみてほしい。
次回は、Net-SNMP独自のMIBツリーを使って、「CPU負荷」「メモリ」「ディスク」「プロセス」の状態を知る方法を説明しよう。
Copyright© 2012 ITmedia, Inc. All Rights Reserved.