連載
» 2012年03月02日 00時00分 UPDATE

Windows TIPS:netstatコマンドを使いこなす

TCP/IP関連のトラブルシューティングでは定番といえるWindows OS標準コマンド「netstat」。本TIPSでは、netstatコマンドの基本的な使い方に加え、Windows 7にも実装されている新機能も解説する。

[打越浩幸, 島田広道,デジタルアドバンテージ]
Windows TIPS
Windows Server Insider


「Windows TIPS」のインデックス

連載目次

対象OS:Windows 2000/Windows XP/Windows Server 2003/Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2


解説

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

 以下では、netstatの基本的な使い方について解説する。なおOSのバージョンアップに伴って、netstatコマンドにはいくらか機能が追加されているので(次表参照)、OSによって使い分けていただきたい。

OSバージョン 機能
Windows NT/
Windows 2000
基本となるnetstatコマンド。-a、-e、-n、-p、-r、-sのみが利用可能(詳細は以下で解説)。-eオプションはイーサネットの統計値を表示するコマンド(TIPS「netstatの統計情報を活用する」を参照)
Windows XP/
Windows Server 2003
通信に関連付けられているプロセスIDを表示する-oオプションが追加された。またOSのService Pack適用によって、通信に関連付けられている実行ファイルやコンポーネントを表示する-bと-vオプションが追加されたほか、ヘルプ表示コマンド -? の結果が日本語化された
Windows Vista/
Windows Server 2008/
Windows 7/
Windows Server 2008 R2
デフォルトでFQDNではなくホスト名が表示されるように変更され、FQDNを表示するための-fオプションが追加された。また、オフロード機能の動作状態を表示する-tオプション*1が追加された。
OSバージョンとnetstatの機能
利用可能なnetstatのオプションは「netstat -?」で表示される。
*1 Windows Server 2003でも、Scalable Networking Packという機能を追加した場合は、-tオプションでオフロード状態を表示できる。

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

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

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

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

アクティブな接続

  プロトコル  ローカル アドレス          外部アドレス        状態
  TCP    uxpc15:2112            server1:microsoft-ds   ESTABLISHED
  TCP    uxpc15:2167            server2:pop3           ESTABLISHED

 引数を何も付けずにnetstatを実行すると、現在アクティブなTCPコネクションの状態が表示される(StateがLISTENINGではないコネクションが表示される)。

 「プロトコル(英語表記では「Proto」)は使用中のネットワーク・プロトコルの種類であり、次項で述べる「-a」オプションを付けていない場合は、常に「TCP」と表示されているはずである。UDPにはコネクションを確立するという概念がないので(UDPではデータを単発的に送るだけなので)、TCPコネクションしか表示されない。

 「ローカル アドレス」または「Local Address」は、ローカル側のコンピュータ名(もしくはIPアドレス)と使用中のTCPのポート番号である。「外部アドレス」または「Foreign Address」は、通信の相手となっているマシンのコンピュータ名*2(もしくはIPアドレス)とポート番号である。1つのマシンには複数のIPアドレスを付けることができるし、ローカルのループ・バック・アドレス(IPv4なら127.0.0.1、IPv6なら[::1]など)が使われていることもあるので、「ローカル アドレス」に表示されるIPアドレスは固定的ではない。また同じマシン同士でもコネクションを確立できるので、「外部アドレス」が自分のIPアドレスの場合もある。

