TCP的四次挥⼿为什么是四次?为什么不能是三 次

news/2025/3/4 6:50:06/

TCP 四次挥手(Four-way Handshake)用于终止一个已经建立的 TCP 连接。之所以是四次挥手,而不是三次,是因为 TCP 是全双工的(full-duplex),这意味着数据可以在两个方向上同时传输。因此,关闭连接需要双方分别确认关闭请求。

四次挥手的过程:

  1. FIN (Client -> Server):

    • 客户端想要关闭连接(假设客户端主动关闭)。
    • 客户端发送一个 FIN 报文段(FIN=1,seq=u)到服务器。
      • FIN=1 表示这是一个 FIN 报文段(请求关闭连接)。
      • seq=u 表示客户端的序列号。
    • 客户端进入 FIN_WAIT_1 状态。
  2. ACK (Server -> Client):

    • 服务器收到客户端的 FIN 报文段。
    • 服务器发送一个 ACK 报文段(ACK=1, seq=v, ack=u+1)到客户端。
      • ACK=1 表示这是一个 ACK 报文段。
      • seq=v 表示服务器的序列号。
      • ack=u+1 表示服务器期望接收的下一个序列号(即客户端的 FIN 报文段的序列号加 1)。
    • 服务器进入 CLOSE_WAIT 状态。
    • 客户端收到服务器的 ACK 报文段后,进入 FIN_WAIT_2 状态。
  3. FIN (Server -> Client):

    • 服务器准备好关闭连接(例如,服务器已经发送完所有数据)。
    • 服务器发送一个 FIN 报文段(FIN=1, seq=w, ack=u+1)到客户端。
      • FIN=1 表示这是一个 FIN 报文段。
      • seq=w 表示服务器的序列号 (注意, w可能等于v, 也可能不等于,取决于服务器是否在等待 ACK 期间发送了数据)。
      • ack=u+1,表示服务器期望接收的下一个序列号与上次 ACK 相同。
    • 服务器进入 LAST_ACK 状态。
  4. ACK (Client -> Server):

    • 客户端收到服务器的 FIN 报文段。
    • 客户端发送一个 ACK 报文段(ACK=1, seq=u+1, ack=w+1)到服务器。
      • ACK=1 表示这是一个 ACK 报文段。
      • seq=u+1 表示客户端的下一个序列号(即客户端上次发送的 FIN 报文段的序列号加 1)。
      • ack=w+1 表示客户端期望接收的下一个序列号(即服务器的 FIN 报文段的序列号加 1)。
    • 客户端进入 TIME_WAIT 状态(等待 2MSL 时间,以确保服务器收到 ACK,并防止延迟的报文段影响新的连接)。
    • 服务器收到客户端的 ACK 报文段后,进入 CLOSED 状态。

为什么不能是三次挥手?

不能是三次挥手的主要原因是 TCP 的半关闭(half-close)特性。

  • 半关闭: TCP 允许一方(例如客户端)关闭它的发送通道,但仍然可以接收数据。这意味着即使客户端发送了 FIN 报文段,它仍然可以接收来自服务器的数据,直到服务器也发送 FIN 报文段。

  • 三次挥手的问题: 如果只有三次挥手,服务器在收到客户端的 FIN 报文段后,立即发送 FIN+ACK 报文段,那么客户端就无法再接收服务器可能发送的剩余数据。

  • 四次挥手如何解决问题

    • 服务器收到客户端的FIN后,发送ACK,表示自己知道客户端要关闭连接了。
    • 但是服务器可能还有数据要发送,所以需要等待。
    • 当服务器数据发送完毕,再发送FIN给客户端。
    • 客户端回复ACK,连接关闭。

四次挥手的必要性:

  • 确保数据完整传输: 服务器在收到客户端的 FIN 报文段后,可以继续发送数据,直到数据发送完毕。
  • 允许半关闭: 客户端可以先关闭发送通道,但仍然可以接收数据。
  • 避免数据丢失: 四次挥手确保了双方都确认了对方要关闭连接,避免了数据丢失。

