5.5、TCP 的拥塞控制

news2024/11/23 10:28:39

在某段时间若 对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏 \color{red}对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏 对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏

  • 这种情况就叫做 拥塞 \color{red}拥塞 拥塞(congestion)。

  • 就是供不应求

  • 在计算机网络中的 链路容量 \color{blue}链路容量 链路容量(即带宽)、 交换结点中的缓存 \color{blue}交换结点中的缓存 交换结点中的缓存 处理机 \color{blue}处理机 处理机等,都是网络的资源。

出现拥塞而不进行控制 \color{red}出现拥塞而不进行控制 出现拥塞而不进行控制,整个网络的 吞吐量将随输入负荷的增大而下降 \color{red}吞吐量将随输入负荷的增大而下降 吞吐量将随输入负荷的增大而下降


1、理想/实际的拥塞控制

如下所示

  • 输入负载:代表单位时间内输入给网络的分组数量
  • 吞吐量:代表单位时间内从网络输出的分组数量

具有理想拥塞的网络,在吞吐量达到饱和之前,网络吞吐量应等于所输入的负载

  • 即吞吐量曲线是 45 ° 45° 45° 的斜线

但当输入负载超过某一限度时,由于网络资源受限,吞吐量就不再增长而保持水平线

  • 也就是吞吐量到达饱和

这就表明输入的负载有一部分损失掉了

  • 例如,输入到网络的某些分组被某个节点丢弃了

虽然如此,但这种理想的拥塞控制下,网络的吞吐量仍然维持在其所能到达的最大值

image-20230105222523288


然而,实际的网络下,并不是这样的

如下所示

随着输入负载的增大,网络吞吐量逐渐减小

  • 也就是再网络吞吐量还未达到饱和时,就已经有一部分的输入分组被丢弃了

当网络的吞吐量明显地小于理想的吞吐量时

  • 网络就进入了轻度拥塞的状态

当输入负载达到某一数值时,网络的吞吐量随反而随着输入负载的增大而减小

  • 这时,网络就进入了拥塞状态

当输入负载继续增大到某一数值时,网络的吞吐量就减小为 0 0 0

  • 此时网络就无法工作量,这就是所谓的死锁

image-20230105223416621

实际的拥塞控制曲线应该尽量接近理想的拥塞控制曲线

image-20230105223458043


2、TCP的四种拥塞控制办法

慢开始(slow-start)、拥塞避免(congestion avoidance)、快重传(fast retransmit)、快恢复(fast recovery)


假定如下条件

  • 数据是单方向传送,而另一个方向只传送确认。

  • 接收方总是有足够大的缓存空间,因而发送方发送窗口的大小由网络的拥塞程度来决定。

  • 以最大报文段 MSS个数为讨论问题的单位,而不是以字节为单位。


image-20230105224049119

发送方维护一个叫做 拥塞窗口 cwnd \color{red}拥塞窗口 \texttt{cwnd} 拥塞窗口cwnd 的状态变量,其值 取决于网络的拥塞程度 \color{red}取决于网络的拥塞程度 取决于网络的拥塞程度,并且 动态变化 \color{red}动态变化 动态变化

  • 拥塞窗口 cwnd 的维护原则 \color{red}\texttt{cwnd}的维护原则 cwnd的维护原则:只要网络 没有出现拥塞 \color{red}没有出现拥塞 没有出现拥塞 拥塞窗口 \color{red}拥塞窗口 拥塞窗口就再 增大 \color{red}增大 增大一些

    • 但只要网络 出现拥塞 \color{red}出现拥塞 出现拥塞 拥塞窗口就减少 \color{red}拥塞窗口就减少 拥塞窗口就减少一些。
  • 判断出现 网络拥塞的依据 \color{red}网络拥塞的依据 网络拥塞的依据:没有按时收到应当到达的确认报文(即 发生超时重传 \color{red}发生超时重传 发生超时重传)。

发送方将拥塞窗口作为 发送窗口 swnd \color{red}发送窗口\texttt{swnd} 发送窗口swnd,即 swnd   =   cwnd \color{red}\texttt{swnd = cwnd} swnd = cwnd

维护一个慢开始门限 ssthresh \color{red}\texttt{ssthresh} ssthresh 状态变量:

cwnd   <   ssthresh \texttt{cwnd < ssthresh} cwnd < ssthresh 时,使用慢开始算法;

