| [Network] | |||||||||||||||
netstatコマンドを使いこなす
|
|||||||||||||||
|
|||||||||||||||
| 解説 |
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コネクションを表示する |
引数を何も付けずに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コネクションを数値で表示する |
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秒おきに表示させてみる |
ただし、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……以下のLISTENINGとなっているのがTCPのリッスン(待ち受け)状態のポート……待ち受け中のTCPポート……これは通信中のコネクション……待ち受け中のUDPポート |
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でのみ有効……-oでプロセスIDを表示させる |
右端に表示されているのがPIDである。このPIDを調べることにより、そのポート(コネクション)を使用しているプロセスを知ることができる。PIDが分かれば、あとはタスク・マネージャやコマンド・プロンプト上でtasklist.exeコマンド(Windows XPおよびWindows Server 2003で利用可能)を実行することにより、そのプロセス名を調査できる。不明なポートがリッスン状態にあるときは、これを使ってプロセスやサービスを調べ、必要ならばファイアウォールなどでそのポートをブロックしたり、プログラムやサービスそのものを停止して、システムの安全性を確保したりできる。
またWindows XP SP2のnetstatコマンドでは、このプロセス追跡の機能がさらに強化され、PIDではなく、実行ファイル名を直接表示する機能が追加されている(-b、-vオプションを使用)。これらのオプションの活用方法についてはTIPS「netstatでリッスンしているプロセスを特定する」を参照していただきたい。![]()
|
||||||||||||||||||||||||||||
| 更新履歴 | ||
|
| 「Windows TIPS」 |
ホワイトペーパー(TechTargetジャパン)
- WindowsTIPS (2010/3/12)
− 不要なアドオンを無効化してIE8の起動を高速化する
− IE8のソース表示エディタを変更する
− RRASのNATでポートマッピングを定義する - PowerShell 2.0で始めるWindowsシステム管理 (2010/3/11)
コマンド・プロンプトやWSHスクリプトはもう古い!? これからのWindowsシステム管理はPowerShellでスマートに片付けよう - Hyper-Vライブ・マイグレーションの運用ノウハウ (2010/3/10)
ライブ・マイグレーションの運用フェイズで役立つノウハウを解説。実用的なPowerShellスクリプトなども紹介する - 第211話 あとで読む (2010/3/9)
おっ、これいいねぇ。ああこっちも。いやあインターネットは情報の宝庫だね。いまは忙しいから、「あとで読む」ってことでメモメモ
|
|
スキルアップ/キャリアアップ(JOB@IT)
スポンサーからのお知らせ
- - PR -
| 仮想環境の構築とデータ保護の特効薬?! 実績と信頼性の高いパッケージで安心運用 New! |
| 仮想環境のバックアップもこれまでどおり 「まるごと取ってまるごと戻す」簡単運用 |
| おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |
| 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |
- - PR -
お勧め求人情報

**先週の人気講座ランキング**
〜Java編〜
| ◆ | おばかアプリ選手権、第4弾開催中!! ムダにカッコよくてくだらない作品求ム! |
| ◆ | 社内ファイルサーバを“クラウド”に統合 VPN直結「クラウド型ストレージ」を紹介 |
| ◆ | Twitterのアカウントはなぜ突破された? メールによる新手の攻撃手法とその対策 |

| ◆ | もう仮想化のお試しフェイズは終わりだ! Hyper-V 2.0が基幹システムも仮想化 |
| ◆ | 美人!? まあまあ? 気になる いやし系!! PV急増で「美人時計」がとった手段とは? |
| ◆ | クライアント企業から求められる人材 ⇒IT技術と経営戦略を併せ持つ「戦略家」 |

| ◆ | .NET編集長が実践する「技術情報検索術」 サンプル・コードを簡単に探す“技”は? |
| ◆ | 業務効率と情報セキュリティ対策を両立! 手間なく確実に機密情報を守る方法とは? |
| ◆ | 直属上司が海外にいるのエンジニアに見る 【実例】場所に捉われないワークスタイル |

| ◆ | 「仮想化工房」のマイスターが選んだのは VMware、Hyper-V、そしてVirtageだった! |
| ◆ | 進化を続ける富士通ストレージETERNUS DX 製品開発者の自信を裏付けるものとは何か |
| ◆ | 運用管理の課題を“2つの観点”から分析 ユーザー満足度の高い「仮想環境」とは? |

| ◆ | 【CTC事例】約30の基幹システムを統合! 膨大なバッジジョブを制御した方法は? |
| ◆ | 仮想化すればコストは削減できるか? 仮想化に必要な「3つの視点」を解説する |
| ◆ | その数、なんと400台以上! グループ内 サーバの「統合管理」によるメリットは? |








