TCP三次握手的过程如下:
client发送syn(SYN=x)请求到server,client状态syn_send状态;
server收到syn包,确认client的syn(ACK=x+1),同时发送自己的syn包(SYN=y),即SYN+ACK包,此时server进入syn_recv状态;
client收到server的包,向server发送确认包(ACK=y+1),此包发送完毕,client进入ESTABLISHED状态,server收到确认包,进入ESTABLISHED,三次握手完成;
TCP四次挥手的过程如下:
client发出连接释放,且停止发送数据,FIN=1,seq=u;此时,客户端进入FIN_WAIT_1状态;
server收到连接释放报文,发出确认报文,ACK=1,ack=u+1,带上自己的序列号seq=v,server进入close_wait状态;此时数据半关闭状态,client没有数据发送了;此时server发送数据,client还是接收;
client收到server的确认请求后,此时client进入FIN_WAIT_2状态,等待server发送连接中断报文;此时server还能发送数据
server将数据发送完毕,像client发送释放连接报文,FIN=1,ack=u+1,此时是假死状态,假定此时序列号seq=w,server进入last_ack状态,等待client确认;
client收到server释放连接报文,必须进行确认,ACK=w+1,ACK=1,自己的序列号seq=u+1,此时client进入time_wait状态,此时client连接还没有释放,经过2*MSL时间,客户端关闭;
server收到client消息,进入close
netstat中的各种状态:
CLOSED
初始(无连接)状态。
LISTEN
侦听状态,等待远程机器的连接请求。
SYN_SEND
在TCP三次握手期间,主动连接端发送了SYN包后,进入SYN_SEND状态,等待对方的ACK包。
SYN_RECV
在TCP三次握手期间,主动连接端收到SYN包后,进入SYN_RECV状态。
ESTABLISHED
完成TCP三次握手后,主动连接端进入ESTABLISHED状态。此时,TCP连接已经建立,可以进行通信。
FIN_WAIT_1
在TCP四次挥手时,主动关闭端发送FIN包后,进入FIN_WAIT_1状态。
FIN_WAIT_2
在TCP四次挥手时,主动关闭端收到ACK包后,进入FIN_WAIT_2状态。
TIME_WAIT
在TCP四次挥手时,主动关闭端发送了ACK包之后,进入TIME_WAIT状态,等待最多MSL时间,让被动关闭端收到ACK包。
CLOSING
在TCP四次挥手期间,主动关闭端发送了FIN包后,没有收到对应的ACK包,却收到对方的FIN包,此时,进入CLOSING状态。
CLOSE_WAIT
在TCP四次挥手期间,被动关闭端收到FIN包后,进入CLOSE_WAIT状态。
LAST_ACK
在TCP四次挥手时,被动关闭端发送FIN包后,进入LAST_ACK状态,等待对方的ACK包。
查看端口状态数:
netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'