拥塞避免算法

        慢启动算法是在一个连接上发起数据流的方法,但有时我们会达到中间路由器的极限,此时分组将被丢失。拥塞避免算法是一种处理丢失分组的方法。

        拥塞避免算法假定由于分组收到损坏引起丢失是非常少的(远小于1%),因此分组丢失就意味着在源主机和目的主机之间的某处网络发生了拥塞。有两种分组丢失的指示:发生超时和接收到重复的确认(如果使用超时作为拥塞指示,那么需要使用一个好的RTT算法)。

        拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,我们希望降低分组进入网络的传输速率,于是可以调用慢启动来做到这一点。在实际中,这两个算法通常在一起实现。

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

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

        2)TCP输出例程的输出不能超过cwnd和接收方的通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口是接收方使用的流量控制。前者是发送方感受到的网络拥塞的估计,而后者则与接收方在该连接上的可用缓存大小有关。

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

       4)当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于我们是否正在进行慢启动或者拥塞避免。如果cwnd小于或者等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到当拥塞发生时所处位置的一半的时候才停止(因为我们记录了在步骤2中给我们制造麻烦的窗口大小的一半),然后转为拥塞避免。

         慢启动算法初始设置cwnd为1个报文段,此后每收到一个确认就加1。这会使窗口按指数方式增长:发送一个报文段,然后是2个,接着是4个... ...

         拥塞避免算法要求每次收到一个确认时将cwnd增加1/cwnd。与慢启动的指数增长比起来,这是一种加性增长。我们希望在一个往返时间内最多增加一个报文段(不管在这个RTT时间内收到了多少个ACK),然而慢启动将根据在这个往返时间中所收到的确认的个数增加cwnd。

举例

1)T0时刻,cwnd=1,ssthresh=65535,cwnd以慢启动方式指数增长

2)T1时刻,cwnd=32,发送网络拥塞

     设置ssthresh=cwnd的一半,即16,

     设置cwnd=1,cwnd以慢启动方式指数增长

3)T2时刻,cwnd=ssthresh=16,进入拥塞避免算法

      cwnd以线性方式增长,在一个RTT时间内最多增加一个报文段

      直至发生网络拥塞,进入步骤2)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值