一次摸鱼的机会,看到群里小伙伴问了一嘴 netstat -tnpl 这个命令是干啥的,netstat 这个命令用过很多次,但是我其实也没有认真研究,但是这是一个问题,我不能放过它,而且 netstat 这个命令我日常就用来查询端口的监听状态了,所以趁着这次机会,一起搞懂 netstat 这个命令。
netstat 这个命令在 Linux 、Windows 和 MacOS 操作系统下都兼容,不同的是,netstat 在 UNIX 下显示详细信息的命令是 man netstat ,而在 Linux 和 Windows 下面是 netstat --help。
Linux 下的 netstat 命令
当我在 Linux 下执行 man netstat 命令之后,系统显示出来的提示着实让我吓一大跳,看来这个命令内容很多啊!不要被这么长的描述吓到,我们一步一步来。
首先来了解一下 netstat 这个命令是干啥的。
官方给我们的解释就是
netstat -- show network status
列出网络状态
但是这网络状态都有啥呢?带着疑问,我在 Linux 下执行了一下。
打印出来是一个六元组,六元组每一列的内容分别是
仔细看了一下这个六元组,这好像表明 netstat 这个命令是用于监控传入和传出的网络连接和状态的一个命令行工具啊。
从整体上来看,netstst 的输出结果可以分为两部分,一部分是 Active Internet connections,称为活跃 TCP 连接,其中的 Recv-Q 和 Send-Q 指的是客户端发送队列和客户端接收队列。这两个队列的值一般都是 0 ,如果不是 0 的话表示有消息堆积还没有发出去/取出,这种情况一般很少见到。
另外一部分是 Active UNIX domain sockets, 称为 活跃的 Unix 域套接字,这部分中的 socket 和网络 socket 套接字一样,不同的是,这块只能用来本地通信,性能要比网络 socket 高。Active UNIX domain sockets 也是一个六元组,分别表示
netstat 参数释义
下面我们来解释一下 netstat --help 列出来的一些参数,我们从最常见的一些参数开始入手,这样大家看起来也能形成阶段性记忆,不至于失去重点。
netstat -a
-a 这个参数默认会监控所有的 socket 连接。
包括已经监听的、已经建立连接的、客户端发送的等待服务器的和未被监听都会被列出来。
netstat -at/-t
netstat -at 和 netstat -t 这俩后缀都是用来监听与 TCP 协议有关的端口,不同的是 netstat -at 会监听所有 State(状态)下的端口,而 netstat -t 仅仅会监听 ESTABLISHED 状态的端口。
netstat -at
netstat -t
netstat -au/-u
同样的,netstat -au 和 netstat -u 都会监控与 UDP 有关的端口,不同的是 netstat -au 会监听所有 State(状态)下的端口,而 netstat -u 仅仅会监听 ESTABLISHED 状态的端口。
netstat -au
netstat -u
我这里测试是没有监控已经建立连接状态下的 UDP 协议。
netstat -ap
这条命令用于列出程序运行的端口,常用的命令是
netstat -ap|grep '程序名'
比如我们要找 http 程序,就是 Netstat -ap|grep http
还可以直接列出端口号
netstat -ap|grep 8080
不过需要注意下,并不是所有的程序都能被找到,没有权限的不会显示,使用 root 权限可以查询所有信息。
netstat -l
netstat -l 用于监听正在处于监听状态的端口(读起来还真有那么点费劲,为了读起来更顺畅,后面直接使用列出
替换监听)。
netstat -lt 只用于列出所有监听 TCP 端口。
netstat -lu 只用于列出所有监听 UDP 端口。
netstat -lx 只用于列出所有监听 UNIX 端口。
netstat -s
netstat -s用于列出所有端口的统计信息。
netstat -st用于列出 TCP 端口的统计信息。
netstat -su用于列出 UDP 端口的统计信息。
netstat -p
netstat -p 可以与其他参数一起使用,例如 netstat -pt 就可以列出服务名称和 PID 号。
netstat -c
使用 netstat -c 将每隔一秒列出网络信息。
netstat -r
netstat -r用于列出路由核心信息。
netstat --verbose
这条命令会列出系统支持的地址族(Address Family)。
Address Family 简单来说就是底层是使用的哪种通信协议来递交数据的,如 AF_INET 用的是 TCP/IPv4;AF_INET6 使用的是 TCP/IPv6;而 AF_LOCAL 或者 AF_UNIX 则指的是本地通信(即本次通信是在当前主机上的进程间的通信),一般用绝对路径的形式来指明。
netstat -i
netstat -i 用来列出网络接口数据包,包括传输和接收具有 MTU(最大传输单元)的数据包。
另外,netstat -ie 还用于列出内核接口表,和 ifconfig 命令很相似
关于这个问题
所以,回到文章刚开始的那个疑问,netstat -tnpl 是干什么用的,其实这就是几个参数的组合
- -t :仅列出与 tcp 有关的信息
- -n:以数字形式列出
- -p:列出正在使用 socket PID 和 程序名称
- -l:列出正在监听的服务器 socket
我们执行一下这个命令。
另外,在 Linux 中,已经推荐使用 ss 来替代 netstat ,使用 ip route 来替代 netstat -r ,使用 ip -s link 来替代 netstat -i ,使用 ip addr 来替代 netstat -g 了。