Netstat

`netstat`是一个基于命令行界面的网络实用工具，可显示当前的网络状态，包括传输控制协议层的连线状况、路由表、网络接口状态和网络协议的统计讯息等。`netstat`命令适用于类Unix系统（如macOS、Linux、Solaris和BSD）、IBM OS/2和Windows NT操作系统家族（如Windows XP、Windows Vista、Windows 7、Windows 8和Windows 10）。

`netstat`可用于查找网络中的问题，并可通过计算网络流量来度量网络性能。尽管该工具仍然被包含在许多Linux发行版中，但基本都被看作过时、应被替代的工具。

在Linux上，推荐使用`ss`替代`netstat`，使用`ip route`替代`netstat -r`，使用`ip -s link`替代`netstat -i`，使用`ip maddr`替代`netstat -g`。

## 命令参数

命令`netstat`的参数必须以连字符（-）而非斜杠（/）为前缀。并非所有平台都支持某些参数。

参数｜描述｜Windows｜ReactOS｜macOS｜BSD｜NetBSD｜FreeBSD｜Linux｜Solaris｜OS/2

-a｜显示所有活动中的网络连接和电脑正在监听的TCP/UDP端口。｜是｜是｜是

-b｜显示每个应用程序所使用的网络连接和监听端口。（仅适用于Windows XP、Windows Server 2003或更高版本的Microsoft Windows操作系统，Windows 2000或更早版本不可用。）｜是｜否｜否

-b｜同-i，但计算网络流量的总字节数。｜否｜是｜是｜否

-e｜显示以太网统计讯息，例如发送和接收的字节数及数据包数。此参数可以与-s组合使用。｜是｜是｜否

-f｜显示外部地址的完整网域名称。（仅适用于Windows Vista和更高版本的Microsoft Windows操作系统。）｜是｜否｜否

-f｜限定显示使用特定套接字（unix、inet、inet6）的地址族。｜否｜是｜否

-g｜显示多播组讯息。（可能仅适用于较新的操作系统。）｜否｜否｜是

-i｜显示网络接口及统计讯息。｜否｜否｜是

-m｜显示随机存取存储器统计讯息。｜否｜否

-n｜显示活动中的TCP连接，但主机地址和端口号以数字形式表示，不会尝试确定实际主机名。｜是｜是｜是

-o｜显示活动中的TCP连接，并包含每个连接的进程ID（PID）。根据PID，可在Windows任务管理器的“进程”选项卡中找到该应用程序。此参数可以与-a、-n和-p组合使用。如果安装了Windows修补程序，则此参数在Windows XP、Windows Server 2003和Windows 2000上可用。｜是｜否｜否

-p｜显示使用指定网络协议的连接。协议可以是TCP、UDP、TCPv6或UDPv6。如果此参数与-s组合使用，则协议可以是TCP、UDP、ICMP、IP、TCPv6、UDPv6、ICMPv6或IPv6。｜是｜是｜是

-p｜显示哪些进程正在使用哪些网络接口，类似于Microsoft Windows下的-b。（需要root权限才能执行此操作。）｜否｜否｜是

-P｜显示使用指定网络协议的连接。协议可以是IP、IPv6、ICMP、ICMPv6、IGMP、UDP、TCP或RawIP。｜否｜否｜是

-r｜显示路由表内容，与Microsoft Windows下`route print`命令相同。｜是｜是｜是｜是

-s｜按网络协议显示统计讯息。默认情况下，显示TCP、UDP、ICMP和IP协议的统计讯息。如果Windows XP安装了IPv6协议，亦可以显示TCPv6、UDPv6、ICMPv6和IPv6协议的统计讯息。-p参数可用于指定一组协议。｜是｜是｜是

-t｜仅显示TCP连接。｜否｜是｜是

-u｜仅显示UDP连接。｜否｜否｜是｜是

-W｜显示完整主机名或IPv6地址。｜否｜否｜是｜否

