【计算机网络】TCP/IP——流量控制与拥塞控制

news2024/11/15 7:15:42

学习日期:2024.7.22

内容摘要:TCP的流量控制与拥塞控制


流量控制

一般来说,我们总是希望数据传输的快一些,但是如果数据传输的太快,接收方可能就来不及接收,这就会导致数据的丢失,流量控制正是为了避免这一现象。

所谓流量控制,其实就是让发送方的发送速率不要太快,让接收方来得及接收,所以一定是接收方给发送方流量控制。用滑动窗口机制可以很方便的在TCP上实现对发送方的流量控制。

下面我们举一个例子,在这个例子中,为了方便讨论,我们不考虑拥塞控制,而是认为接收窗口与发送窗口大小相等。

如图,一开始流量窗口是400,A向B发送数据,B给A流量控制。图中第三部分,201~300的字节数据丢失了,B就在确认时,ack=201,意思是201号字节之前的数据都收到了,而rwnd=300的意思是,调整接收窗口为300。

 于是,发送窗口被调节为201之后的300个字节,如上图蓝色阴影所示。然后A会从301开始发送(接着上次的)然后发完401~500之后,窗口内的数据已经全部发完,不能再发送新数据了。待重传计时器超时后,A就会开始超时重传旧数据

 如图,当主机A超时重传201~300的数据后,主机b就能对收到的501以前的数据进行累计确认,再把接收窗口调整成为100。主机A的发送窗口会调整为501~600,发完这部分数据后,主机A就不能再发送数据了。此时主机B对601号以前的数据进行了累计确认,ACK=1的意思是确认收到,ack=601的意思是601以前的数据,rwnd=0是接收窗口调整为了0。

因为此时接收窗口是0,所以就不能发送一般的TCP报文了,直到B通知A,接收窗口不为0。

但是这样可能导致一个问题,如果主机B的接收窗口扩大了,它想通知主机A,但这个通告在传输过程中丢失了,这会怎么样呢?

主机A会一直等待主机B告诉它传输窗口已经打开了,而主机B会一直等待主机A发送消息,双方会无限等待下去,这样就会导致死锁。A以为B在忙一直等,B以为自己告诉A了,双方又不交流,就死锁了。

为了解决这个问题,TCP规定,如果收到0窗口通知,发送方就要启动一个持续计时器,每隔一段时间发送一个0窗口探测报文,仅携带1字节数据。就好比A隔一段时间问一下B,“在吗?”,如果B的接收窗口还没调大,就回ACK=1表示收到(确认通信能完成),rwnd=0表示接收窗口为0,就是还在忙。如果可以了,就是rwnd=xxx,这样就能够避免死锁了。


拥塞控制

在某段时间中,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞。类比生活中就是堵车,大家都想去一个地方(访问一个处理机),但是路就那么宽,那么就塞车了。

在计算机网络中的链路容量、交换节点中的缓存和处理机等,都叫做“网络的资源”。

若出现拥塞而不进行控制,整个网络的吞吐量将随着输入负荷的增大而下降。

如图,理想的拥塞控制是绿线,在达到阈值前,输入负载始终等于吞吐量,达到之后,吞吐量始终保持最高。这好比公路在达到承载能力上限之前,始终能满负荷运转,而达到之后,即使再多的车来,也能保持以最大限度运转,但塞过车的都知道这是不可能的。

如果无拥塞控制,就是红线,随着车越来越多,大家全部都动不了,最后所有车都堵在路上,吞吐量为0。而实际的拥塞控制,就是要尽量接近理想的拥塞控制。

TCP的拥塞控制主要有慢开始,拥塞避免,快重传,快恢复

为了方便讨论,我们假定:

①数据是单方向传送的,另一个方向只传送确认

②接收方的缓存空间足够大,因而发送方发送窗口的大小以网络的拥塞程度决定,不考虑接收窗口

③以最大报文段MSS的个数为讨论问题的单位,而非字节

慢开始和拥塞避免

传输轮次:发送方给接收方发送后,到接收方给发送方发回对应的确认报文段的时间,其实就是往返时间RTT,这个时间并不是恒定的,会根据具体的网络情况波动。

慢开始算法的过程很简单,一开始拥塞窗口cwnd为1,发送窗口等于拥塞窗口,之后每轮次2,4,8,16这样指数级增大,直到拥塞窗口大于慢开始门限。然后采用拥塞避免算法,其实就是改为每轮次都线性+1,直到发生超时重传(认为此时网络已经开始拥塞),就把慢开始门限值调节为拥塞时的一半,然后从头再来一遍 慢开始—>拥塞避免。

 如图,慢开始门限起初是16,先用慢开始算法,从1开始指数增长到16,然后触发门限值,开始拥塞避免,每次线性+1,直到拥塞窗口为24时,发生了超时重传。此时把门限设置为24的一半,即12,然后从头再慢开始一次,8->16时,改为到门限12,然后从12开始线性增长。

