四次挥手只有一个目的:让双方都知道对方想要断开连接并且把该传输的数据都传输完
假设是由有客户端发起的断开请求:
第一次挥手:客户端给服务器端发送一个FIN标志位和seq,就像是在告诉服务器,"我想跟你断开连接,但是如果你有数据还想跟我发送的话可以发,或者你也想断开的话,你告诉我一声”,第一次挥手之后,客户端处于FIN_WAIT1状态
第二次挥手:第二次就是回应客户端,“我收到你的FIN了,我知道你要分手,你等我把数据发完咱们就分手吧”,并回复ACK,acknum,seq,(这些东西在数据传输的过程中都是必不可少的,因为TCP传输的可靠性嘛)然后服务器端进入CLOSE_WAIT状态,而客户端这个时候是处于FIN_WAIT2状态
第三次挥手:经过第二次挥手之后,把该发的数据发完了,他就向客户端发送FIN标志位,就像是在告诉客户端,“我传完数据了,我也要跟你断开连接,分手吧”,之后服务器端就进入LAST_ACK状态,就坐等客户端最后的ACK信息
第四次挥手:客户端收到FIN之后,会给服务器端发送最后的ACK,但是这个时候他不相信网络,他怕服务端收不到,还以为我客户端反悔了,我不想分手了,所以他会进入一个TIME_WAIT状态,这个状态就是让客户端等待2MSL的时间再关闭,如果2MSL时间内没有重新收到服务器端FIN的消息,就证明服务器那边已经收到了我的ACK并且已经关闭连接,那我客户端也关闭连接吧;然后他们都处于了CLOSE状态
这就是TCP四次挥手的过程
注:哪方主动断开,哪方就会存在TIME_WAIT状态