netstat
是一个很实用的 Linux 命令,通过它可以显示网络连接,路由表,接口状态,网络链路和组播成员组等信息。最常用的场景是拿来看本机的 TCP/UDP 网络连接,并以此判断本地网络服务的运行状态。
netstat 命令格式
netstat [选项]...
netstat
命令的使用格式并不复杂,对照接下来的示例可以轻松掌握其用法。难点在于解读输出的连接信息,这个可以对照文末「netstat 命令输出」小节来参阅。
netstat 命令示例
显示所有网络和连接信息:
netstat
只显示 TCP 连接信息:
netstat -t
以 IP 和端口号的方式显示所有 TCP 连接信息:
netstat -nat
配合 grep
命令过滤 TIME_WAIT 状态的连接:
netstat -nat |grep TIME_WAIT
配合 awk
命令统计 TCP 连接状态的类型和数量:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
显示连接的进程 ID 和程序名称:
netstat -natp
netstat 命令选项
缩写 | 完整名称 | 说明 |
---|---|---|
-r |
--route |
显示内核路由表。 |
-g |
--groups |
显示 IPv4 和 IPv6 的 IGMP 组播组成员关系信息。 |
-i |
--interface= iface |
显示所有网络接口列表或者是指定的 iface 。 |
-M |
--masquerade |
显示一份所有经伪装的会话列表。 |
-s |
--statistics |
显示每种协议的统计信息。 |
-t |
--tcp |
显示使用 TCP 协议端口的连接。 |
-u |
--udp |
显示使用 UDP 协议端口的连接。 |
-v |
--verbose |
详细模式运行。特别是打印一些关于未配置地址族的有用信息。 |
-n |
--numeric |
显示数字形式地址而不是去解析主机、端口或用户名。 |
--numeric-hosts |
显示数字形式的主机但是不影响端口或用户名的解析。 | |
--numeric-ports |
显示数字端口号,但是不影响主机或用户名的解析。 | |
--numeric-users |
显示数字的用户ID,但是不影响主机和端口名的解析。 | |
-A |
--protocol= family |
指定要显示哪些连接的地址族。family 是以逗号分隔的地址族列表,比如 inet , unix , ipx , ax25 , netrom , 和 ddp 。这样和使用 --inet , --unix (-x ), --ipx , --ax25 , --netrom , 和 --ddp 选项效果相同。地址族 inet 包括 raw , udp 和 tcp 协议套接字。 |
-c |
--continuous |
将使 netstat 不断地每秒输出所选的信息。 |
-e |
--extend |
显示附加信息。使用这个选项两次来获得所有细节。 |
-o |
--timers |
包含与网络定时器有关的信息。 |
-p |
--program |
显示套接字所属进程的PID和名称。 |
-l |
--listening |
只显示正在侦听的套接字。 |
-a |
--all |
显示所有正在或不在侦听的套接字。加上 --interfaces 选项将显示没有标记的接口。 |
-F |
显示 FIB 中的路由信息。 | |
-C |
显示路由缓冲中的路由信息。 |
netstat 命令输出字段
netstat
命令的输出内容主要有两大类,第一类是活动的 Internet 网络连接,由 TCP, UDP, raw 组成。字段如下:
字段名称 | 说明 |
---|---|
Proto | 套接字使用的协议。 |
Recv-Q | 连接此套接字的用户程序未拷贝的字节数。 |
Send-Q | 远程主机未确认的字节数。 |
Local Address | 套接字的本地地址(本地主机名)和端口号。依赖 --numeric 选项。 |
Foreign Address | 套接字的远程地址(远程主机名)和端口号。 |
State | 套接字的状态。因为在 RAW 协议中没有状态,而且 UDP 也不用状态信息,所以此行留空。它的值和相关说明请参考下面的 State 状态列表表格。 |
User | 套接字属主的名称或 UID。 |
PID/Program name | 以斜线分隔的处理套接字程序的 PID 及进程名。 |
关于 State 状态字段的值列表如下:
状态名称 | 说明 |
---|---|
ESTABLISHED | 套接字有一个有效连接。 |
SYN_SENT | 套接字尝试建立一个连接。 |
SYN_RECV | 从网络上收到一个连接请求。 |
FIN_WAIT1 | 套接字已关闭,连接正在断开。 |
FIN_WAIT2 | 连接已关闭,套接字等待远程方中止。 |
TIME_WAIT | 在关闭之后,套接字等待处理仍然在网络中的分组 |
CLOSED | 套接字未用。 |
CLOSE_WAIT | 远程方已关闭,等待套接字关闭。 |
LAST_ACK | 远程方中止,套接字已关闭。等待确认。 |
LISTEN | 套接字监听进来的连接。如果不设置 --listening 或者 --all 选项,将不显示出来这些连接。 |
CLOSING | 套接字都已关闭,而还未把所有数据发出。 |
UNKNOWN | 套接字状态未知。 |
另外一类是活动的 UNIX 域套接字,相关字段和解释如下:
字段名称 | 说明 |
---|---|
Proto | 套接字所用的协议(通常是 unix)。 |
RefCnt | 使用数量(也就是通过此套接字连接的进程数)。 |
Flags | 显示的标志为 SO_ACCEPTON (显示为 ACC ), SO_WAITDATA (W ) 或 SO_NOSPACE (N )。 如果相应的进程等待一个连接请求,那么 SO_ACCECPTON 用于未连接的套接字。其它标志通常并不重要。 |
Type | 套接字使用的一些类型。值主要包含:SOCK_DGRAM 此套接字用于数据报(无连接)模式;SOCK_STREAM 流模式(连接)套接字;SOCK_RAW 此套接字用于 RAW 模式;SOCK_RDM 一种服务可靠性传递信息;SOCK_SEQPACKET 连续分组套接字;SOCK_PACKET RAW 接口使用套接字;UNKNOWN 未知; |
State | 套接字状态,值主要包含:FREE 套接字未分配;LISTENING 套接字正在监听一个连接请求;CONNECTING 套接字正要建立连接;CONNECTED 套接字已连接;DISCONNECTING 套接字已断开;(empty) 套接字未连;UNKNOWN 未知; |
PID/Program name | 处理此套接字的程序进程名和 PID。上面关于活动的 Internet 连接的部分有更详细的信息。 |
Path | 当相应进程连入套接字时显示路径名。 |