前言
后台开发,netstat命令总是绕不过,不仅工作中经常用过,面试也是考的多。netstat命令,对应的选项比较多,功能比较强大。netstat 常用来查看,后台服务进程的相关状态。
netstat 可以用来打印网络连接、路由表、连接的数据统计。下面我们来学习一下。
netstat-an
netstat -an命令能看到所有和本地计算机建⽴连接的IP,它包含四个部分:proto(连接⽅式)、local address(本地连接地址)、foreign address(和本地建⽴连接的地址)、state(当前端⼝状态)。通过这个命令的详细信息可以完全监控⾃⼰的计算机上的连接。
netstat -an命令显⽰的state(当前端⼝状态)有以下⼏种状态:
- LISTEN:侦听来⾃远⽅的TCP端⼝的连接请求
- SYN-SENT:再发送连接请求后等待匹配的连接请求
- SYN-RECEIVED:再收到和发送⼀个连接请求后等待对⽅对连接请求的确
- ESTABLISHED:代表⼀个打开的连接
---------------------------------------------------------------------------------------------------------------------------------
- FIN-WAIT-1:等待远程TCP连接中断请求,或先前的连接中断请求的确认
- FIN-WAIT-2:从远程TCP等待连接中断请求
- CLOSE-WAIT:等待从本地⽤户发来的连接中断请求
- CLOSING:等待远程TCP对连接中断的确认
- LAST-ACK:等待原来的发向远程TCP的连接中断请求的确认
- TIME-WAIT:等待⾜够的时间以确保远程TCP接收到连接中断请求的确认
- CLOSED:没有任何连接状态
打印所有连接
使用 -a,列出所有连接。
[root@VM-16-9-centos ~]# netstat -a
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp 0 0 VM-16-9-centos:49326 169.254.0.55:lsi-bobcat ESTABLISHED
tcp 0 52 VM-16-9-centos:ssh 119.137.1.7:20029 ESTABLISHED
tcp 0 0 VM-16-9-centos:ssh 113.110.224.255:63626 ESTABLISHED
tcp6 0 0 [::]:mysql [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
udp 0 0 VM-16-9-centos:ntp 0.0.0.0:*
udp 0 0 VM-16-9-centos:ntp 0.0.0.0:*
udp 0 0 0.0.0.0:38064 0.0.0.0:*
udp6 0 0 VM-16-9-centos:ntp [::]:*
udp6 0 0 VM-16-9-centos:ntp [::]:*
打印 TCP 或 UDP 连接
使用 -t 选项列出 TCP 协议的连接。
[root@VM-16-9-centos ~]# netstat -t
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 VM-16-9-centos:49326 169.254.0.55:lsi-bobcat ESTABLISHED
tcp 0 52 VM-16-9-centos:ssh 119.137.1.7:20029 ESTABLISHED
tcp 0 0 VM-16-9-centos:ssh 113.110.224.255:63626 ESTABLISHED
tcp 0 0 VM-16-9-centos:ssh vps-d395feee.vps.:39128 ESTABLISHED
使用 -u 选项列出 UDP 协议的连接。
[root@VM-16-9-centos ~]# netstat -u
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
禁用反向域名解析
使用 -n 选项禁用域名解析功能,这样可以加快查找速度。
[root@VM-16-9-centos ~]# netstat -n
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 172.17.16.9:49326 169.254.0.55:5574 ESTABLISHED
tcp 0 52 172.17.16.9:22 119.137.1.7:20029 ESTABLISHED
tcp 0 0 172.17.16.9:22 113.110.224.255:63626 ESTABLISHED
tcp 0 0 172.17.16.9:52236 169.254.0.4:80 TIME_WAIT
-p 显示对应的程序识别码和程序名称
使用 -p 选项列出正在监听的套接字。
[root@VM-16-9-centos ~]# netstat -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 VM-16-9-centos:49326 169.254.0.55:lsi-bobcat ESTABLISHED 1400/YDService
tcp 0 52 VM-16-9-centos:ssh 119.137.1.7:20029 ESTABLISHED 22131/sshd: root@pt
tcp 0 0 VM-16-9-centos:ssh host-188-14-121-2:55529 TIME_WAIT -
tcp 0 0 VM-16-9-centos:ssh 113.110.224.255:63626 ESTABLISHED 32201/sshd: root@pt
打印监听中的连接
使用 -l 选项列出正在监听的套接字。
[root@VM-16-9-centos ~]# netstat -l
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN
tcp6 0 0 [::]:mysql [::]:* LISTEN
udp 0 0 0.0.0.0:bootpc 0.0.0.0:*
打印连接进程信息
使用 -p 选项查看进程信息。
[root@VM-16-9-centos ~]# netstat -p
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 VM-16-9-centos:49326 169.254.0.55:lsi-bobcat ESTABLISHED 1400/YDService
tcp 0 0 VM-16-9-centos:48680 169.254.0.55:webcache TIME_WAIT -
tcp 0 52 VM-16-9-centos:ssh 119.137.1.7:20029 ESTABLISHED 22131/sshd: root@pt
tcp 0 0 VM-16-9-centos:ssh 113.110.224.255:63626 ESTABLISHED 32201/sshd: root@pt
tcp 0 0 VM-16-9-centos:ssh host-188-14-121-2:56025 ESTABLISHED 10384/sshd: unknown
查看TCP连接数
1) 统计80端口连接数
#netstat -nat|grep -i "80"|wc -l
4341
netstat -an会打印系统当前网络链接状态,而grep -i “80”是用来提取与80端口有关的连接的,wc -l进行连接数统计。 最终返回的数字就是当前所有80端口的请求总数。
2)统计已连接上的,状态为”established”
netstat -na|grep ESTABLISHED|wc -l
netstat -an会打印系统当前网络链接状态,而grep ESTABLISHED 提取出已建立连接的信息。 然后wc -l统计。 最终返回的数字就是当前所有80端口的已建立连接的总数。
根据进程pid查端口 t(TCP连接) p(程序名称)n(禁用域名解析)
利用 grep 命令,通过进程 pid 查出监听端口。
[apps@TLVM202016131]$ netstat -tpn | grep 5891
tcp 0 0 10.202.16.131:42872 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:25418 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:42832 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:5368 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.26:35742 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:42878 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:10454 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:10002 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:11002 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:4545 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:9988 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:42816 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:42812 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:30755 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:59654 ESTABLISHED 5891/nginx: worker
tcp 0 0 10.202.16.131:1521 10.202.17.29:51550 ESTABLISHED 5891/nginx: worker
根据端口查进程 t(TCP连接) p(程序名称)n(禁用域名解析)
利用 grep 命令,通过监听端口查出进程 pid 。
[apps@TLVM202016131]$netstat -tpn | grep 9988
tcp 0 0 10.202.16.131:9988 10.202.16.14:1521 ESTABLISHED 5891/nginx: worker
统计网络socket状态
在linux 服务器查看tcp 连接数的命令:借助 awk 命令,统计socket状态对应的个数。
[test]# netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 5
TIME_WAIT 2