zzxworld

Linux netstat 命令使用指南

Linux netstat 命令使用指南

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, udptcp 协议套接字。
-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 当相应进程连入套接字时显示路径名。