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が答えてくれるのは、こうした問いです。サーバーが起動しない、見覚えのない通信がある、といった場面で最初に打つコマンドになります。
| オプション | 表示されるもの | 使う場面 |
|---|---|---|
| なし | 今のTCP接続 | ざっと通信先を見る |
| -a | TCP接続に加え、待ち受けている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はこれを英語の大文字で表示します。
| 表示 | 段階 | 見かけたときの読み方 |
|---|---|---|
| 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は、多いときの意味が逆
- どちら側に残る
- 先に切断した側
- 消えるまで
- MSLの2倍(RFC 9293ではMSL=2分)
- 多いとき
- 短い接続を繰り返しているだけのことが多い
- どちら側に残る
- 相手から切断された側
- 消えるまで
- 自分のプログラムが接続を閉じるまで
- 多いとき
- 自分側のプログラムが閉じていない。アプリの担当者へ
図: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 |
|---|---|---|---|---|
| 接続の一覧 | netstat -an | Get-NetTCPConnection | ss -t -a | show tcp brief |
| 待ち受けだけを見る | netstat -an(LISTENINGの行) | -State Listen | ss -t -l | show tcp brief all |
| プロセスを付ける | netstat -ano | OwningProcess列 | ss -t -l -p | ─ |
| 数値のまま出す | -n | 既定で数値 | -n | show tcp brief numeric |
| 経路表 | netstat -r | Get-NetRoute | ip route | show 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年分の現場の視点で整理した記事です。
免責事項
※本記事はMicrosoft・シスコシステムズの公式ドキュメント、Linuxのマニュアル、RFCなどの公開情報をもとに整理したものです。コマンドの表示や既定値は、OSのバージョンや機器の設定によって変わる場合があります。業務で使う機器では、所属先の手順とベンダーの最新資料をあわせてご確認ください。

