Click Here!
   Top > Windows Insider > Windows TIPS
  Windows TIPS
[Network]
  Windows TIPS TOPへ
Windows TIPS全リストへ

netstatコマンドを使いこなす




デジタルアドバンテージ
2002/07/20
 
対象OS
Windows 2000 Professional
Windows XP Professional
Windows XP Home Edition
Windows 2000 Server
Windows 2000 Advanced Server
netstatは、TCP/IPにおける通信の状態を調査するために使われる、最も基本的なコマンドである。
引数なしでnetstatを起動すると、現在アクティブなTCPコネクションに関するIPアドレスやポート番号などの情報が表示される。
-aオプションを付けると、現在待ち受け状態にあるTCPやUDPのポートの一覧が表示される。


解説

 TCP/IP関連のトラブルシューティングを行う場合に、必ずといってよいほど使うコマンドとしてnetstatがある(実行ファイル名はnetstat.exe)。このコマンドは、通信の状態を調べるためには必須であり、ぜひともその使い方をマスターしておいていただきたい。ここでは基本的なnetstatのいくつかの使い方について解説する。

通信中のTCPコネクションの調査

 netstatの最も基本的な使い方は、通信中のTCPコネクションの表示機能である。このコマンドを実行すると、ローカルのマシンのTCP/IPプロトコル・スタック上で現在アクティブな、TCP通信(コネクション)の状態を表示することができる。TCPとは、2つのアプリケーション間で(同一マシン上のアプリケーション同士でもよいし、異なるマシン上にある2つのアプリケーションでもよい)、信頼性のある通信路(コネクション)を開設し、お互いにデータなどをやりとりするための機能である。例えばPOPプロトコルでメールを受信する場合は、メール・サーバのPOPポート(TCPの110番ポート)とメール・クライアント・ソフトウェア間でTCPコネクションを開設し(クライアント側のポート番号は任意)、メール・ボックスを読み出すためのコマンドを送ったり、メッセージの内容を受信したりする。

 現在どのようなTCP通信が行われているかは、netstatコマンドを使うと表示させることができる。

C:\>netstat ……TCPコネクションを表示する

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    uxpc15:2112            server01:netbios-ssn   ESTABLISHED
  TCP    uxpc15:2167            server02:pop3          ESTABLISHED

 引数を付けずに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の値としては以下のようなものがある。これを調べることにより、コネクションの状態がどうなっているか、開始しようとしているのか、終了しようとしているのか、などが分かる。

状態 頻度 意味
CLOSED
未使用状態のTCPポート。通常これが表示されることはない
LISTENING
待ち受け状態(リッスン状態)のポート。netstatに-aオプションを付けると表示される
SYN_SENT
サーバに対して、通信開始の要求(SYN:Synchronize)を送信したが、まだそれに対する応答(ACK:Acknowledgement)を受け取っていない状態。相手が無応答のときもこの状態になる。ACKを受け取るとESTABLIHSEDへ遷移する
SYN_RECEIVED
クライアントからSYN要求を受け取った直後の状態。SYNに対するACKを送信するとESTABLISHEDへ遷移する
ESTABLISHED
TCPコネクションが確立して通信している状態。netstatでは最もよく見る状態。どちらかが終了処理を始めると、FIN_WAIT_1/CLOSE_WAITへ遷移する
FIN_WAIT_1
自分の側からFINを送信した状態。そのFINに対するACKを相手から受信すると、FIN_WAIT_2へ遷移するが、先に相手からのFINを受けるとCLOSINGへ遷移する
FIN_WAIT_2
FINに対するACKを受信した状態。相手からのFINを受信して、それに対するACKを返すと、TIME_WAITへ遷移する
CLOSE_WAIT
相手からのFINを受け取った状態。アプリケーションが終了すると、FINを送信してからLAST_ACKへ遷移する
CLOSING
FINに対する相手からのACKを受けるとTIME_WAITへ遷移する
LAST_ACK
送信したFINに対するACK待ち状態。ACKを受け取るとCLOSEDへ遷移して終了する
TIME_WAIT
コネクションの終了待ち状態。しばらく待ったあと、CLOSEDへ遷移して終了する
TCPの状態遷移
netstatコマンドのState欄に表示される文字列は、TCPコネクションの開始から確立、終了までの一連の(内部的な)状態遷移を表している。ここでは最初にリッスンしている(待ち受けしている)方をサーバ、そのサーバに接続要求を送る方をクライアントとしている。TCPでは、SYNやFINを送ると、それに対するACK応答を必ず待つ(SYNやFINの送信とACKの確認作業は双方向で行われる)。「頻度」は、netstatを実行したときに、その状態をユーザーが見る可能性の高さを表している。LISTENINGやESTABLISHEDはよく目にするであろうが、それ以外のものはすぐにほかの状態に遷移してしまうので、見ることはほとんどないであろう。

