netstat
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
-r:--route,显示路由表信息 -g:--groups,显示多重广播功能群组组员名单 -s:--statistics,按照每个协议来分类进行统计。默认的显示IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP和UDPv6 的统计信息。 -M:--masquerade,显示网络内存的集群池统计信息 -v:--verbose,命令显示每个运行中的基于公共数据链路接口的设备驱动程序的统计信息 -W:--wide,不截断IP地址 -n:进制使用域名解析功能。链接以数字形式展示(IP地址),而不是通过主机名或域名形式展示 -N:--symbolic,解析硬件名称 -e:--extend,显示额外信息 -p:--programs,与链接相关程序名和进程的PID -t:所有的 tcp 协议的端口 -x:所有的 unix 协议的端口 -u:所有的 udp 协议的端口 -o:--timers,显示计时器 -c:--continuous,每隔一个固定时间,执行netstat命令 -l:--listening,显示所有监听的端口 -a:--all,显示所有链接和监听端口 -F:--fib,显示转发信息库(默认) -C:--cache,显示路由缓存而不是FIB -Z:--context,显示套接字的SELinux安全上下文
二、各列含义
Proto:协议名
recv-Q:网络接收队列
表示收到的数据已在本地接收缓冲,但是还有多少没有被进程取走,recv()。如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q:网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区.
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
recv-Q、send-Q这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。
Local Address:本地地址
1) 0.0.0.0:2000:表示监听服务器上所有ip地址的2000端口(0.0.0.0表示本地所有ip)
2) :::2000:也表示监听本地所有ip的2000端口。和 0.0.0.0:2000 的区别是这里表示的是IPv6地址,0.0.0.0表示的是本地所有IPv4地址。
3) ":::" 这三个 : 的前两个 "::" ,是 "0:0:0:0:0:0:0:0" 的缩写,相当于IPv6的 "0.0.0.0" 。表示本机的所有IPv6地址,第三个 : 是IP和端口的分隔符
4) 127.0.0.1:8080:表示监听本机的loopback地址的8080端口。如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问
5) ::1:9000:表示监听IPv6的回环地址的9000端口,::1这个表示IPv6的loopback地址
Foreign Address:外部地址
与本机端口通信的外部socket。显示规则与 Local Address 相同
State:状态
链路状态,共有11种。state列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。
状态参数主要有:
1) LISTEN:首先服务端需要打开一个socket进行监听,状态为LISTEN。来自远方TCP端口的连接请求 2) SYN_SENT:客户端通过应用程序调用connect进行active open。于是客户端tcp发送一个SYN以请求建立一个连接,状态置为SYN_SENT。在发送连接请求后等待匹配的连接请求 3) SYN_RECV:服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN,状态置为SYN_RECV。在收到和发送一个连接请求后等待对连接请求的确认 4) ESTABLISHED:代表一个打开的连接,双方可以进行或已经在数据交互了。代表一个打开的连接,数据可以传送给用户 5) FIN-WAIT-1:主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态。等待远程TCP连接中断请求,或先前的连接中断请求的确认 6) CLOSE-WAIT:被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT。等待从本地用户发来的连接中断请求 7) FIN-WAIT-2:主动关闭端接到ACK后,就进入了 FIN-WAIT-2。从远程TCP等待连接中断请求 8) LAST-ACK:被动关闭端一段时间后,接收到文件结束符的应用程序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK,这就进入了LAST-ACK。等待原来发向远程TCP的连接中断请求的确认 9) TIME-WAIT:在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。等待足够的时间以确保远程TCP接收到连接中断请求的确认 10) CLOSING:比较少见。等待远程TCP对连接中断的确认 11) CLOSED:被动关闭端在接受到ACK包后,就进入了closed的状态。链接结束,没有任何连接状态 12) UNKNOWN:未知的Socket状态
状态参数补充:
SYN:同步序列编号(Synchronize Sequence Numbers),该标志只在三次握手建立TCP连接时有效,表示一个新的TCP连接请求 ACK:确认编号(Acknowledgement Number),是对TCP请求的确认标志,同时提示对端系统已成功接收所有数据 FIN:结束标志(Finish),用来结束一个TCP对话,但对应端口仍处于开放状态,等待接收后续数据
PID/Program:
PID即进程id,Program即使用该socket的应用程序
三、具体用法
查看tcp连接数状态
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
统计8080端口上有多少个TCP连接,命令:
netstat -ant |grep 80|wc -l
TCP连接中有多少个连接状态是ESTABLISHED,命令:
netstat -ant |grep 80|grep ESTABLISHED|wc -l
TCP连接中有多少个连接状态是CLOSE_WAIT
netstat -ant |grep 80|grep CLOSE_WAIT|wc -l
TCP连接中有多少个连接状态是TIME_WAIT
netstat -ant |grep 80|grep TIME_WAIT|wc -l
使用awk来完成统计信息,命令如下
netstat -ant |grep 80|awk '{++S[$NF]} END {for (a in S) print a, S[a]}'