慢启动和拥塞避免算法

一:慢启动算法

        慢启动算法通过观察到新分组进入网络的的速率应该与另一端返回确认的速率相同而进行工作。慢启动为发送方的TCP增加了另一个窗口:拥塞窗口(congestion window),记为cwnd。

        有必要解释一下cwnd: 当新建连接时,cwnd初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文段被确认,cwnd就增加1个MSS大小

        当两端建立起TCP连接时,拥塞窗口被初始化为1。每收到一个ACK,拥塞窗口就增加一个报文段。发送方取拥塞窗口与通告窗口的最小值作为发送上限。拥塞窗口是发送方使用的流量控制,而通告窗口则是接收方使用的流量控制。

        发送方开始时发送一个报文段,然后等待ACK,当收到该ACK时,拥塞窗口从1增加到2,即可以发送两个报文段。当收到这两个报文段的ACK时,拥塞窗口就增加为4。这是一种指数增加的关系。

        指数增加的一个结果是,到了某个时间一次性报文发送过多,某些点上可能达到了互联网的容量,于是中间路由器开始丢弃分组。这就通知发送方它的拥塞窗口开得过大。慢启动算法往往和拥塞避免算法一起配合使用。

二:拥塞避免算法

        拥塞避免算法是假定由于分组受到损坏引起的丢失时非常少的(远小于1%),因此分组丢失意味着在源主机和目的主机之间的某处网络上发生了拥塞。拥塞表现为两种形式:发送一个报文后定时器发生超时没有收到ACK,另外就是收到了重复的ACK确认。

        拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。这样得到的算法工作过程如下:

        1,对一个给定的TCP连接,初始化cwnd为1,ssthresh为65535个字节

        2,发送方发送的报文不能超过cwnd和接收方通告的窗口大小。拥塞避免算法时发送方使用的流量控制,而通告窗口则时接收方进行的流量控制。前者时发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

        3,当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小的一半(cwnd和接收方通告大小的最小值,但最少为两个报文段)。此外如果是超时引起了拥塞,则cwnd被设置为1个报文段(这就是慢启动)。

        4,当新得数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或拥塞避免,如果cwnd小于或等于ssthresh,则进行慢启动,否则实施拥塞避免。慢启动一直持续到我们回到当拥塞发生时所处位置一半的时候停止,然后转为执行拥塞避免。

        拥塞避免算法要求每次收到一个ACK时,将cwnd设置为cwnd+1/cwnd。与慢启动的指数增加相比起来这是一种加性增长。

        当cwnd增加到某个大小的时候,同样也会发生超时,这时候如果收到连续的三个ack,就立马重传丢失的报文段,不用等待超时定时器的溢出。另外无需像一开始那样反应那么剧烈,立马启用慢启动。这时候能连续收到三个ack说明情况还没那么糟糕,这时候启用的是快速重传与快速恢复算法。

三:快速重传与快速恢复算法

       快速重传和快速恢复算法一般同时使用。快速恢复算法是认为,你还有3个Duplicated Acks说明网络也不那么糟糕,所以没有必要像RTO超时那么强烈,并不需要重新回到慢启动进行,这样可能降低效率。所以协议栈会做如下工作

        1.  cwnd = cwnd/2 

        2. sshthresh = cwnd 

该算法如下:

        1. 设置cwnd = ssthresh+ACK个数*MSS(一般情况下会是3个dup ACK)

        2. 重传丢失的数据包(对于重传丢失的那个数据包,可以参考TCP-IP详解:https://blog.csdn.net/wdscq1234/article/details/52503315

        3. 如果只收到Dup ACK,那么cwnd = cwnd + 1, 并且在允许的条件下发送一个报文段

        4. 如果收到新的ACK, 设置cwnd = ssthresh, 进入拥塞避免阶段

四:总结

 以上三种算法结合在一起就是如下图所示。在该图中假如在32个报文段时发生了拥塞。于是将慢启动的门限ssthresh设置为当前发生拥塞的窗口的一半为16个报文段,当慢启动的窗口cwnd达到16个时,启动拥塞避免算法。当进行到某个点,发生了超时,这时候启动快速重传和快速恢复算法,总的流程如下:

这里写图片描述

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值