【网络】传输层协议TCP(下)

目录

四次挥手状态变化

流量控制

PSH标记位

URG标记位

滑动窗口

快重传

拥塞控制

延迟应答

mtu

TCP异常情况


四次挥手状态变化

之前我们讲了四次挥手的具体过程以及为什么要进行四次挥手,下面是四次挥手的状态变化

那么我们下面可以来验证一下CLOSE_WAIT这个状态,这个状态出现的条件是后调用close的一方(比如服务器)调用close之前(调用完close就进入last_ack),我们可以很容易模拟出来,直接比如让客户端先调用close,不让服务器端调用close即可,这样就可以看到这个状态

用指令netstat -natp,a表示all

这就证明一件事情,如果我们发现服务器上有大量close_wait状态的时候,这就意味着大概率我们写的服务器有BUG,主要是没有close fd

我们把服务器进程关掉就看不到这个状态了,因为进程结束会把所有文件描述符释放掉

我们可以看到图中有一个time_wait的状态,对这个就是等待一段时间,这个状态实际上是先调用close的一方收到对方的close并给应答后处于的一种状态,这个状态通常持续的时间是分钟级别的,所以我们也可以较容易的看到

这样虽然服务器进程已经关闭,但是这里的端口仍然是被占用的,这也就是为什么立即启动服务器会bind err

所以我们的处理方法就是设置地址复用

那么等待的时间是多少呢?

TCP协议规定,主动关闭连接的一方要处于TIME_WAIT状态,等待两个MSL的时间才能回到CLOSED状态

MSL是 Maximum Segment Lifetime(报文在网络中最大存活时间),我们可以看Linux中它是多长

也就是一分钟,所以TIME_WAIT的时间就是两分钟

下面解释一下为什么会等待这么长的时间

1.因为有可能我关闭了服务器后立马又绑定相同的IP和端口,这是其实是发给上一次连接的数据由于阻塞在了网络中一段时间,现在发到了服务器,这样旧报文就会影响新连接

2.或者说,四次挥手的最后一次ACK可能会丢,如果等待了2个MSL,对方没收到ACK就会超时重传,这是处于TIME_WAIT的我们就可以重新发ACK。总之,就是又重传的机会,保证让对方也关闭连接。

流量控制

有下面这样一种场景,如果A给B发消息非常快,导致B的缓冲区被打满了,那么新来的数据就会被丢弃,尽管TCP有超时重传机制,但是这样其实是不合理的,因为发送的数据被丢掉就会白白占用网络资源;不仅如此如果A发送的过于慢,这也会导致效率低下。

这上面的问题就和我们要说的流量控制有关,B可以通过应答ACK报文通告给A自己缓冲区剩余空间的大小,那么A就可以选择加快或减慢发送的速度

这里就是B就是通过报头中的16位窗口大小将自己缓冲区的大小通告给A的

那如果B的缓冲区满了,A和B就不进行数据交互了,那么A是如何知道B什么时候有空间呢?

A会向B发送窗口探测,B会向A发送窗口更新通知,这两种机制是会同时存在的。

PSH标记位

那如果B一直没空间,A就会给B发的报头中把PSH标记位 置一(当然PSH标记位的应用场景不只是会这么极端),就是让B尽快向上交付,当然取走缓冲区中的数据取决于应用层,这里的意思是应用层调用read的时候不要阻塞,即使要读走的内容很少,也要尽量读走

URG标记位

这个标记位 置一是指16位紧急指针有效,16位紧急指针中存着紧急数据在报文数据中的偏移量(广义的指针就是指能找到想要的数据即可),这个紧急数据一般是一个字节,通常是上层应用层规定好的。

这个大概的应用场景是:比如客户端要给服务器上传数据,上传到一半不想上传了,但是此时服务器TCP缓冲区中还有很多数据,这些数据其实都不想上传了,有了紧急指针就可以不按序到达,TCP协议可以让上层先把带有紧急指针的报文读上去,这样就可以停止上传了

