netstatコマンドの使い方|-anoの見方と状態(LISTENING・TIME_WAIT)の意味、ssとの対応

netstatコマンドの使い方

netstatコマンドは、今のTCP接続と、PCが待ち受けているポートを一覧にするコマンドです。Windowsでは「netstat -ano」で全接続を数値のまま表示し、どのプロセスが使っているかをPIDで確かめます。Linuxでは、後継のssコマンドへの移行がマニュアルで案内されています。

この記事でわかること

  • netstatのオプション一覧と、-anoをよく使う理由
  • ローカルアドレス・外部アドレス・状態・PIDの出力の読み方
  • LISTENING・ESTABLISHED・TIME_WAIT・CLOSE_WAITなど状態の意味と、大量に出たときの読み分け
  • ポートを使っているプロセスを特定する手順
  • PowerShell・Linuxのss・Cisco IOSの同じ役割のコマンド

一次情報: Microsoft Learn「netstat」(参照)/Linux man-pages「netstat(8)」「ss(8)」(参照)/RFC 9293(参照)※2026年9月時点

netstatのようにサーバー側の通信まで追えると、常駐先で任される範囲が広がります。SESから次の職場へ移る進め方は、別の記事で段階ごとに整理しました。

目次

netstatコマンドとは?通信中の相手と待ち受けポートを一覧にするコマンド

netstatコマンドとは、PCやサーバーのTCP接続と、待ち受けているポートを一覧で表示するコマンドです。Microsoftの資料によると、オプションなしで実行した場合は、今つながっているTCP接続だけを表示します。

どのポートで待ち受けているか、どこの相手と通信しているか、それはどのプログラムか。netstatが答えてくれるのは、こうした問いです。サーバーが起動しない、見覚えのない通信がある、といった場面で最初に打つコマンドになります。

netstatのオプション一覧(Windows・Microsoft Learn)
オプション表示されるもの使う場面
なし今のTCP接続ざっと通信先を見る
-aTCP接続に加え、待ち受けているTCP・UDPのポート開いているポートを調べる
-nアドレスとポートを数値のまま表示名前の変換を待たずに速く出す
-o各接続のプロセスID(PID)どのプログラムの通信かを調べる
-b接続を作った実行ファイル名PIDを引かずに名前で見る(管理者権限が要る)
-p tcp指定したプロトコルだけTCPやUDPに絞る
-sプロトコルごとの統計再送やエラーの数を見る
-eイーサネットの統計送受信のバイト数を見る
-rルーティングテーブルroute printと同じ内容を見る
数字(例: 5)指定した秒数ごとに表示し直す状態の変化を追う

-bは、十分な権限が無いと失敗するとMicrosoftの資料に書かれています。コマンドプロンプトを「管理者として実行」で開いてから使ってください。

netstat -anoの使い方と出力の見方

現場で打つのは、ほとんどが「netstat -ano」です。-aで待ち受けも含めた全部を出し、-nで名前の変換を省いて速く表示し、-oでPIDを付けます。下は日本語版Windowsの出力例で、アドレスは説明用の値にしています。

アクティブな接続

  プロトコル  ローカル アドレス        外部アドレス           状態            PID
  TCP         0.0.0.0:135              0.0.0.0:0              LISTENING       1024
  TCP         127.0.0.1:5432           0.0.0.0:0              LISTENING       3380
  TCP         192.168.10.23:52344      203.0.113.80:443       ESTABLISHED     8812
  TCP         192.168.10.23:52350      203.0.113.80:443       TIME_WAIT       0
  UDP         0.0.0.0:5353             *:*                                    2240
出力の各列の読み方
列意味見るポイント
プロトコルTCPかUDPかUDPには状態が表示されない
ローカル アドレス自分のIPとポート番号0.0.0.0は全アドレス、127.0.0.1は自分の中だけで待ち受け
外部アドレス相手のIPとポート番号待ち受け中は0.0.0.0:0や*:*になる
状態TCP接続の段階次の章の表で読み方を確かめる
PIDその接続を持つプロセスの番号タスクマネージャーやtasklistで名前を引く

特に見落としやすいのが、ローカルアドレスの前半です。0.0.0.0で待ち受けていれば外から届き得る、127.0.0.1なら自分の中からしか届かない。同じポート番号でも、意味がまったく違います。

UDPの行に状態が出ないのは、UDPが接続の手順を持たないプロトコルだからです。UDPについて分かるのは、そのポートを開けているプロセスがあるかどうかまでになります。

netstatの状態(State)の意味|大量に出たときの読み分け

状態の列は、TCP接続が今どの段階にあるかを表します。段階の定義はTCPの仕様(RFC 9293)にあり、Windowsはこれを英語の大文字で表示します。