*2 「外部アドレス」に表示されるコンピュータ名は、FQDNの場合もあれば、ドメイン・サフィックスを含まないホスト名だけの場合もある。Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2では、「-f」というオプションを指定すると、これをFQDNで統一して表示できる。


 「:」記号の左側に表示されているのがコンピュータ名(もしくはIPアドレス)で、右側に表示されているのがポート(サービス名もしくは番号)である。例えば「uxpc15:2112」は、「uxpc15」というホストの「2112」番のポートを表している。また「server2:pop3」は、「server2」というマシンの「pop3」というサービスのポート(110番)を表している。

 TCPのコネクションは、「ローカルのIPアドレス」と「ローカルのTCPポート番号」、「リモートのIPアドレス」と「リモートのTCPポート番号」の4つの値の組で識別される。どれか1つでも値が異なれば、別のコネクションとして扱われるので、例えばWebサーバとの通信を行っていると、同じような値のコネクションが複数表示されることがあるが(例:Webブラウザは、高速化のために複数のTCPコネクションを使うのが一般的)、よく見ると、ローカル側(左側)のポート番号が違っているはずである。

 「状態」または「State」は、その名の通りTCPコネクションの「状態」を表している。TCPはステート(状態)を持つプロトコルであり、コネクションの開始や終了、通信方法などに関しては細かい手順が決められている。例えばサーバとクライアントのどちらの側から先に通信を開始するのか、終了を宣言するにはどちらの側から最初にコマンドを送り、それに対する応答はどうするのかなどが厳密に決まっている。通信速度は有限なので、たとえ双方が同時に終了コマンドを送ったとしても、相手側へそれが届くまでにはタイムラグがある。そのためローカル側から先に終了コマンドを送るか、相手側が先に送るか、それとも双方同時に終了コマンドを送るか、などに応じて破綻のないように決められている。

 次にTCPの状態遷移図を示しておく。

wi-fig01.gif TCPの状態遷移図
TCPの規格書(RFC793)に記載の状態遷移図を簡略化して、分かりやすくしたもの。詳細については連載「基礎から学ぶWindowsネットワーク」の第16回「信頼性のある通信を実現するTCPプロトコル(3)―2.TCPの状態遷移図」を参照していただきたい。四角の中に書かれているのがTCPの状態名。矢印は可能な遷移の経路。矢印のそばにある文字は「トリガ(アクション)」を表しており、ある「トリガ」となるイベントが発生すると指定された「アクション」を実行する。

 具体的なStateの値としては以下のようなものがある。これを調べることにより、コネクションの状態がどうなっているか、開始しようとしているのか、終了しようとしているのか、などが分かる。

状態 頻度 意味
CLOSED 未使用状態のTCPポート。通常これが表示されることはない
LISTENING 待ち受け状態(リッスン状態)のポート。netstatに-aオプションを付けると表示される
SYN_SENT サーバに対して、通信開始の要求(SYN:Synchronize)を送信したが、まだそれに対する応答(ACK:Acknowledgement)を受け取っていない状態。相手が無応答のときもこの状態になる。ACKを受け取るとESTABLISHEDへ遷移する
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応答を必ず待つ(TCPは双方向通信をサポートしているので、SYNやFINの送信とACKの確認作業は双方向で行われる)。「頻度」は、netstatを実行したときに、その状態をユーザーが見る可能性の高さを表している。LISTENINGやESTABLISHEDはよく目にするであろうが、それ以外のものはすぐにほかの状態に遷移してしまうので、見る機会は少ない。

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

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

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

アクティブな接続

  プロトコル  ローカル アドレス          外部アドレス        状態
  TCP    192.168.0.111:2112     192.168.0.221:445      ESTABLISHED
  TCP    192.168.0.111:2167     192.168.0.222:110      ESTABLISHED

 TCP/IPのプロトコルでは、IPアドレスやポート番号はすべてこのように数値で表現するのが基本である。しかしこれでは人間にとっては非常に分かりづらいので、文字列を使って代用することもできるようになっている。このためのメカニズムとしては、例えばIPアドレスならDNSやhostsファイルによる「FQDN名/ホスト名←→IPアドレス」の相互変換システムがあるし、ポート番号ならservicesファイルによる「サービス名←→ポート番号」の相互変換機能がある。hostsファイルやservicesファイルは、Windows OSでは%windir%\system32\drivers\etcフォルダに置かれている(UNIX/Linuxでは/etcディレクトリにある)。

 netstatに-nオプションを付けないと、これらの変換機構を使って、なるべくIPアドレスやポート番号を具体的なホスト名やサービス名に変換して出力するので、人間にとっては分かりやすい(変換できないものについては、そのまま数値で出力される)。しかし1台のホストに複数のIPアドレスが付けられていたり、サービス名だけでははっきりとは分からない場合は、-nオプションを使って実際の数値で確認する必要がある。

 また-nを付けて実行すると、DNSサーバなどに対する問い合わせが行われないので、結果がすぐに表示されるという利点もある。Webブラウザでインターネット上のサイトを閲覧しているような場合には、外部IPアドレスがインターネット上のホストになる。この場合は、外部のDNSサーバに対してDNSの逆引き(IPアドレスからFQDN/ホスト名への変換)を実行するので、かなり待たされるし、さらに各コネクションごとに逆引き操作が必要になるので、通信の状態を素早く調べたい場合には-nを付けて逆引きを抑制するのがよい。どうしても具体的なホスト名が必要ならば、nslookupで調べるか、最後に1回だけ-nなしでnetstatを実行すればよいだろう(Windows Vista以降のWindows OSであれば、-nなし、かつ-f付きでnetstatを実行する)。