滑动窗口

我们之前说过TCP发消息可以串行发,就是发一条消息等一个应答,但是这样发送效率太低。所以TCP一次发多条报文,然后等应答。

那么问题就来了,一次发多条,这些消息都是无需等待确认应答而可以继续发的数据,这个数量是怎么看的呢?

其实无需等待应答而可以继续发送数据的最大值就是滑动窗口的大小

我们可以认为滑动窗口就是发送缓冲区的一部分区域,这个区域是连续的,其中的数据都是暂时不需要应答而可以直接发送的数据

如果不考虑网络情况,滑动窗口的大小一般是对方接收缓冲区中剩余空间的大小,其实这个数据在三次握手的时候接收方就可以通过报头中的16位窗口大小告诉发送方了

我们可以把滑动窗口认为成下面的样子

其实简单来说,要维护一个窗口其实就是维护一段数组空间(可以把缓冲区看成char类型的数组),只需要两个整型变量即可,一个表示窗口开始位置,一个表示结束位置。

我们之前说过超时重传机制,就是对于已发送但是未收到应答的报文进行保存,万一报文丢失触发超时重传我们得找到那个报文,其实报文正好就存在于滑动窗口中

并且这个滑动窗口只能是向右滑动,可以变大,可以变小直至为零。因为滑动窗口的大小就取决于对方接收缓冲区的大小(暂时先这样理解,后面会说其实跟网络状况也有关系)

快重传

为了提高发送笑效率,TCP引入了快重传策略,就是当收到3个报文中具有同样的确认序号时就会重发滑动窗口的最左边的报文。

因为我们知道确认序号的意义就是确认序号之前的报文全部都收到了,接收方之所以会发三个同样的确认序号就是它收到了滑动窗口中间的一些报文,但是滑动窗口最左边(滑动窗口内)的报文没有收到,接收方收到报文后必须发确认应答,并且确认序号只能是滑动窗口左边(滑动窗口外)的已经收到的数组下标

如果没有3个呢?那就会触发超时重传

所以快重传其实是一个提效的策略,而超时重传则是一个兜底的策略

就以为有了上面的策略,所以才不会害怕滑动窗口最左侧丢包。

那如果是滑动窗口中间或最右侧丢包呢?这种情况其实最终还是转化成最左侧丢包,因为收到应答的报文会被分离出滑动窗口

对方在收到一批报文时,会发回一批应答报文,如果这个应答报文是乱序的呢?

1.首先应答报文也是有序号的,不用担心乱序问题

2.就算是乱序的,比如先收到确认序号是3001,后收到2001,其实收到3001是就已经能确定2000收到了,2001其实就可以直接丢弃了

所以就算一部分应答报文会丢失,后面的应答报文也会通告情况,所以是允许部分应答报文丢失的,这一切还是要归功于确认序号的意义上:确认序号之前的报文全部都收到了

接收数据的一方是要对报文进行排序后才能放到接收缓冲区的

我们上面说流量控制,其实滑动窗口就是流量控制的具体实现

缓冲区终归是有限的,那到头了怎么办?我们可以把缓冲区认为成是一个环状结构,滑动窗口就在这个环上循环

拥塞控制

我们发送数据看的其实不仅是通信双方的主机,还有网络

所以拥塞控制就是用来衡量网络的健康状况的

如果网络拥塞了,那么就会导致大面积丢包;如果发送量超过拥塞窗口就会导致网络拥塞

什么控制发送量呢?就是滑动窗口

每次发送数据包的时候,将拥塞窗口和接收端主机反馈的窗口大小作比较,取较小的值作为实际发送的窗口

所以滑动窗口的大小就是对方接收能力和拥塞窗口的最小值