但是这样有个问题,超时重传不一定是网络拥塞,有可能只是报文段在网络中丢失了,这会导致发送方超时重传,并误认为网络发生了拥塞。所以引入了快重传算法。

快重传

所谓“快重传”,就是要发送方尽快进行重传,而不是等到超时重传计时器超时再重传

①要求接收方不要等到字节要发送数据时顺带确认,而要立刻发送确认

②即使收到了失序的报文段,也要对已收到报文段发出重复确认

③发送方一旦收到3个连续的重复确认,就立刻重传相应的报文段,而不是等待超时重传计时器超时

如图,我们还是把发送方和接收方分别命名为A和B

A发送M1,B收到后立刻确认M1,A在收到M1确认前就发送M2,B确认M2,A发送M3,但是此时M3丢失,B不知道,自然不会确认。

于是A发送M4,B发现这不是按顺序到达的报文,于是重复确认自己收到的最晚的一条信息M2,A继续发送M5,B发现这不是按顺序到达的报文,重复确认M2,A发送M6后同理,此时A连续收到了三次对M2的确认,于是A重复发送M3,无需等待M3的超时重传计时器

B在收到M3后,已经有了M1到M6的报文,所以B确认M6,A就知道B已经收到了M1到M6的报文。

快恢复

快恢复和快重传搭配使用,发送方一旦收到了3个重复确认,就知道现在只是丢失了个别的报文段,于是不使用慢开始算法,而是用快恢复算法,其实就是慢开始算法跳过了“慢开始”部分,而是直接把慢开始门限值和拥塞窗口调整为当前窗口的一半,然后开始执行拥塞避免算法。

说人话就是,拥塞窗口直接减半,然后依旧每次+1线性增长

如图,第一次慢开始到达门限16,然后线性增长到24,发生超时重传,门限改为12,慢开始到12,然后线性增长到16,然后发生快重传,快恢复到8,继续线性增长。


感谢您看到这里,如果满意的话麻烦您点个赞支持一下,主页还有更多内容分享。

内容总结自bilibili用户 湖科大教书匠的《计算机网络微课堂》和中国工信出版集团《图解TCP/IP》

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

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

相关文章

【代码随想录】【算法训练营】【第58天 4】 [卡码104]建造最大岛屿

前言 思路及算法思维,指路 代码随想录。 题目来自 卡码网。 day 58,周四,ding~ 题目详情 [卡码104] 建造最大岛屿 题目描述 卡码104 建造最大岛屿 LeetCode类似题目827 最大人工岛 解题思路 前提: 思路: 重点…

压缩pdf大小的方法 指定大小软件且清晰

在数字化时代,pdf文件因其良好的兼容性和稳定性,已成为文档分享的主流格式。然而,高版本的pdf文件往往体积较大,传输和存储都相对困难。本文将为您详细介绍几种简单有效的方法,帮助您减小pdf文件的大小,让您…

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线

基于STM32单片机生理监控心率脉搏TFT彩屏波形曲线 1、系统功能介绍2、演示视频3、系统框图4、系统电路介绍4.1、STM32单片机最小系统设计4.2、按键电路设计4.3、蜂鸣器报警电路设计4.4、Pulsesensor脉搏心率传感器模块电路设计 5、程序设计5.1、LCD TFT屏幕初始化5.2、TFT屏幕显…

【性能优化】在大批量数据下使用 HTML+CSS实现走马灯,防止页面卡顿(一)

切换效果 页面结构变化 1.需求背景 项目首页存有一个小的轮播模块,保密原因大概只能这么展示,左侧图片右侧文字,后端一次性返回几百条数据(开发环境下,生产环境只会更多).无法使用分页解决,前端需要懒加载防止页面卡顿 写个小demo演示,如下 2.解决思路 获取到数据后,取第一…

《JavaSE》---21.<简单认识Java的集合框架包装类泛型>

目录 前言 一、什么是集合框架 1.1类和接口总览 二、集合框架的重要性 2.1 开发中的使用 2.2 笔试及面试题 三、背后所涉及的数据结构 3.1 什么是数据结构 3.2 容器背后对应的数据结构 四、包装类 4.1 基本数据类型和对应的包装类 4.2 装箱和拆箱 1.最初的写法 2.…

向量数据库|一文全面了解向量数据库的基本概念、原理、算法、选型

向量数据库的原理和实现,包括向量数据库的基本概念、相似性搜索算法、相似性测量算法、过滤算法和向量数据库的选型等等。向量数据库是崭新的领域,目前大部分向量数据库公司的估值乘着 AI 和 GPT 的东风从而飞速的增长,但是在实际的业务场景中…

