![]() |
Top > Windows Insider > Windows TIPS |
Windows TIPS
TCP/IP関連のトラブルシューティングを行う場合に、必ずといってよいほど使うコマンドとしてnetstatがある(実行ファイル名はnetstat.exe)。このコマンドは、通信の状態を調べるためには必須であり、ぜひともその使い方をマスターしておいていただきたい。ここでは基本的なnetstatのいくつかの使い方について解説する。 通信中のTCPコネクションの調査netstatの最も基本的な使い方は、通信中のTCPコネクションの表示機能である。このコマンドを実行すると、ローカルのマシンのTCP/IPプロトコル・スタック上で現在アクティブな、TCP通信(コネクション)の状態を表示することができる。TCPとは、2つのアプリケーション間で(同一マシン上のアプリケーション同士でもよいし、異なるマシン上にある2つのアプリケーションでもよい)、信頼性のある通信路(コネクション)を開設し、お互いにデータなどをやりとりするための機能である。例えばPOPプロトコルでメールを受信する場合は、メール・サーバのPOPポート(TCPの110番ポート)とメール・クライアント・ソフトウェア間でTCPコネクションを開設し(クライアント側のポート番号は任意)、メール・ボックスを読み出すためのコマンドを送ったり、メッセージの内容を受信したりする。 現在どのようなTCP通信が行われているかは、netstatコマンドを使うと表示させることができる。
引数を付けずにnetstatを実行すると、現在アクティブなTCPのコネクションが表示される(StateがLISTENINGではないコネクションが表示される)。 「Proto」は使用中のネットワーク・プロトコルの種類であり、次項で述べる「-a」オプションを付けていない場合は、常に「TCP」と表示されているはずである。UDPにはコネクションを確立するという概念がないので(UDPではデータは単発的に送るだけなので)、TCP通信しか表示されない。 「Local Address」はローカル側のIPアドレスと使用中のTCPのポート番号、「Foreign Address」は通信の相手となっているマシンのIPアドレスとポート番号である。1つのマシンには複数のIPアドレスを付けることができるし、ローカルのループ・バック・アドレス(127.0.0.1)が使われていることもあるので、「Local Address」に表示されるIPアドレスは固定的ではない。また同じマシン同士でもコネクションを確立することができるので、「Foreign Address」が自分のIPアドレスの場合もある。 「:」記号の左側に表示されているのがIPアドレスで、右側に表示されているのが「ポート番号」である。例えば「uxpc15:2112」は、「uxpc15」というホストの「2112」番のポートを表している。また「server02:pop3」は、「server02」というマシンの「pop3」というポート(110番)を表している。 TCPのコネクションは、「ローカルのIPアドレス」と「ローカルのTCPポート番号」、「リモートのIPアドレス」と「リモートのTCPポート番号」の4つの値の組で識別される。そのためどれか1つでも値が異なれば、別のコネクションとして扱われるので、例えばWebサーバとの通信を行っていると、同じような値のコネクションが表示されることがあるが(例:Webブラウザは、高速化のために複数のTCPコネクションを使うのが一般的)、よく見ると、ローカル側(左側)のポート番号が違っているはずである。 「State」はTCPコネクションの「状態」を表している。TCPはステート(状態)を持つプロトコルであり、コネクションの開始や終了、通信方法などに関しては細かい手順が決められている。例えばサーバとクライアントのどちらの側から先に通信を開始するのか(どちらがサーバ側でどちらがクライアント側か)、終了を宣言するにはどちらの側から最初にコマンドを送り、それに対する応答はどうするのかなどが厳密に決まっている。通信速度は有限なので、たとえ双方が同時に終了コマンドを送ったとしても、相手側へそれが届くまでにはタイムラグがある。そのためローカル側から先に終了コマンドを送るか、相手側が先に送るか、それとも双方同時に終了コマンドを送るか、などに応じて破綻のないように決められている。 具体的なStateの値としては以下のようなものがある。これを調べることにより、コネクションの状態がどうなっているか、開始しようとしているのか、終了しようとしているのか、などが分かる。
IPアドレスやポート番号を数値で表示する先の例では、いくつかのIPアドレスやTCPやUDPのポート番号が文字列で表示されていたが、「-n」というオプションを付けると、IPアドレスやポート番号がすべて数値で表示されるようになる。
TCP/IPのプロトコル的には、IPアドレスやポート番号はすべてこのような数値による表現が基本である。しかしこれでは人間にとっては非常に分かりづらいので、文字列を使って代用することもできるようになっている。このためのメカニズムとしては、例えばIPアドレスならDNSやhostsファイルによる「FQDN名/ホスト名←→IPアドレス」の相互変換システムがあるし、ポート番号ならservicesファイルによる「サービス名←→ポート番号」の相互変換機能がある。hostsファイルやservicesファイルは、Windows NT/2000/XPでは%windir%\system32\drivers\etcフォルダに置かれている(UNIX/Linuxでは/etcディレクトリにある)。 netstatに-nオプションを付けないと、これらの変換機構を使って、なるべくIPアドレスやポート番号を具体的なホスト名やサービス名に変換して出力するので、人間にとっては分かりやすいだろう(変換できないものについては、そのまま数値で出力)。しかし1台のホストに複数のIPアドレスが付けられていたり、サービス名だけでははっきりとは分からない場合は、-nオプションを使って実際の数値で確認する必要がある。 また-nを付けて実行すると、DNSサーバなどに対する問い合わせが行われないので、結果がすぐに表示されるという利点もある。Webブラウザでインターネット上のサイトを閲覧しているような場合には、外部IPアドレスがインターネット上のホストになる。この場合は、外部のDNSサーバに対してDNSの逆引きを実行するので、かなり待たされるし、さらに各コネクションごとに逆引き操作が必要になるので、通信の状態をすばやく調べたい場合には-nを付けて逆引きを抑制するのがよいだろう。どうしても具体的なFQDN名が欲しければ、nslookupで調べるか、最後に1回だけ-nなしでnetstatを実行すればよいだろう。 定期的な状態の調査netstatの引数として数値を指定すると、その時間間隔(単位は秒)でnetstatを繰り返し実行することができる。通信の状態を定常的にモニタしたい場合に有用なオプションである。やめる場合は、Control-Cを押して、プログラムを強制終了させる。
ただし、Windows系のOSでこのオプションを付けてnetstatを実行しても、実際の通信の状態がすぐには表示されず、若干のタイムラグがあるようなので注意が必要である。例えば「netstat -n 1」を実行して、1秒ごとに通信の状態を表示させているとする。このとき、メール・プログラムを起動してPOP3のメール・サーバに接続したとしても、そのTCPコネクションの状態が表示されるまでには何秒かが必要である(手元のWindows 2000 Professionalマシンでは、10秒以上かかっていた)。これに対して、手動で「netstat -n」を繰り返し実行させてみると、メール・プログラムを起動すれば、すぐにそのTCPコネクションの状態が正しく表示されていた。このように、(理由は不明だが)実際の通信状態が反映されるまでしばらく時間がかかるようなので、このような特性を理解して使うか、もっと長い時間間隔(例:10分など)でモニタしていても構わないような場合(サーバの通信状態をおおまかに把握する場合など)に使うとよいだろう。 リッスンしているポートの調査リッスン(待ち受け状態のサービスのこと)しているポートがあるかどうかを調べるには、-aというオプションを付けて実行する。またサービス名でなく、具体的なポート番号を知りたければ、-anというオプションを付ける。
TCPとUDPは通信方式が異なるので、それぞれ待ち受け状態の表示方法が異なるが、TCPならば「LISTENING」と表示されているのが待ち受け状態のポートである。UDPの場合は、Foreign Addressが*:*と表示されているのが待ち受け状態のポートを表している。 ここではLocal Addressには、「0.0.0.0」と「127.0.0.1」、「192.168.0.103」の3種類が表示されているが、それぞれどのIPアドレスで待ち受けしているかを示している(つまり、IPアドレスごとに異なるサービスで待ち受けできるということ)。「0.0.0.0」は、任意のIPアドレスで待ち受けしていることを表し(ほかの2つも包含している)、「127.0.0.1」はローカル・ループバック・アドレスという特別なIPアドレス(常に自分自身を指す)で待ち受けしていることを表す。「192.168.0.103」はこのマシンに付けられたIPアドレスなので、マシンによっては異なるIPアドレスになることがある。
プロセスIDとコネクションの関連の調査これはWindows XPでのみ有効なオプションであるが、「-o」オプションを付けると、そのコネクションを所有しているプロセスのID(PID)を表示することができる。
右端に表示されているのがPIDである。このPIDを調べることにより、そのポート(コネクション)を使用しているのはどのプロセスかを調べることができる。PIDが分かれば、あとはタスク・マネージャやコマンド・プロンプト上でtasklist.exeコマンド(これもWindows
XPでのみ利用可能なコマンド)を実行することにより、そのプロセス名を調査できる。不明なポートがリッスン状態にあるときは、これを使ってプロセスやサービスを調べ、必要ならばファイアウォールなどでそのポートをブロックしたり、プログラムやサービスそのものを停止して、システムの安全性を確保したりできる。
|
![]()
|
|
|
|
||||
@IT
新着記事![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
||||||
Copyright(c) 2000-2002 atmarkIT 著作権はアットマーク・アイティまたはその記事の筆者に属します @ITに掲載されている記事や画像などの無断転載を禁止します 弊社へのご連絡は「@ITへのお問い合わせ」をご覧ください |