前言
大家好,我是田螺。
有位星球粉丝去字节面试,被问了这道题:TCP断开连接是怎么样的?
大家第一感觉会不会不知道怎么去回答?其实呢,就是换个角度在问TCP的四次挥手过程而已。
TCP断开连接(也称为TCP连接终止或关闭连接)是指在TCP协议中,通信双方结束会话并释放占用的资源的过程。断开连接使用了一个类似于建立连接的四次挥手过程,以确保双方都安全地关闭连接。
如果是我,我会按这几个角度来回答:
- 四次挥手过程
- TCP挥手为什么需要四次呢?
- TIME-WAIT 状态为什么需要等待 2MSL
1. 四次挥手过程
图片
- 第一次挥手(FIN=1,seq=u),发送完毕后,客户端进入FIN_WAIT_1 状态
- 第二次挥手(ACK=1,ack=u+1,seq =v),发送完毕后,服务器端进入CLOSE_WAIT 状态,客户端接收到这个确认包之后,进入 FIN_WAIT_2 状态
- 第三次挥手(FIN=1,ACK1,seq=w,ack=u+1),发送完毕后,服务器端进入LAST_ACK 状态,等待来自客户端的最后一个ACK。
- 第四次挥手(ACK=1,seq=u+1,ack=w+1),客户端接收到来自服务器端的关闭请求,发送一个确认包,并进入 TIME_WAIT状态,等待了某个固定时间(两个最大段生命周期,2MSL,2 Maximum Segment Lifetime)之后,没有收到服务器端的 ACK ,认为服务器端已经正常关闭连接,于是自己也关闭连接,进入 CLOSED 状态。服务器端接收到这个确认包之后,关闭连接,进入 CLOSED 状态。
2. TCP挥手为什么需要四次呢?
举个例子吧! 假设小明和小红打电话聊天,差不多要结束了:
图片
小明和小红打电话聊天,通话差不多要结束时,小红说“我没啥要说的了”,小明回答“我知道了”。但是小明可能还会有要说的话,小红不能要求小明跟着自己的节奏结束通话,于是小明可能又叽叽歪歪说了一通,最后小明说“我说完了”,小红回答“知道了”,这样通话才算结束。”
3. TIME-WAIT 状态为什么需要等待 2MSL
MSL,Maximum Segment Lifetime,是指一个 TCP 报文段在网络中存活的最长时间、 2MSL,即两个最大段生命周期。我们先回头看看挥手这张图:
图片
- 第一个 MSL 确保所有在网络中延迟的报文段(包括 FIN 和 ACK)能够到达。
- 第二个 MSL 确保如果对方未收到 ACK 而重传 FIN,该报文能够到达并被正确处理。
专业点说,等待2MSL是为了确保 TCP 连接的可靠性和一致性。
3.1. 确保最后的 ACK 能够被对方接收
当主动关闭的一方发送最后一个 ACK 后,如果这个 ACK 报文在传输过程中丢失,另一方会重新发送 FIN 报文。TIME-WAIT 状态的 2MSL 时间足够长,可以确保如果对方没有收到 ACK,重发的 FIN 报文仍然能够被接收到并处理,重新发送 ACK。如果主动关闭的一方在发送 ACK 后立即关闭了连接,那么对方如果重发 FIN,将不会收到响应,可能导致连接未能正常关闭。
3.2 防止旧的重复报文段影响新连接
TCP 连接的每个报文段都有一个序列号。如果一个 TCP 连接在关闭后立即被重新建立,而之前的连接中传输的某些报文由于网络延迟而滞后到达,这些旧的报文段可能会被误认为是新连接的一部分,从而引起混乱。TIME-WAIT 状态等待 2MSL 的时间,足够让网络中所有旧的报文段都过期,从而避免它们对新连接造成干扰。
3.3 一些类似的后端思想
邮件确认链接:
在用户注册或重置密码时,系统通常会发送一封确认邮件,要求用户点击链接以验证其操作。这一过程可能设置一个有效期,在有效期内,如果用户没有完成确认,操作将被取消。这类似于 TIME-WAIT 状态中的等待,以确保操作的确认和安全。