TCPの状態と、見かけたときの読み方
表示段階見かけたときの読み方
LISTENING接続の要求を待っているそのポートでサービスが待ち受けている
SYN_SENT接続を申し込み、相手の返事を待っている長く残るなら、相手が応答しないかFWで止まっている
SYN_RECEIVED相手の申し込みを受け、確認を待っている大量に並ぶなら、不審な接続要求を疑う材料になる
ESTABLISHED接続が確立し、データをやり取りできる通信中。相手のアドレスを確かめる
FIN_WAIT_1・FIN_WAIT_2自分から切断を申し出て、相手を待っている通常は短時間で次へ進む
CLOSE_WAIT相手が切断を申し出て、自分のプログラムが閉じるのを待っている大量に残るなら、自分側のプログラムが接続を閉じていない
LAST_ACK切断の最後の確認を待っている通常は短時間で消える
TIME_WAIT切断後、遅れて届くパケットに備えて待っている短い通信を繰り返した側で増える。多くは正常

netstatの状態は3つのまとまりで読む

  • 状態(State)の列
    • 待ち受けLISTENING。そのポートでサービスが接続を待っている
    • 接続の途中・通信中SYN_SENT・SYN_RECEIVED・ESTABLISHED。SYN_SENTが残るなら相手が応答していない
    • 切断の途中FIN_WAIT_1/2・CLOSE_WAIT・LAST_ACK・TIME_WAIT。多いときはTIME_WAITかCLOSE_WAITかを見分ける

図:待ち受け・接続の途中・切断の途中に分けると、どの行を気にすべきかが見える

TIME_WAITとCLOSE_WAITは、多いときの意味が逆

大量に並んでいると不安になる2つですが、読み方は正反対です。

TIME_WAITは、先に切断した側に残る状態です。RFC 9293では、TIME-WAITはMSL(最大セグメント寿命)の2倍の時間とどまるとされ、MSLは2分とされています。Webサーバーへの短い接続を繰り返せば、それだけ並ぶのが普通です。TIME_WAITが多いこと自体は、多くの場合で異常ではありません。

一方のCLOSE_WAITは、相手はもう切断したのに、自分のプログラムが接続を閉じていない状態です。RFC 9293でも、ローカルのユーザー(プログラム)からの切断要求を待つ状態と定義されています。CLOSE_WAITが増え続けるなら、自分側のプログラムの不具合を疑うのが筋です。この場合は、ネットワークの設定を見直すより先に、アプリケーションの担当者へ相談する話になります。

TIME_WAITとCLOSE_WAITは、多いときの意味が逆

TIME_WAIT
どちら側に残る
先に切断した側
消えるまで
MSLの2倍(RFC 9293ではMSL=2分)
多いとき
短い接続を繰り返しているだけのことが多い
CLOSE_WAIT
どちら側に残る
相手から切断された側
消えるまで
自分のプログラムが接続を閉じるまで
多いとき
自分側のプログラムが閉じていない。アプリの担当者へ

図:TIME_WAITの多さは多くの場合で正常、CLOSE_WAITが増え続けるなら自分側のプログラムを疑う

ポートを使っているプロセスを特定する手順

「Webサーバーを起動しようとしたら、80番がすでに使われていると言われた」。netstatが一番役に立つのは、こういう場面です。コマンドを3つつなげて、使っているプログラムを突き止めます。

netstat -ano | findstr :80
tasklist /fi "PID eq 3380"

1行目で、80番に関係する行だけに絞ります。LISTENINGの行の右端がPIDです。2行目でそのPIDのプロセス名を表示すれば、どのプログラムが80番を押さえているかが分かります。

ポートを使っているプログラムを突き止める手順

  • 「80番はすでに使われています」と言われたときの流れです。
  • 1netstat -ano | findstr :8080番に関係する行だけを表示する
  • 2LISTENINGの行のPIDを読むローカルアドレスの末尾が :80 の行か確かめる(8080にも当たるため)
  • 3tasklist /fi "PID eq 番号"PIDからプロセス名を表示する
  • 4止めるか、ポートを変えるかを決める業務で使うプログラムなら、止める前に担当者へ確認する

図:findstrで絞り、LISTENINGの行のPIDからプロセス名を引く

findstrは文字列で絞るので、「:80」は8080や8081の行にも当たります。行が多いときは、ローカルアドレスの列の末尾が「:80」かどうかを目で確かめてください。

PowerShellなら条件を指定して取り出せる

PowerShellのGet-NetTCPConnectionを使うと、文字列で絞らずに、ポート番号や状態を条件として指定できます。Microsoftの資料には、状態がEstablishedの接続だけを取り出す例や、PIDで絞る例が載っています。

Get-NetTCPConnection -LocalPort 80
Get-NetTCPConnection -State Listen
Get-NetTCPConnection -OwningProcess 3380

結果の「OwningProcess」がPIDです。Get-Process -Id にこの番号を渡せば、プロセス名まで一続きで確かめられます。

-s・-r・秒数指定など、そのほかの使いどころ

-anoほど頻繁ではありませんが、覚えておくと切り分けが速くなるオプションがあります。

知っておくと便利な使い方

  • netstat -s -p tcp。TCPの統計だけを出す。再送されたセグメントの数が増え続けていれば、回線の品質を疑う手がかり
  • netstat -r。ルーティングテーブルを表示する。Microsoftの資料どおり、route printと同じ内容
  • netstat -o 5。5秒ごとに表示し直す。接続が増えたり消えたりする様子を追える