拥塞探测和TCP发送数据其实是同时进行的,拥塞控制的核心算法其实就是指数级增长,因为指数级增长一开始为慢启动,不会给拥塞的网络增加太多的压力;然后一旦发现网络状况较好就会增长的很快,尽快恢复通信;但是到了后面又开始比例增长,否则指数级增长过快了,大致是下面这样

延迟应答

这个意思就是收到数据后先等待一段时间,当然这个时间不会超过超时重传的时间,就是为了可能上层会取走一部分数据,这时就可以向发送方通报更大的接收能力了

mtu

Maximum Transmission Unit,缩写MTU,中文名是:最大传输单元。  MTU是 数据链路层 的概念

这个值我们可以通过ifconfig命令看到,是1500字节

所以网络中能够传输的最大数据包大小是1500字节

TCP异常情况

如果进程崩溃掉了,那么已经建立好连接的双方就会正常进行四次挥手

如果是机器重启导致进程退出,同样会执行上面的操作,所以有进程时的重启会比没进程时慢一些

如果网线断开或者突然断电,那么这方就直接关闭连接了,对方会发消息或者由于保活策略发一些试探性报文,如果没有应答就会断开连接

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

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

相关文章

单链表专题

单链表 1. 链表的概念2. 链表的分类3. 实现无头单向非循环链表(单链表)3.1 单链表的声明3.2 单链表的打印3.3 尾插3.4 头插3.5 尾删3.6 头删3.7 查找3.8 在指定位置之前插入数据3.9 在指定位置之后插入数据3.10 删除指定节点3.11 销毁链表 4. 一些细节4.…

K8S篇(基本介绍)

目录 一、什么是Kubernetes? 二、Kubernetes管理员认证(CKA) 1. 简介 2. 考试难易程度 3. 考试时长 4. 多少分及格 5. 考试费用 三、Kubernetes整体架构 Master Nodes 四、Kubernetes架构及和核心组件 五、Kubernetes各个组件及功…

中国500米分辨率逐月平均EVI数据集(2000-2022)

EVI是在归一化植被指数(NDVI)的基础上进行改进的,通过卫星不同波段探测数据组合而成。EVI考虑了大气校正,包括大气分子、气溶胶、水汽和臭氧等因素,以解决NDVI容易饱和的问题。EVI的计算公式考虑了蓝光和红光波段&…

二级列表联动

介绍 本示例主要介绍了List组件实现二级联动(Cascading List)的场景。 该场景多用于商品种类的选择、照片不同类型选择等场景。 效果图 使用说明: 滑动二级列表侧控件(点击没用),一级列表随之滚动。&…

基于matlab的人民币面额识别

