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

Tech TIPS:netstatコマンドを使いこなす (1/2)

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

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


「Tech 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の状態遷移図を示しておく。

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    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を実行する)。

       1|2 次のページへ

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

@IT Special

- PR -

TechTargetジャパン

高精細なRetinaが魅力の「MacBook Pro」、プレゼント!
Loading

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

注目のテーマ

@IT Special

- PR -

コンパクトなシステムで価格を最適化したCisco UCS Miniの実力を検証

Cisco UCS Miniが中堅中小企業に選ばれた理由

低コストでハイスペック、省スペース! @IT編集部による検証結果は?

新省スペースサーバーのスゴさを@IT編集部が検証

マイナンバー対策は、高性能で安全なITインフラを手に入れるチャンス!

マイナンバー対応サーバーの選択:5つのポイント

RSSについて

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

メールマガジン登録

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