(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制
- 获取pdf:密码7281
- 专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航
文章目录
- 一:流量控制概述
- 二:流量控制举例
- 三:拓展阅读(可不看)
- (1)TCP流量控制完整例子
- (2)操作系统缓冲区与滑动窗口的关系
- A:若应用程序没有及时读取缓冲区
- B:操作系统直接减少缓冲区大小
本节对应视频如下
- 【计算机网络微课堂(有字幕无背景音乐版)】:TCP流量控制
一:流量控制概述
流量控制:一般来说,我们总希望数据能够传输得更快一些,但是存在一个问题,如果发送方发送数据过快那么接收方就有可能来不及接收,从而造成数据的丢失。所谓流量控制,就是让发送方的发送速率不要太快,让接收方能够来得及接收,TCP流量控制是利用滑动窗口机制来实现流量控制的
二:流量控制举例
如下图,A和B是因特网行两台主机,它们之间已经建立了TCP连接,A给B发送数据,B对A进行流量控制。左上角是主机A中待发送数据的字节序号,假设主机A发送的每个TCP报文段可携带100字节数据,因此图中每个小格子表示100字节数据的序号。在主机A和B建立TCP连接时,B告诉A“我的接收窗口为400”,因此主机A将自己的发送窗口也设置为400,这意味着主机A在未收到主机B发来的确认时可将序号落入发送窗口中的全部数据发送出去

主机B对主机A进行流量控制过程如下
-
主机A将发送窗口内序号1-100的数据封装为一个TCP报文段发送出去,发送窗口内还有300字节可以发送
seq是TCP报文段首部中的序号字段,取值为1表示TCP报文段数据载荷的第一个字节序号是1Data是TCP数据报文段
-
主机A将发送窗口内序号101-200的数据封装为一个TCP报文段发送出去,发送窗口内还有200字节可以发送

-
主机A将发送窗口内序号201-300的数据封装为一个TCP报文段发送出去,但丢失了,发送窗口内还有100字节可以发送

-
主机B对主机A所发送的201号之前的数据进行累积确认,并在该累积确认中将窗口字段额值调整为300,也就是对主机A进行流量控制
ACK是TCP报文段首部中的标志位,取值为1表示这是一个TCP确认报文段ack是TCP报文段首部中的确认号字段,取值为201表示201之前的数据已全部正确接收,现在希望收到序号201及其后续数据rwnd是TCP报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300

-
主机A收到该累积确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口
-
由于主机B在该累积确认中将自己的接收窗口调整为了300,因此主机A相应地也将自己的发送窗口调整为300

-
主机A现在可以将发送缓存中序号1-200的字节数据全部删除了,因为已经收到了主机B对它们的累积确认
-
目前,主机A发送窗口内的序号为201-500,也即主机A还可以发送这300字节
- 201-300:是已发送的数据,若重传计时器超时,它们会被重传
- 301-400和401-500:还未被发送,可被分别封装在一个TCP报文段中发送

-
主机A将发送窗口内序号301-400的数据封装成一个TCP报文段发送出去,发送窗口内还有100字节可以发送
-
主机A将发送窗口内序号401-500的数据封装成一个TCP报文段发送出去。
-
至此,序号落在发送窗口内的数据已经全部被发送出去了,不能再发送新数据了

-
现在,发送窗口内序号201-300这100字节数据的重传计时器超时了,主机A将它们重新封装为一个TCP报文段发送出去,暂时不能发送其他数据

-
主机B收到重传的TCP报文段后,对主机A所发送的501号之前的数据进行累积确认,并在该累积确认中将接收窗口调整为100,这是主机B对主机A进行的第二次流量控制

-
主机A收到该累积确认后,将发送窗口向前滑动,使以发送并收到确认的这些数据的序号移出发送窗口
-
由于主机B在该累积确认中将自己的接收窗口调整为了100,因此主机A相应地也将自己的发送窗口调整为100

-
主机A现在可以将发送缓存中序号201-500的字节数据全部删除了,因为已经收到了主机B对它们的累积确认
-
目前,主机A发送窗口内的序号为501-600,也即主机A还可以发送这100字节

-
主机A将发送窗口内序号501-600的数据封装成一个TCP报文段发送出去
-
至此,序号落在发送窗口内的数据已经全部被发送出去了,不能再发送新数据了

-
主机B对主机A所发送的601号之前的数据进行累积确认,并在该累积确认中将窗口字段的值调整为0,这是主机B对主机A进行的第三次流量控制

-
主机A收到该累积确认后,将发送窗口向前滑动,使以发送并收到确认的这些数据的序号移出发送窗口
-
由于主机B在该累积确认中将自己的接收窗口调整为了0,因此主机A相应地也将自己的发送窗口调整为0
-
目前,主机A不能再发送一般的TCP报文段了

-
主机A现在可以将发送缓存中序号501-600的字节数据全部删除了,因为已经收到了主机B对它们的累积确认

-
假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间
-
于是,主机B向主机A发送了接收窗口为300的报文段,然后它在传输过程中丢失了

-
主机A一直等待主机B发送的非零窗口的通知
-
主机B一直等到主机A发送的数据
-
如果不采取措施,这种互相等待的死锁局面将会一直持续下去

-
为了解决这个问题,TCP为每一个连接设置了一个持续计时器,只要TCP连接的一方收到对方的零窗口通知就启动持续计时器;若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据,而对方在确认这个探测报文段时,给出自己现在的接收窗口值。TCP规定:即使接收窗口为0也必须接收零窗口探测报文段、确认报文段以及携带有紧急数据的报文段
- 如果接收窗口仍然为0:那么收到这个报文段的一方就会重新启动持续计时器
- 如果接收窗口不是0:那么死锁局面就可以被打破
-
对于本例,主机A收到零窗口通知时,就启动一个持续计时器,当持续计时器超时,主机A立刻发送一个仅携带一字节数据的零窗口探测报文段

-
假设此时主机B的接收窗口又为0了,主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为0

-
主机A再次收到零窗口通知,就再次启动一个持续计时器,当持续计时器超时,主机A立刻发送一个仅携带一字节数据的零窗口探测报文段

-
假设主机B此时的接收缓存又有了一些存储空间,于是将自己的接收窗口调整为了300
-
主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为300

三:拓展阅读(可不看)
(1)TCP流量控制完整例子
如下图是一个经典的场景,其中客户端是接收方,服务端是发送方。假设接受窗口和发送窗口都为200。假设两个设备在传输过程中都保持相同的窗口大小,不受外界影响
过程如下
- 1:客户端向服务端发送请求数据报文
- 2:服务端受到请求报文后,发送确认报文和80字节的数据,于是可用窗口可用窗口减少为120字节。同时,
SND.NXT指针也向右移动80字节,指向321,意味着下次发送数据序列号为321 - 3:客户端收到80字节数据后,其接受窗口向右移动80字节,
RCV.NXT指向321,意味着客户端期望的下一个报文序列号是321,接着发送确认报文给服务端 - 4:服务端再次发送120字节数据,可用窗口耗尽为0,无法再发送数据
- 5:客户端收到120字节数据后,接受窗口向右移动120字节,
RCV.NXT指向441,接着发送ACK - 6:服务端收到对80字节数据的确认报文后,
SUD.UNA指针向右偏移指向321,于是可用窗口增大到80 - 7:服务端受到对120字节的确认报文后,
SUD.UNA指针向右偏移指向441,于是可用窗口增大到200 - 8:服务端现在可以继续发送,发送160个字节的数据后,
SND.NXT指向601,可用窗口减少到40 - 9:客户端收到160字节后,接收窗口向右移动160字节,
RCV.NXT指向601,接着发送ACK - 10:服务端收到对160字节数据的确认报文后,发送窗口向右面移动60字节,
SND.UNA指针偏移160后指向601,可用窗口增大至200

(2)操作系统缓冲区与滑动窗口的关系
上面的例子中,发送窗口和接受窗口的大小是不变的。但在实际情况中,发送窗口和接受窗口中存放的字节数,都会存放在操作系统中的内存缓冲区,因此一定会受到操作系统的控制而被调整。当应用程序由于各种原因未及时读取缓冲区中的内容时,也会对缓冲区造成影响
A:若应用程序没有及时读取缓冲区
下面的例子展示的是由于应用程序没有及时读取缓冲区时,发送窗口和接受窗口的变化情况,其中
- 客户端为发送方,服务端为接收方,发送窗口和额接受窗口初始大小为360
- 服务端很忙,收到客户端数据时,应用层未能及时处理数据
过程如下
- 1:客户端发送140字节数据,可用窗口变为220
- 2:服务端受到140字节数据,由于服务器繁忙,应用程序仅仅读取了40字节,还有100字节占用缓冲区,因此接收窗口缩小到260(360-100),最后发送ACK时,将窗口大小告知客户端
- 3:客户端收到ACK后,将发送窗口减少为260
- 4:客户端发送180字节数据,可用窗口减少到80
- 5:服务端收到180字节后,但是应用层没有读取任何数据,180字节直接留在了缓冲区,于是接收窗口缩小到了80(260-180),最后发送ACK时,将窗口大小告知客户端
- 6:客户端收到ACK后,将发送窗口减少为80
- 7:客户端发送80字节数据后,可用窗口耗尽
- 8:服务端收到80字节数据,但是应用程序依然没有读取任何数据,这80字节仍然留在缓冲区,于是接收窗口缩小到了0,最后发送ACK时,将窗口大小告知客户端
- 9:客户端收到ACK后,将发送窗口减少为0
最后窗口变为了0,也即是发生了窗口关闭。当发送方窗口为0时,发送方实际上会定时发送窗口探测报文,以便知道接受方的窗口是否发生了改变

B:操作系统直接减少缓冲区大小
当服务器系统资源很紧张的时候,操作系统可能会直接减少接受缓冲区的大小,这时应用程序又无法及时读取缓冲区数据的话,那么可能导致丢包现象的产生
过程解释如下
- 1:客户端发送140字节的数据,可用窗口减少到了220
- 2:服务端因为现在非常繁忙,操作系统于是就把接受缓存减少了120字节,当收到140字节数据后,由因为应用程序没有及时读取数据,所以140字节留在了缓冲区中,于是接受窗口大小由360缩小到了100。最后发送ACK时,通知窗口大小给对方
- 3:此时客户端因为还没有收到服务端的ACK,所以不知道此时接受窗口缩减到了100,客户端只会看到自己的可用窗口还有220,于是客户端发送了180字节数据,可用窗口减少到了40
- 4:服务端收到了140字节数据,发现数据大小超过了接收窗口的大小,于是直接把数据丢了
- 5:客户端收到第2步服务端发送的ACK后,尝试减少发送窗口到100,把窗口的右端向左收缩了80,但是在第3步时,已经发送了超过100字节的数据,所以可用窗口出现负值
所以如果发生了先减少缓存,再收缩窗口,就会出现丢包的现象。因此为了防止这种情况发生,TCP规定不允许同时减少缓存又收缩窗口的,而是先收缩窗口,一定时间后再减少缓存

相关文章:
(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制
获取pdf:密码7281专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一:流量控制概述二:流量控制举例三:拓展阅读(可不看)(1)TCP流量控制完整例子&a…...
使用Docker-Compose搭建Redis集群
1. 集群配置3主3从由于仅用于测试,故我这里只用1台服务器进行模拟redis列表2.编写redis.conf在server上创建一个目录用于存放redis集群部署文件。这里我放的路径为/root/redis-cluster 在/opt/docker/redis-cluster目录下创建redis-1,redis-2,redis-3,redis-4,redis…...
华为OD机试 -计算网络信号(Js)
计算网络信号 题目 网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。 注意:网络信号可以绕过阻隔物 array[m][n] 的二维数组代表网格地图,array[i][j] = 0代表 i 行 j 列是空旷位置;array[i][j] = x(x 为正整数)代表 i 行 …...
【数据结构】————栈
文章目录前言栈是什么,栈的特点实现栈的基本操作栈的相关操作声明1.创建栈2.对栈进行初始化3.销毁栈4.判断栈是否为空5.压栈操作6.删除栈顶元素7.取出栈顶元素8.计算栈内存放多少个数据总结前言 本文主要讲述特殊的线性表——栈: 栈是什么,栈…...
从零编写linux0.11 - 第十一章 可执行文件
从零编写linux0.11 - 第十一章 可执行文件 编程环境:Ubuntu 20.04、gcc-9.4.0 代码仓库:https://gitee.com/AprilSloan/linux0.11-project linux0.11源码下载(不能直接编译,需进行修改) 本章目标 本章会加载并运行…...
Win10上通过nginx代理配置远程非445端口SMB
引言 家里架了一个SMB文件服务器,想要远程访问,开了445端口,但仅限某些特殊网络可以远程访问,其他网络全部拒绝445端口,因此网上找了很多将Win10的SMB指向别的端口的教程,但所有教程均使用环回网卡解决&am…...
Allegro如何快速清除多余的规则设置操作指导
Allegro如何快速清除多余的规则设置操作指导 在用Allegro做PCB设计的时候,会给PCB设置一些规则,在PCB设计完成之后,可能会有一些没有使用到的规则,如下图 Physical规则中的45OHM的规则是多余的 单独某个规则可以直接在规则管理器中删除,如果比较多可以用下面方法批量删除…...
ROS2 入门应用 引用自定义消息(Python)
ROS2 入门应用 引用自定义消息(Python)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_interfaces/…...
SmS-Activate一款好用的短信验证码接收工具
前言 有些国外应用在使用应用上的功能时需要注册账号,由于某种不可抗因素,我们的手机号一般不支持注册,接收不到信息验证码,于是我们可以使用SmS-Activate提供的服务,使用$实现我们的需求(大概一次验证1-5…...
SpringBoot+Elasticsearch按日期实现动态创建索引(分表)
😊 作者: 一恍过去💖 主页: https://blog.csdn.net/zhuocailing3390🎊 社区: Java技术栈交流🎉 主题: SpringBootElasticsearch按日期实现动态创建索引(分表)⏱️ 创作时间&…...
Terraform基础入门 (Infrastructure as Code)
文章目录前言介绍Terraform 术语Terraform 如何工作关于provider安装开启本地缓存demo1(dockernginx)demo2(dockerzookeeperkafka)参考资料前言 像写代码一样管理基础设施。 Terraform 使用较为高级的配置文件语法来描述基础设施,这个特性让你对配置文件进行版本化…...
Redis内存回收
Redis 内存回收 Redis之所以性能很强,最主要的原因是基于内存存储,然而单节点的Redis其内存大小不宜过大,会影响持久化或主从同步性能 可以通过修改配置文件来设置Redis的最大内存 maxmemory <bytes>当内存达到上限时,就…...
ROS2 入门应用 引用自定义消息(C++)
ROS2 入门应用 引用自定义消息(C)1. 查看自定义消息2. 修改话题发布3. 修改话题订阅4. 修改依赖关系5. 修改编译信息6. 编译和运行1. 查看自定义消息 引用在《ROS2 入门应用 创建自定义接口》中自定义的消息Sphere.msg ros2 interface show tutorial_i…...
Spring中的数据校验
数据校验基础 参考: Java Bean Validation 规范 Spring对Bean Validation的支持 Spring定义了一个接口org.springframework.validation.Validator,用于应用相关的对象的校验器。 这个接口完全从基础设施或者上下文中脱离的,这意味着它没有…...
python批量翻译excel表格中的英文
python批量翻译excel表格中的英文需求背景主要设计分析具体实现表格操作请求百度翻译api多线程控制台显示进度完整源码需求背景 女朋友的论文需要爬取YouTube视频热评,但爬下来的都是外文。 主要设计 读取一个表格文件,获取需要翻译的文本 使用百度翻译…...
基于SSM框架的RBAC权限系统设计与 实现
基于SSM框架的RBAC权限系统设计与 实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...
目标检测各常见评价指标详解
注:本文仅供学习,未经同意请勿转载 说明:该博客来源于xiaobai_Ry:2020年3月笔记 对应的PDF下载链接在:待上传 目录 常见的评价指标 准确率 (Accuracy) 混淆矩阵 (Confusion Matrixÿ…...
深入讲解Kubernetes架构-控制器
在机器人技术和自动化领域,控制回路(Control Loop)是一个非终止回路,用于调节系统状态。这是一个控制环的例子:房间里的温度自动调节器。当你设置了温度,告诉了温度自动调节器你的期望状态(Desi…...
Urho3D本地化 国际化
本地化子系统提供了创建多语言应用程序的简单方法。 初始化 在使用子系统之前,需要加载本地化字符串集合。通常的做法是在应用程序启动时执行此操作。可以加载多个集合文件,每个集合文件只能定义一种或多种语言。例如: Localization* l10n…...
千锋教育嵌入式物联网教程之系统编程篇学习-04
目录 alarm函数 raise函数 abort函数 pause函数 转折点 signal函数 可重入函数 信号集 sigemptyset() sigfillset sigismember() sigaddset() sigdelset() 代码讲解 信号阻塞集 sigprocmask() alarm函数 相当于一个闹钟,默认动作是终止调用alarm函数的进…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
[Java恶补day16] 238.除自身以外数组的乘积
给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O(n) 时间复杂度…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