cwnd   >   ssthresh \texttt{cwnd > ssthresh} cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法;

cwnd   =   ssthresh \texttt{cwnd = ssthresh} cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。

2.1、慢开始(指数增长) & 拥塞避免(线性+1)

如下所示:拥塞窗口随传输轮次变化图

传输轮次:发送方给接收方发送数据报文段后,接收方给发送方发回相应的确认报文段

  • 一个传输轮次所经历的时间其实就是往返时间

  • 往返时间并非是恒定的数值

使用传输轮次是为了强调把拥塞窗口所允许发送的报文段连续发送出去,并收到了对已发送的最后一个报文段的确认

拥塞窗口:它会随网络拥塞程度以及所使用的拥塞控制算法动态变化

  • TCP 双方建立逻辑连接关系时,拥塞窗口的值设置为 1 1 1

慢开始门限的初始值此处设置为 16 16 16

image-20230105225220219

2.1.1、TCP 报文段未丢失情况

在执行慢开始算法时,发送方每收到一个对新报文的确定时,就把拥塞窗口值 + 1,然后开始下一轮的传输

当拥塞窗口值增长到慢开始门限值时,就改为执行拥塞避免算法

由于当前拥塞窗口值是 1 1 1,而发送窗口值等于拥塞窗口值

  • 因此,发送方当前只能发送一个 TCP 数据报文段
  • 即:拥塞窗口值是几,就能发送几个 TCP 数据报文段

image-20230105225907501

例如:此时发送方当前拥塞窗口值已经增大到了慢开始门限值

之后,改用拥塞避免算法

也就是每个传输轮次结束后,拥塞窗口值只能线性 + 1

  • 而不像慢开始那样,每个传输轮次结束后,拥塞窗口值按指数规律增长

image-20230105230504349

2.1.2、TCP 报文段丢失情况

例如:此时,发送方可以发送 171 171 171 ~ 194 194 194 24 24 24 个数据报文段

假设这 24 24 24 个数据报文段在传输过程中丢失了几个

  • 则必然会造成发送方对这些丢失报文段的超时重传

image-20230105230721374

发送方很可能判断网络出现了拥塞,需要进行以下工作

①将慢开始门限值更新为发生拥塞时拥塞窗口值的一半,如下所示

slowstart.gif

②将拥塞窗口值减少为 1 1 1,并重新开始执行慢开始算法,如下所示

yongsaibimian.gif


当慢开始算法执行到拥塞窗口值增大到新的慢开始门限值时,就停止使用慢开始算法

  • 转而执行拥塞避免算法

如下所示

yongsaibimian2.gif


2.1.3、小结

通过上述可以看出

1、一开始,TCP 发送方一开始使用慢开始算法,让拥塞窗口值从 1 1 1 开始按指数规律增大

  • 当拥塞窗口值增大到慢开始门限值时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性 + 1 的规律增大

2、当超时重传是就判断网络可能出现了拥塞,采取相应的措施

  • 一方面:将慢开始门限值更新为发生拥塞时拥塞窗口值的一半
  • 另一方面:将拥塞窗口值减少为 1 1 1,并重新开始执行慢开始算法

3、拥塞窗口值又从 1 1 1 开始按指数规律增大

  • 当增大到了新的慢开始门限时,停止使用慢开始算法,转而执行拥塞避免算法,让拥塞窗口值按线性 + 1 的规律增大

image-20230105232355625


2.1.4、注意

“慢开始” 是指一开始向网络注入的报文段少,并不是指拥塞窗口 cwnd \texttt{cwnd} cwnd 增长速度慢;

“拥塞避免 ”并非指完全能够避免拥塞,而是指在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞;


2.2、快重传 & 快恢复

慢开始和拥塞避免算法是 1988 1988 1988 年提出的TCP拥塞控制算法(TCP Tahoe版本)。

1990 1990 1990 年又增加了两个新的拥塞控制算法( 改进 TCP 的性能 \color{red}改进 \texttt{TCP} 的性能 改进TCP的性能),这就是快重传和快恢复(TCP Reno版本)。

  • 有时, 个别报文段 \color{red}个别报文段 个别报文段会在网络中 丢失 \color{red}丢失 丢失,但实际上网络 并未发生拥塞 \color{red}并未发生拥塞 并未发生拥塞

  • 这将导致 发送方 \color{red}发送方 发送方超时重传,并 误认为 \color{red}误认为 误认为网络发生了 拥塞 \color{red}拥塞 拥塞;

  • 发送方把拥塞窗口 cwnd 又设置为最小值 1 \color{red}发送方把拥塞窗口 \texttt{cwnd} 又设置为最小值1 发送方把拥塞窗口cwnd又设置为最小值1,并错误地启动慢开始算法,因而 降低了传输效率 \color{red}降低了传输效率 降低了传输效率