-sの統計は、打った時点までの累計です。1回だけ見ても多いか少ないかは判断できません。時間を空けて2回打ち、差がどれだけ増えたかを見るのが実務での読み方です。

Linuxのss・Cisco IOSとの対応

Linuxにもnetstatはありますが、マニュアル自体が「ほぼ廃止された(mostly obsolete)」と書き、置き換え先を挙げています。netstatの代わりはss、netstat -rの代わりはip route、という対応です。

目的別の対応表(Windows/PowerShell/Linux/Cisco IOS)
やりたいことWindowsPowerShellLinuxCisco IOS
接続の一覧netstat -anGet-NetTCPConnectionss -t -ashow tcp brief
待ち受けだけを見るnetstat -an(LISTENINGの行)-State Listenss -t -lshow tcp brief all
プロセスを付けるnetstat -anoOwningProcess列ss -t -l -p─
数値のまま出す-n既定で数値-nshow tcp brief numeric
経路表netstat -rGet-NetRouteip routeshow ip route

ssのマニュアルには、「ss -t -a」で全TCPソケットを、「ss -u -a」で全UDPソケットを表示する例が載っています。ポート番号で絞るフィルターも書け、たとえばSSHの確立済みの接続だけを取り出すことも可能です。

Cisco IOSの「show tcp brief」は、ルーター自身が持っているTCP接続を表示します。シスコの資料によると、allを付けるとLISTENの状態も含めた表示に、numericを付けるとアドレスが数値の表示に変わります。機器へのTelnetやSSH、BGPの接続が確立しているかを見るときの定番です。

よくある質問

netstatの表示がなかなか終わらないのはなぜですか?

相手のアドレスを名前に変換しようとして、1行ごとに待っているのが主な理由です。-nを付けると数値のまま表示するので、すぐに出ます。-bを付けている場合も、実行ファイル名を調べる分だけ時間がかかります。

TIME_WAITが大量に表示されますが、放っておいて大丈夫ですか?

多くの場合は問題ありません。短い接続を繰り返した側に残る状態で、決まった時間がたてば消えます。数が増え続けて新しい接続が張れない、といった症状が出たときに初めて、接続の使い方の見直しを考えます。

外部アドレスが「0.0.0.0:0」や「*:*」になっているのは何ですか?

まだ相手が決まっていない、待ち受け中の行です。TCPのLISTENINGの行や、UDPの行でよく見かけます。相手とつながると、ESTABLISHEDの行として相手のアドレスが表示されます。

netstatでLISTENINGなら、外からそのポートに接続できますか?

できるとは限りません。netstatで分かるのは、そのPCでプログラムが待ち受けていることまでです。PCのファイアウォールや途中のルーターで止められていれば、外からは届きません。ローカルアドレスが127.0.0.1なら、そもそも自分の中からしか接続できません。

-bを付けると「管理者特権が必要」と出ます

-bは実行ファイルの情報を調べるので、管理者の権限が要ります。コマンドプロンプトを「管理者として実行」で開き直してから打ってください。権限を使えない環境では、-oでPIDを出し、tasklistで名前を引く方法が代わりになります。

まとめ

  • netstatは、TCP接続と待ち受けポートを一覧にするコマンド。まず打つのは netstat -ano
  • ローカルアドレスが0.0.0.0なら外から届き得る、127.0.0.1なら自分の中だけ
  • TIME_WAITが多いのは多くの場合で正常。CLOSE_WAITが増え続けるなら自分側のプログラムを疑う
  • ポートの使用者は、findstrで絞ってPIDを出し、tasklistで名前を引いて特定する
  • Linuxではssへの移行が案内されている。Cisco IOSはshow tcp brief

netstatで自分の側の待ち受けを確かめられたら、次は相手の側です。途中で止められていないかは、pingやtracert、ポートへの接続テストと組み合わせて確かめていきます。

通信の状態を自分で読めるようになると、障害対応で頼られる場面が増えます。構築から運用保守へ移るときにうまくいく人と後悔する人の違いを、10年分の現場の視点で整理した記事です。

NW構築から運用保守への転職は失敗か、を見る


免責事項

※本記事はMicrosoft・シスコシステムズの公式ドキュメント、Linuxのマニュアル、RFCなどの公開情報をもとに整理したものです。コマンドの表示や既定値は、OSのバージョンや機器の設定によって変わる場合があります。業務で使う機器では、所属先の手順とベンダーの最新資料をあわせてご確認ください。


よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

Tanabeです。新卒でSIerに入り、ネットワークの設計から構築、運用保守、クラウド移行まで10年やってきました。その間に転職を3回、CCNPも取りました。

正直に言うと、資格を取っても年収はすぐには上がりませんでした。1回目の転職は失敗、2回目でようやく150万円上がり、3回目で今の事業会社に落ち着いた。動いてみて分かったのは、資格の有無より「現場で何を任されてきたか」で評価が決まる、ということです。

エージェントの言葉を鵜呑みにして、危うく後悔しかけた経験もあります。だからこそ、自分がやらかした失敗をそのまま書いて、同じ回り道をしなくて済むように残しています。転職を考え始めた人が、条件で損をしないための材料にしてもらえたら嬉しいです。

目次