「netstat」コマンドの使い方
TCP/IP通信の状態を調べる
TCP/IP通信の状態を調べる
コマンドプロンプトに「netstat」と入力することで起動できます。
「Windowsキー + R」(ファイル名を指定して実行)で「netstat」を起動することもできます。
(実行ファイル名が「netstat.exe」であるため)
目次
基本的な使用方法
netstatコマンドの最も基本的な使い方は、通信中のTCPコネクション(TCP接続)の状態を表示させることです。このコマンドを実行すると、ローカルPCの現在アクティブになっているTCP通信の状態を表示できます。
TCPとは、2つのアプリケーション間で、信頼性のある通信路(コネクション)を開設し、お互いにデータなどをやりとりするための規格です。通信するアプリケーションは、同一PC上のアプリケーション同士でもよく、異なるPC(ホスト)上にある2つのアプリケーション間でも可能です。
引数無しで使用
何もオプション引数を付けずにnetstatを実行すると、現在アクティブなTCPコネクションの状態が表示されます(後述する「状態」が「LISTENING」ではないコネクションが表示されます)。
●「プロトコル」欄は使用中のネットワークプロトコルの種類であり、次項で述べる「-a」オプションを付けていない場合は、常に「TCP」と表示されているはずです。UDPにはコネクションを確立するという概念がないので、このコマンドではUDPの通信状態は表示されません(UDPではデータを単発的に送るだけであるため)。
●「ローカル アドレス」欄は、ローカル側のコンピュータ名(もしくはIPアドレス)と使用中のTCPのポート番号です。
●「外部アドレス」欄は、通信の相手となっているマシンのコンピュータ名(もしくはIPアドレス)とポート番号です。1つのマシンには複数のIPアドレスを付けることができ、ローカルのループバックアドレス(IPv4なら「127.0.0.1」、IPv6なら「[::1]」など)が使われていることもあるため、「ローカル アドレス」に表示されるIPアドレスは静的ではありません。また同じマシン同士でもコネクションを確立できるため、「外部アドレス」が自分のIPアドレスの場合もあります。
●「:」記号の左側に表示されているのが「コンピュータ名」(もしくは「IPアドレス」)で、右側に表示されているのが「ポート」(サービス名か番号)です。
TCPのコネクションは、「ローカルのIPアドレス/ローカルのポート番号/リモートのIPアドレス/リモートのポート番号」という4つの組み合わせで識別されます。どれか1つでも値が異なれば別のコネクションとして扱われるので、例えばWebサーバとの通信を行っていると、同じような値のコネクションが複数表示されることがあります。Webブラウザは、高速化のために複数のTCPコネクションを使うのが一般的だからです。ですがよく見ると、ローカル側(左側)のポート番号が違っているはずです。
●「状態」欄は、その名の通りTCPコネクションの状態を表します。TCPはステート(状態)を持つプロトコルであり、コネクションの開始や終了、通信方法などに関して細かい手順が決められています。サーバとクライアントのどちらの側から先に通信を開始するのか、データの送受信はどうするのか、終了する場合はどうするのか、などが厳密に決められています。
状態の意味
それぞれの状態の説明は以下の通りです。これを調べることにより、コネクションの状態がどうなっているか、開始しようとしているのか、待ち受け中なのか、終了しようとしているのか、などが分かります!
状態 | 頻度 | 説明 |
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へ遷移して終了する(netstatの表示から消える)。 |
TIME_WAIT | 〇 | コネクションの終了待ち状態。しばらく待ったあと、CLOSEDへ遷移して終了する(netstatの表示から消える)。 |
-nオプション
IPアドレスやポート番号を数値表示
IPアドレスから名前を求める名前解決処理を行わないため、結果が素早く表示されます。ただし、通信相手などが分かりづらいため、通常は-nオプション付きで素早く実行させ、必要に応じて引数なしで利用するとよいでしょう。
-fオプション
外部アドレス名をFQDN表示
例えば「a123.hogehoge.jp」というFQDN名を持つコンピュータと通信している場合、-fオプションがないと単にa123としか表示されませんが、-fを付けると完全なDNS名で表示されます。表示が長くなって見づらくなりますが、どのコンピュータと通信しているかが分かりやすくなります。
その他の代表的なオプション
オプション引数 | 機能 |
-a | 使用しているポート(待機中含む)を全て表示 |
-b | 各コネクションやlistenポートに対応したプログラム名を表示 |
-e | Ethernetでやりとりしたデータ量を表示 |
-r | TCP/IPのルーティング情報を表示 |
-s | TCP、UDP、IPの各プロトコルでやりとりしたデータ量を表示 |