前言
netstat 这个命令一直以为是 net status 的缩写,今天一查发现并没有找到官方的这种说法,然后参考了 man 手册,发现这个词更像是 net statistics 的缩写,命令的作用是显示网络连接、路由表、接口连接、无效连接和多播成员关系的,man 手册中描述这个命令如下:
netstat - Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships
这个命令很强大,但是我经常使用的参数很简单,通常用来查询端口占用问题,命令为 netstat -anp | grep xxxPORT,因为在我测试自己项目程序的时候,总有一些进程企图占用我使用的端口,比如那个 被我 kill 了 n 次的 TIM 客户端,使用 netstat 可以方便的找到是哪个进程占用了你的端口。
虽然这个命令经常使用,但是其中的这些参数含义却不是很清楚,所以特地总结一下,综合其他常见的用法,记录下来以备后续查找使用。
参数选项
- -a:显示所有连接,包括 LISTEN 状态的连接
 - -l:仅显示 LISTEN 状态的连接
 - -t:仅显示tcp相关选项
 - -u:仅显示udp相关选项
 - -n:拒绝显示别名,能显示数字的全部转化成数字
 - -o:显示信息中包括与网络计时器相关的信息
 - -e:显示扩展信息,例如uid等
 - -p:显示建立相关链接的程序名
 - -r:显示路由信息,路由表
 - -s:按各个协议进行统计
 - -c:每隔一个固定时间,执行该netstat命令。
 
无参数执行
该命令无参数执行时显示数据会少一些,便于我们看清命令执行的结果,内容如下:
1  | [root@node1 ~]# netstat  | 
输出结果可以分为 Active Internet connections 和 Active UNIX domain sockets 两个部分:
Active Internet connections 指有效的网络连接,默认显示6列内容:
- Proto:协议名字,包括tcp, udp, udpl, raw等
 - Recv-Q:表示网络接收队列,表示收到的数据已经在本地接收缓冲,还有多少没有被应用程序取走
 - Send-Q:表示网络发送队列,表示存在本地缓冲区,但对方没有收到的数据或者没有 ACK 的
 - Local Address:本地IP地址和端口
 - Foreign Address:外部IP地址和端口
 - State:网络连接状态,包括 ESTABLISHED、SYN_SENT、SYN_RECV、FIN_WAIT1、FIN_WAIT2、TIME_WAIT、CLOSE、CLOSE_WAIT、LAST_ACK、LISTEN、CLOSING、UNKNOWN 等状态
 
Active UNIX domain sockets 是指本地套接口,我们知道 socket 也可用于同一台主机的进程间(IPC)通讯,但是 socket 用于IPC更有效率:不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程
并且它是是全双工的,API接口语义丰富,相比其它进程间通信机制有明显的优越性。
常用命令组合
查询端口占用
1  | [root@node1 /]# netstat -anp | grep 8889  | 
这是我目前最常用的命令,在windows可以改为 netstat -ano | findstr 8889
显示tcp连接
1  | [root@node1 /]# netstat -at  | 
显示处于 LISTEN 状态的端口
1  | [root@node1 /]# netstat -l  | 
分类统计每种协议的信息
1  | [root@node1 /]# netstat -s  | 
每秒显示一次信息
1  | [root@node1 /]# netstat -c  | 
显示核心路由信息
1  | [root@node1 /]# netstat -r  | 
显示网络接口列表
1  | [root@node1 /]# netstat -i  | 
总结
netstat -anp | grep 8889命令可用于查询8889端口被哪个进程占用了,在Windows上翻译为netstat -ano | findstr 8889- netstat 命令查询出的网络连接信息中,
Recv-Q和Send-Q通常应该为0,如果长时间不为0可能是有问题的,需要尽快排查 - 如果 
Recv-Q数值一直处于不为0的状态,可能是遭受了拒绝服务 DOS 攻击,导致本地消息处理过慢 - 如果 
Send-Q数值一直处于不为0的状态,可能是有应用向外发送数据包过快,或者是对方接收处理数据包不够快 
以史为鉴可以知兴替,以铜为鉴可以正衣冠,以人为鉴可以明得失。人的成长需要对比,总有人比你更加优秀~
2020-11-23 01:17:59