为什么 TCP 是3次握手4次挥手?

news/2025/9/23 0:10:15/文章来源:https://www.cnblogs.com/lemos/p/19106410

为什么 TCP 是3次握手4次挥手?

① 为什么是三次握手?(A: 客户端,B: 服务器)

TCP连接是全双工的,意味着数据在两个方向上可以同时传输。因此,建立连接的关键是确保双方都具有发送和接收的能力,并且要同步双方的初始序列号(Sequence Number, SN),这是TCP可靠性传输的基石。

  1. 第一次握手 (SYN):客户端发送一个SYN包(SYN=1)到服务器,并选择一个初始序列号 seq = x。这表示:“你好服务器,我想建立连接。我的初始序列号是x。”

意义:客户端证明了自己有发送能力。

  1. 第二次握手 (SYN-ACK):服务器收到SYN包后,必须进行确认。它发送一个SYN-ACK包(SYN=1, ACK=1),确认号为 ack = x + 1,同时自己也选择一个初始序列号 seq = y。这表示:“收到你的请求了(x),我同意建立连接。我的初始序列号是y。”

意义:服务器证明了自己有接收能力和发送能力。

  1. 第三次握手 (ACK):客户端收到服务器的SYN-ACK包后,再次发送一个ACK包(ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1。这表示:“收到你的同意了(y),连接已建立,我们可以开始发送数据了。”

意义:客户端证明了自己有接收能力。

② 为什么是四次挥手?(A: 主动关闭方,B: 被动关闭方)

TCP连接是全双工的,这意味着数据在两个方向上独立传输。因此,关闭连接需要分别关闭这两个方向的数据流。

  1. 第一次挥手 (FIN):主动关闭方(比如客户端)发送一个FIN包(FIN=1),序列号为 seq = u。这表示:“我这边没有数据要发送了,准备关闭连接。”(即关闭客户端到服务器的数据通道)

意义:主动方通知对方,我发完了。

  1. 第二次挥手 (ACK):被动关闭方(服务器)收到FIN后,发送一个ACK包(ACK=1),确认号为 ack = u + 1。这表示:“知道你发完了。”

意义:被动方确认收到了主动方的关闭请求。此时,从主动方到被动方这个方向的连接就关闭了。但服务器可能还有数据没发完。

  1. 第三次挥手 (FIN):当被动方也准备好了关闭连接时(数据处理完了),它发送一个FIN包(FIN=1),序列号为 seq = w。这表示:“我这边也发完了,我也要关闭了。”(即关闭服务器到客户端的数据通道)

意义:被动方发起自己方向的关闭请求。

  1. 第四次挥手 (ACK):主动关闭方收到FIN后,发送一个ACK包(ACK=1),确认号为 ack = w + 1。这表示:“知道你也要关了,再见。”

意义:主动方确认被动方的关闭请求。此时,整个TCP连接才正式关闭。

③ 可以将第二次挥手的ACK和第三次挥手的FIN合并成一个包发送吗?

可以,但前提是对方没有数据要发送了。在很多情况下,服务器收到FIN时可能正在发送数据,所以ACK先发出去,等所有数据发完再发FIN,这就自然形成了四次挥手。Linux内核中有一个选项 tcp_fin_timeout 来控制这个行为。

④ tcp_fin_timeout 作用是?

TCP 四次挥手中主动关闭方的状态变化:

  1. 主动关闭方(如 Client)发送 FIN 包,进入 FIN-WAIT-1 状态。
  2. 收到对端(如 Server)回应的 ACK 包后,进入 FIN-WAIT-2 状态。此时,tcp_fin_timeout 计时器开始生效。
  3. 在 FIN-WAIT-2 状态,主动关闭方等待对端发送它自己的 FIN 包(即第三次挥手)。
  4. 有两种可能的结果:
    正常情况:在 tcp_fin_timeout 超时之前,收到了对端的 FIN 包。主动关闭方回复 ACK(第四次挥手),然后连接直接进入 TIME-WAIT 状态,FIN-WAIT-2 状态结束。
    异常情况:对端因为某种原因(如程序崩溃、进程被杀、网络丢包等)始终没有发送 FIN 包。此时,tcp_fin_timeout 计时器到期,内核会强制将这条处于 FIN-WAIT-2 状态的连接关闭,释放相关资源(如内存、端口等)。

为什么要设置这个超时?
如果没有这个超时限制,而对端又永远不发送 FIN 包,那么主动关闭方的连接就会永远停留在 FIN-WAIT-2 状态。每一个这样的连接都会占用系统的内存和一个文件描述符。如果大量连接出现这种情况,就会耗尽系统资源,导致新的连接无法建立,形成一种拒绝服务(DoS)状态。

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

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

相关文章

烟台网站关键词推广深圳哪些建设公司招聘

像Eclipse这样的现代IDE提供了各种插件来简化Web开发。 但是,我相信将Tomcat作为“常规” Java应用程序启动仍然可以提供最佳的调试体验。 大多数情况下,这是因为这些工具将Tomcat或任何其他servlet容器作为外部进程启动,然后在其上附加一个远…

网站流量工具网站换了域名怎么查

LabVIEW绘制带有多个不同标尺的波形图 通过在同一波形图上使用多个轴,可以使用不同的标尺绘制数据。请按照以下步骤操作。 将波形图或图表控件放在前面板上。 1. 右键点击您要创建多个标尺的轴,然后选择复制标尺。例如,如果要为一个…

如何建立网站后台云商网站建设

cocos2d-x自带了不少示例,以及几个比较简单的游戏,不过这些游戏都是用javascript binding(SpiderMonkey)做的,所以我猜测javascript binding可能是cocos2d-x开发游戏的主流模式,优点是: 游戏逻辑用javascript&#xff…

企业网站ui模板下载如何改wordpress文章模板

原作者链接:基于卷积神经网络的中药识别(pytorch框架)【python源码UI界面前端界面功能源码详解】_识别中药python-CSDN博客 //gitcode,gitee,飞桨,csdn,bilibili。几个有用网站,直接搜索即可,平…

win7iis如何做网站广东东莞自己建站教程

1.用户好不容易一个工程的应力分析计算通过,不料,第二天使用时提示以下信息,对用户来说简直如同噩梦降临。 分析:要么用户移动了文件,要么用户删除了文件,用户两者都否定。无论怎么样文件不会莫名不见了&am…

青岛专业公司网站设计网站程序建设

P3356 火星探险问题 对于一个第一次经过会有价值,但是之后经过没有价值的点,我们的处理方法就是只连一条流量为1并且有费用的边,再连接流量为INF但是没有费用的边,这样我们要使得价值最大就会优先流有费用的边。

源码出售网站wordpress滑动验证码

第一招、mysql服务的启动和停止net stop mysqlnet start mysql第二招、登陆mysql语法如下: mysql -u用户名 -p用户密码键入命令mysql -uroot -p, 回车后提示你输入密码,输入12345,然后回车即可进入到mysql中了,mysql的…

java中的浮点数计算

在java语言中无法精确计算浮点数,例如: float a1,a2; System.out.println("请输入两个浮点数:"); Scanner sc=new Scanner(System.in); a1=sc.nextFloat(); a2=sc.nextFloat(); System.out.println("…

高端酒店网站模板经验推广

一、需求场景:每天固定时间执行某个行为/动作。 一开始想用定时器,后来无意间发现了这个插件,感觉功能太强大了,完美解决了我的问题。 二、下载地址:https://www.quartz-scheduler.net/ 也可以在项目中直接使用nugut进…

XYCTF2025复现(WEB)

ez_puzzle 打开环境也是发现个神奇的东西这里只要按键盘上的按键就会弹出这个 还有右键也不行 还有一个看源代码的方法,直接在网页里面输入,不过这个要在访问这个界面之前输入就是一个禁止键盘按键和鼠标右键的代码 …

网站建设公司介绍ppt重庆 机械有限公司 江北网站建设

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端实现 2.1 判断是否能进行拖拽 2.2 收集受影响的节点,提交给服务器 三、后端实现 四、总结 一、总述 这个拖拽功能对于这种树形的列表,整体的搬迁是很方便的。但是其实现却并不是那么的简单。 …

网站被攻击 是vps问题还是dz程序广州优化网站建设

首先,在 switch 开关添加一个 change 事件,并且通过作用域插槽的形式,将该行数据作为参数传入,目的是为了后续的修改。 在函数内我们将传递过来的参数作为我们请求的参数,通过 put 方式修改我们的后台数据 。

网站设计公司案例做电子商务网站多少钱

本文转自微信公众号:Datawhale(强烈推荐) 原创: AIUnion Datawhale 今天 【导读】 本文由知名开源平台,AI技术平台以及领域专家:Datawhale,ApacheCN,AI有道和黄海广博士联合整理贡献…

盗版小说网站怎么赚钱Wordpress 转发后查看

一、基本组件栈 在Flink整个软件架构体系中,同样遵循着分层的架构设计理念,在降低系统耦合度的同时,也为上层用户构建Flink应用提供了丰富且友好的接口。从下图中可以看出整个Flink的架构体系基本上可以分为三层,由上往下依次是 …

pc端网站建设哪里有美德的网站建设

在C#中,垃圾回收(Garbage Collection)是一种自动管理内存的机制。它负责跟踪和释放不再使用的内存,以便程序可以有效地使用内存资源。 C#中的垃圾回收器是由.NET运行时(CLR)提供和管理的。它使用了一种叫做…

技术支持 嘉兴网站建设网站 免费空间

一、基础内容 在Python中,路径可以以不同的表现形式进行表示。以下是一些常用的路径表现形式: 1. 绝对路径:它是完整的路径,从根目录开始直到要操作的文件或文件夹。在Windows系统中,绝对路径以盘符开始,…

质量好网站建设价格wordpress数据库加速插件

大家都知道什么是实时操作系统,但是,大家熟知的实时操作系统,站在更广的角度来看,其实它就是一个实时内核。一、实时内核和实时操作系统一个实时内核是管理微处理器(MPU)、微控制器(MCU&#xf…

洛谷 P13973 [VKOSHP 2024] Nightmare Sum

先用单调栈预处理出 i 位置左右第一个小于 a[i] 的位置,然后计算出 tot 数组 (tot[i]: 所有以 a[i] 为最小值的子数组总数) 和 pos 数组去记录每个数的位置所在 (每个数互不相同)。构造离线查询,对于固定的 i,枚举所…

单调栈01

单调栈01代码问题 困惑什么样的问题会让你想到利用栈这个数据结构? 栈(尤其是单调栈)非常适合解决 “在数组中寻找元素的特定邻居(如下一个更大 / 更小元素、第一个满足条件的元素等)” 类问题。这类问题的核心是…

网站更换关键词怎么做好快速搭建网站软件

1.当想输入一个数字再输入一个字符串要多一个nextLine(); int a scan.nextInt(); String b scan.nextLine(); 在Java编程语言中,使用Scanner类进行输入时,需要注意nextInt()和nextLine()方法的使用。nextInt()用于读取下一个整数,而nextLi…