计算机网络:运输层 - TCP 流量控制 拥塞控制

计算机网络:运输层 - TCP 流量控制 & 拥塞控制

    • 滑动窗口
    • 流量控制
    • 拥塞控制
      • 慢开始算法
      • 拥塞避免算法
      • 快重传算法
      • 快恢复算法


滑动窗口

如图所示:

在这里插入图片描述

TCP首部中有一个窗口字段,该字段就基于滑动窗口来辅助流量控制拥塞控制。所以我们先讲解滑动窗口。

首先,发送方会维护一个发送缓存

在这里插入图片描述

应用程序会把想要发送的数据写入到发送缓存中,而在发送缓存内部,维护一个发送窗口

发送窗口将发送缓存分为四个部分:

在这里插入图片描述

当发送方发送数据后,就要等待对方确认,粉色区域就是发送了但是没有收到确认的区域。当粉色区域的字节收到确认后,就会离开滑动窗口,进入绿色区域。

蓝色区域的字节,是可以发送的但是还没有发送,一旦发送了就进入粉色区域,等待确认。黄色区域处于发送缓存但不处于发送窗口,此时是待发送的数据,但是还不能发送。

接收方也会维护一个接收缓存

在这里插入图片描述

接收缓存也被接收窗口划分为了三个部分:

在这里插入图片描述

接收窗口内部的数据,是允许接收的,当接收到一个数据接收到后,接收方对其发出确认,随后该数据变成绿色部分,即已经确认接收的部分。黄色部分则是不允许接收的部分,就算收到这个区域的数据,也会被丢弃。

滑动窗口的运行模式如下:

一开始A发送了313233这三个报文,但是31丢失了:

在这里插入图片描述

由于3233在接收窗口内,可以正常接收,但是由于31没有收到,此时接收窗口不能往后移动。

随后B发送确认报文,确认号为31,表示当前收到的最后一个连续报文是31,虽然3334也收到了,但是不连续

在这里插入图片描述

由于一直没收到31的确认报文,A超时重传31

在这里插入图片描述

随后B就收到了这三个连续的报文,于是接收窗口向后滑动:

在这里插入图片描述

B又发送确认号为34的报文,表示33之前的所有报文都收到了,此时A的发送窗口也向后移动:

在这里插入图片描述


流量控制

流量控制就是让发送方的发送速率不要太快,要让接收方来得及接收。其本质是通过控制滑动窗口的大小来实现的。

每个TCP数据报发送时,都会在窗口字段填入自己的接收窗口值,从而告诉对方最多传送多少数据。

如下,一开始B的接收窗口为400

在这里插入图片描述

随后A连续发送了三个报文,分别是[1, 100][101, 200][201, 300]。而第三个报文丢失了。

随后B发送了一个确认报文,此时rwnd就是窗口字段的值,表明当前自己的接收窗口是多少Brwnd控制为300并告知A

在这里插入图片描述

随后A发送了[301, 400][401, 500]并重传了[201, 300]

在这里插入图片描述

此时A计算出到已经发送到对方接收窗口的最大值了,不会再发送数据了。

直到BA发送新的报文,将rwnd = 100,表示可以再发送100个数据:

在这里插入图片描述

最后B又发送一个rwnd = 0的报文,表示接下来A不要发送任何数据了:

在这里插入图片描述

通过这样一个控制接收窗口的过程,你会发现A想要发多少数据,都由B来控制了,这就是流量控制


拥塞控制

在某段时间内,若对网络中某资源(带宽、缓存、处理机等)的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况称为拥塞 (congestion)。

拥塞控制就是防止过多的数据注入到网络中,以防网络中的路由器或链路过载。它是一个全局性的过程,涉及到所有的主机和路由器。

为了进行拥塞控制,发送方维持一个叫做拥塞窗口 cwnd的状态变量。发送窗口的值是拥塞窗口接收窗口的较小值。本博客为了方便理解,假设接收窗口的值一直大于拥塞窗口,也就是说发送窗口的值一直和拥塞窗口保持一致。

发送方控制拥塞窗口的原则是:

  • 只要网络没有出现拥塞,拥塞窗口就可以再增大一些,以便把更多的分组发送出去,提高网络的利用率。
  • 但只要网络出现拥塞(依据就是出现了超时),拥塞窗口就减小一些,以减少注入到网络中的分组数,缓解网络出现的拥塞。

