第一次挥手(Active Close):
客户端发送一个FIN(Finish)报文给服务器,表示客户端不再发送数据。客户端进入FIN_WAIT_1状态,等待服务器的确认。
第二次挥手(Passive Close):
服务器收到客户端的FIN报文后,发送一个ACK(Acknowledge)报文作为确认,表示已经收到了客户端的关闭请求。服务器进入CLOSE_WAIT状态。此时,服务器可能还有未发送完的数据,因此仍可以发送数据给客户端。
第三次挥手(Passive Close):
服务器发送一个FIN报文给客户端,表示服务器也准备关闭连接。同时,服务器通知客户端:我已经没有数据要发送了。服务器进入LAST_ACK状态。
第四次挥手(Active Close):
客户端收到服务器的FIN报文后,发送一个ACK报文作为确认。客户端进入TIME_WAIT状态,并等待一段时间(两个最大报文段生存时间的时间),以确保服务器接收到了ACK报文。
在等待时间结束后,客户端关闭了连接,进入CLOSED状态。服务器接收到ACK报文后,也关闭了连接,进入CLOSED状态。
服务器在发送最后一个FIN报文后,并不会立即断开连接,而是进入LAST_ACK状态。在LAST_ACK状态下,服务器等待客户端发送确认的ACK报文。
在接收到客户端的确认ACK报文后,服务器才会关闭连接并进入CLOSED状态。这个过程中,服务器也需要等待一段时间以确保客户端接收到ACK报文,避免出现网络延迟或丢包导致的问题。
因此,可以说服务器在发送最后一个FIN报文后并不立即断开连接,而是等待客户端的确认ACK报文后才关闭连接。这样做是为了确保连接的正常关闭,并保证数据的可靠传输。
如果服务器最后发送的FIN报文没有收到客户端的ACK报文,那么服务器就无法确认连接已经被关闭,因此不能立即关闭连接。在这种情况下,服务器会等待一段时间(通常是2倍的最大报文段生存时间)以确认ACK报文是否丢失或者延迟到达。
如果在等待时间结束后服务器仍然没有收到客户端的ACK报文,那么服务器就会强制关闭连接。在强制关闭连接后,服务器可能会向上层应用程序或者其他系统发送错误报告或日志,以提醒管理员发现和修复问题。
需要注意的是,在正常情况下,四次挥手过程中服务器不会强制关闭连接,除非发送的FIN报文丢失或者延迟到达导致ACK报文没有及时到达。四次挥手过程中的等待时间是为了保证数据传输的可靠性和完整性,并尽可能避免数据丢失或损坏。
标签:挥手,ACK,报文,四次,关闭,服务器,FIN,客户端 From: https://www.cnblogs.com/lzfyz/p/17703834.html