例如:如下所示,当拥塞窗口值增大到 24 24 24 时,发生了超时重传

  • 而网络并没有发生拥塞,但是发送方却误认为网络发生了拥塞

image-20230105233524423


2.2.1、快重传算法

采用快重传算法可以KaTeX parse error: Unexpected end of input in a macro argument, expected '}' at position 12: \color{\red}̲让发送方尽早知道发生了个别报文…

所谓快重传,就是使发送方 尽快进行重传 \color{red}尽快进行重传 尽快进行重传,而 不是等超时重传计时器超时 \color{red}不是等超时重传计时器超时 不是等超时重传计时器超时再重传。

  • 要求接收方不要等待自己发送数据时才进行捎带确认,而是要 立即发送确认 \color{red}立即发送确认 立即发送确认;

  • 即使收到了失序的报文段也要立即发出对已收到的报文段的 重复确认 \color{red}重复确认 重复确认

  • 发送方一旦 收到 3 个连续的重复确认 \color{red}收到3个连续的重复确认 收到3个连续的重复确认,就将相应的报文段 立即重传 \color{red}立即重传 立即重传,而不是等该报文段的超时重传计时器超时再重传。

  • 对于个别丢失的报文段,发送方不会出现超时重传,也就不会误认为出现了拥塞(进而降低拥塞窗口 cwnd 1 1 1)。使用快重传可以使整个网络的吞吐量提高约 20 % 20\% 20%


发送方发送 1 1 1 号数据报文段

  • 接受方收到后给发送方发回对 1 1 1 号报文段的确认

在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 2 2 2 号数据报文段发送出去

  • 接受方收到后给发送方发回对 2 2 2 号报文段的确认

在该确认报文段到达发送方之前,发送方还可以将发送窗口内的 3 3 3 号数据报文段发送出去

  • 但该报文段丢失了,接收方自然不会给发送方发回针对该报文段的确认

image-20230105234349457


发送方还可以将发送窗口内的 4 4 4 号数据报文段发送出去

  • 接受方收到后,发现这不是按序到达的报文段
  • 因此,给发送方发回针对 2 2 2 号报文段的重复确认

表明:“我现在希望收到的是 3 号报文段,但是我没有收到 3 号报文段,而是收到了未按序到达的报文段”

发送方还可以将发送窗口内的 5 5 5 号数据报文段发送出去

  • 接受方收到后,发现这不是按序到达的报文段
  • 因此,给发送方发回针对 2 2 2 号报文段的重复确认

发送方还可以将发送窗口内的 6 6 6 号数据报文段发送出去

  • 接受方收到后,发现这不是按序到达的报文段
  • 因此,给发送方发回针对 2 2 2 号报文段的重复确认

image-20230105234653946


至此,发送方收到 3 3 3 个连续的对 2 2 2 号报文段的重复确认,就立即重传 3 3 3 号报文段

  • 接受方收到后给发送方发回对 6 6 6 号报文段的确认

表明序号到 6 6 6 为止的报文段都正确接收了

  • 这样就不会造成对 3 3 3 号报文段的超时重传
  • 而是提早进行了重传

image-20230105234941203


使用快重传可以使整个网络的吞吐量提高约 20 % 20\% 20%

2.2.2、快恢复算法

发送方一旦 收到 3 个重复确认 \color{red}收到3 个重复确认 收到3个重复确认,就知道现在只是丢失了个别的报文段。

  • 于是不启动慢开始算法,而 执行快恢复算法 \color{red}执行快恢复算法 执行快恢复算法

发送方将慢开始门限 ssthresh 值和拥塞窗口 cwnd 值调整为当前窗口的一半 ; 开始执行拥塞避免算法 \color{red}发送方将慢开始门限\texttt{ssthresh} 值和拥塞窗口\texttt{cwnd}值调整为当前窗口的一半;开始执行拥塞避免算法 发送方将慢开始门限ssthresh值和拥塞窗口cwnd值调整为当前窗口的一半;开始执行拥塞避免算法

