字节二面:TCP断开连接是怎样的?

网络 网络管理
在用户注册或重置密码时,系统通常会发送一封确认邮件,要求用户点击链接以验证其操作。这一过程可能设置一个有效期,在有效期内,如果用户没有完成确认,操作将被取消。这类似于 TIME-WAIT 状态中的等待,以确保操作的确认和安全。

前言

大家好,我是田螺。

有位星球粉丝去字节面试,被问了这道题: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 状态中的等待,以确保操作的确认和安全。

责任编辑:武晓燕 来源: 捡田螺的小男孩
相关推荐

2022-12-02 13:49:41

2021-06-30 17:38:03

Trie 树字符Java

2024-04-19 08:05:26

锁升级Java虚拟机

2021-03-01 11:53:15

面试伪共享CPU

2022-01-17 14:24:09

共享字节面试

2024-09-11 09:50:22

2021-10-26 00:07:35

TCP连接python

2022-09-05 14:36:26

服务端TCP连接

2022-08-11 13:34:13

SDK监控多环境

2022-10-19 14:08:42

SYNTCP报文

2021-03-15 11:20:46

HTTPS优化前端

2021-01-26 01:55:24

HTTPS网络协议加密

2020-04-21 12:09:47

JVM消化字节码

2023-12-01 14:57:22

TCP连接

2021-04-25 09:58:48

mmapJava面试

2024-11-20 16:00:19

MybatisJava数据库

2021-03-17 15:54:32

IO零拷贝方式

2024-04-03 09:01:34

SpringTomcat容器

2012-09-24 15:13:50

C#网络协议TCP

2022-09-13 14:42:35

Redis内存函数
点赞
收藏

51CTO技术栈公众号