Linux网络:传输层协议TCP(三)滑动窗口及流量控制

目录

一、关于滑动窗口在TCP中的应用

1.1什么是滑动窗口,为什么要有滑动窗口

1.2滑动窗口的实现

1.3滑动窗口针对丢包重传的处理机制

二、流量控制


一、关于滑动窗口在TCP中的应用

1.1什么是滑动窗口,为什么要有滑动窗口

在上一篇博文中博主阐述了确认应答ACK策略, 对每一个对方发送的数据段报文, 接收方都要给一个 ACK的确认应答。接收方收到 ACK应答后再发送下一个数据段报文。但是这样做有一个缺点, 那就是性能较差,效率较低,尤其是数据传输往返时间较长的时候。

这样一发一收的传输方式显然性能较低, 那么如果一次发送多条数据, 从而降低传输频率,这样一来就可以大大的提高数据报文传输的性能(其实也就是将多个数据段的等待时间重叠在一起。

而我们要传输的数据如果很大,那么在TCP层,其传输能力也是有限的,而且如果这时对方的接收缓冲区已经快满的话,不能存储过多数据,且对方应用层迟迟不去接收缓冲区读取数据的话,此时我们如果依旧发送大量的数据给对方,那么会有很大的概率出现丢包的情况,这时发送方就要根据传输协议的阈值以及对方接收能力来动态的调节每次发送的数据量。这时,维护一个窗口,通过滑动窗口来控制无疑就是最好的选择。

结合我们所介绍的多条数据一起发送(实际上是在没有接收ACK情况下连续的发送好几条报文),滑动窗口就可以一次确定一段发送区间,然后分段进行发送,得到对方应答确定报文被对方接收后继续向后移动去发送还未被发送的报文。

1.2滑动窗口的实现

窗口的大小指的是无需等待确认应答而可以继续多次发送数据的最大值. 上图中的窗口大小就是4000个字节(四个段)。

刚开始发送前四个段的时候, 不需要等待任何的ACK应答,直接连续发送报文;

当收到第一个 ACK应答之后, 滑动窗口就继续向后移动, 继续发送第五个段的数据;依次往后类推;

操作系统内核为了维护这个滑动窗口, 需要开辟一个发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;

窗口越大, 则说明网络的吞吐率就越高;

滑动窗口也采用类似环状结构,每次通过取模类似的操作来将指针始终控制在存放数据的区间,当将后面的数据全部发送完毕后,滑动窗口会自动回绕会区间头部去处理并发送新的数据。

所以在网络较好情况下,滑动窗口的大小一般是对方接收缓冲区中剩余空间的大小

1.3滑动窗口针对丢包重传的处理机制

根据如上描述,如果真的因为特殊原因出现了丢包, 那滑动窗口该如何进行重传? 这里分以下两种情况:

情况一: 数据包已经抵达, ACK应答丢包了

 在双方都遵循TCP协议的情况下,如果情况一出现,主机B接收到了主机A的所有报文并且对所有报文都进行了ACK应答,但是应答在传输过程中丢了,这时起始问题并不大,网络正常情况下,也不会让主机A等到超时重传,因为主机B已经实实在在接收到了主机A的报文,所以确认序号是正常往后走的,这里需要重申确认序号的功能:确认序号之前的所有报文都已被接收。所以只要后面发送给主机A的ACK应答能传达到,那么主机A也可以知道在此之前的报文对方都接收到了,就不会再进行超时重传了。

比如上图所示,就算前几个应答都丢失了,但只要后面6001的应答传给了主机A,那么主机A就知道,虽然前面的应答我没有接收到但是对方的6001说明6001之前全部到达了,那只是ACK丢包了而已,而ACK本身就是为了确认数据可靠性的,本身并没有携带什么有价值的信息,所以主机A就不会再管6001之前的报文了。

情况二:数据包直接丢了

这种情况下,数据包直接丢了,是实实在在的丢包,那么没有ACK,主机A也不确定到底主机B是收到了还是没收到,此时TCP协议就起了作用。

当某一段报文段丢失之后,比如1001-2000的数据包丢了,那么发送端会一直收到1001的 ACK, 因为发送的每条报文都有自己的序号,而接收方会对接收的报文进行排序,然后按序进行处理,如果对应序号的报文丢失,那么接收方会一直重复发送该报文之前的确认序号,以此达到提醒对方丢包,就像是在提醒 发送端 "我想要的是 1001" 一样;

如果发送端主机连续三次收到了同样一个 "1001" 这样的应答, 就会将对应的数据 1001 - 2000 重新发送;

这个时候当接收端收到了序号1001的报文之后, 再次返回的 ACK应答就是7001了(因为 2001 - 7000)接收端其实之前就已经收到了, 被放到了接收端操作系统内核的接收缓冲区中;

而这种机制也被称为 "高速重发控制"(也叫 "快重传"机制)。

二、流量控制

在上面博主提到过网络资源和传输效率是有限的。

接收端处理数据的速度也是有限的。如果发送方发送端发的太快, 导致接收端的缓冲区被存储满, 这 时候如果发送端继续发送报文, 就会造成丢包, 从而引起丢包重传等等一系列连锁反应降低了网络传输的效率。因此 TCP 支持根据接收端的处理能力及接收缓冲区大小, 来决定发送端的发送速度. 这个机制就叫做流量控制(Flow Control);

接收端将自己可以接收的缓冲区大小(也就是接收缓冲区中剩余的大小)放入TCP 首部中的 "窗口大小" 字段, 在发送ACK应答时携带通知发送端;

窗口大小的字段越大, 说明网络的吞吐量就越高;

当接收端一旦发现自己的缓冲区快满了时, 就会将窗口大小字段设置成一个更小的值通知给发送端;

发送端接受到这个窗口之后, 就会减慢自己的发送速度;

如果接收端缓冲区一旦满了, 就会将窗口大小置为 0; 这时发送方就不再发送数据, 但是需要定期发送一个窗口探测数据段, 时刻得知对方缓冲区是否有剩余空间,使接收端把窗口大小告诉发送端。

那么问题来了, 16位二进制位所存储的数字最大表示65535, 那么 TCP 窗口最大就是 65535 字节么? 实际上, TCP 首部 40 字节选项中还包含了一个窗口扩大因子 M, 实际窗口大小是窗口字段的值左移了M 位;我们可以根据16位中存储的值再左移M得出实际的大小。

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

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

相关文章

叉车安全防撞系统有哪些?叉车防撞装置解决方案

叉车安全防撞系统作为现代工业物流中的安防防护装置,为企业的安全生产提供了强有力的保障。该系统集成了先进的传感器技术、高效的算法处理以及人性化的操作界面,确保叉车在作业过程中能够准确感知周围环境,及时作出反应,有效避免…

车载录像机:移动安全领域的科技新星

随着科技的飞速发展,人类社会的各个领域都在不断经历技术革新。其中,车载录像机作为安防行业与汽车技术结合的产物,日益受到人们的关注。它不仅体现了人类科技发展的成果,更在安防领域发挥了重要作用。本文将详细介绍车载录像机的…

信号、电源、网线、传感器防雷,SPD系列防雷器全覆盖!

信号、电源、网线、传感器防雷,SPD系列防雷器全覆盖! SPD 系列防雷器是一种安装于被保护设备一侧的产品,旨在保护电子设备免受雷击、电磁脉冲、过压过渡冲击等造成的设备损坏。该产品广泛应用于工业控制、安全监测、网络通讯、交通电压等行业…

Windows 实用小工具:窗口钉子/文件管理 2024/7/27

一: wintop 窗口置顶工具 二:WinDirStat 这是一个免费的、开源的磁盘使用分析工具,适用于Windows系统。它会扫描你的硬盘,列出所有文件和文件夹的大小,并以图形化的方式展示,便于理解。 可以用来检测硬盘文件夹占用从而,酌情处…

多模态聊天效果如何?尝试和AI大模型煲电话粥

01 能像真人一样聊天的AI “我第一次来直播的发布会,有点紧张。”当OpenAI前沿研究部门主管马克(Mark Chen)通过手机对ChatGPT说话时,ChatGPT回答,“要不你深呼吸一下?” “好的,我深呼吸。”…

蓝牙耳机百元之内怎么选?四款百元精品爆款蓝牙耳机盘点

在蓝牙耳机的海洋中,百元价位仿佛是一片神秘的绿洲,既诱人又充满未知,如何在众多选项中挑选出真正的精品呢?蓝牙耳机百元之内怎么选?这是许多消费者的共同疑问,带着这个疑问,作为蓝牙耳机发烧党…

【计算机网络】DNS命令练习与抓包分析实验

一:实验目的 1:掌握DNS缓存的清除方法,了解DNS缓存的作用和影响。 2:熟悉nslookup和dig等DNS查询工具的使用,理解DNS查询的基本原理和过程。 3:通过抓包和分析,深入了解DNS查询和响应消息的格…

SpringBoot+ Sharding Sphere 轻松实现数据库字段加解密

一、介绍 在实际的软件系统开发过程中,由于业务的需求,在代码层面实现数据的脱敏还是远远不够的,往往还需要在数据库层面针对某些关键性的敏感信息,例如:身份证号、银行卡号、手机号、工资等信息进行加密存储&#xf…

使用API Monitor探测C++程序在调用HtmlHelp接口打开.chm文件时传入了哪些参数

目录 1、API Monitor介绍 2、为何要使用API Monitor工具? 2、HtmlHelp函数在API列表函数中找不到,将所在模块作为外部Extern DLL模块添加到API Monitor中 3、开启对Beyond Compare工具软件的实时监测 4、在Beyond Compare软件中打开chm帮助文档&…

数据库密码实现加盐加密处理

在实际的开发中,我们的数据库密码一般都是明文的方式存储在数据库中,但是,这种操作非常不安全,容易被黑! 那么,此时我们就需要对其进行加密处理,市面上比较常见的就是MD5加密了,但是…

2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题

题库来源:安全生产模拟考试一点通公众号小程序 2024年起重信号司索工(建筑特殊工种)证模拟考试题库及起重信号司索工(建筑特殊工种)理论考试试题是由安全生产模拟考试一点通提供,起重信号司索工(建筑特殊工种)证模拟考试题库是根据起重信号司索工(建筑特…

aarch64环境安装minio

1.去官网查看最新版本 MinIO | 用于AI的S3 & Kubernetes原生对象存储 2.使用命令安装,采取wget和dnf安装 wget https://dl.min.io/server/minio/release/linux-arm64/archive/minio-20240113075303.0.0-1.aarch64.rpm -O minio.rpm sudo dnf install minio.rpm 注意点…

SpringCloud Nacos的配置与使用

Spring Cloud Nacos的配置与使用 文章目录 Spring Cloud Nacos的配置与使用1. 简单介绍2. 环境搭建3. 服务注册/服务发现4. Nacos 负载均衡4.1 服务下线4.2 权重配置4.3 同集群优先访问 5. Nacos 健康检查5.1 两种健康检查机制5.2 服务实例类型 6.Nacos 环境隔离6.1 创建namesp…

GeneCompass:跨物种大模型用于破解基因调控机理

GeneCompass是第一个基于知识的跨物种基础模型,该模型预先训练了来自人类和小鼠的超过1.2亿个单细胞转录组。在预训练过程中,GeneCompass有效整合了四种生物先验知识,以自监督的方式增强了对基因调控机制的理解。对多个下游任务进行微调&…

E19.【C语言】练习:数组

有序序列合并 描述 输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。 数据范围: 1≤n,m≤1000 , 序列中的值满足 0≤val≤30000 输入描述: 输入包含三行, 第一行包含两个正整数n, m,用空…

VSCode 解决 pylint 报错 No name QWidget in module PyQt5.QtWidgets

问题 启用了 VSCode 的 Pylint 插件, 即便 Python 环境中安装了 PyQt5, 也无法正确解析 PyQt5 的导入 PyQt5 底层代码是用 C/C 写的, pylint 默认不会深入解析 pylint doesn’t load any C extensions by default, because those can run arbitrary code. 解决 修改 Settings…

k8s学习--k8s集群部署kubesphere的详细过程

文章目录 kubesphere简介k8s群集部署kubespere环境准备工作一、配置nfs二、配置storageclass三、kubesphere开启服务(devops) kubesphere简介 下面是官方文档描述 KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多…

免费的批量自动处理工具,让重复工作一键搞定

对于一些重复的工作,大部分情况下我们可以借助工具批量自动处理,无需手动一个一个去操作。小编今天就和大家分享几款可以一键帮我们搞定重复任务的免费工具。 1.TinyTask:解放双手的自动化神器 TinyTask是一款小巧但功能强大的自动化工具&a…

如何用AP525采集【车机播放的扫频信号】的频响曲线

一.测试目的 车机播放20~20khz的扫频信号,这个信号从功放的输出端(eg. CH1)接入到AP525的模拟输入端(eg. Analog input),通过APx500 软件分析采集回来的扫频信号的频响曲线 二.APx500输出输入配置 三.生成扫频信号 1…

习题2.25~2.26

没啥需要解释的,直接贴代码和执行结果 2.25 (def x (list (list 7))) (first (first x) )(def x (list 1 3 (list 5 7) 9)) (first (rest (first (rest (rest x)))))(def x (list 1 (list 2 (list 3 (list 4 (list 5 (list 6 7) )))))) (first (rest (first (rest (…