当前位置: 首页 > news >正文

【JavaEE】——四次挥手,TCP状态转换,滑动窗口,流量控制

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:断开连接的本质

二:四次挥手

1:FIN

2:过程梳理

3:能合二为一吗?

三:“三次握手”和“四次挥手”异同

1:相同点

2:不同点

四:TCP连接状态转换

1:TCP状态转换图

2:LISTED

3:ESTABLISHED状态

4:CLOSE_WAIT(面试高频)

(1)过程梳理

(2)作用

5:TIME_WAIT(面试高频)

(1)过程梳理

(2)作用

五:滑动窗口

1:批量传输

2:滑动窗口

3:ack丢包

4:数据丢包

(1)快速重传

注意点①

注意点②

(2)优点

(3)总结

六:流量控制

1:缓存区上限

2:窗口动态变化


一:断开连接的本质

通过上一篇文章的学习,我们知道“三次握手”的目的和本质就是让通信双方能够保存对端的信息,当信息这个数据量过大的时候,就要引用数据结构。

那么断开连接的本质就是把对端的信息从数据结构中进行删除,释放掉

二:四次挥手

1:FIN

同样我们先认识一下TCP数据报包中,6个标志符中的FIN——结束报文段

单词为finish(结束)——>缩写为FIN

在之前的学习中,我们调用通过ServerSocket类调用close方法就会触发FIN,这里的FIN也是在内核中完成。

同样如果我们结束一个进程也会触发FIN【JavaEE】——TCP回显服务器(万字长文超详细)-CSDN博客

2:过程梳理

引入:与“三次握手”中“一定是客户端先主动”不同,“四次挥手”中服务器和客户端两者谁都可以先主动(分手像极了爱情~)这里我们用“客户端先主动”充当例子

(1)客户端发起FIN(结束报文段)

(2)服务器ACK应答并且也发起FIN(结束报文段)

(3)客户端ACK应答

3:能合二为一吗?

引入:在上述图解步骤下,服务器和客户端各自给对方发起FIN,并再给对方返回ACK,“四次挥手”后代表着通信双方“和平分手”。那么这里的②③步骤是否也能“合并”呢?

答案是:可以合并,但是不能100%的合并——“如合~”

如果②③两者发送的时间间隔很长,那么就不能合并

三:“三次握手”和“四次挥手”异同

1:相同点

都是需要有一端先发起SYN/FIN,然后对端在返回ACK

传输顺序:syn/ack/syn/ack     fin/ack/fin/ack

2:不同点

三次握手中中间两次一定能够合并,四次挥手中中间来那个词不一定能够合并

三次握手中一定是客户端先主动,四次挥手中谁先主动都可以

四:TCP连接状态转换

引入:在TCP的连接中,数据结构会保存两端的信息,在这里面就有一个属性,叫做“状态”,操作系统可以根据状态的不同,决定应该对连接做什么

1:TCP状态转换图

铁铁们看到这个图脑壳都大了吧,俺也是,这里我们只介绍几个比较重要的状态即可

2:LISTED

listed(译为:已登录的)表示:服务器这边已经建立好了ServerSocket,并且绑定好了端口号,随时准备接收客户端的连接

步骤一:我们先启动服务器(代码在之前TCP回显服务器那一篇文章,直接复制粘贴即可)

【JavaEE】——TCP回显服务器(万字长文超详细)-CSDN博客

步骤二:打开命令窗口,输入netstat -ano

步骤三:服务器加上限制条件,我们看9090这个在代码里选择连接的端口

3:ESTABLISHED状态

注:established(译为:已建立的)

表示:客户端和服务器已经建立完毕(三次握手完了)

步骤四:客户端和服务器连接进入ESTABLISHED

注:这里双方进入时间差极小,肉眼是看不出来先后顺序的,除非精确查看日志里的时间戳

4:CLOSE_WAIT(面试高频)

close_wait(译为:关闭等待)——谁被断开连接,谁进入close_wait状态

(1)过程梳理

看图客户端发起FIN断开连接(四次挥手),服务器收到后发送ACK应答报文后进入close_wait状态。

这个状态是比较难观察到的,因为服务器发送ACK和FIN的时间间隔极短,即关闭socket文件的时间极短,此时close_wait -> last_ack 状态的切换非常快

(2)作用

阻塞等待客户端数据请求

注:如果发现服务器或者客户端出现大量的CLOSE_WAIT,意味着很可能是socket没有关闭,出bug了。

5:TIME_WAIT(面试高频)

谁主动断开连接,谁进入TIME_WAIT状态

(1)过程梳理

服务器返回给客户端ASK和FIN,客户端收到返回ASK应答后,进入TIME_WAIT状态

(2)作用

如果最后一个ACK丢包了,服务器迟迟收不到ACK,就会重传一个FIN,客户端收到后也会相应重传一个ACK。

