简述TCP四次挥手

四次挥手过程

首先,当前客户端和服务器的状态都为 established

image-20201028152842414

第一次挥手

客户端发送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连接中,不会出现旧的连接报文

感谢帅地的这篇文章对本文撰写 所提供的的帮助

posted @ 2020-10-28 15:31  BAEBAE996  阅读(1005)  评论(0编辑  收藏  举报