TCP的四次挥手过程

news2024/11/13 9:25:06

TCP连接是双向传输的对等的模式(全双工模式),就是说双方都可以同时向对方发送或接收数据。
而断开的时候,也是双方都可以主动断开,此时需要经过四次挥手的过程,流程如下图所示:

TCP四次挥手

  1. 主动方发送FIN包给被动方,主动方状态变成FIN_WAIT_1,等待被动方的确认。此时主动方不能再发送数据。
  2. 被动方收到FIN之后,返回ACK包给主动方,确认自己收到这个包,被动方状态变成CLOSE_WAIT,等待关闭连接(等待缓存数据都发送过去)
  3. 主动方收到ACK之后,状态变成FIN_WAIT_2,等待被动方的FIN包。
  4. 被动方将缓冲区剩余的数据发送给主动方。
  5. 被动方发送FIN给主动方,被动方状态变成LAST_ACK状态。
  6. 主动方收到FIN之后,返回ACK包给被动方,主动方变成TIME_WAIT状态。
  7. 被动方收到ACK确认后,变成CLOSE状态。
  8. 主动方在经过2MSL时间之后,变成CLOSE状态。

MSL(Maximum Segment Lifetime)指报文最大生存时间,它是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

为什么握手需要三次,而挥手需要四次?

因为 TCP连接是全双工模式,一方断开连接,另一方还是可以继续发送数据,所以无法像三次握手一样,将 FINACK合并到一起,而是需要等待被动方处理完所有数据,不再有数据发送时,才会发送 FIN,来关闭被动方的连接。

为什么需要 TIME_WAIT状态?

需要 TIME_WAIT 状态,主要是两个原因:

  1. 防止历史连接中的数据,被后面相同四元组的连接错误的接收:
    在连接关闭过程中,可能会存在一些延迟的数据包在网络中,这些数据包可能在连接关闭后到达目的地。TIME_WAIT 状态的存在可以确保在这段时间内不会接收到与当前连接相关的旧数据包,防止这些数据包造成连接的混乱。
  2. 保证「被动关闭连接」的一方,能被正确的关闭:
    如果主动方收到 FIN,发出 ACK之后,直接进入 CLOSE状态,那么当这个 ACK丢失时,被动方收不到 ACK则会重发一个 FIN,但此时主动方已经是 CLOSE状态,无法再给被动方发送 ACK了。

如果两端同时关闭,会出现什么情况?

前面说过,TCP连接双方都可以主动断开,那如果两边同时断开,会怎样呢?
TCP同时关闭
从上图可以看到,一方发出FIN,进入FIN_WAIT_1状态,原本期待收到ACK,但此时收到了FIN,则会变成CLOSING状态,等到收到ACK时,再进入TIME_WAIT状态,同样要经过2MSL时间变成CLOSE状态。

参考资料

  • TCP连接断开 - 小林coding

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

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

相关文章

HTTP1.1的优化措施

3.2 HTTP/1.1 如何优化? 可以从以下三个方面来优化http/1.1协议: 尽量避免发送 HTTP 请求; 在需要发送 HTTP 请求时,考虑如何减少请求次数; 减少服务器的 HTTP 响应的数据大小; 避免发送HTTP请求 对于…

智能文件夹改名助手:一键秒级恢复原始名称,轻松告别繁琐操作,提升文件管理效率

文件夹管理成为了我们日常工作和生活中不可或缺的一部分。然而,随着文件数量的不断增加和文件夹命名的复杂性,我们经常面临着重命名文件夹的繁琐操作。你是否曾经因为误改文件夹名称而头疼不已?是否曾经为了找回原始名称而耗费大量时间&#…

将CentOS 7安装在U盘上,这时你将体验到......

文章目录 前言一、Linux 是什么?二、使用步骤1.下载安装 VMware Workstation Pro2.下载 CentOS 镜像3.准备一个U盘(最好是32G以上的)4.VMware 里安装 CentOS 总结 前言 随着 Linux 在服务器、嵌入式系统、移动设备等领域的广泛应用&#xff…

【jitsi】jitsi 布署及docker打包

目录 单独的布署 最后总结的成果 旧的架构 单独的布署 最后总结的成果 http://10.30.40.10/dualvenDoc/installjitsi/ 旧的架构 wvp视频调度平台架构布署图_wvp 架构-CSDN博客

Word应用:一键提取手写签名

1、将带有签名的图片插入到word文档中,裁剪出签名部分; 2、点击“格式-颜色”,选择“重新着色”中的“黑白50%”; 3、“格式-颜色”,设置透明色; 4、选择“文件”选项卡,选择打开“选项”,点击“…

【Unity Shader入门精要 第6章】基础光照(二)

1. 获取环境光 unity shader中可以通过 UNITY_LIGHTMODEL_AMBIENT获取当前环境光颜色信息。 fixed4 frag(v2f i) : SV_Target {return UNITY_LIGHTMODEL_AMBIENT; }2. 漫反射 2.1 兰伯特模型 创建Chapter_6_Diffuse_Lambert作为测试材质创建Chapter_6_Diffuse_Lambert作为测…

