TCP协议为啥会有三次挥手(close、shutdown)

一、前言

使用wireshrak抓包的时候,发现有的TCP断开连接,有的是三次挥手、有的是四次挥手,本文将带领带领大家一探究竟。

1. 四次挥手:
四次挥手
四次挥手流程回顾

第一次挥手: 主动关闭的一方(客户端或服务器)发送一个TCP段,其中包含一个FIN标记(Finish),表示它没有数据要发送给对方,但它仍能接收数据。
第二次挥手: 接收到FIN的一方发送一个ACK(Acknowledgement),确认收到FIN。
第三次挥手: 接收到FIN的一方发送一个FIN,表示它也没有数据要发送了,但它仍能接收数据。
第四次挥手: 主动关闭的一方发送一个ACK,确认收到FIN。

2. 三次挥手:
三次挥手

二、原因探索

2.1 现象:

  • 三次握手,使用close函数关闭的连接
  • 四次握手,使用shutdown函数来关闭的连接

2.2 close

close彻底关闭socket并释放资源

1.调用close函数将会完全关闭socket,不再允许任何读写操作。如果还有数据未发送给对方,系统会尝试在关闭前发送完这些数据(受TCP协议的控制)。在调用close之后,该socket描述符不再有效,不能再被用于读写操作。
2。 系统内核会将socket设置为不可读,任何读操作都会返回异常;在数据发送方向,系统内核尝试将发送缓冲区的数据发送给对端,并最后向对端发送一个FIN报文,接下来如果再对socket进行写操作会返回异常。

2.3 shutdown

shutdown提供了一种更为灵活的方式来关闭socket的一部分功能(接收、发送或两者都关闭)

shutdown函数允许指定关闭操作的类型:
SHUT_RD(0):关闭socket的接收操作。关闭连接的“读”,对该socket进行读操作返回 EOF,并且套接字上接收缓冲区已有的数据将被丢弃,如果再有新的数据流到达,会确认收到数据,返回ACK,但是数据包会被丢弃。
SHUT_WR(1):关闭socket的发送操作。关闭连接的“写”,在这种情况下,连接处于“半关闭”状态。套接字上发送缓冲区已有的数据将被立即发送出去,并发送一个 FIN 报文给对端。应用程序如果对该套接字进行写操作会报错。
SHUT_RDWR(2):同时关闭socket的接收和发送操作。

2.4 进一步原理

没有数据要发送」并且「开启了 TCP 延迟确认机制」,那么第二和第三次挥手就会合并传输,这样就出现了三次挥手。
在这里插入图片描述
TCP延迟确认

  • 当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方
  • 当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送
  • 如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK

挥手流程变化
在这里插入图片描述
参考内容:
https://blog.csdn.net/m0_67698950/article/details/126960476
https://blog.csdn.net/qq_61084129/article/details/136407189

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/28946.shtml

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

相关文章

算法安全自评估报告如何填写?(附模板)

之前,众森企服给大家讲过办理互联网信息服务算法备案有三部分组成:主体备案、算法备案和产品备案。 主体备案主要审查的就是一家主体公司是否有算法相应的规章制度,里面最主要的就是算法安全管理制度。 算法备案主要审查的就是算法本身的情…

【春秋云镜】Faculty Evaluation System未授权任意文件上传漏洞(CVE-2023-33440)

因为该靶场没有Write up,索性自己搞一下,方便别人,快乐自己! 漏洞概述: Sourcecodester Faculty Evaluation System v1.0 is vulnerable to arbitrary code execution via /eval/ajax.php?actionsave_user. 漏洞复现&#xff…

simdjson 高性能JSON解析C++库

simdjson 是什么 simdjson 是一个用来解析JSON数据的 C 库,它使用常用的 SIMD 指令和微并行算法来每秒解析千兆字节的 JSON,在Velox, ClickHouse, Doris 中均有使用。 加载和解析 JSON documents 出于性能考虑,simdjson 需要一个末尾有几个…

2024年高考:计算机相关专业前景分析与选择建议

2024年高考结束,面对计算机专业是否仍具有吸引力的讨论,本文将从行业趋势、就业市场、个人兴趣与能力、专业选择建议等多个角度进行深入分析,以帮助考生和家长做出明智的决策。 文章目录 一、行业趋势与就业市场1. 计算机行业的发展与变革2. …

49.Chome浏览器有三种清缓存方式

49.Chome浏览器有三种清缓存方式:正常重新加载、硬件重新加载、清空缓存并硬性重新加载 1、【正常重新加载】 触发方式:①F5  ②CtrlR  ③在地址栏上回车  ④点击链接 如果缓存不过期会使用缓存。这样浏览器可以避免重新下载JavaScript文件、图像、…

LINUX 精通 3.2

main里怎么实现 accept_cb 里的regist部分抽出来 // regist拉出来 int event_register(int fd, int event) {if (fd < 0) return -1;conn_list[fd].fd fd;conn_list[fd].r_action.recv_callback recv_cb;conn_list[fd].send_callback send_cb;memset(conn_list[fd].rbuff…

【吉林大学Java程序设计】第8章:IO流

第8章&#xff1a;IO流 1.流与相关类1.1 流的概念1.2 File类1.3 字节流及其方法1.4 字符流及其方法1.5 其他IO流&#xff08;1&#xff09;节点流&#xff08;2&#xff09;处理流&#xff08;过滤流&#xff09;&#xff08;3&#xff09;文件流基于字节的文件流基于节符的文件…