IPアドレスやポート番号を数値で表示する

 先の例では、いくつかのIPアドレスやTCPやUDPのポート番号が文字列で表示されていたが、「-n」というオプションを付けると、IPアドレスやポート番号がすべて数値で表示されるようになる。

C:\>netstat -n ……TCPコネクションを数値で表示する

Active Connections

  Proto  Local Address          Foreign Address        State
  TCP    192.168.0.111:2112     192.168.0.151:139      ESTABLISHED
  TCP    192.168.0.111:2167     192.168.0.152:110      ESTABLISHED

 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を押して、プログラムを強制終了させる。

C:\>netstat -n 1 ……1秒おきに表示させてみる

Active Connections……コマンド起動直後の表示

  Proto  Local Address          Foreign Address        State
  TCP    192.168.0.111:1085     172.16.10.61:139       ESTABLISHED
  TCP    192.168.0.111:3979     172.16.10.61:445       ESTABLISHED

Active Connections……コマンド起動から1秒後の表示

  Proto  Local Address          Foreign Address        State
  TCP    192.168.0.111:1085     172.16.10.61:139       ESTABLISHED
  TCP    192.168.0.111:3979     172.16.10.61:445       ESTABLISHED

Active Connections……コマンド起動から2秒後の表示

  Proto  Local Address          Foreign Address        State
  TCP    192.168.0.111:1085     172.16.10.61:139       ESTABLISHED
  TCP    192.168.0.111:3979     172.16.10.61:445       ESTABLISHED
  TCP    192.168.0.111:4174     172.16.10.64:110       ESTABLISHED
^C……やめるにはContorol-Cを押して、強制終了させる
C:\>

 ただし、Windows系のOSでこのオプションを付けてnetstatを実行しても、実際の通信の状態がすぐには表示されず、若干のタイムラグがあるようなので注意が必要である。例えば「netstat -n 1」を実行して、1秒ごとに通信の状態を表示させているとする。このとき、メール・プログラムを起動してPOP3のメール・サーバに接続したとしても、そのTCPコネクションの状態が表示されるまでには何秒かが必要である(手元のWindows 2000 Professionalマシンでは、10秒以上かかっていた)。これに対して、手動で「netstat -n」を繰り返し実行させてみると、メール・プログラムを起動すれば、すぐにそのTCPコネクションの状態が正しく表示されていた。このように、(理由は不明だが)実際の通信状態が反映されるまでしばらく時間がかかるようなので、このような特性を理解して使うか、もっと長い時間間隔(例:10分など)でモニタしていても構わないような場合(サーバの通信状態をおおまかに把握する場合など)に使うとよいだろう。

リッスンしているポートの調査

 リッスン(待ち受け状態のサービスのこと)しているポートがあるかどうかを調べるには、-aというオプションを付けて実行する。またサービス名でなく、具体的なポート番号を知りたければ、-anというオプションを付ける。

C:\>netstat -an ……待ち受け状態のポートを調べる

Active Connections
……以下のLISTENINGとなっているのがTCPのリッスン(待ち受け)状態のポート
  Proto  Local Address          Foreign Address        State
  TCP    0.0.0.0:23             0.0.0.0:0              LISTENING
……待ち受け中のTCPポート
  TCP    0.0.0.0:135            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:445            0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1048           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1056           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1435           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:1556           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:2008           0.0.0.0:0              LISTENING
  TCP    0.0.0.0:2009           0.0.0.0:0              LISTENING
  TCP    192.168.0.103:139      0.0.0.0:0              LISTENING
  TCP    192.168.0.103:1465     0.0.0.0:0              LISTENING
  TCP    192.168.0.103:1465     192.168.0.51:139       ESTABLISHED
……これは通信中のコネクション
  UDP    0.0.0.0:135            *:*
……待ち受け中のUDPポート
  UDP    0.0.0.0:445            *:*
  UDP    0.0.0.0:1027           *:*
  UDP    0.0.0.0:1044           *:*
  UDP    0.0.0.0:1049           *:*
  UDP    0.0.0.0:1557           *:*
  UDP    127.0.0.1:1548         *:*
  UDP    127.0.0.1:2059         *:*
  UDP    192.168.0.103:137      *:*
  UDP    192.168.0.103:138      *:*
  UDP    192.168.0.103:500      *:*

 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アドレスになることがある。