AI智能写作网站推荐:好用的工具看这几款就够了!

在近年来的科技发展浪潮中,人工智能写作工具以其独特的优势和魅力,引起了行业内外的广泛关注。从技术层面来看,这种工具的应用和发展已经取得了重要的突破,而从应用层面来看,它们对内容创作领域的深远影响更是不可忽视…

关于Speech processing Universal PERformance Benchmark (SUPERB)基准测试及衍生版本

Speech processing Universal PERformance Benchmark (SUPERB)是由台湾大学、麻省理工大学,卡耐基梅隆大学和 Meta 公司联合提出的评测数据集,其中包含了13项语音理解任务,旨在全面评估模型在语音处理领域的表现。这些…

EasyExcel简单使用

EasyExcel简单使用 ​ 之前一直用的Apache POI来做数据的导入导出&#xff0c;但听说阿里的EasyExcel也拥有POI的功能的同时&#xff0c;在处理大数据量的导入导出的时候性能上比POI更好&#xff0c;所以就来尝试使用一下 导入Maven依赖&#xff1a; <dependency><…

图和网络笔记

文章目录 1. 图(节点边) 1. 图(节点边) 一个图可以由节点和边组成&#xff0c;假设我们有一个节点notes &#xff1a;n4,边edges&#xff1a;m5的有向图&#xff0c;表示如下 通过以上电路图可以得到关联矩阵(incident matrix),我们定义边&#xff0c;开始端用-1表示&#x…

Elasticsearch查看集群信息,设置ES密码,Kibana部署

Elasticsearch查看集群信息&#xff0c;设置ES密码&#xff0c;Kibana部署 查看集群信息查看节点信息查看集群健康状态查看分片信息查看其他集群信息 Kibana部署安装设置ES密码 查看集群信息 查看节点信息 curl http://127.0.0.1:9200/_cat/nodes?v 参数说明&#xff1a; ip…

基于大模型的idea提炼:围绕论文和引用提炼idea之ResearchAgent

前言 对本博客比较熟悉的朋友知道&#xff0c;我司论文项目组正在基于大模型做论文的审稿(含CS英文论文审稿、和金融中文论文审稿)、翻译&#xff0c;且除了审稿翻译之外&#xff0c;我们还将继续做润色/修订、idea提炼(包含论文检索)&#xff0c;是一个大的系统&#xff0c;包…

星辰考古:TiDB v1.0 再回首

“ 1.0 版本只是个开始&#xff0c;是新的起点&#xff0c;愿我们一路相扶&#xff0c;不负远途。 前言 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。 近日&#xff0c;TiDB v8.0.0 DMR 发布&#xff0c;详细发版说明戳这里&#xff1a; https://docs.pingca…

【C/C++】C/C++ KTV点歌系统设计与实现(源码+数据+报告)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

3588 pwm android12 的操作

问题&#xff1a; 客户需要在android12 的界面上操作板卡上的 PWM 蜂鸣器设备。 过程&#xff1a; 1 了解一下 3588 android12 源码的 关于PWM 的驱动。 设备树找不到 pwm 但是&#xff0c; 还不知道&#xff0c;android12 最终包含的 设备树是哪个&#xff0c;但是经过我的…

MyCat实现分库分表

两个集群 两个库 两个表 搭建数据库服务使用docker启动两个mysql 3506 3507连接MyCat创建两个数据源连接MyCat创建集群 mycat创建逻辑库MyCat创建全局表广播表创建分片表mycat逻辑库MyCat插入数据mycat查看数据物理库3506查看数据物理库3507查看数据 ER表创建ER表mycat插入数据…

蓝桥杯练习系统(算法训练)ALGO-946 Q神的足球赛

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 足球赛上&#xff0c;只见Q神如闪电般的速度带球时而左&#xff0c;时而右&#xff0c;时而前&#xff0c;时而后&#xff…

HDFS HA 修改nameservice

本例中修改将原来的hdfs-ha 修改为 hdfs-ns 停止HDFS, 防止新的业务操作 等待停止结束 KDE中需要调整的配置项如下图所示 a.搜索栏找到fs.defaultFS&#xff0c;将hdfs://hdfs-ha改为hdfs://hdfs-ns b.搜索栏找到dfs.nameservices&#xff0c;将hdfs-ha改为hdfs-ns c.搜索栏找…

HBuilder报错--openssl-legacy-provider is not allowed in NODE_OPTIONS解决方法

目录 一、问题描述二、解决方法 一、问题描述 HBuilder编译时报错&#xff1a;–openssl-legacy-provider is not allowed in NODE_OPTIONS 二、解决方法 将 windows 环境变量 NODE_OPTIONS 的值设置为空&#xff0c;由&#xff1a; 改为&#xff1a;

并发-判断线程对象是否处于活动状态 - isAlive

t.isAlive() 测试线程t是否处于活动状态&#xff0c;只要线程启动并且没有终止&#xff0c;方法返回值就是truestart()之前&#xff0c;线程不处于活动状态&#xff0c;之后就处于活动状态示例&#xff1a;运行结果&#xff1a;但是事情并没有这么简单&#xff0c;先来看一下以…