TIME_WAIT就为这个过程留下充足的时间,这个等待的时间不是无休止的等待(连机器都不会无限制的等待,更何况爱情呢~),最多2MSL(MSL是系统内核的配置项)

五:滑动窗口

引入:之前我们简单了解一次数据传输,所经历的过程。 

我们可以发现一个问题:发一个数据就要等一个ack,这样的效率是不足以满足现在“信息爆炸”的现状的。

所以我们引出:批量传输这个概念

1:批量传输

顾名思义——先发一个数据,不等ack了,下一个数据接着发,连续发了好多个ack之后,使用同一份时间来等待ack

好处:减少了总的等待的时间内(下面这张图能非常形象的表现出来)

2:滑动窗口

3:ack丢包

看图——

1001的ack应答丢包了,但是2001这个ack没有丢包,主机A收到②这个ack后就知道主机B2001之前的数据都收到了,所以①号ack丢包问题不大,这种情况无需处理,对于TCP传输的可靠性没有影响。

4:数据丢包

(1)快速重传

注意点①

看上图,主机A发送的1001~2000这个数据丢包了,但是2001后面的数据还在发送,此时主机B就会对2001后面的数据,返回ack,多次强调下一个数据是1001,服务器收到三次这个ack之后,就知道1001~2000这个数据丢包了,就会重传(有点超时重传的感脚~)

注意点②

主机B收到1001~2000这个丢包的数据后,直接会跳到索要7001这个数据包了,而不是2001~。

这是因为TCP有一个接受缓冲区,你可以想象成一个队列

(2)优点

上述重传的过程,整体效率非常高,做到了“针对性”的丢包重传,不必重新发送,这种重传叫做“快速重传”

(3)总结

①“确认应答”、“超时重传”、“滑动窗口”、“快速重传”这四种机制并不冲突,可以同时存在。

②短时间发送了很多数据,窗口才滑的起来

③判定丢包的标准是:连续有多个ack索要同一个数据;普通传输判定标准是:ack超时没有到达

六:流量控制

引入:上述滑动窗口可以提高数据的传输效率,窗口越大,更多数据复用同一块时间,效率就更高,那么问题来了,窗口越大越好吗?显然不行

1:缓存区上限

数据到达接收方是先暂时存储在缓冲区当中,等到一定的数量后,接受方在一次性拿(read)出来

试想发送方如果一下子发送数据太快,导致接收方的缓冲区装不下了,就会导致丢包,这时在重传也没用了(因为已经返回ack了)

2:窗口动态变化

与其等待接收方缓存区满了,不如提前感知到,就减慢发送数据的速度,(下面有请我们的老朋友)

16位窗口大小,就能很好的动态控制窗口的大小,通过这个字段,来给发送方反馈发送速度,很明显这个字段对于发送方的报文中没有意义,只有ack报文中才有意义

注:这个16位并不是实际上的大小——在TCP报头中有一个参数叫做窗口扩展因子

       实际窗口大小 = 16位窗口大小* 2^窗口扩展因子

相关文章:

【JavaEE】——四次挥手,TCP状态转换,滑动窗口,流量控制

阿华代码,不是逆风,就是我疯 你们的点赞收藏是我前进最大的动力!! 希望本文内容能够帮助到你!! 目录 一:断开连接的本质 二:四次挥手 1:FIN 2:过程梳理 …...

D42【python 接口自动化学习】- python基础之函数

day42 高阶函数 学习日期:20241019 学习目标:函数﹣- 55 高阶函数:函数对象与函数调用的用法区别 学习笔记: 函数对象和函数调用 # 函数对象和函数调用 def foo():print(foo display)# 函数对象 a foo print(a) # &…...

GitLab 老旧版本如何升级?

极狐GitLab 正式对外推出 GitLab 专业升级服务 https://dl.gitlab.cn/cm33bsfv! 专业的技术人员为您的 GitLab 老旧版本实例进行专业升级!服务详情可以在官网查看详细解读! 那些因为老旧版本而被攻击的例子 话不多说,直接上图&a…...

现今 CSS3 最强二维布局系统 Grid 网格布局