四次挥手的状态变化:

  • FIN_WAIT_1: 客户端发送 FIN 报文段后进入的状态。
  • FIN_WAIT_2: 客户端收到服务器的 ACK 报文段后进入的状态。
  • CLOSE_WAIT: 服务器收到客户端的 FIN 报文段后进入的状态。
  • LAST_ACK: 服务器发送 FIN 报文段后进入的状态。
  • TIME_WAIT: 客户端发送 ACK 报文段后进入的状态(等待 2MSL 时间)。
  • CLOSED: 连接完全关闭。

TIME_WAIT 状态的作用:

  • 确保服务器收到 ACK: 如果服务器没有收到客户端的 ACK 报文段,它会重传 FIN 报文段。TIME_WAIT 状态允许客户端重新发送 ACK 报文段。
  • 防止延迟的报文段影响新的连接: 2MSL (Maximum Segment Lifetime,报文段最大生存时间) 时间足够长,可以确保网络中所有延迟的报文段都消失,避免影响新的连接。

总结:

  • TCP 四次挥手是为了可靠地关闭全双工连接。
  • 不能是三次挥手,因为 TCP 支持半关闭,需要双方分别确认关闭请求。
  • 四次挥手确保了数据完整传输,允许半关闭,并避免了数据丢失。
  • TIME_WAIT 状态确保了服务器收到 ACK,并防止延迟的报文段影响新的连接。

四次挥手是 TCP 协议为了保证可靠性而设计的,虽然比三次挥手多了一次交互,但它确保了连接的正确关闭,避免了数据丢失和潜在的问题。


http://www.ppmy.cn/news/1576483.html

相关文章

java2025热点面试题之springmvc

1. 请解释Spring MVC的工作原理。 答案: Spring MVC是一个基于Java的MVC框架,用于构建Web应用程序。其工作原理如下: 客户端发送请求到DispatcherServlet,它是Spring MVC的前端控制器。DispatcherServlet查询HandlerMapping&…

升级Office软件后,Windows 系统右键里没有新建Word、Excel、PowerPoint文件的解决办法

我办公用的电脑,Office 2013 已经用了好多年,最近突发奇想给升级到了 Ofiice 2024。升级过程还蛮顺利的,但是安装完成后,发现点右键里没有新建Word、Excel、PowerPoint,开始菜单里 Word、Excel、PowerPoint 使用都正常…

Unclutter for Mac v2.2.12 剪贴板/文件暂存/笔记三合一 支持M、Intel芯片

在你工作学习时,剪切的内容,需要暂存的文件和暂存的文字都可以放在这里,告别杂乱桌面,让mac井井有条。 应用介绍 Unclutter for mac本身是一个多功能的隐藏菜单,里面包含Clipboard(剪切板)&am…

flutter 专题 八十 Flutter 应用性能检测与优化

概述 软件项目的交付是一个复杂且漫长的过程,任何细小的失误都有可能导致交付过程失败。在软件开发过程中,除了代码逻辑的 Bug 和视觉异常这些功能层面的问题之外,移动应用另一类常见的问题是性能问题,比如滑动操作不流畅、页面出…

算法学习笔记:169. 多数元素——摩尔投票算法(Moore‘s Voting Algorithm)

摩尔投票算法 摩尔投票算法最早由 Robert S. Boyer 和 J Strother Moore 在 1981 年的论文 “MJRTY—A Fast Majority Vote Algorithm” 中提出。这篇论文描述了摩尔投票算法的原理和证明,并展示了它在实际应用中的高效性。 论文的引用信息如下: Title: …

(七)消息队列-Kafka 序列化avro(传递)

(七)消息队列-Kafka 序列化avro(传递) 客从远方来,遗我双鲤鱼。呼儿烹鲤鱼,中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台,图片依然保持最初发布的水印&…

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释

基于 ‌MySQL 数据库‌对三级视图(用户视图、DBA视图、内部视图)的详细解释,结合理论与实际操作说明: 一、三级视图核心概念 数据库的三级视图是 ANSI/SPARC 体系结构的核心思想,MySQL 的实现逻辑如下: …

0301 leetcode - 1502.判断是否能形成等差数列、 682.棒球比赛、657.机器人能否返回原点

1502.判断是否能形成等差数列 题目 给你一个数字数组 arr 。 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 。 如果可以重新排列数组形成等差数列,请返回 true ;否则,返回 false…