-v｜与-b组合使用时，将显示所有应用程序使用的网络连接和监听端口所涉及的组件列表。｜是｜否｜否

-h｜显示该命令的提示。｜否｜否｜是｜是｜是｜是｜是｜是｜否

-?｜显示该命令的提示。｜否｜否｜否｜否｜否｜否｜否｜否｜是

/?｜显示该命令的提示。｜是｜是｜否｜否｜否｜否｜否｜否｜否

## 统计讯息

- Proto：网络协议，包括传输控制协议（TCP）和用户数据报协议（UDP）。
- Local Address：本地计算机的IP地址和正在使用的端口号。除非使用-n参数，否则将显示与IP地址和端口对应的主机名称。如果主机正在侦听所有端口，则主机名显示为星号（*）。如果端口尚未建立，则端口号显示为星号。
- Foreign Address：远程计算机的IP地址和正在使用的端口号。除非指定了-n参数，否则将显示与IP地址和端口对应的主机名称。如果端口尚未建立，则端口号显示为星号（*）。
- State：TCP连接的状态，可能的状态包括CLOSE_WAIT、CLOSED、ESTABLISHED、FIN_WAIT_1、FIN_WAIT_2、LAST_ACK、LISTEN、SYN_RECEIVED、SYN_SEND和TIME_WAIT。

## 命令范例

<image>

要仅显示TCP或UDP协议的统计讯息，请键入以下命令之一：

`netstat -sp tcp` `netstat -sp udp`

类Unix系统：

显示进程ID为“pid”的进程打开的所有端口：

持续更新活动中的TCP和UDP连接，但主机地址和端口号以数字形式表示，并显示哪些进程正在使用这些连接：

`sudo netstat -nutpacw`

Microsoft Windows：

显示活动的TCP连接和关联的进程ID，每5秒为一个更新周期（仅适用于基于Windows NT的操作系统或装有修补程序的Windows 2000）：

`netstat -o 5`

显示活动中的TCP连接和关联的进程ID，但主机地址和端口号以数字形式表示（仅适用于基于Windows NT的操作系统或装有修补程序的Windows 2000）：

`netstat -no`

## 应用（类UNIX系统）

命令｜说明

`netstat -a`｜显示所有端口（无论被监听或不被监听）、所有网络协议的连接。

`netstat -at`｜仅显示TCP连接。

`netstat -au`｜仅显示UDP连接。

`netstat -ant`｜显示所有TCP连接，但不进行域名解析（即显示IP地址而不显示主机名）。

`netstat -al`｜显示所有被监听的端口。

`sudo netstat -aep`｜同时显示每个端口相关的进程和进程ID（需要root权限以运行此命令）。

`netstat -s > wiki.txt`｜输出当前计算机网络统计讯息到文本文件`wiki.txt`。

`netstat -r`｜显示路由表。与`route -e`的输出结果相同。

`netstat -i`｜显示所有网络接口。`netstat -i -e`与`ipconfig`的输出结果类似。

`netstat -ct`｜显示TCP连接（持续更新）。

`netstat -g`｜显示多播组讯息。

`netstat -lntu`｜显示所有监听端口的守护进程和本地计算机上所有空闲的开放端口。

`netstat -atnp | grep ESTA`｜显示所有状态为ESTABLISHED的TCP连接。

### 通配符

在`netstat`命令的输出结果中，星号（*）为通配符，表示“所有”。

例如：

```bash
....Local Address Foreign Address State
... *:smtp          *:*   LISTEN
```

在输出结果中，`*:smtp`表示该进程正在本地计算机的所有网络接口上监听所有映射为SMTP的端口，此处的星号有时会被代替，意义不改变。`*:*`中的第一个星号表示连接可以来自任何IP地址，第二个星号表示连接可以来自远程计算机上的任何端口。

## 基本资料

- 日语原文：netstat
- 操作系统：Unix和类Unix系统、IBM OS/2、Microsoft Windows、ReactOS
- 类型：命令