【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
Windows TIPS
[Network]
  Windows TIPS TOPへ
Windows TIPS全リストへ
内容別分類一覧へ

netstatコマンドを使いこなす

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

  解説

 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オプションが追加された
Windows XP SP2 通信に関連付けられている実行ファイルやコンポーネントを表示する-bと-vオプションが追加された。ヘルプ表示コマンド-?の結果が日本語化された
OSバージョンとnetstatの機能
利用可能なnetstatのオプションは「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はステート(状態)を持つプロトコルであり、コネクションの開始や終了、通信方法などに関しては細かい手順が決められている。例えばサーバとクライアントのどちらの側から先に通信を開始するのか、終了を宣言するにはどちらの側から最初にコマンドを送り、それに対する応答はどうするのかなどが厳密に決まっている。通信速度は有限なので、たとえ双方が同時に終了コマンドを送ったとしても、相手側へそれが届くまでにはタイムラグがある。そのためローカル側から先に終了コマンドを送るか、相手側が先に送るか、それとも双方同時に終了コマンドを送るか、などに応じて破綻のないように決められている。

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

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コネクションを数値で表示する

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/Server 2003では%windir%\system32\drivers\etcフォルダに置かれている(UNIX/Linuxでは/etcディレクトリにある)。

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

 また-nを付けて実行すると、DNSサーバなどに対する問い合わせが行われないので、結果がすぐに表示されるという利点もある。Webブラウザでインターネット上のサイトを閲覧しているような場合には、外部IPアドレスがインターネット上のホストになる。この場合は、外部のDNSサーバに対してDNSの逆引き(IPアドレスからFQDNへの変換)を実行するので、かなり待たされるし、さらに各コネクションごとに逆引き操作が必要になるので、通信の状態を素早く調べたい場合には-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分など)でモニタしていても構わないような場合(サーバの通信状態をおおまかに把握する場合など)に使うとよい。

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

 リッスンしているポート(待ち受け状態のTCPポート)があるかどうかを調べるには、-aというオプションを付けて実行する。これにより、LISTENING状態のTCPポートが表示される。サービス名でなく具体的なポート番号を知りたければ、-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アドレスで待ち受けしているかを示している(このようにTCPでは、IPアドレスごとに異なるサービスで待ち受けできる)。「0.0.0.0」は、任意のIPアドレスで待ち受けしていることを表し(ほかの2つも包含している)、「127.0.0.1」はローカル・ループバック・アドレスという特別なIPアドレス(常に自分自身を指す)で待ち受けしていることを表す。「192.168.0.103」はこのマシンに付けられた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 Server 2003では、「-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およびWindows Server 2003で利用可能)を実行することにより、そのプロセス名を調査できる。不明なポートがリッスン状態にあるときは、これを使ってプロセスやサービスを調べ、必要ならばファイアウォールなどでそのポートをブロックしたり、プログラムやサービスそのものを停止して、システムの安全性を確保したりできる。

 またWindows XP SP2のnetstatコマンドでは、このプロセス追跡の機能がさらに強化され、PIDではなく、実行ファイル名を直接表示する機能が追加されている(-b、-vオプションを使用)。これらのオプションの活用方法についてはTIPS「netstatでリッスンしているプロセスを特定する」を参照していただきたい。End of Article

関連記事(Windows Server Insider)
  TIPS―netstatの統計情報を活用する
  TIPS―ポートのリッスン状態を調査する
  TIPS―netstatでリッスンしているプロセスを特定する
  TIPS―svchost.exeプロセスとは?
  TIPS―ネットワークの診断ツールを活用する
  TIPS―IPアドレスからホスト名を見つける方法
  TIPS―ホスト名からIPアドレスを見つける方法
 
  関連リンク
  Portqry.exe コマンド ライン ユーティリティの説明(マイクロソフト)
  [HOWTO] Portqry を使用して Active Directory の接続の問題をトラブルシューティングする方法(マイクロソフト)
     
この記事と関連性の高い別のWindows TIPS
netstatでリッスンしているプロセスを特定する
Windows Serverシステムで利用するネットワーク・ポート番号
ネットワークの接続拒否とタイムアウトの違いを知る
ターミナル・サービス/リモート・デスクトップ接続のポート番号を変更する
ポートのリッスン状態を調査する
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

更新履歴
【2004/02/14】Windows XPとWindows Server 2003に関する情報と、TCPの状態遷移に関する情報を追加して加筆・修正しました。
【2004/11/27】Windows XP SP2に関する情報を追加して修正しました。
 
「Windows TIPS」

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

Windows Server Insider フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  直属上司が海外にいるのエンジニアに見る
【実例】場所に捉われないワークスタイル

  「仮想化工房」のマイスターが選んだのは
VMware、Hyper-V、そしてVirtageだった!

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?