深入学习 CSS3 目前最强大的布局系统 Grid 网格布局 Grid 网格布局的基本认识 Grid 网格布局: Grid 布局是一个基于网格的二位布局系统,是目前 CSS 最强的布局系统,它可以同时对列和行进行处理(它将网页划分成一个个网格,可以任…...

【图解版】力扣第146题:LRU缓存

力扣第146题:LRU缓存 一、LRU算法1. 基本概念2. LRU 和 LFU 的区别:3. 为什么 LRU 不需要记录使用频率? 二、Golang代码实现三、代码图解1. LRUCache、DLinkedNode两个结构体2. 初始化结构体对象3. addToHead函数4. removeNode函数5. moveToH…...

数据库知识点整理

DDL DDL-数据库操作 show databases ------------ 查看所有数据库 select database(); ----------查看当前数据库 create database 数据库名;---- 创建数据库 use 数据库名; --------------使用数据库 drop database 数据库名;--…...

【JVM】内存模型

文章目录 内存模型的基本概念案例 程序计数器栈Java虚拟机栈局部变量表栈帧中局部变量表的实际状态栈帧中存放的数据有哪些 操作数栈帧数据 本地方法栈 堆堆空间是如何进行管理的? 方法区静态变量存储 直接内存直接内存的作用 内存模型的基本概念 在前面的学习中,我们知道了字…...

代码随想录:二叉树的四种遍历

144. 二叉树的前序遍历 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(nullptr), right(nullpt…...

【Linux】从多线程同步到生产者消费者模型:多线程编程实践

目录 1.线程的同步 1.1.为什么需要线程的同步? 2.2.条件变量的接口函数 2.生产消费模型 2.1 什么是生产消费模型 2.2.生产者消费者模型优点 2.3.为何要使用生产者消费者模型 3.基于BlockingQueue的生产者消费者模型 3.1为什么要将if判断变成while&#xff…...

如何在word里面给文字加拼音?

如何在word里面给文字加拼音?在现代社会,阅读已经成为了我们日常生活中不可或缺的一部分。尤其是在学习汉语的过程中,拼音的帮助显得尤为重要。为了帮助大家更好地理解和掌握汉字的发音,许多教师和学生都希望能够在Word文档中为文…...

Detr论文精读

摘要: 作者提到,该方法将物体检测看做直接的集合预测,在传统的目标检测算法中,会先生成候选区域,然后对每个候选区域进行单独的预测(包括物体的分类和预测框的回归),集合预测就是直…...

找寻孤独伤感视频素材的热门资源网站推荐

在抖音上,伤感视频总是能够引起观众的共鸣,很多朋友都在寻找可以下载伤感视频素材的地方。作为一名资深的视频剪辑师,今天我来分享几个提供高清无水印伤感素材的网站,如果你也在苦苦寻找这些素材,不妨看看以下推荐&…...

大模型~合集13

我自己的原文哦~ https://blog.51cto.com/whaosoft/12302606 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA!模型资源站收录情况 模型来源论文 RAE ​​ht…...

【Next.js 项目实战系列】04-修改 Issue

原文链接 CSDN 的排版/样式可能有问题,去我的博客查看原文系列吧,觉得有用的话,给我的库点个star,关注一下吧 上一篇【Next.js 项目实战系列】03-查看 Issue 修改 Issue 添加修改 Button​ 本节代码链接 安装 Radix UI 的 Ra…...

【Linux】并行与并发(含时间片)

简单来说 并发:多个进程轮流使用同一个CPU,在逻辑层面上,一段时间内推进完成了多个进程 并行:机器中有多个CPU可以使用,在物理层面上,做到同一时间会有多个进程同时在运行 举个例子:一群人需要…...

【Flutter】页面布局:弹性布局(Flex)

在 Flutter 开发中,布局是非常重要的部分。布局系统允许开发者控制和管理界面上的组件如何排列和展示。弹性布局(Flex)是其中一个非常强大且常用的布局组件,它能够在水平方向或垂直方向上灵活调整子组件的空间分配比例。Row 和 Co…...

深入解析 Go 语言接口:多接口实现与接口组合的实际应用

文章目录 一、引言二、一个类型实现多个接口1. 定义多个接口2. 类型实现多个接口3. 使用多个接口 三、接口的组合1. 接口嵌套2. 实现复合接口 四、实际开发中的应用场景1. 多态与模块化设计2. 松耦合系统设计3. 测试与依赖注入4. 事件驱动架构中的应用 五、小结 一、引言 在 G…...

Eclipse——Java开发详解

Eclipse 1、配置JDK2、设置编译版本2.1、全局编译版本2.2、项目编译版本2.3、Web项目编译版本 3、设置工作目录4、创建Java项目5、配置Tomcat6、创建Web项目7、配置Maven8、创建Maven项目8.1、普通Maven项目8.2、Maven Web项目 9、创建SpringBoot项目10、设置字体11、设置代码提…...

练手小项目推荐

以下是一些练手项目推荐,我可以给你一些适合学生毕业设计的小项目建议,既可以锻炼技能,也能完成学术要求。以下是一些可行的毕业设计项目建议: 校园导航APP 功能:为校园内的新生和访客提供导航,标记教室、…...

一图秒懂色彩空间和色彩模型

色彩空间和色彩模型 想必学过图像处理或者摄影的小伙伴都知道这两个词,看了一些博客,发现很少有人把这两个概念说清楚的,大多数都是混在一起,色彩模型和色彩空间的概念混为一谈,很让人疑惑。   这里我们用一张图来解…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 ,不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源(最常用) conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...