【Linux】四次挥手

客户端和服务器通过close()四次挥手断开连接。

关闭连接的过程为四次挥手,由于TCP是全双工的通讯。所以每个方向都必须单独进行关闭。当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向上的连接。收到一个FIN只意味着这一方向上没有数据流动一个TCP连接在收到一个FIN后仍能继续发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

第一次挥手:断开连接时,客户端向服务器发送FIN包(seq = x),用来关闭客户端到服务器的数据传送。并进入FIN_WAIT_1状态,等待服务器确认。

第二次挥手:服务器收到FIN包,必须确认客户端的FIN(即发送ACK包,ack = x+1),确认客户端到服务器的传送中断。并进入CLOSE_WAIT状态,客户端进入FIN_WAIT_2状态。

第三次挥手:服务器向客户端发送FIN包(seq = y),用来关闭服务器到客户端的数据传送。并进入LAST_ACK状态。

第四次挥手:客户端收到FIN包,必须确认服务器的FIN(即发送ACK包,ack = y=1),确认服务器到客户端的传送中断。并进入TIME_WAIT状态。

四次挥手示意图

挥手在某些情况下三次能完成吗?

可以。当本端关闭了连接,恰好也同时收到了对方的FIN报文,此时可以把自己的FIN和给对方的确认ACK合在一起发送,就变成了三次。

TIME_WAIT状态存在的意义?

TIME_WAIT状态是:主动断开连接的一端收到对端的FIN报文段并且将ACK报文段发出后的一种状态。

意义:

       保证迟来的报文段能被识别并丢弃。

       保证可靠的终止TCP连接。保证对端能收到最后一个ACK,如果ACK丢失,在TIME_WAIT状态本端还可以接受到对端重传的FIN报文段并重新发送ACK。所以TIME-WAIT的存在时间为2MSL。

TIME_WAIT和CLOSE_WAIT有什么区别?

CLOSE_WAIT是被动关闭的一端在接收到对端关闭请求(FIN报文段)并且将ACK发送出去后所处的状态。这种状态表示:收到了对端关闭的请求,但是本端还没有完成工作,还未关闭。

TIME_WAIT状态是在主动关闭的一端在本端已经关闭的前提下,收到对端的关闭请求(FIN报文段)并且将ACK发送出去后所处的状态。这种状态表示:双方都已经完成了工作,只是为了确保迟来的数据报能被识别并丢弃,可靠的终止TCP连接。

 

 

 

 

 

 

 

 

 

 

 

 

 

发布了20 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ifiwere/article/details/104602560