TCP进行依赖四种算法:满开始拥塞避免快重传快恢复

慢开始算法

慢开始算法的思路是:

当主机在刚建立的 TCP 连接上发送数据时,并不清楚网络当前的状况,不宜把大量的数据注入网络,而是应当由小到大逐渐增大注入到网络中的数据量,即由小到大逐渐增大拥塞窗口的数值。

慢开始算法的规则是:

每收到一个确认报文,就把cwnd的值增大1

如图所示:

在这里插入图片描述

首先明确轮次的概念:发送方把拥塞窗口所允许发送的报文段都连续发送出去,并收到对这些报文段的确认所经历的时间,就叫一个轮次。

第一轮次cwnd = 1,只能发送一个数据,接收方收到这个数据后回应一个确认报文。发送方接收到一个回应报文,cwnd = cwnd + 1

第二轮次发送窗口cwnd就变成了2,此时发送方就可以一次发送两个数据报,接收方就回应两个确认报文。发送方接收到两个回应报文,cwnd = cwnd +2

第三轮次发送窗口cwnd就变成了4,此时发送方就可以一次发送四个数据报,接收方就回应四个确认报文。发送方接收到四个回应报文,cwnd = cwnd +4

于是发送窗口cwnd变为8,以此类推。

你会发现:处于慢开始阶段,cwnd呈指数级增长。为了控制拥塞窗口增加过快,此时会设置一个慢开始门限 sstresh

  • cwnd < ssthresh 时,使用慢开始算法。
  • cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。
  • cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

接下来我们就讲解拥塞避免算法。


拥塞避免算法

拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,规则如下:

每经过一个轮次,把拥塞窗口 cwnd 值加 1

拥塞避免并非完全避免拥塞,而是让拥塞窗口增长得缓慢些,使网络不容易出现拥塞。

如图所示:

在这里插入图片描述

横坐标为轮次,纵坐标为cwnd值。当cwnd < sstresh时,执行慢开始算法,此时cwnd指数级增长。当cwnd = 16 = sstresh时,改用拥塞避免算法,每个轮次cwnd = cwnd + 1,此时呈现线性增长

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞,此时就会重新调整cwnd,和sstresh规则如下:

ssthresh 设置为出现拥塞时的拥塞窗口值的一半。然后把拥塞窗口 cwnd 重新设置为 1,并执行慢开始算法。

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间处理队列中积压的分组。

如图:

在这里插入图片描述

等到第13个轮次,此时某个报文超时重传了,于是主机认为此时网络拥塞了,于是sshtresh = cnwd / 2 = 12cwnd = 1,并重新执行慢开始算法。

随后当慢开始执行到cwnd = 12时,cwnd = sstresh,由执行拥塞避免了。


慢开始拥塞避免1988年提出的TCP拥塞控制算法,在1990年由增加了两个算法:快重传快恢复算法。

快重传算法

为了避免单个报文段的意外丢失被发送方误认为网络产生了拥塞,同时为了让发送方尽早知道有个别报文段没有按序到达接收方,需要应用快重传算法。

快重传算法首先要求接收方每收到一个失序的报文段就立即发出对已收到的报文段的重复确认。当发送方连续收到三个重复的确认时,就执行快重传,这样就不会出现超时,发送方也就不会误认为网络出现了拥塞。

如图:

在这里插入图片描述

发送方发送M3丢失了,如果按照以前的算法,此时M3超时重传就会把cwnd = 1,就要从头开始增长了,导致传输效率降低。

于是当接收方收到M4M5M6时,都发送M3的确认报文,此时发送方连续收到三个M2确认报文,立刻重传M3,这个重传不算超时重传,不会触发网络拥塞的判断条件,后续就可以正常传输了。


快恢复算法

发送方在收到三个连续确认报文,执行快重传丢失的报文段的同时,执行快恢复算法:

令拥塞窗口 cwnd 减半,并设置慢开始门限 ssthresh 为同样的数值,然后开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大

如图:

在这里插入图片描述

这是在,没有快恢复快重传的时候,遇到报文丢失后超时重传触发的机制。

