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

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.rhkb.cn/news/27461.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek掘金——DeepSeek-R1图形界面Agent指南

DeepSeek掘金——DeepSeek-R1图形界面Agent指南 本文将指导你完成设置 DeepSeek R1 和 Browser Use 的过程,以创建能够执行复杂任务的 AI 代理,包括 Web 自动化、推理和自然语言交互。 开源大型语言模型 (LLM) 的兴起使得创建可与 OpenAI 的 ChatGPT Operator 等专有解决方案…

K8S学习之基础六:k8s中pod亲和性

Pod节点亲和性和反亲和性 podaffinity:pod节点亲和性指的是pod会被调度到更趋近与哪个pod或哪类pod。 podunaffinity:pod节点反亲和性指的是pod会被调度到远离哪个pod或哪类pod 1. Pod节点亲和性 requiredDuringSchedulingIgnoredDuringExecution&am…

Lua | 每日一练 (4)

💢欢迎来到张胤尘的技术站 💥技术如江河,汇聚众志成。代码似星辰,照亮行征程。开源精神长,传承永不忘。携手共前行,未来更辉煌💥 文章目录 Lua | 每日一练 (4)题目参考答案线程和协程调度方式上…

数据结构:二叉搜索树(排序树)

1.二叉搜索树的定义 二叉搜索树要么是空树,要么是满足以下特性的树 (1)左子树不为空,那么左子树左右节点的值都小于根节点的值 (2)右子树不为空,那么右子树左右节点的值都大于根节点的值 &#…

SpringBoot快速入门

快速入门 1). 创建springboot工程,并导入 mybatis的起步依赖、mysql的驱动包、lombok等。 项目工程创建完成后,自动在pom.xml文件中,导入Mybatis依赖和MySQL驱动依赖。如下所示: 2). 数据准备:创建用户表user&#xf…

DataWorks (数据工厂)介绍

介绍 DataWorks 是阿里云推出的一体化大数据开发与治理平台,曾用名"数据工厂""大数据开发套件" 最新版本是3.0 它是一套基于MaxCompute(原ODPS)的DW(数据仓库)解决方案,它集成了阿里多年的DW实施经验&…

信息技术知识赛系统设计与实现(代码+数据库+LW)

摘 要 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装信息技术知识赛系统软件来发挥其高效地信息处理的作用&…

VirtualBox虚拟机转VM虚拟机

前言:部分靶机只适用于VirtualBox,VM打不开VirtualBox的文件,所以需要进行转换 前置条件:本机已经下载VM和VirtualBox 第一步:文件转换 找到VirtualBox.exe所在位置,启动cmd窗口 文件转换的命令&#xf…

ArcGIS操作:11 计算shp矢量面的质心坐标

1、打开属性表 2、添加字段 3、设置字段名称、类型 4、选择创建的字段,计算几何 5、选择属性质心的x坐标、坐标系(y坐标同理) 注意:计算坐标一般使用的是地理坐标系(投影坐标系转地理坐标系教程:ArcGIS操作…

使用 DeepSeek 生成流程图、甘特图与思维导图:结合 Typora 和 XMind 的高效工作流

在现代工作与学习中,可视化工具如流程图、甘特图和思维导图能够极大地提升信息整理与表达的效率。本文将详细介绍如何使用 DeepSeek 生成 Mermaid 文本,结合 Typora 快速生成流程图和甘特图,并通过 Markdown 格式生成思维导图,最终…

【Cadence仿真学习笔记】ADS Dynamic Link报错model is reserved的解决办法

首先创建好原理图 创建symbol 在library manager下就会出现symbol了 在Cadence的CIW窗口中运行ADS dynamic link 打开ADS后,创建对应的cellview 加入控件OPTIONS 加入网表netlist 这个时候的Netlist没有路径 点击加载symbol 把原来的netlist include删掉…

【二.提示词工程与实战应用篇】【1.提示词工程入门:AI对话的艺术】

大家好,今天咱们来聊聊一个特别有意思的话题——提示词工程。你可能已经听说过这个词,或者在使用AI工具时不经意间接触过它。但提示词工程到底是什么?它为什么这么重要?咱们今天就来深入探讨一下,看看它是如何影响我们与AI的对话,以及如何在实际应用中发挥作用的。 什么…

[密码学实战]Java实现国密(SM2)密钥协商详解:原理、代码与实践

一、代码运行结果 二、国密算法与密钥协商背景 2.1 什么是国密算法? 国密算法是由中国国家密码管理局制定的商用密码标准,包括: SM2:椭圆曲线公钥密码算法(非对称加密/签名/密钥协商)SM3:密码…

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…

制服小程序的“滑手”:禁用页面左右滑动全攻略

哈哈,看来你已经很聪明地发现了小程序中左右滑动的“顽皮”行为!😄 没错,我们可以通过设置 disableScroll 属性来“管教”它,同时结合 CSS 样式让页面既禁得住横向“乱跑”,又能顺畅地上下滚动。你的方案已…

蓝桥备赛(六)- C/C++输入输出

一、OJ题目输入情况汇总 OJ(online judge) 接下来会有例题 , 根据一下题目 , 对这些情况进行分析 1.1 单组测试用例 单在 --> 程序运行一次 , 就处理一组 练习一:计算 (ab)/c 的值 B2009 计算 (ab)/c …

Golang的性能分析指标解读

Golang的性能分析指标解读 一、概述 语言)是一种由Google开发的开源编程语言,以其并发性能和高效的编译速度而闻名。对于程序员来说,了解如何对Golang应用程序进行性能分析是非常重要的,因为这能帮助他们发现潜在的性能瓶颈并对其…

【前端基础】Day 8 H5C3提高

目录 1. HTML5新特性 1.1 新增语义化标签 1.2 新增多媒体标签 1.3 新增input类型 1.4 新增表单属性 2. CSS3的新特性 2.1 新增选择器 2.1.1 属性选择器 2.1.2 结构伪类选择器 2.1.3 伪元素选择器(重点) 2.2 CSS3盒子模型 2.3 CSS3其他特性&a…

Android系统_Surface绘制流程

目录 一,框架图 二,核心代码 一,框架图 对上面这张图的总结 二,核心代码 /Volumes/aosp/android-8.1.0_r52/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp void SurfaceFlinger::onMessageReceived(int32_t what) {ATRACE_CALL();switch (what) {case Mes…

CDefView::_OnFSNotify函数分析

进入CDefView::_OnFSNotify函数时状态栏 _UpdateStatusBar函数之后增加一个对象,变成7个对象。 LRESULT CDefView::_OnFSNotify(LONG lNotification, LPCITEMIDLIST* ppidl) { LPITEMIDLIST pidl; LPCITEMIDLIST pidlItem; // we may be registered for no…