一、netstat -ant 显示的连接状态有几种:
LISTEN,SYN-SENT,SYN-RECEIVED,ESTABLISHED,FIN_WAIT_1,FIN_WAIT_2,CLOSE_WAIT和TIME_WAIT,LAST-ACK和 CLOSED。他们的含义要从TCP的连接与中断过程说起
Client (三次握手) Server
--------SYN -------->
<------- ACK/SYN -------
-------- ACK -------->
服务器侦听来自远方的TCP端口的连接请求,服务器处于LISTEN状态;
客户端首先向服务器发送SYN包,客户端处于SYN-SENT状态;
服务端接到第一次握手请求后,发送ACK包和SYN包,进行确认并请求第二次握手,服务端处于SYN-RECEIVED状态;
客户端发送ACK确认,进行第三次握手,两端均处于ESTABLISHED状态,可进行数据传输;
Client (四次断开) Server
-------- FIN -------->
<------- ACK --------
<------- FIN ---------
-------- ACK -------->
客户端首先向服务器发送FIN包,客户端进入FIN_WAIT_1状态;(客户端完成了数据的传输,而服务端没有完成)
服务端向客户端发送ACK,确认FIN包收到,服务端进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态;
服务端等待他上面的应用程序关闭连接,一旦连接被关闭(服务端完成数据的传输),服务端进入LAST_ACK状态,会发送FIN包到客户端,客户端收到后进入TIME_WAIT状态,并发送最后一个ACK包,由于在连接关闭后,还不能确定所有连接关闭前的包(最后一个ACK包)被服务端收到了,可能由于网络不可靠的原因导致服务端没有收到ACK,服务端超时后会重新发送FIN包,所有客户端进入了TIME_WAIT状态,就是为了重发ACK包,一般这个状态保持时间为2*MSL,MSL指的是一个TCP包在网络中存在的最长时间,大概2*MSL=240(s)。而后进入CLOSED状态;
服务器收到最后一个ACK包后,进入CLOSED状态。
二、查看TCP各种状态列表:
netstat -nat |tail -n +3|awk '{print $6}'|sort|uniq -c|sort -rn
或
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'