而现在如果报文丢失,执行快恢复快重传,那么整体恢复速度就很快了:

在这里插入图片描述

执行快重传的时候,sstresh = cwnd = cwnd / 2 = 12,然后立刻执行拥塞避免,此时就可以在很短的时间内恢复到之前的状态了。


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

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

相关文章

实验室数字化转型:青软青之LIMS系统助力提升检测效率与数据管理

随着检测需求的日益增长和业务的不断扩展&#xff0c;实验室中工作量急剧上升。从而带来了不少挑战&#xff1a; 实验室中的人员、设备管理混乱&#xff0c;部门协作困难&#xff1b;实验数据分析和存储难以协同管理&#xff0c;容易造成错漏&#xff0c;导致数据准确性难以保…

MATLAB 在大规模数据分析和处理中的性能优化策略有哪些?

MATLAB在大规模数据分析和处理中具有一些性能优化策略&#xff0c;其中包括以下几个方面&#xff1a; 1.矢量化向量化操作&#xff1a;使用矢量化向量化操作能够同时处理多个数据点&#xff0c;减少循环的数量&#xff0c;提高程序的效率。 2.使用函数和内置函数&#xff1a;…

xcode报错合集,你都遇到过哪些跳不过的坑

1.报错Consecutive declarations on a line must be separated by ; 其实我这里是用因为创建了一个结构体&#xff0c;然后在没有使用State的情况下&#xff0c;修改它的属性了 当然加上State依然报错&#xff1a; 应该在UI事件中修改&#xff1a;

特种设备高处安装维护拆除作业精选历年试题

高处安装、维护、拆除作业人员资格考试题库[含答案] 单选题 1.大型运动设施拆除工程开工前,根据工程特点、设备、设施情况、工程量等编制( )。 A、安全专项方案 B、安全交底 C、拆除预算 正确答案:A 2.“卡缸”是因为压缩机润滑油( )了的情况下才会出现的现象。 A、多 …

杭州电子科技大学2024年成人高等继续教育招生简章

杭州电子科技大学&#xff0c;作为一所享有盛誉的高等学府&#xff0c;始终致力于为社会培养优秀的人才。2024年&#xff0c;学校敞开大门&#xff0c;为广大有志于进一步提升自身学识与技能的成年人提供了难得的机会——成人高等教育招生。 此次招生不仅彰显了杭州电子科技大…

Python开发记录--手撸加解密小工具(1)

目录 1.环境搭建 2. PyQt简介 3.小结 最近考虑设计一个涵盖国际、国家等加密算法的小工具&#xff0c;用于组内测试使用。一来回顾下算法&#xff0c;二来很久没写代码得练练手感&#xff0c;给工具取个名字&#xff1a;MuscleV0.1 MuscleV0.1涵盖的算法&#xff1a; 对称算…

数据分析:RT-qPCR分析及R语言绘图

介绍 转录组分析是一种用于研究细胞或组织中所有RNA分子的表达水平的高通量技术。完成转录组分析后&#xff0c;科学家们通常需要通过定量实时聚合酶链式反应&#xff08;qRT-PCR&#xff09;来验证二代测序&#xff08;Next-Generation Sequencing, NGS&#xff09;结果的可靠…

多品类第一!海尔智家618战绩出炉

618已经收官&#xff0c;从今年各大平台取消预售机制、简化流程等新动作来看&#xff0c;“回归用户”成为重中之重。而海尔智家从未离开用户&#xff0c;“以用户为中心”始终是海尔智家不变的坚持。 正因如此&#xff0c;今年618&#xff0c;海尔智家又把“第一”收入囊中。…

.NET C# 八股文 代码阅读(一)

.NET C# 八股文 代码阅读&#xff08;一&#xff09; 目录 .NET C# 八股文 代码阅读&#xff08;一&#xff09;1 两种获10000个数的方式&#xff0c;哪种效率更高&#xff1f;为什么&#xff1f;2 请说出以下代码AB谁先打印&#xff0c;AB打印的值分别为多少&#xff1f;3 关于…

Django框架数据库ORM查询操作

Django框架在生成数据库的models模型文件后&#xff0c;旧可以在应用中通过ORM来操作数据库了。今天抽空试了下查询语句。以下是常用的查询语句。 以下查询需要引入django的Sum&#xff0c;Count&#xff0c;Q模块 from django.db.models import Sum,Count,Q 导入生成的mode…

