TCP拥塞控制机制(附面试题)

TCP拥塞控制机制(附面试题)产生的原因∑对资源的需求>可用资源∑对资源的需求>可用资源\sum_{}^{}对资源的需求>可用资源注意单纯的增加网络资源无法解决问题例如:把结点的存储空间扩大,更换更高速率的链路,提高结点处理机的运算速度,不仅不能解决问题,而且可能使网络性能更坏。原因:网络拥塞是许多因素引起的,单纯的解决一个可能会使上述情况得到一些缓解,但是会把拥塞转移到其…

大家好,又见面了,我是你们的朋友全栈君。

产生的原因

> ∑ 对 资 源 的 需 求 > 可 用 资 源

注意
单纯的增加网络资源无法解决问题
例如:把结点的存储空间扩大,更换更高速率的链路,提高结点处理机的运算速度,不仅不能解决问题,而且可能使网络性能更坏。
原因:网络拥塞是许多因素引起的,单纯的解决一个可能会使上述情况得到一些缓解,但是会把拥塞转移到其他地方。
扩大结点存储空间——>由于输出链路的容量和处理机的速度并未提高,增大排队等待时间,超时重传,浪费资源。
更换更高速率的链路——>可能会缓解,,有可能造成各部分不匹配。

拥塞控制的作用

拥塞控制的作用

注意
拥塞控制与流量控制的区别
拥塞控制是防止过多的数据注入到网络中,可以使网络中的路由器或链路不致过载,是一个全局性的过程。
流量控制是点对点通信量的控制,是一个端到端的问题,主要就是抑制发送端发送数据的速率,以便接收端来得及接收。

拥塞的标志

1.重传计时器超时
2.接收到三个重复确认

拥塞控制的机制

TCP拥塞控制流程图
从连续收到三个重复的    确认转入拥塞避免

慢开始与拥塞避免

慢开始

1.慢开始不是指cwnd的增长速度慢(指数增长),而是指TCP开始发送设置cwnd=1。
2.思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。这里用报文段的个数的拥塞窗口大小举例说明慢开始算法,实时拥塞窗口大小是以字节为单位的。如下图:
每经过一个传输轮次,cnwd指数增长
3.为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限(ssthresh状态变量)
当cnwd<ssthresh,使用慢开始算法
当cnwd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法
当cnwd>ssthresh,使用拥塞避免算法

拥塞避免(按线性规律增长)

1.拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。
2.思路:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞控制窗口加一。

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有收到确认,虽然没有收到确认可能是其他原因的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把慢开始门限设置为出现拥塞时的发送窗口大小的一半。然后把拥塞窗口设置为1,执行慢开始算法。
慢开始与拥塞避免算法的实现

加法增大与乘法减小
乘法减小:无论是慢开始阶段还是拥塞避免,只要出现了网络拥塞(超时),就把慢开始门限值ssthresh减半
加法增大:执行拥塞避免算法后,拥塞窗口线性缓慢增大,防止网络过早出现拥塞

快重传与快恢复

增加快重传与快恢复

快重传

1.快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
快重传示意图
2.由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。

快恢复(与快重传配合使用)

1.采用快恢复算法时,慢开始只在TCP连接建立时和网络出现超时时才使用。
2.当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
3.考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。

注意
发送方窗口的上限值=Min(接受窗口rwnd,拥塞窗口cwnd)
rwnd>cwnd 接收方的接收能力限制发送方窗口的最大值
rwnd<cwnd 网络的拥塞限制发送方窗口的最大值

面试题

