四次挥手过程
首先,当前客户端和服务器的状态都为 established
第一次挥手
客户端发送FIN报文,表示请求释放连接
发送完毕后,客户端进入 FIN-WAIT-1 状态
第二次挥手
服务器收到FIN报文后,会返回一个ACK报文,表明自己接收到了客户端关闭连接的请求,但还没有准备好关闭连接
此时服务器进入 CLOSE-WAIT 状态
客户端收到这个ACK报文后,进入 FIN-WAIT-2 状态
第三次挥手
当服务器准备好关闭连接时,向客户端发送FIN报文,请求释放连接
发送完毕后,服务器进入 LAST-ACK 状态
第四次挥手
客户端接收到服务器的FIN报文后,知道服务器已经准备好关闭了,就返回一个ACK报文
同时进入 TIME-WAIT 状态,等待可能出现的要求重传的ACK报文
服务器接收到这个ACK报文后,关闭连接,进入 CLOSED 状态
客户端等待固定时间(2MSL)之后,没有收到服务器的ACK,认为服务器已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态
补充问题
1、为什么需要四次挥手?
关键在于中间2次挥手:
当服务器收到客户端的FIN报文后,不会立即关闭连接,所以只能先回复一个ACK报文,告诉客户端“我收到了你发的FIN报文了”;只有等服务器的报文都发送或者接收完了,才能发送FIN报文给客户端,完成第三次挥手
2、为什么客户端需要TIME-WAIT状态?
假设客户端在第四次挥手中 发送的ACK报文在网络中丢失了,那么服务器就会重发FIN报文,如果客户端在发完这个ACK报文后立即关闭连接,就无法收到服务器重发的FIN报文,导致服务器无法正常关闭TCP连接
3、为什么客户端的TIME-WAIT状态需要持续2MSL的时间?
- 第一:为了保证客户端发送的最后一个ACK报文能够到达服务器。 所谓MSL(Maximum Segment Lifetime)指的是一个报文在网络中最长的存活时间,而2MSL就是一个发送和一个回复报文所需的最大时间。如果2MSL之后,客户端都没有再次收到服务器的FIN报文,那么就推断第四次挥手的ACK报文已经被服务器成功接收,所以关闭TCP连接
- 第二:防止已失效的连接请求报文出现在本次连接中。在经过2MSL后,本次连接内产生的所有报文段都将从网络中小时,使得在下一个新的TCP连接中,不会出现旧的连接报文
感谢帅地的这篇文章对本文撰写 所提供的的帮助