也有的快恢复实现是把快恢复开始时的拥塞窗口 cwnd 值再增大一些,即等于新的 ssthresh + 3 \texttt{ssthresh} + 3 ssthresh+3

  • 既然发送方收到 3 3 3 个重复的确认,就表明有 3 3 3 个数据报文段已经离开了网络;

  • 3 3 3 个报文段不再消耗网络资源而是停留在接收方的接收缓存中;

  • 可见现在网络中不是堆积了报文段而是减少了 3 3 3 个报文段。因此可以适当把拥塞窗口扩大些。

2.3、整体曲线图

image-20230106001109301

3、习题

image-20230106001252721

image-20230106001702162

答案 C

4、小结

image-20230106001823255

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

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

相关文章

CSDN第22场周赛

1.写在前面的话22场周赛的详情总比赛第7名了&#xff0c;hhhCSDN周赛非常能够锻炼码代码的能力&#xff0c;无论是在平常的练习题目当中&#xff0c;还是每次的周赛中&#xff0c;题目有难有易&#xff0c;每次周赛的题目出的十分具有代表性&#xff0c;参加了将近20场的周赛&a…

批量PDF文件合并用什么软件?这两个宝藏软件赶快收藏起来

我们在工作中经常有很多处理过的PDF文件&#xff0c;我们经常会将这些文件进行保存&#xff0c;以防日后需要使用&#xff0c;但是太多的PDF文件真的会占用很多存储空间&#xff0c;所以我们可以将各类PDF文件合并在一起&#xff0c;这样也方便以后观看&#xff0c;但是逐个合并…

Docker容器实时日志查看器Dozzle

什么是 Dozzle&#xff1f; Dozzle 是一个小型轻量级应用程序&#xff0c;具有基于 Web 的界面来监控 Docker 日志。Dozzle不存储任何日志文件&#xff0c;仅用于实时监控您的容器日志。 先看个官方的动图 老苏已转成了视频&#xff0c;源文件地址&#xff1a;https://github.c…

制造型企业离不开MES?MES系统有什么应用场景

随着工业物联网的迅速发展&#xff0c;设备监测也成为MES系统中的一个关键环节。过去我们所收集到的资料&#xff0c;也许只是一种记录的作用&#xff0c;随着联网的设备越来越多以及大数据、云计算等技术的发展&#xff0c;数据的价值越来越高。数据收集不再仅仅是一种简单的记…

Codeforces Round #841 (Div. 2) (A--D)