*リッスン状態表示に注意
 netstatによってリッスン状態であると表示されるポートは、外部からの接続が行われる可能性があるので、ファイアウォールなどでブロックしたり、そのようなポートを使用しているサービスやプログラムはすべて停止しておきたいと考えるかもしれない。しかし、このnetstat -aで表示される待ち受け状態のポートは、必ずしも現在オープンされているポートを正確に表しているとは限らない。サポート技術情報の「JP418762 - LISTEN していないポートが netstat で LISTENING と表示される」や「JP307175 - Windows 2000 と Windows NT 4.0 におけるリスニング ソケット再使用時の動作の違い」にあるように、すでに使用済みでクローズされているポートがリッスン状態であると報告されることがあるのである。だから、ポート・スキャン・ツールなどでポートが実際に開いているかどうかを調べても、すでにクローズ状態であったりする。このような相違は、Windows OS内のTCP/IPの実装方法に原因がある。WindowsのSocket(いわゆるWinSock)は、下位にあるTDI(Transport Driver Interface)を利用して実現されているが、netstatはこのTDIレベルでの状態を表示している。これはWinSockレベルでの状態とは異なるので、すでにWinSockレベルでは使用済みのポートが、TDIレベルではまだリッスン中であったりする。その結果、実際のポートよりもいくらか多く、リッスン状態のポートが報告されてしまう。

プロセスIDとコネクションの関連の調査

 これはWindows XPでのみ有効なオプションであるが、「-o」オプションを付けると、そのコネクションを所有しているプロセスのID(PID)を表示することができる。

※-oオプションはWindows XPでのみ有効
C:\>netstat -no
……-oでプロセスIDを表示させる

Active Connections

  Proto  Local Address          Foreign Address        State           PID
  TCP    192.168.0.111:1085     192.168.0.51:139       ESTABLISHED     4
  TCP    192.168.0.111:2874     192.168.0.54:445       ESTABLISHED     4
  TCP    192.168.0.111:3435     192.168.0.51:80        ESTABLISHED     1160
  TCP    192.168.0.111:3979     192.168.0.51:445       ESTABLISHED     4

 右端に表示されているのがPIDである。このPIDを調べることにより、そのポート(コネクション)を使用しているのはどのプロセスかを調べることができる。PIDが分かれば、あとはタスク・マネージャやコマンド・プロンプト上でtasklist.exeコマンド(これもWindows XPでのみ利用可能なコマンド)を実行することにより、そのプロセス名を調査できる。不明なポートがリッスン状態にあるときは、これを使ってプロセスやサービスを調べ、必要ならばファイアウォールなどでそのポートをブロックしたり、プログラムやサービスそのものを停止して、システムの安全性を確保したりできる。End of Article

「Windows TIPS」
 


●マイクロソフト
最新統合開発環境
 Visual Studio .NET
無償トレーニング提供中



URL送信この記事のURL送信
印刷用この記事の印刷表示
</COMMENT></TD></TR> <TR bgColor=#dddddd> <TD><FONT size=2><A href="javascript:KeepIt();"><IMG height=18 alt="kee<p>oint保存" src="@IT:Windows TIPS -- Tips:netstatコマンドを使いこなす.files/ico_kpt.gif" width=24 align=absMiddle border=0>kee&lt;p&gt;ointで保存</A></FONT></TD></TR> <TR bgColor=#dddddd> <TD><COMMENT>
検索IT用語・記事検索



企業ユーザーが後押し、無線LAN機器市場は4年後に1000億円規模に

[eWEEK] サンのLinux構想、ターゲットはデベロッパ

[Interview] 不景気だから売れるITツールとは


[Spencer F. Katt] 赤い帽子をかぶったサンの新サーバ

WebサービスとUMLのDelphi 7、クロスプラットフォームのKylix 3

GroupBoard無償提供でグループウェア市場を狙うMS


[Interview] サイベース、パートナー戦略とインテグレーションを加速

ニュース一覧へ →



優待料金で受講できる
Java関連研修10月まで


転職者インタビュー
IT歴15年目の決断


-PR-
インテル発“64ビット”
アーキテクチャの実力


SPSS事例:ギャガ編
好評!連載企画第4弾


公開座談会レポート
UML普及のカギは!?


@IT FYIへ →



 
  @IT 新着記事
UMLとJavaのマッピングを考える
VB.NETのエラーと例外処理
4つのXPointerのドラフト、WSDL 1.2も登場
Windows TIPS
技術の切り込み隊長を目指すエンジニア
日本国内パソコン市場、需要はいつ回復するのか?
情報セキュリティポリシーの策定状況は?
IP技術者に贈る、ネットワーク・ストレージ入門講座
アセンブリのロードとセキュリティ
Linux Tips
Business & IT DataLinks(IT業界データ集)
現状の情報セキュリティポリシーの問題点とは
分散オブジェクト技術としてのHORBとCOM+

 
   
 

Windows Insiderフォーラムのトップへ
記事へのご意見、ご感想はWindows Insider会議室
@ITクラブへの入会はこちら



Copyright(c) 2000-2002 atmarkIT
著作権はアットマーク・アイティまたはその記事の筆者に属します
@ITに掲載されている記事や画像などの無断転載を禁止します
弊社へのご連絡は「@ITへのお問い合わせ」をご覧ください