TCP的11种状态:
1. CLOSED:表示初始状态,在连接关闭或超时的时候变成此状态。
2. LISTEN:表示服务器端的某个SOCKET处于监听状态,可以接受连接。服务端调用socket、 bind、listen函数后就进入此状态。被动状态(等待客户端来连接)。
3. SYN_RCVD:表示接受到了SYN报文,服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
4. SYN_SENT: 当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。
5. ESTABLISHED:客户端和服务器端在完成三路握手后,两者最终进入的状态,表示连接已经建立成功,可以传送数据了。对于服务器端来说,就是在SYN_RCVD状态时,收到了来自客户端的ACK。于是SYN_RCVD->ESTABLISHED;对于客户端来说,就是在SYN_SENT状态时,收到了来自服务器端的SYN+ACK分节,状态从SYN_SENT->ESTABLISHED,然后发送ACK。
6. FIN_WAIT_1: 主动关闭的一方,发送FIN,从ESTABLISHED -> FIN_WAIT_1
7. FIN_WAIT_2: 主动关闭的一方,接收到对方的FIN、ACK,进入此状态。由此不能再接收对方的数据。但是能够向对方发送数据。
8. CLOSE_WAIT: 接收到FIN以后,被动关闭的一方进入此状态。具体动作时接收到FIN,同时发送ACK。过会还要发送FIN表示自己也要关闭了,中间的这段就可以叫做CLOSE_WAIT(等待关闭)
9. LAST_ACK:被动方发送FIN,导致CLOSE_WAIT -> LAST_ACK,TCP终止则还需要等待最后一个ACK,所以状态叫做LAST_ACK,等到最后ACK后,LAST_ACK ->CLOSED
10. CLOSING:主动关闭方处于FIN_WAIT_1状态时,接收FIN,则从FIN_WAIT_1 -> CLOSING
(举一个此种情况的例子,(前提是两者的tcp连接已经建立)当主动关闭方发送FIN(一般是调用close)给被动关闭方,状态从ESTABLISHED -> FIN_WAIT_1,如果是正常TCP终止,则主动方会收到一个ACK,状态从 FIN_WAIT_1 -> FIN_WAIT_2,然后一段时间后被动方会继续发送FIN给主动方,主动关闭方收到FIN后状态从FIN_WAIT_2 -> TIME_WAIT(2msl后超时,状态最终变为CLOSED),这是最正常的情况
但当主动关闭方处于FIN_WAIT_1时,被动关闭方的FIN先于之前的自己发送的ACK到达,主动关闭方就直接FIN_WAIT_1 -> CLOSING,(其实就相当于同时关闭),然后迟来的ACK到达时,主动关闭方就从CLOSING -> TIME_WAIT)
11. TIME_WAIT:三种转化途径
FIN_WAIT_1 -> TIME_WAIT: 接收到了FIN,ACK;
FIN_WAIT_2 -> TIME_WAIT: 在正常TCP终止时,这种情况发生,处于FIN_WAIT_2的主动关闭方接收到被动关闭方的FIN,TCP状态发生改变,然后发送ACK;
CLOSING -> TIME_WAIT: 处于CLOSING 状态的主动关闭端接收到了迟来的ACK;