TCP建立/关闭连接时握手过程中的状态情况

一句话总结:深入理解握手中的状态情况

建立连接的3次握手和关闭连接的4次握手:




状态转换:



注:下面状态转换说明以客户端主动关闭为例。

close:表示初始状态

listen:服务器端某个socket处于监听状态,可以接受客户端连接

SYN_SENT:客户端执行connect()连接服务器时,发送SYN(J)报文发起第一次握手,随后进入SYN_SENT状态。

SYN_RCVD:服务器端接收到客户端发来的SYN(J)报文完成,进入SYN_RCVD状态完成第一次握手,并向客户端发送SYN(K)和ACK(J+1)报文,发起第二次握手

ESTABLISHED:客户端收到服务器端发来的送SYN(K)和ACK(J+1)报文,状态从SYN_SENT进入ESTABLISHED,完成第二次握手,随后发送ACK(K+1)报文,发起第三次握手,服务器端收到ACK(K+1)报文后状态从SYN_RCVD进入ESTABLISHED,完成第三次握手

上面就完成了建立连接的3次握手,可以相互发送数据通信了。

FIN_WAIT_1:客户端主动关闭连接,向服务器端发送FIN(M)报文发起第一次握手,随即进入FIN_WAIT_1状态。

CLOSE_WAIT:服务器端收到FIN(M)报文,完成第一次握手。然后并向客户端发送ACK(M+1)报文发起第二次握手,随即进入CLOSE_WAIT状态,被动关闭。

FIN_WAIT_2:客户端收到ACK(M+1)报文后进入FIN_WAIT_2状态。完成第二次握手。此时客户端处于半连接(半关闭)状态,只能收不能发。

LAST_ACK:在CLOSE_WAIT状态下如果没有数据需要发送,此时关闭socket,发送FIN(N)给客户端,发起第三次握手如果客户端没有关闭,则不会发起第三次握手,此时客户端停留在CLOSE_WAIT状态,服务器端停留在FIN_WAIT_2状态

TIME_WAIT:客户端收到FIN(N)报文完成第三次握手,并向服务器端发送ACK(N+1)报文发起第四次握手,随即进入TIME_WAIT状态。客户端等待2MSL超时后进入CLOSE状态。

CLOSE:客户端发起第四次握手后,等待2MSL超时后进入CLOSE状态。服务器端收到ACK(N+1)报文完成第四次握手,进入CLOSE状态。

上面即完成了关闭连接的4次握手。

上面关闭时是按照“客户端发FIN—>客户端收到服务器端发的ACK—>客户端收到服务器端发的FIN—>客户端发ACK”的时序来的,但是实际情况还有两种可能,一是客户端同时收到服务器端发的ACK和FIN报文,二是客户端先收到服务器端发来的FIN报文之后才收到ACK报文。

特殊情况1:FIN_WAIT_1到TIME_WAIT的转换。由于FIN_WAIT_2是接收到服务器端的ACK报文后才能进入的状态,而TIME_WAIT是收到服务器端的FIN报文就可进入的状态,如果客户端发出FIN报文进入FIN_WAIT_1状态后,同时收到FIN和ACK报文,可以直接进入TIME_WAIT状态。

特殊情况2:当双方都主动关闭socket时,同时发送FIN报文,进入CLOSING状态,表示双方都在关闭socket。双方接收到FIN报文后,发送ACK报文,双方接收到后依次进入TIME_WAIT状态,等待2MSL超时后进入CLOSE状态。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值