[TOC](Codeforces Round #841 (Div. 2)(A–D)) A、 Joey Takes Money 1、题目 2、思路 3、代码 #include<iostream>#include<algorithm>#include<cstring>using namespace std;typedef unsigned long long ll;int main(){ll t;cin>>t;while(t--){int…

新书赠送丨《中国金融科技发展概览:创新与应用前沿》

我国金融科技发展日新月异&#xff0c;人工智能、云计算、大数据等新兴数字技术与实体经济及金融业的深度融合&#xff0c;推动我国数字经济快速发展&#xff0c;也深刻改变着我国金融业的服务业态和经营模式。过去的一年&#xff0c;金融机构实现核心技术自主可控成为热点&…

影响因子14.65:16S全长测序+低丰度简化菌群,提供根腐病防控新视角

背景介绍当土壤中病原体入侵时&#xff0c;植物可以动态调节其根际微生物并适应这种生物胁迫。植物招募的保护性微生物群落中通常包含一些低丰度的类群&#xff0c;其作用尚不清楚。本研究首先分析了健康和患病黄芪之间根系微生物群落结构的差异&#xff0c;依据患病黄芪根部的…

增加模拟前端的动态范围

1、光电接收电路 下面两张图分别在sensor正偏置和负偏置时的接收电路&#xff0c;这里我们关注一下输出的波形特征为一个脉冲信号&#xff0c;脉冲信号的共模电压为5V分压得到&#xff0c;信号的摆幅为Iout*RT&#xff0c;Iout为光电流&#xff0c;在应用在雷达接收的中时&…

JVM调试命令与调试工具

一、JDK自带命令Sun JDK监控和故障处理命令如&#xff1a;1、jpsJVM Process Status Tool&#xff0c;显示指定系统内所有的HotSpot虚拟机进程。jsp命令格式&#xff1a;jps [ options ] [ hostid ] 扩展参数&#xff1a;jps -l&#xff1b;jps -mlv&#xff1b;各参数说明如下…

tkinter 实现倒计时(1小时)

使用python标准GUI库tkinter实现倒计一小时效果。 废话少说。 效果图&#xff1a; 要不然看个 动态效果 图&#xff1a; 代码&#xff1a; from tkinter import * from tkinter.messagebox import showerrorroot Tk() root.title("倒计时") root.geometry("3…

解析|当前企业OA系统面对的困难与解决方案

近年来&#xff0c;由于疫情爆发&#xff0c;线下的企业办公效率难以保证&#xff0c;不少企业逐渐转向远程办公。尝试过后&#xff0c;远程办公的优势凸显&#xff0c;使得有越来越多的企业开始逐渐深入了解在线办公软件、协同办公OA系统。据统计&#xff0c;2021年数字化办公…

监控docker

当前&#xff0c;容器的使用已经非常普及&#xff0c;将服务迁移到容器上正成为了越来越多公司的选择。而对于运维人员而言&#xff0c;熟悉容器的使用与监控&#xff0c;也已成为一项必不可少的专业技能。关于容器的开源产品&#xff0c;目前知名的有Docker、Containerd、Core…

P2580 于是他错误的点名开始了

题目背景 XS中学化学竞赛组教练是一个酷爱炉石的人。 他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次&#xff0c;然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉&#xff08;详情请见已结束比赛 CON900&#xff09;。 题目描述 这之后校长任命你为特派探员…

范数的意义与计算方法(使用NumPy)

1. 范数的意义 范数可以简单的理解为“距离”。由于向量是既有大小又有方向的量&#xff0c;所以向量是不能直接比较大小的&#xff0c;但是范数提供了一种方法&#xff0c;可以将所有的向量转化为一个实数&#xff0c;然后就可以比较向量的大小了。&#xff08;注&#xff1a…

前端Vue和Element-UI配合后端接口进行数据交互

前言 本次用element-ui的table组件&#xff0c;简单案例演示下前后端数据交互。 前提声明&#xff1a;如果不知道如何在vue中引入element-ui&#xff0c;可以先看下这篇文章:Vue引入并使用Element-UI组件库的两种方式 静态页面 首先先写一个静态页面吧&#xff0c;数据都是…

《Linux运维实战:Centos7.6基于ansible一键离线部署redis6.2.8容器版之cluster集群》

一、部署背景 由于业务系统的特殊性&#xff0c;我们需要针对不同的客户环境部署redis cluster集群&#xff0c;由于大都数用户都是专网环境&#xff0c;无法使用外网&#xff0c;为了更便捷&#xff0c;高效的部署&#xff0c;针对业务系统的特性&#xff0c;我这边编写了基于…

采用模块化设计的轮腿式六足机器人

原创作者&#xff1a;王菡琪1、前言 1.1 背景及意义 近两个世纪以来&#xff0c;人类生产技术水平不断飞跃&#xff0c;人口数量也大幅增长&#xff0c;这是人类史上不曾有的盛景&#xff0c;但是这也同时对我们提出了全新的挑战&#xff0c;于是我们研发了各类机器&#xff…

ECS简单介绍

ECS 云服务器ECS (Elastic Compute Service)是一种可弹性伸缩的计算服务&#xff0c;降低IT成本&#xff0c;提升运维效率&#xff0c;更专注于核心业务创新。 定位&#xff1a;最基础的计算服务&#xff0c;ECS及其上装载的操作系统&#xff0c;通常用作应用程序的运行环境。…

聚类--常见的K-MEANS聚类,DBSCAN聚类方法介绍

聚类 1. 什么是聚类⁉️ ➡️ 聚类就是把相似的物品分到一组。例如苹果&#xff0c;橙子属于水果类&#xff0c;猫&#xff0c;狗属于动物类&#xff0c;聚类把具有相似属性的物品分到同一组。 ☕常见的两种监督问题 有监督问题&#xff1a;有标签学习&#xff0c;通过已知…

过线检测判断方向

过线检测时需要判断目标是从哪个方向经过的 L1向量&#xff1a;&#xff08;-1&#xff0c;-7&#xff09; L2向量&#xff1a;&#xff08;-5&#xff0c;0&#xff09; 叉乘&#xff1a;L1 X L2 (-1x0 - (-5 x -7)) 0 - 35 -35 点乘&#xff1a;L1 L2 -1 x -5 -7 x 0…