NodeRed测试modbus RTU或modbus TCP通讯

目录标题 STEP1 添加modbus节点STEP2 查看是否安装成功STEP3 modbusTCP读取写入设置读取设置写入设置 STEP4 读写测试 STEP1 添加modbus节点 节点管理——控制板——安装 找到node-red-contrib-modbus,点击安装 STEP2 查看是否安装成功 安装成功后,左…

Day14 | 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树

语言 Java 找树左下角的值 题目链接:找树左下角的值 题目 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路 本题有两种做法我主要讲一下递归的思路,创建两个全局变量&…

blender使用(三)常用建模操作及修改器

1,挤出图形 tab编辑模式,选中一个点/线/面,按键E,可以挤出对应的图形。选中点会挤出一条线,线会挤出一个面,面挤出体 2,倒角 选中一个边后,ctrlB ,拖动鼠标是倒角范围&am…

MINIO集群部署手册

为了满足电子仓库功能相关部署与扩容等操作,因此提供电子仓库部署手册。手册中我们以2个minio节点,每个节点2个盘来进行分布式部署;并且最终扩容成4个节点每个节点2个盘。 操作系统 由于在Windows下运行分布式Minio处于实验阶段,因…

Web前端浅谈ArkTS组件开发

本文由JS老狗原创。 有幸参与本厂APP的鸿蒙化改造,学习了ArkTS以及IDE的相关知识,并有机会在ISSUE上与鸿蒙各路大佬交流,获益颇丰。 本篇文章将从一个Web前端的视角出发,浅谈ArkTS组件开发的基础问题,比如属性传递、插…

定积分与不定积分

定积分与不定积分 引言正文不定积分理解角度1理解角度2 定积分 引言 可能大家看到这个标题会不屑一顾,觉得这个还用你教我吗,高等数学最简单的内容。今天突然想到一个问题,就是为什么不定积分会有一个常数 C C C 出现,这个常数 …

继电器驱动电路的可靠性设计分析

在温度-30℃到85℃、供电电源9V-16V范围条件下,保证外部继电器能正常作动,且不发生负载能力降低的情况。(注:需要详细的外部继电器规格说明) 对于控制多路输出而且要求负载同时打开的模块,必须以50ms(10ms…

C++_单例模式

目录 1、饿汉方式实现单例 2、懒汉方式实现单例 3、单例模式的总结 结语 前言: 在C中有许多设计模式,单例模式就是其中的一种,该模式主要针对类而设计,确保在一个进程下该类只能实例化出一个对象,因此名为单例。而…

OpenCV 图像旋转和平移 数学和代码原理详解

文章目录 数学原理旋转矩阵平移和旋转合成变换矩阵应用在OpenCV中的实现 代码关键点解读完整代码C代码:Python代码: 在OpenCV中进行图像旋转涉及到一些基本的几何变换和图像处理操作。 数学原理 在图像旋转中,背后的数学原理主要涉及二维欧…

嵌入式硬件-Xilinx FPGA DDR4 接口配置基础(PG150)

1. 简介 1.1 DDR4 SDRAM 控制器主要特点 支持8到80位接口宽度的组件(支持 RDIMM、LRDIMM、UDIMM 和 SODIMM) 最大组件限制为9,此限制仅适用于组件,不适用于 DIMM。密度支持 最高支持 32 GB 的组件密度,64 GB 的 LRDI…

步步精慕尼黑上海电子展完美收官,感恩所有相遇,期待下次再会

2024年7月11日至13日,慕尼黑上海电子展圆满落幕,步步精科技(以下简称步步精)在此次展会上取得了丰硕的成果。作为连接器行业的重要制造商,步步精携带其最新产品和连接器技术方案亮相展会,吸引了大量参观者的…

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式结构重用

【HarmonyOS】HarmonyOS NEXT学习日记:六、渲染控制、样式&结构重用 渲染控制包含了条件渲染和循环渲染,所谓条件渲染,即更具状态不同,选择性的渲染不同的组件。 而循环渲染则是用于列表之内的、多个重复元素组成的结构中。 …

RK3568笔记四十二:OLED 屏幕驱动(模拟I2C)

若该文为原创文章,转载请注明原文出处。 本篇记录使用GPIO模拟I2C驱动OLED屏幕,显示界面效果如下。 主要流程是,修改设备树,使用普通IO口,驱动模拟I2C方式,应用程直接传输数据控制。 1、修改设备 2、编写…

Go语言 Import导入

本文主要介绍Go语言import导入使用时注意事项和功能实现示例。 目录 Import 创建功能文件夹 加法 减法 主函数 优化导入的包名 .引入方法 总结 Import 创建功能文件夹 做一个计算器来演示,首先创建test文件夹。 加法 在test文件夹中创建add文件夹&#xff…