【CPP】直接选择排序、堆排序

目录 1.选择排序1.1简介1.2代码1.3分析 2.堆排序2.1简介2.2代码2.3分析 1.选择排序 1.1简介 思路&#xff1a;遍历一遍&#xff0c;选出最大值和最小值的下标&#xff0c;然后与第一个和最后一个数字交换位置。 1.2代码 1.3分析 最好复杂度&#xff1a;O(N^2) 最差复杂度&am…

振动分析-5-基于CNN的机械故障诊断方法

参考基于CNN的机械故障诊断方法 CNN之图像识别 预训练模型迁移学习&#xff08;Transfer Learning&#xff09; 基于卷积神经网络&#xff08;CNN&#xff09;的深度迁移学习在声发射&#xff08;AE&#xff09;监测螺栓连接状况的应用 参考基于CNN的机械故障诊断所面临的困难和…

win 打包java项目为exe一键部署,包括mysql和redis

需求&#xff1a;打包springboot项目在win系统下执行&#xff0c;并且要一键部署和开机启动 把所需的程序放在同一个文件夹 1.jdk文件夹&#xff1a;自己去下载&#xff0c;jdk8的话拿jre目录好了 2.mysql文件夹&#xff1a;是8.0.36版&#xff0c;270M精简版了 3.redis文件夹…

Python限制输入的数范围:如何避免程序崩溃

哈喽&#xff0c;大家好&#xff0c;我是木头左&#xff01; 有时候用户可能会输入一些不符合预期的数值&#xff0c;导致程序崩溃或者产生错误的结果。为了避免这种情况&#xff0c;需要对用户输入的数值进行限制&#xff0c;确保它们在合理的范围内。本文将介绍如何在Python中…

windows桌面运维----第七天

1、运维有哪些方面选择&#xff1a; 1&#xff0c;桌面运维&#xff08;以windows为主&#xff0c;砸个水晶头诸如此类&#xff09; 2&#xff0c;通讯运维&#xff08;电话&#xff09; 3&#xff0c;网络运维&#xff0c;包括&#xff0c;路由&#xff0c;交换&#xff0c;防…

Microsoft AI Day:支持开放合作,普及技术应用,推进行业企业智慧化创新

微软在北京举办以“共创AI创新&#xff0c;智启无限可能”为主题的Microsoft AI Day活动&#xff0c;集中展示了在生成式智能技术加速发展普及的过程中&#xff0c;微软取得的最新技术突破与进展&#xff0c;并同步更新了在Microsoft Build 2024全球开发者大会上发布的一系列Az…

[归档]YOLOv8l在rk3588上量化后的细节

归档备查。这是我第一个成功进行量化的模型&#xff1a; D RKNN: [17:53:26.729] Network Layer Information Table D RKNN: [17:53:26.729] ----------------…

人力资源招聘社会校企类型招聘系统校园招聘小程序

校企社会人力资源招聘小程序&#xff1a;开启高效招聘新时代 &#x1f680;开篇&#xff1a;打破传统&#xff0c;开启招聘新篇章 在快速发展的现代社会&#xff0c;人力资源招聘已经成为企业和学校共同关注的重要议题。为了更高效、便捷地满足双方的招聘需求&#xff0c;一款…

第58章SOCKET:TCP/IP网络基础

58.1 互联网 互联网会将不同的计算机网络连接起来并允许位于网络中的主机相互之间进行通信。互联网的目标是隐藏不同物理网络的细节以便向互联网中的所有主机呈现一个统一的网络架构&#xff0c;TCP/IP已经成了使用最为广泛的协议套件了&#xff0c; 术语Internet被用来指将全球…

【架构师】听说CDN服务把公司账户余额干趴了?我不服

最近老是看到八卦消息 说是某系统用了cdn的加速服务&#xff0c;某些学员一晚上学员几千个小时&#xff08;真好学&#xff09;&#xff0c;结果一晚上就欠费&#xff0c;又是几千大洋没了&#xff0c;吓的我赶紧上链接&#xff08;呸&#xff0c;上控制台看看&#xff09; 关于…