TCP断开连接为什么需要4次挥手?

news/2024/5/4 3:06:38

一、断开连接过程
由于TCP连接是全双工的,因此每个方向都必须单独关闭。客户端在数据发送完毕后发送一个结束数据段FIN,且服务端也返回确认数据段ACK,此时结束了客户端到服务端的连接;然后客户端接收到服务端发送的FIN,且服务端也收到了客户端发送的ACK之后,自此双方的数据通信完全结束。简单说来是 "先关读,后关写",一共需要四个阶段:服务器读通道关闭->客户机写通道关闭->客户机读通道关闭->服务器写通道关闭。

4次挥手中的每次"挥手"(即报文交换)都是对之前动作的确认,确保了数据的可靠传输直到连接完全关闭。例如,客户端发送FIN后进入FIN-WAIT-1状态,等待服务端的ACK;服务端收到FIN后发送ACK,并进入CLOSE-WAIT状态继续发送剩余数据,之后再发送FIN;客户端收到ACK后进入FIN-WAIT-2状态,收到服务端的FIN后发送最后一个ACK,并进入TIME-WAIT状态等待可能滞后的服务端数据报文,确认没有未送达的数据后,连接最终关闭。


二、需要4次挥手的原因
1.双方均可主动关闭:
与三次握手类似,4次挥手确保了双方都能够有序地关闭连接。双方都可以主动发起关闭连接的过程。
2.确认数据接收:
通过4次挥手过程中的ACK报文,每一方都确认收到了对方的FIN报文,确保了数据被可靠传输。
3.避免数据丢失:
在关闭连接之前,必须保证已经发送的数据被对方接收,同时也要允许对方发送的数据被本端接收。4次挥手过程提供了这样的机制,确保数据不会因为连接的关闭而丢失。
4.全双工通信:
TCP是全双工协议,意味着数据可以在两个方向上同时传输。因此,每个方向上的连接都需要独立关闭。每个方向上都要经历一次"我已完成发送"(FIN,Finish)的信号交换和对方对此的确认(ACK,Acknowledgment)。由于关闭连接涉及两个方向,所以至少需要两次这样的信号交换,总共4次挥手。这就是为什么需要两次FIN和两次ACK的原因。
5.关闭顺序的灵活性: 任一端(客户端或服务端)都可以主动发起关闭连接的请求。当一方(例如客户端)完成数据发送并准备关闭连接时,它会发送一个FIN报文给另一方(服务端)。服务端收到FIN后,确认已收到(发送ACK),但此时服务端可能还在发送数据或需要一些时间来清理资源。服务端完成数据发送后,也会发送自己的FIN报文给客户端,客户端再回复ACK确认。这种双向的关闭过程确保双方都同意关闭,并且各自的数据传输都已经结束。
6.等待足够时间:
在第4次挥手中,最初发送FIN报文的一方在发送ACK报文后,需要等待一段时间2*MSL(MSL:Maximum Segment  Lifetime报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间),以确保对方收到了这个ACK报文。这个过程称为TIME_WAIT状态,它有助于确保远程端正确关闭连接,并允许迟到的数据包到达。
7.资源释放:
4次挥手过程还负责适当地释放在建立连接时分配的资源,如端口号、内存缓冲区等。
8.保持一致性:
4次挥手保持了与三次握手过程的一致性。虽然它们的目的不同(三次握手用于建立连接,4次挥手用于断开连接),但都是为了保证TCP连接的可靠性和稳定性。


三、总结
总的来说,4次挥手是TCP协议为了确保连接可靠、有序地关闭而设计的,它允许双方都能完成数据的发送和确认,避免了数据丢失,并且确保了资源的合理释放。


致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享。

若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢。您的支持是我们为您提供帮助的最大动力。


http://www.mrgr.cn/p/05624746

相关文章

Vue3从入门到实践:深度了解新组件

1.Teleport 概念:Teleport(传送门)是一个新的特性,用于在DOM中的任意位置渲染组件。它允许你将组件的内容渲染到DOM中的另一个位置,而不受组件层次结构的限制。 下面举出例子解释: 1.新建App.vue文件作…

古典密码之棋盘密码(ADFGVX,ADFGX,Polybius)

引言 棋盘密码只加密字母,不区分大小写(ADFGVX棋盘还可加密数字),若输入其它字符则原样保留。若输入多行(段落),每行是单独加密的。 Polybius/ADFGX棋盘由于I/J在同一格,解密后需人工确认I和J。 ADFGX/ADFGVX棋盘原则上需要密钥二次加密,但可留空不使用密钥。若使用,…

射影几何学笔记

给大家拉坨大的。 在中学阶段,我们就研究过欧几里得平面上的几何。在初中阶段我们学习了平移与旋转,在高中阶段我们学习了仿射,这些几何变换有一个共同点:保持共线三点与共点三线在变换后仍共线或共点。然而在生活中,除了这些变换以外,还有更一般的变换也拥有这个性质:比…

Linux的学习之路:5、粘滞位与vim

摘要 这里主要是把上章没说完的权限的粘滞位说一下,然后就是vim的一些操作。 目录 摘要 一、粘滞位 二、权限总结 三、vim的基本概念 四、vim的基本操作 五、vim正常模式命令集 1、插入模式 2、从插入模式切换为命令模式 3、移动光标 4、删除文字 5、复…

Python开源工具库使用之词云Wordcloud

