netstat(ネットスタット)は、TCPで通信するポートの状態を一覧表示する、Windowsのネットワークコマンドである。コマンドプロンプトで使う。

 TCPでは、通信相手と3回パケットをやり取りしてコネクションを確立する「3ウエイハンドシェーク」やコネクションを閉じる過程など、10種類以上の「状態」が定義されている。TCPで通信するポート番号と通信相手、これらの状態を一覧表示するのが、netstatである。

 ポートの状態としてよく表示されるのは、通信中を意味する「ESTABLISHED」や、通信終了の処理中である「CLOSE_WAIT」だ。クライアントからサーバーへ通信する場合、状態は以下のように変化する。まずクライアントが「LISTENING」状態のサーバーのポートに、接続を依頼する。具体的には「SYN(シン)」パケットを送付する。このときにクライアントは「SYN_SENT」状態になる。サーバーから了解を意味する「SYN/ACK(アック)」が返ってくると、クライアントが「ACK」を送って通信を確立し、「ESTABLISHED」状態に移行する。Webサーバーであれば、一連のデータを送り終えると、通信の終了を要求する。その要求を受け取ったクライアントは「CLOSE_WAIT」状態となる。クライアントの終了処理が完了すると「LAST_ACK」となり、終了確認がサーバーに送られる。サーバーは終了待ちで「TIME_WAIT」となり、両者の接続が終了した時点で「CLOSED」になる。

 netstatは、オプションなしで実行すると、何らかの通信が始まったTCPのポート(終了処理中を含む)を一覧表示する。待ち受け状態(LISTENING)やUDPを含むすべてのポートを一覧表示するときは、-aオプションを付けて実行する。UDPのポートだけを表示するときは「netstat -P UDP」と実行する。スクリプトで数値を使って処理するときは、-nオプションを使ってネットワークサービスの種類をポート番号で表示させると便利だ。

 ほかにnetstatには、「netstat -r」と実行して、ルーティングテーブルを表示させる機能を持つ。ルーティングテーブルの操作には、専用のroute(ルート)コマンドが用意されているが、ルーティングテーブルを表示させるだけならnetstatでも事足りる。routeでルーティングテーブルを表示させるときは、「route print」と実行する。