TCP拥塞控制-慢启动、拥塞避免、快重传、快启动

news/2024/5/17 20:22:41 标签: TCP

TCP拥塞控制-慢启动、拥塞避免、快重传、快启动



一般原理:发生拥塞控制的原因:资源(带宽、交换节点的缓存、处理机)的需求>可用资源。

作用:拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。拥塞控制要做的都有一个前提:

就是网络能够承受现有的网络负荷。

对比流量控制:拥塞控制是一个全局的过程,涉及到所有的主机、路由器、以及降低网络相关的所有因素。流量控制往往指点对点通信量的控

制。是端对端的问题。


拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方让自己的发送窗口=拥塞窗口,但是
发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化了。

 发送方如果知道网络拥塞了呢?发送方发送一些报文段时,如果发送方没有在时间间隔内收到接收方的确认报文段,则就可以人为网络出现了拥塞。

慢启动算法的思路:主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。

   例子:开始发送方先设置cwnd(拥塞窗口)=1,发送第一个报文段M1,接收方接收到M1后,发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就加倍。

 拥塞避免:为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量(我也不知道这个到底是什么,就认为他是一个拥塞控制的标识),它的用法:

                  1. 当cwnd< ssthresh,使用慢启动算法,

                  2. 当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。

                  3. 当cwnd = ssthresh,这两个算法都可以。



   拥塞避免的思路:是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。

  实例:1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。

             2.在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长,

             3.当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。 



          

     AIMD(加法增大乘法减小)

          1.乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,ssthresh置为cwnd的一半,然后开始执行慢启动算法(cwnd<ssthresh)。

         2.加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络中的分组数,而加法增大是指执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞。

       这两个结合起来就是AIMD算法,是使用最广泛的算法。拥塞避免算法不能够完全的避免网络拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞。

   

      快重传:

      快重传算法要求首先接收方收到一个失序的报文段后就立刻发出重复确认,而不要等待自己发送数据时才进行捎带确认。接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK,现在接收方没有收到M3,而接收到了M4,显然接收方不能确认M4,因为M4是失序的报文段。如果根据可靠性传输原理接收方什么都不做,但是按照快速重传算法,在收到M4、M5等报文段的时候,不断重复的向发送方发送M2的ACK,如果接收方一连收到三个重复的ACK,那么发送方不必等待重传计时器到期,由于发送方尽早重传未被确认的报文段。





 

      快恢复:

       1. 当发送发连续接收到三个确认时,就执行乘法减小算法,把慢启动开始门限(ssthresh)减半,但是接下来并不执行慢开始算法。

       2. 此时不执行慢启动算法,而是把cwnd设置为ssthresh的一半, 然后执行拥塞避免算法,使拥塞窗口缓慢增大。



 


http://www.niftyadmin.cn/n/1313406.html

相关文章

如何理解和使用Java package

【摘自&#xff1a;Java编程思想】 Java中的一个包就是一个类库单元&#xff0c;包内包含有一组类&#xff0c;它们在单一的名称空间之下被组织在了一起。这个名称空间就是包名。可以使用import关键字来导入一个包。例如使用import java.util.*就可以导入名称空间java.util包里…

TCP-IP详解

TCP-IP详解&#xff1a;快速重传与快速恢复快速重传算法快速重传算法在之前的文章中有介绍&#xff0c;如果收到一个out-of-order的报文段时&#xff0c; TCP需要立刻产生一个ACK&#xff0c;这个ACK不应该被延时&#xff0c;目的在于让对方知道收到一个失序的报文&#xff0c;…

【转】Entity Framework Extended Library (EF扩展类库,支持批量更新、删除、合并多个查询等)...

E文好的可以直接看https://github.com/loresoft/EntityFramework.Extended 也可以在nuget上直接安装这个包&#xff0c;它的说明有点过时了&#xff0c;最新版本已经改用对IQueryable<T>的扩展&#xff0c;而不是DbSet<T>&#xff08;已经标记为弃用&#xff09;,所…

Java中的浮点数比较

前几天有位同学问我一个问题&#xff0c;为什么float和double不能直接用比较&#xff1f; 例如&#xff1a; [java] view plain copy System.out.println(0.1d 0.1f); 结果会是flase当时我只是简单的回答&#xff0c;因为精度丢失&#xff0c;比较结果是不对的。 那么&#…

Linux下的vim常用操作

在vim里面有3种模式&#xff1a;命令模式&#xff0c;编辑模式&#xff0c;末行模式 命令模式下的操作&#xff1a; 打开文件 vim 文件路径和名称&#xff0c;如果文件不存在则新建一个文件 vim xxx 代表打开这个文件从多少行开始 光标的移动 分为下面几个级别&#xff1a; 字…

TCP DUP ACK

最近在跟一个CDN服务器端做对接&#xff0c;从CDN服务器下载内容&#xff08;http&#xff09;&#xff0c;发现抓包出现非常多的Tcp Dup Ac​k异常提示。通过查阅质料得知Tcp Dup Ack xxx#y 代表了数据段丢失TCP状态&#xff0c;xxx代表数据丢失的位置&#xff0c;#后代表第几…

Tomcat4 源代码分析 (15) How Tomcat Works 第十五章

Chapter 15 : Digester 概览 在之前的章节中&#xff0c;我们用Bootstrap类来实例化connector, context, wrappers 以及其他的组件。当把组件注入到父级组件中时&#xff0c;我们使用的是set方法&#xff0c;比如说&#xff1a; connector.setContainer(context); context.setP…

应用程序无法正常启动0xc0150002解决方案

我也遇到过此问题&#xff0c;解决办法&#xff1a; 方案一&#xff1a; 在项目的“属性&#xff5c;配置属性&#xff5c;链接器&#xff5c;常规”中的“启用增量链接”选择“否”。此方法阻断了问题产生的源头&#xff0c;其每次生成exe文件时都直接嵌入清单文件&#xff0c…