大连网站怎么/杭州百度seo代理
- 获取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函数的进…...

【运维】什么是 DevOps?
文章目录什么是 DevOps?如何实现 DevOpsDevOps工作原理: DevOps生命周期DevOps 文化DevOps 工具:构建 DevOps 工具链DevOps 和云原生开发什么是 DevSecOps?DevOps 和站点可靠性工程 (SRE)什么是 DevOps? DevOps 通过结…...

【C++入门】引用、内联函数、auto关键字、基于范围的for循环(C++11)、指针空值nullptr(C++11)
文章目录引用引用概念引用特性引用使用场景常引用内联函数宏的优缺点?C有哪些技术替代宏?auto关键字auto不能推导的场景基于范围的for循环(C11)指针空值nullptr(C11)引用 引用概念 引用不是新定义一个变量,而是给已存在变量取了一个别名&…...

《FPGA学习》->多个按键控制LED灯
🍎与其担心未来,不如现在好好努力。在这条路上,只有奋斗才能给你安全感。你若努力,全世界都会为你让路。本次项目任务,利用开发板上的4个按键KEY1,KEY2,KEY3,KEY4和2个LED灯LED1&…...

vb.net计算之.net core基础(4)-项目与程序结构(2)
目录 Namespace 语句Visual Basic 中的命名空间完全限定名命名空间可以定义什么全局关键字命名规范条件编译拆分和合并语句拆分成多行在同一行上放置多个语句为代码行添加标签注释串联成员访问运算符点运算符 `.`感叹号 `!`运算符Me 关键字MyMyBaseMyClassNamespace 语句 <…...

基于RK3588的嵌入式linux系统开发(五)——uboot优化修改(按任意按键停止autoboot)
我们通常情况下,芯片进入uboot后,会根据设置的bootdelay时间进行倒数计数。这时候在终端按任意键,即可退出autoboot,进入uboot的命令行模式。 官方提供的uboot源码中,为了防止调试串口干扰导致不能进入系统,…...

Lumerical---在FDTD和MODE工程中的PML边界条件
Lumerical---在FDTD和MODE工程中的PML边界条件 引言PML边界条件实现原理PML 类型PML 配置文件PML 配置文件选项Standard(标准)Stabilized(稳定性)Steep AngleCustom(陡角)对于不同的边界使用不同的配置FDE,varFDTD和FDTD SolverPML 参数阅读这篇前,推荐阅读边界条件综述…...

论文投稿指南——中文核心期刊推荐(社会学)
【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…...

KVM-4、KVM 高级功能详解
1. 半虚拟化驱动 1.1 virtio 概述 KVM 是必须使用硬件虚拟化辅助技术(如 Intel VT-x 、AMD-V)的 Hypervisor,在CPU 运行效率方面有硬件支持,其效率是比较高的;在有 Intel EPT 特性支持的平台上,内存虚拟化的效率也较高。 QEMU/KVM 提供了全虚拟化环境,可以让客户机不经…...

【Linux】进程状态
文章目录1. 阻塞1. 举例2. 为什么要阻塞?3.操作系统层面上如何理解进程等待某种资源就绪呢?资源进程4. 总结2.挂起3.Linux进程状态1. R状态进程只要是R状态,就一定是在CPU运行吗?证明当前进程运行状态生成程序查看进程2. S休眠状态…...

2023河南省第二届职业技能大赛郑州市选拔赛“网络安全”项目比赛样题任务书
2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 一、竞赛时间 共计360分钟。 竞赛任务书内容 2023河南省第二届职业技能大赛郑州市选拔赛“网络安全” 项目比赛样题任务书 A模块基础设施设置/安全加固(200分) A-1&…...