本文通过分析第五版人民币的特征,利用纸币中央数字的特征提取和识别的方法,通过matlab软件实现对第五版人民币的100元、50元和20元的识别。 Matlab函数介绍 Imread 函数imread用于读取图片文件中的数据。 调用格式: A imread(filename,…

Docker篇(实际应用)

目录 一、MySQL 部署 1. 拉取 MySQL 镜像 2. 查看镜像 3. 创建 MySQL 容器 4. 进入 MySQL 容器,登陆 MySQL 5. 远程登陆 MySQL 6. 查看容器 IP 地址 二、tomcat 部署 1. 拉取 tomcat 镜像 2. 创建 tomcat 容器 3. 搭建 Tomcat 服务并部署 web 应用 三、Nginx 部署 …

别名路径联想设置

如何使用/进行路径提示? 找到jsconfig.json文件,如何项目中没有的话,自行创建 {"compilerOptions": {"paths": {"/*": ["./src/*"]}},"exclude": ["node_modules", "dis…

osi七层模型

文章目录 1、网络层1、数据链路层2、以太网和mac地址3、地址解析协议(arp)1、免费arp 4、物理层1、双绞线(网线) 5、总结 1、网络层 路由器就是网络层设备,因为是根据目标ip报文来实现转发的,三层的 1、数据链路层 作用 解决了,ip报文在链路…

spark (算子 ) groupBykey+Map 和 reduceBykey 的区别

1)面试题:groupByKeymap和reduceByKey都能实现分布式分组聚合,有什么区别? - groupByKey没有Map端聚合的操作,只做分组,必须等分区结束才能实现,最终map需要做整体聚合 - reduceByKey是有Map端聚…

mysql--多表查询

目录 一、联合查询 案例1,UNION 案例2,UNION ALL 二、表连接查询 (一)内连接 (二)外连接 1.左外连接 2.右外连接 3.全外连接 去重关键字 distinct 三、自连接 案例1: 案例2&…

【MyBatis源码】CacheKey缓存键的原理分析

文章目录 Mybatis缓存设计缓存KEY的设计CacheKey类主体CacheKey组成CacheKey如何保证缓存key的唯一性 Mybatis缓存设计 MyBatis 每秒过滤众多数据库查询操作,这对 MyBatis 缓存键的设计提出了很高的要求。MyBatis缓存键要满足以下几点。 无碰撞:必须保证…

打好“组合拳”,实现国有企业降本增效

打好“组合拳”,实现国有企业降本增效 在当前经济不确定性加剧、市场寒意明显的背景下,众多国有企业因历史积累的管理问题而陷入困境。随着经济形势的严峻,各行业普遍出现发展乏力的现象,促使企业开始重视“修炼内功”、“向内挖…

金媒婚恋相亲系统10.4择爱开源旗舰版支持微信小程和抖音小程序上架

最近大家应该注意到了,金媒婚恋相亲系统已经更新至最新的10.4版本了!本人作为商业用户也已经更新至最新的旗舰版了,更新的内容是啥!这个官方都有列出,一个方面就是更新了多端的登录逻辑和UI 和后台CRM及很多细节的优化…

新能源行业必会基础知识-----电力现货市场理论篇-----电力现货市场组织-----配套措施

新能源行业必会基础知识-----电力现货市场理论篇-----主目录-----持续更新https://blog.csdn.net/grd_java/article/details/143364261 这本书是2023年出版的,是当下了解国内电力市场最好的途径了。还是推荐大家买来这本书进行阅读观看,最好作为随身携带…

【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)

博主说明:本文项目编号 T 061 ,文末自助获取源码 \color{red}{T061,文末自助获取源码} T061,文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析…

微服务day02

教学文档: 黑马教学文档 Docker Docker的安装 镜像和容器 命令解读 常见命令 案例 查看DockerHub,拉取Nginx镜像,创建并运行容器 搜索Nginx镜像:在 www.hub.docker.com 网站进行查询 拉取镜像: docker pull ngin…

MySQL 安装与配置

MySQL 安装与配置 MySQL 安装 MySQL 一般分为社区版和商业版,我们使用的是社区版(因为免费)。MySQL 安装的教程在网上有很多,此处就不再进行进行赘述,这里推荐两篇文章:如何在 Windows11 中安装 MySQL 8.…

ISUP协议视频平台EasyCVR大华设备视频平台高并发情况下FLV协议流无法播放的原因排查

随着视频监控技术的发展和应用领域的扩大,大中型项目对视频监控系统的需求日益增长,特别是在智慧城市、公共安全、交通管理等领域。这些项目通常涉及跨区域、大规模的视频监控和管理,要求视频监控系统具备高兼容性、高稳定性和高扩展性。ISUP…

Linux学习笔记之vim入门

基本介绍 Linux系统会内置vi文本编辑器,vim具有程序编辑的能力,可看做是vi的增强版本,可以主动以字体颜色辨别语法的正确性,方便程序设计。代码补全、编译以及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用…

C# 实现读取Excel文件并设置单元格计算公式再保存

背景:需求需要读取数据导出成Excel文件,并且其中有一列需要赋值为公式,用于用户自己修改数据自动计算 导出Excel,我用到开源包MiniExcel Gitee地址MiniExcel源码介绍,功能说明 Nuget安装 搜索MiniExcel 导出代码如下&a…