Shell脚本(.sh文件)如何执行完毕之后不自动关闭?

Shell脚本异常傲娇&#xff0c;出错后、执行完根本不给你机会让你查看报错信息、输出信息&#xff0c;直接闪退。 废话不多说&#xff0c;调教方法如下&#xff0c;直接在Shell脚本末尾加上如下代码&#xff1a; 1、实现方式一 1.1 使用read命令达到类似bat中的pause命令效果…

深度解析响应式异步编程模型

上一篇文章中我们聊了一下线程池,基于线程池的多线程编程是我们在高并发场景下提升系统处理效率的有效手段,但却不是唯一的。今天我们来看一下另一种异步开发的常用手段-响应式编程模型 传统多线程模型的缺陷 多线程模型是目前应用最为广泛的并发编程手段,但凡遇到什么性能…

语义分割——mmsegmentation框架使用

目录 1.mmsegmentation简介 2.mmsegmentation安装 3.mmsegmentation使用&#xff08;代码结构介绍&#xff09; 4.mmsegmentation使用实战&#xff08;deeplab v3为例&#xff09; 4.1配置 4.2训练&#xff1a; 4.3预测&#xff1a; 1.mmsegmentation简介 mmsegmentatio…

LogicFlow 学习笔记——11. 对齐线 和 键盘快捷键

对齐线 Snapline 对齐线能够在节点移动过程中&#xff0c;将移动节点的位置与画布中其他节点位置进行对比&#xff0c;辅助位置调整。位置对比有如下两个方面。 节点中心位置节点的边框 对齐线使用 普通编辑模式下&#xff0c;默认开启对齐线&#xff0c;也可通过配置进行关…

自己想要公开自己的学习方法,但是自己很害怕自己的学习方法是一个错误的,因为对于自己而言,专升本的机会只有一次

分享自己的学习方法可能需要一定的勇气&#xff0c;特别是当你担心可能会受到批评或是不被理解时。以下是一些建议&#xff0c;可以帮助你克服这种恐惧&#xff1a;&#xff08;kimi编辑器自己对于这些内容的基础批注&#xff09; 自我肯定&#xff1a;首先&#xff0c;认识到你…

安裝了windows,Ubuntu双系統,windows系統时间不对的修正方法

当你在电脑上安装双系统(如 Windows 和 Ubuntu)时,系统时间不同步的问题通常是由于这两个操作系统处理系统时间的方式不同而引起的。Windows 默认使用本地时间(Local Time),而 Ubuntu 和其他基于 Linux 的系统通常使用协调世界时(UTC)。 为了解决这个问题,可以选择让…

小程序开发的费用简介篇

小程序的价格跟很多因素有关系&#xff0c;比如你想要的复杂度、功能多不多等等 今天我就来具体说说开发一款APP&#xff0f;小程序到底需要多少 ❶功能复杂度&#xff1a;功能越多越复杂&#xff0c;开发时间和费用就越高&#xff0c;费用就会高 ❷设计要求&#xff1a;高级的…

RAG系列之:深入浅出 Embedding

RAG系列之&#xff1a;深入浅出 Embedding 什么是文本向量化&#xff1f; 文本向量化就是将文本数据转成数字数据&#xff0c;例如&#xff1a;将文本 It was the best of times, it was the worst of times. 转成 [0, 1, 0, 2, 2, 2, 2, 2, 0, 1]。 为什么要进行文本向量化…

深入Linux Core文件生成与自定义命名规则

Linux 作为广泛使用的运行平台&#xff0c;在程序运行崩溃时能及时记录 错误信息&#xff0c;是很方便的查询问题的方式&#xff0c;这里对怎么使用 Linux下的 错误信息记录 core文件&#xff0c;进行总结介绍。 引言 在Linux系统开发中&#xff0c;当程序发生崩溃时&#xf…

FinalShell 连接虚拟机超时,主机ping不通虚拟机,解决

出现问题&#xff1a; 连接主机...java.net.ConnectException: Connection timed out: connect 在排查错误时发现&#xff1a; 虚拟机内能互相ping通&#xff0c;虚拟机能ping通主机 但是主机的cmd命令ping不通虚拟机 问题原因&#xff1a; 虚拟机内能互相ping通&#xff0…

shop APP UI

APP和微信小程序不一样&#xff0c; APP的客户端需要两个(一个安卓&#xff0c;一个苹果IOS); APP的服务端需要&#xff08;管理端后台&#xff0c;接口&#xff09;&#xff1b;

CSS 列表样式(ul)全面解析

CSS 列表样式是前端开发中常用的一种技术&#xff0c;用于定义无序列表&#xff08;ul&#xff09;的外观和行为。无序列表在网页布局和内容展示中扮演着重要角色&#xff0c;从导航菜单到内容清单&#xff0c;无所不在。通过CSS可以对无序列表的各个方面进行自定义&#xff0c…

【Docker】解决访问难题:搭建私有的Docker镜像代理

什么是Nexus 3 Nexus 3是由Sonatype公司开发的一款强大的包管理和仓库服务工具&#xff0c;它广泛应用于自动化的构建系统和持续集成/持续部署(CI/CD)流程中。Nexus 3支持多种包格式&#xff0c;包括但不限于Maven、npm、Docker、NuGet等&#xff0c;能够为软件开发中的依赖管…