■定常的な状態の調査

 netstatの引数として数値を指定すると、その時間間隔(単位は秒)でnetstatを繰り返し実行できる。通信の状態を定常的にモニタしたい場合に有用なオプションである。止めるには、[Ctrl]+[C]キーを押して強制終了させる。

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

アクティブな接続……コマンド起動直後の表示

  プロトコル  ローカル アドレス          外部アドレス        状態
  TCP    192.168.0.111:1085     172.16.10.61:139       ESTABLISHED
  TCP    192.168.0.111:3979     172.16.10.61:445       ESTABLISHED

アクティブな接続……コマンド起動から1秒後の表示

  プロトコル  ローカル アドレス          外部アドレス        状態
  TCP    192.168.0.111:1085     172.16.10.61:139       ESTABLISHED
  TCP    192.168.0.111:3979     172.16.10.61:445       ESTABLISHED

アクティブな接続……コマンド起動から2秒後の表示

  プロトコル  ローカル アドレス          外部アドレス        状態
  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……やめるには[Ctrl]+[C]キーを押して、強制終了させる
C:\>

 ただ、Windows OSでこのオプションを付けてnetstatを実行しても、実際の通信の状態がすぐには表示されず、若干のタイムラグが生じる場合があるようなので注意すべきだ。例えば「netstat -n 1」を実行して、1秒ごとに通信の状態を表示させているとする。このとき、手元のWindows 2000 Professionalマシンでは、メール・プログラムを起動してPOP3のメール・サーバに接続しても、そのTCPコネクションの状態が表示されるまでには10秒以上が必要だった(Windows 7ではこうした現象は確認できなかった)。これに対して、手動で「netstat -n」を繰り返し実行させてみると、メール・プログラムを起動すれば、すぐにそのTCPコネクションの状態が正しく表示されていた。

 このように、このオプションを指定したときには実際の通信状態が反映されるまでしばらく時間がかかることもあるので、このような特性を理解して使うか、もっと長い時間間隔(例:10分など)でモニタしていても構わないような場合(サーバの通信状態をおおまかに把握する場合など)に使うとよい。

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

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

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

アクティブな接続
……以下のLISTENINGとなっているのがTCPのリッスン(待ち受け)状態のポート
  プロトコル  ローカル アドレス          外部アドレス        状態
  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 ……これは通信中のコネクション
  TCP    [::]:135               [::]:0                 LISTENING
  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    [fe80::5d7e:5b1a:a89a:7eaf%11]:1900  *:*

 TCPとUDPは通信方式が異なるので、それぞれ待ち受け状態の表示方法が異なるが、TCPならば「LISTENING」と表示されているのが待ち受け状態のポートである。UDPの場合は、「外部アドレス」が「*:*」と表示されているのが待ち受け状態のポートを表している。

 ここでは「ローカル アドレス」には、「0.0.0.0」と「127.0.0.1」「192.168.0.103」「[::]」「[fe80::5d7e:5b1a:a89a:7eaf%11]」の5種類が表示されているが、それぞれどのIPアドレスで待ち受けしているかを示している(このようにTCPでは、IPアドレスごとに異なるサービスで待ち受けできる)。「0.0.0.0」「[::]」は、任意のIPアドレスで待ち受けしていることを表し(ほかの2つも包含している)、「127.0.0.1」はローカル・ループバック・アドレスという特別なIPアドレス(常に自分自身を指す)で待ち受けしていることを表す。「192.168.0.103」「[fe80::5d7e:5b1a:a89a:7eaf%11]」はこのマシンに付けられたIPアドレスなので、マシンによっては異なるIPアドレスになることがある。

