TCP 状态

TCP状态

  • TCP三次握手的过程如下:

    1. 主动连接端发送一个SYN包给被动连接端
    2. 被动连接端收到SYN包后,发送一个带ACK和SYN标志的包给主动连接端
    3. 主动连接端发送一个带ACK标志的包给被动连接端,握手动作完成
  • TCP四次挥手的过程如下:

    1. 主动关闭端发送一个FIN包给被动关闭端
    2. 被动关闭端收到FIN包后,发送一个ACK包给主动关闭端
    3. 被动关闭端发送了ACK包后,再发送一个FIN包给主动关闭端
    4. 主动关闭端收到FIN包后,发送一个ACK包,当被动关闭端收到ACK包后,四次挥手动作完成,连接断开

netstat或ss中的TCP状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//获取TCP状态命令
netstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ss -ant|awk '{print $1}'|sort|uniq -c

//各个状态说明
* 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包

//主动和被动可能出现的状态
* 主动连接端可能的状态有: CLOSED,SYN_SEND,ESTABLISHED。
* 主动关闭端可能的状态有: FIN_WAIT_1,FIN_WAIT_2,TIME_WAIT
* 被动连接端可能的状态有: LISTEN,SYN_RECV,ESTABLISHED
* 被动关闭端可能的状态有: CLOSE_WAIT,LAST_ACK,CLOSED