文章目录 前言一、基本使用1.1 文本生成词云1.2 配置项 二、进阶用法2.1 自定义形状2.2 自定义着色2.3 自定义词频2.4 中文 三、实际案例3.1 工作报告词云3.2 周杰伦歌词词云 四、总结4.1 优点和局限性4.2 展望未来发展 参考 前言 当我们需要将大量文本数据可视化展示时&#…

PTA图论的搜索题

目录 7-1 列出连通集 题目 输入格式: 输出格式: 输入样例: 输出样例: AC代码 7-2 六度空间 题目 输入格式: 输出格式: 输入样例: 输出样例: 思路 AC代码 7-3 地下迷宫探索 题目 输入格式: 输出格式: 输入样例1: 输出样例1: 输入样例2: 输出样例2: 思路 …

SQL刷题---2021年11月每天新用户的次日留存率

解题思路: 1.首先算出每个新用户注册的日期,将其命名为表a select uid,min(date(in_time)) dt from tb_user_log group by uid2.计算出每个用户登录的天数,将其命名为表b select uid,date(in_time) dt from tb_user_log union select uid,date(out_time) dt fro…

Anaconda Navigator启动卡在loading applications界面(同时莫名启动了VSCODE)

0.问题 参考:anaconda navigator启动时一直卡在 loading applications 页面 我的问题和网上普遍的不太一样, 首先我能找到conda_api.py, 但是不是在D:\anaconda\Lib\site-packages\anaconda_navigator\api文件夹下,而是在...\anaconda3\pkgs\anaconda-project-0.11.1-py311haa9…

C盘越用越大?教你如何科学管理C盘空间

前言: 如图,左边是我多开的E5电脑,装的是LTSC2019_210707F多开封装版,C盘占用8.5GB,右边是我平常打游戏写代码的电脑,装的是Win11 22H2,C盘占用30GB。两台电脑都关闭了休眠,C盘的虚拟…

STM32学习和实践笔记(15):STM32中断系统

中断概念 CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂 时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序 或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序 继…

Edge崩溃(Edge错误代码STATUS_ACCESS_DENIED的修复方法)

0.问题 今天由于在编写自动化脚本,edge浏览器自动填充表单功能十分烦人,会导致测试失败遂在选择每次关闭时清除浏览数据时, 全选了所有选项(后来发现实际上只需要删除自动填充表单即可)然后重启edge后,坏事来了,首先旁边提示...扩展出错,请重新加载,而且所有网页(包括setting设…

解决 Win11 微软拼音输入法下 JetBrains IDE Shift+F6 失效的问题

如果你使用 Win11 系统下的微软拼音输入法,同时又在使用 JetBrains 系列的 IDE,你可能会发现 "Refactor -> Rename..." 功能对应的默认快捷键 Shift+F6 按了之后没有反应,但通过菜单执行这个操作是正常的。这个问题目前基本可以确定是微软拼音输入法引起的。 目…

C# 动态加载dll

方式1 using System; using System.Reflection;class Program {static void Main(){string dllPath "path/to/your/library.dll"; // 替换为你的DLL文件路径Assembly myAssembly Assembly.LoadFile(dllPath);Type myType myAssembly.GetType("YourNamespace…

4.19第二天冲刺

晨会1.人员:袁兴兰、齐飞跃、王瑞2.会议讨论袁兴兰:1)昨天完成寻找免费api,完成博客的整理2)今天打算收集数据,美化页面3)没有遇到问题 齐飞跃:1)昨天学习调用第三方库或第三方api2)今天完成优化api返回的结果3)没有遇到问题王瑞:1)昨天完成画出安卓前端页面2)今…

重复组合理论与公式

从n个球当中,取出k个球,k个球允许重复出现,问有几种可能。 解答: 假设现在有编号的n个球,每一个编号的球有个,那么会有等式: ,现在问题就转化为该等式一共有多少解? 这里使用间隔法,即使用(n-1)个分隔符分隔得到n个空间,使得每一个空间之和为k. 假设这里一共有5个球…

【C语言】【数据结构】项目实践——贪吃蛇游戏(超详细)

前言 本篇博客我们来实现一个小游戏项目——贪吃蛇,相信肯定很多人都玩过,那么整个贪吃蛇是怎么实现出来的那,这个项目用到了很多方面的知识:C语言函数、枚举、结构体、动态内存管理、预处理指令、链表、Win32 API等。我们就通过这…

MySQL-05.存储引擎

C-05.存储引擎 为了方便管理,把连接管理,查询缓存,语法解析,查询优化这些不涉及真实数据存储的功能划分为MySQL Server的功能,把真实存取数据的功能划分为存储引擎的功能。所以在MySQL Server完成了查询优化后,只需按照生成的执行计划调用底层存储引擎提供的API,获取到数…

一文玩转Seaborn热力图中调色板设置

1.引言 在前文中我们介绍了如何利用Seaborn绘制热力图,并详细介绍了各种热力图中的控制条件。本文重点介绍如何控制绘制热力图中的调色板。 闲话少说,我们直接开始吧! 2.举个栗子 我们首先来看个上一节的栗子,代码如下&#x…

前三次大作业总结

一、前言 这三次作业都是完成一个答题判题程序,但是每一次的都在增加新的内容,所以难度逐次增加。 1.第一次作业 程序输入三部分内容:题目数量、题目内容、答题信息。设计类并根据所输入的信息使用正则表达式进行切割,把每一部分存进各个对象中的属性中并调用函数进行判题。…

CentOS如何使用Docker部署Plik服务并实现公网访问本地设备上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问,实现随时随地在任意设备上传或者…