【コラム】リッスン状態表示に注意

 netstatによってリッスン状態であると表示されるポートは、外部からの接続が行われる可能性があるので、ファイアウォールなどでブロックしたり、そのようなポートを使用しているサービスやプログラムはすべて停止しておきたいと考えるかもしれない。しかし、このnetstat -aで表示される待ち受け状態のポートは、必ずしも現在オープンされているポートを正確に表しているとは限らない。マイクロソフト サポート技術情報の「LISTEN していないポートが netstat で LISTENING と表示される」や「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以降のWindows OSでは、「-o」オプションを付けると、そのコネクションを所有しているプロセスのID(PID)を表示できる。

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

アクティブな接続

プロトコル  ローカル アドレス         外部アドレス     状態     PID
TCP    192.168.0.111:1085    172.16.10.51:139      ESTABLISHED   4
TCP    192.168.0.111:2874    172.16.10.54:445      ESTABLISHED   4
TCP    192.168.0.111:3435    172.16.10.51:80       ESTABLISHED  1160
TCP    192.168.0.111:3979    172.16.10.51:445      ESTABLISHED   4

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

 Windows XP以降のWindows OSでは、このプロセス追跡の機能がさらに強化され、PIDではなく、実行ファイル名を直接表示する機能が追加されている(「-b」「-v」オプションを使用)。これらのオプションの活用方法についてはTIPS「netstatでリッスンしているプロセスを特定する」を参照していただきたい。また、Windows 7/Windows Server 2008 R2以降のOSでは、タスク・マネージャから起動するリソース・モニタ・ツールで「ネットワーク」タブにある「TCP接続」を見れば、プロセスとPID、アドレス、ポート番号などの関係をGUIツールで簡単に確認できる。

■オフロード機能の動作状況の調査

 Windows Vista以降のWindows OSやScalable Networking Pack(関連記事参照)という機能を追加したWindows Server 2003では、「-t」オプションを付けると、オフロード機能の動作状況をコネクションごとに表示できる。オフロード機能とは、IPパケットやTCP/UDPパケットのヘッダ中に格納するチェックサム値の計算を、ホストのCPUではなく、NIC上のコントローラ・チップで行う機能である。これにより、ホストCPUの負荷が軽減され、ネットワーク処理やシステム全体のパフォーマンスが改善するとのことだ。その半面、この機能が原因でネットワーク通信速度が低下するなどの不具合が生じることもある(TIPS「Hyper-Vの仮想マシンでネットワークが遅くなる問題を回避する」参照)。

※-tオプションはWindows Vista以降のWindows OSで有効
C:\>netstat -nt ……オフロード機能の動作状況を表示する

アクティブな接続

プロトコル  ローカル アドレス    外部アドレス         状態            オフロード状態
TCP         192.168.0.111:2112   192.168.0.221:445    ESTABLISHED     ホスト内
TCP         192.168.0.111:3389   192.168.0.231:52891  ESTABLISHED     オフロード済
TCP         192.168.0.111:57527  192.168.0.51:445     ESTABLISHED     オフロード済

 「オフロード状態」列に表示されているのがオフロード状態である。これが「ホスト内」であれば、オフロード機能ではなくホストCPUによってチェックサムが計算されている。「オフロード済み」の場合は、オフロード機能が動作していることを意味する。このように、コネクションごとにオフロード機能が使われて稼動しているかどうかが分かるので、オフロード機能が不具合の原因かどうか(あるいはネットワーク性能の向上に役立っているかどうか)確認しやすくなる。

■更新履歴

【2012/03/02】Windows Vista/Windows Server 2008/Windows 7/Windows Server 2008 R2に関する情報を追加して修正しました。

【2004/11/27】Windows XP SP2に関する情報を追加して修正しました。

【2004/02/14】Windows XPとWindows Server 2003に関する情報と、TCPの状態遷移に関する情報を追加して加筆・修正しました。

【2002/07/20】初版公開(対象はWindows 2000/Windows XP/Windows Server 2003)。


「Windows TIPS」のインデックス

Windows TIPS

Copyright© 1999-2014 Digital Advantage Corp. All Rights Reserved.

TechTargetジャパン

iPhone 6 Plus SIMフリー版、プレゼント!
Loading

ホワイトペーパー(TechTargetジャパン)

注目のテーマ

Focus

- PR -

転職/派遣情報を探す

【転職サーチ】SIer/Web企業/新規事業 スマホ開発で、あなたのキャリアを生かす

「派遣・フリーで働くメリット」とは? 活躍する派遣エンジニアの本音

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。