Netstat

**netstat**は、ネットワーク接続、ルーティングテーブル、各種ネットワークインタフェースの統計情報などを表示するコマンド行ツール。UNIX、Unix系、Windows NT系オペレーティングシステムで利用可能。"network statistics" の略。

ネットワークに関わる問題を探したり、トラフィック量を調べて性能を測定するといった用途に使う。

## パラメータ
このコマンドのパラメータには、スラッシュ (**/**) ではなくハイフン (-) を前置する。

* **-a** : 全てのアクティブなTCPコネクションと、そのマシンがlistenしているTCPポートおよびUDPポートを表示する。
* **-b** : 各コネクションやlistenポートに対応したプログラム名を表示する（Windows XPと2003 Server以降のみ）。
* **-e** : イーサネットの統計情報を表示する（受信した総バイト数やパケット数など）。**-s** と組み合わせて使うことができる。
* **-f** : 外部のアドレスについて完全修飾ドメイン名  を表示する（Windowsでは使えない）。
* **-i** : ネットワークインタフェースとそれらの統計情報を表示する（Windowsでは使えない）。
* **-n** : アクティブなTCPコネクションを表示するが、アドレスやポート番号は数値的に表示され、名前への変換は行わない。
* **-o** : アクティブなTCPコネクションと対応するプロセスID (PID) を表示する。Windowsタスクマネージャを併用するとPIDからどのアプリケーションかがわかる。**-a, -n,**および**-p**と共に指定できる。Windows XPと2003 Server以降で利用可能（Windows 2000ではホットフィックスがある）。
* **-p** Windows: **P**rotocol : Protocolで指定したプロトコルのコネクションを表示する。Protocolに指定できるのは**tcp, udp, tcpv6, udpv6**のいずれかである。**-s**と組み合わせてプロトコルの統計情報を表示する場合は**tcp, udp, icmp, ip, tcpv6, udpv6, icmpv6, ipv6**のいずれかを指定できる。
* **-p** Linux: **P**rocess : ソケットごとのプロセスの対応を表示する（Windowsの-bに相当）。root権限が必要。
* **-P** Solaris: **P**rotocol : Protocolで指定したプロトコルのコネクションを表示する。Protocolには**ip, ipv6, icmp, icmpv6, igmp, udp, tcp, rawip**が指定できる。
* **-r** : ルーティングテーブルの内容を表示する。Windowsでの**route print**コマンドに相当。
* **-s** : プロトコル毎の統計情報を表示する。デフォルトでは、TCP、UDP、ICMP、IPの統計情報を表示する。Windows XP以降でIPv6をインストールしている場合、TCP over IPv6、UDP over IPv6、ICMPv6、IPv6についての統計情報も表示する。**-p**を併用すると、指定したプロトコルの情報を表示できる。
* **-v** : **-b**と組み合わせると、コネクション作成やlistenポートに関わるコンポーネントを羅列する。
* **Interval** : 指定された情報をInternal秒ごとに表示する。CTRL+Cで表示が停止する。これを省略すると1回だけ表示する。
* **/?** : ヘルプ情報を表示する（Windowsのみ）。

## netstatで得られる情報
* Proto（プロトコル） - プロトコル名（TCPまたはUDP）
* Local Address（ローカルアドレス） - ローカルコンピュータで使われているIPアドレスとポート番号。**-n**パラメータを指定しない場合、対応する名前が表示される。
* Foreign Address（外部アドレス） - ソケットが接続されているリモートコンピュータのIPアドレスとポート番号。**-n**パラメータを指定しない場合、対応する名前が表示される。コネクションが確立していない場合、ポート番号はアスタリスク (*) で表示される。
* State（状態） - TCPコネクションの状態を表示。とりうる状態はCLOSE_WAIT, CLOSED, ESTABLISHED, FIN_WAIT_1, FIN_WAIT_2, LAST_ACK, LISTEN, SYN_RECEIVED, SYN_SEND, TIME_WAITである。TCPコネクションの状態について詳しくはを参照。

## 例
TCPまたはUDPプロトコルの統計情報を表示する場合、次のようなコマンド行となる。
`netstat -sp tcp`
`netstat -sp udp`

アクティブなTCPコネクションと対応するプロセスIDを5秒間隔で表示する場合、次のようなコマンド行となる（Windows XP、2003、2000（ホットフィックス）以降のみ）。
`netstat -o 5`

macOSでは次の通り。
`netstat -w 5`

アクティブなTCPコネクションと対応するプロセスIDを数値として表示する場合、次のようなコマンド行になる（Windows XP、2003、2000（ホットフィックス）以降）。
`netstat -no`

特定のプロセスIDのプロセスがオープンした全ポートを表示する場合は、次の通り。
`netstat -ao | find "pid"`

## 注意
一部のバージョンでは、printf出力に明確なフィールド区切り文字が指定されていないため、フィールドが重なってしまい、データが読み取れなくなる場合がある。

## プラットフォーム固有の注意点
Linuxでは、netstatでは上述のprintf問題で表示が壊れることがあるため、**/proc/net/dev**からデータを得る場合がある。

Windowsでは、netstatはIP Helper APIまたはIPHLPAPI.DLLの**GetTcpTable**および**GetUdpTable**という関数を呼び出して情報を収集している。これらで得られる情報は、ローカルおよびリモートのIPアドレスとポート番号、TCP状態コードである。また、TCP/IPがインストールされていない場合は使えない。

Mac OS X v10.5では、 /Applications/UtilitiesフォルダにNetwork Utilityというユーティリティがあり、その**Netstat**タブで同等の情報を表示できる。

## 関連項目
* `[[Lsof|lsof -i]]`
* iproute2

## 脚注

## 外部リンク
*Net Statistics (NetStats) home page – フリーウェアのネットワーク監視ツール
*[Microsoft TechNet Netstat article](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-xp/bb490947(v=technet.10)?redirectedfrom=MSDN)
*The netstat Command (Linux)
*Security Now #49 - The NETSTAT Command – Security Now!のポッドキャスト
*From linux-ip.net 表示内容に関する詳細な説明
* netstat(8) man page (JM Project)
* netstat(1M) man page (Solaris 10 Reference Manua)
* netstat(1) man page（HP-UX リファレンス）
* netstat コマンド Solaris のシステム管理（IP サービス）