腾讯面试题
TCP的拥塞控制机制是什么?请简单说说。
答:我们知道TCP通过一个定时器(timer)采样了RTT并计算RTO,但是,如果网络上的延时突然增加,那么,TCP对这个事做出的应对只有重传数据,然而重传会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这就导致了恶性循环,最终形成“网络风暴” —— TCP的拥塞控制机制就是用于应对这种情况。
首先需要了解一个概念,为了在发送端调节所要发送的数据量,定义了一个“拥塞窗口”(Congestion Window),在发送数据时,将拥塞窗口的大小与接收端ack的窗口大小做比较,取较小者作为发送数据量的上限。
拥塞控制主要是四个算法:
1.慢启动:意思是刚刚加入网络的连接,一点一点地提速,不要一上来就把路占满。
连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据。
每当收到一个ACK,cwnd++; 呈线性上升
每当过了一个RTT,cwnd = cwnd*2; 呈指数让升
阈值ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入“拥塞避免算法”
2.拥塞避免:当拥塞窗口 cwnd 达到一个阈值时,窗口大小不再呈指数上升,而是以线性上升,避免增长过快导致网络拥塞。
每当收到一个ACK,cwnd = cwnd + 1/cwnd
每当过了一个RTT,cwnd = cwnd + 1
拥塞发生:当发生丢包进行数据包重传时,表示网络已经拥塞。分两种情况进行处理:
等到RTO超时,重传数据包
sshthresh = cwnd /2
cwnd 重置为 1
3.进入慢启动过程
在收到3个duplicate ACK时就开启重传,而不用等到RTO超时
sshthresh = cwnd = cwnd /2
进入快速恢复算法——Fast Recovery
4.快速恢复:至少收到了3个Duplicated Acks,说明网络也不那么糟糕,可以快速恢复。
cwnd = sshthresh + 3 * MSS (3的意思是确认有3个数据包被收到了)
重传Duplicated ACKs指定的数据包
如果再收到 duplicated Acks,那么cwnd = cwnd +1
如果收到了新的Ack,那么,cwnd = sshthresh ,然后就进入了拥塞避免的算法了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152769.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Makefile教程(绝对经典,所有问题看这一篇足够了)「建议收藏」

    Makefile教程(绝对经典,所有问题看这一篇足够了)「建议收藏」该篇文章为转载,是对原作者系列文章的总汇加上标注。支持原创,请移步陈浩大神博客:http://blog.csdn.net/haoel/article/details/2886makefile很重要   什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefil…

    2022年5月14日
    33
  • vs2019配置opencv什么版本_vs配置opencv

    vs2019配置opencv什么版本_vs配置opencv一、环境vs2019社区版、win1064位操作系统二、opencv配置步骤(共5步)1、下载OpenCV4.0.1,官网为opencv.org2、安装opencv,我的安装目录是D:\opencv-4.0.1-vc14_vc153、添加环境变量,在PATH中添加:D:\opencv-4.0.1-vc14_vc15\opencv\build\x64\vc15…

    2022年10月20日
    1
  • .NET框架体系结构

    刚开始接触.NET很疑惑,看完视频也不是太懂,通过总结和反复,从概括和概念入手,慢慢变得清晰了。这篇博客主要是我对.NET基础知识的了解,算作积累吧。.NET框架体系结构由四个主要部分组成公共语

    2021年12月23日
    55
  • python爬虫的思路总结

    python爬虫的思路总结爬虫是一个比较容易上手的技术,也许花5分钟看一篇文档就能爬取单个网页上的数据。但对于大规模爬虫,完全就是另一回事,并不是1*n这么简单,还会衍生出许多别的问题。系统的大规模爬虫流程如图所示。先检查

    2022年7月3日
    24
  • 6种常见的测试用例设计方法及应用_测试用例设计的方法

    6种常见的测试用例设计方法及应用_测试用例设计的方法测试前准备作为一个测试人员,软件测试的流程首先是要非常熟悉的,何时何地都能脱口而出,避免一切翻车的可能。需要注意的是流程没有唯一答案,具体由项目决定。所以给出的只是一个还算通用的参考流程。  我们要熟知的测试流程:  总结一下:在测试流程中,有6个部分,其中3个部分涉及到了用例,可见写好用例的重要性。  所以,结合这些年吃过的亏,我来给大家缕缕,如何快速的get到测试用例的设计方法。  5种常见的测试用例设计方法  一、等价类划分  1)概念  某个输入域的集合,在这个集合中每个输入条件都是

    2022年10月9日
    2
  • 联盟卡结合异业联盟,如何建立一个完善的联盟生态会员体系?「建议收藏」

    联盟卡结合异业联盟,如何建立一个完善的联盟生态会员体系?「建议收藏」对于我们所认知的联盟,生态就是联盟生态,也就是说,如果我们要做一个联盟卡,然后通过我们的联盟卡去建立我们的会员。那如何来建立呢?分四个方式来讲。首先第一个方式要建立完善的一个会员体系,把这个会员体系给架构起来。如何成为我们平台的会员,以及说成有平台会员之后可以享受平台的一种权益。再者的话就是如何让我们的会员去帮助我们平台去做裂变,也就是我们经常讨论的一个问题,如何去做分享?那么在这个环节中如何去做一个线上电子权益卡,通过入口让用户可以去购买,或者叫免费卡也行,这个都是由平台去做设定的,开通后可以去享受我们相

    2022年6月15日
    27

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号