TCP如何实现的拥塞控制

1.网络拥塞: 

    在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络性能就要变坏,这种情况就叫做网络拥塞。
        如:在一个道路上,如果没有道路管制(如靠右行驶),这个道路上的来去的车一多而且都不遵守交通规则,或者后面的车辆已经看到了前面已经堵车了,但是还一个劲的往前挤,那么这个路就会越来越堵。
 
    出现网络拥塞的条件:     对资源需求的总和 > 可用资源
        如:一根网线的带宽是50M,但是网络中的所有人传输的带宽已经大于50M了就会出现堵塞
    
    而流量控制是两台计算机之间调控自己的传输速度。和拥塞没有关系。
 

2.拥塞控制

    网络中的所有使用TCP通讯的计算机,如果在传输过程中出现了丢包的情况,就会主动把发送速度降下来,避免堵住
    
    拥塞控制起到的作用
                                     
    假设网络的最大吞吐量是50M。(可用理解为网线的带宽为50M)
        理想的拥塞控制:当网络上传输的数据包的流量超过了50M,路由器就会处理不过来大量的数据包时就会丢包,再传输过来的数据包就会直接扔掉。而且网络一点也不堵。
        实际的拥塞控制:为了避免出现绿线的情况。如果出现了丢包的情况,路由器就会自动减缓发送速度和接受速度。
        无拥塞控制:网络线路上传输的数据包如果没有拥塞控制,如果有丢包完全不考虑,还是该扔多少就扔多少。这样就会适得其反,扔了20M就出处理了10M,而有10M的数据包丢包堵住了。最后就会造成死锁(传输的数据越快,接收到的数据包最后就会为0)堵住。
    
    
    

3.网络拥塞的解决方法:  慢开始、拥塞避免、快速重传、快速恢复

    发送方维持 拥塞窗口(cwnd,就是可靠传输中的接收窗口 )的原则: 
        只要网络没有拥塞,拥塞窗口就增大一些,以便发送更多分组出去
        只要网络出现拥塞,拥塞窗口就减小大一些,以减少网络中的分组数。
 
  • 慢开始和拥塞避免
  1.慢开始算法:开始的传输速率慢,到后面会越来越快,以2的指数的速率加快
        但是如果不控制cwnd就会快速膨胀,为了防止因为cwnd的过度增长引起的网络拥塞,需要使用慢开始门限ssthresh控制:
        慢开始门限ssthresh默认值是16。会根据发生网络拥塞的峰值(下一次是峰值的一半,如下图)随时都会变化
 
    2.拥塞避免算法:通过慢开始门限的约束,让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的cwnd拥塞窗口cwnd加1cwnd,而不是加倍cwnd。这样拥塞窗口cwnd按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。
        拥塞避免算法不能完全避免拥塞,只是使网络不容易出现拥塞。
 
 
    3.慢开始和拥塞避免的工作原理:  先使用慢开始算法 然后 使用拥塞避免算法。
     
    第一轮,cwnd=1,开始执行慢开始算法,因为不知道网络到底堵不堵,所以只发送1个数据包试探一下,如果在规定时间内接收到确认包就进行第二轮。
    第二轮,cwnd=2,一次发送2个数据包,如果正常接收到确认包就进行第三轮。
    第三轮,cwnd=4,一次发送4个数据包,如果正常接收到确认包就进行第四轮。
    下面的都看右面的图。
    cwnd=8,一次发送8个数据包,如果正常接收到确认包就进行第五轮。
    cwnd=16,已经到等于了默认慢开始门限的值,一次发送16个数据包,正常发送数据包16个。
    cwnd=17,因为默认慢开始门限就是16,执行拥塞避免算法,一次只增长一个cwnd,所以这一次不是32,而是17。
    。。。
    cwnd=24,到了该点发送24个cwnd的位置已经开始出现丢包现象,网络开始有点拥塞。
    cwnd=25,由于网络出现了丢包,所以就要从0重新开始发送数据包,执行慢开始算法。倍数增长。但是此时的慢开始门限的值也会变为网络拥塞点的1/2个cwnd,也就是12。
    cwnd=1,因为丢包了,所以重新开始执行慢开始算法
    。。。
    cwnd=12,开始执行拥塞避免算法。之后重复上面的步骤。
    
       
     
  • 快速重传:快重传和快恢复是配套使用的。
    快速重传:要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方),而不要等到自己发送数据时捎带确认。
        如:A给B发数据,假设B每接收到5个数据包就向A确认,当B收到了1、2后,但是直接收到了4,B会认为3已经丢了,立即向A发送3个连续确认(都是3个),A收到3个连续确认,让A发第3个,B就不等到5个再确认,让A重新发送3的数据包。  为了防止A重发后面B已经收到的数据包。
    然后又从cwnd=1开始重新发送数据包,执行快速恢复。
 
  • 快速恢复
    快速恢复的工作机制:
              
    (1)当发送方连续收到三个重复确认,就执行“乘法减小”算法,立刻把慢开始门限ssthresh减半为12。这是为了预防网络发生拥塞。然后立即重传丢失的报文段,并将cwnd设置为新的ssthresh(如:12。减半后的ssthresh)
     注意:接下来不执行慢开始算法
 
有些快重传实现是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3 * MSS 。这样做的理由是:既然发送方收到三个重复的确认,就表明有三个分组已经离开了网络。这三个分组不再消耗网络资源而是停留在接收方的缓存中。可见现在网络中并不是堆积了分组而是减少了三个分组。因此可以适当把拥塞窗口扩大了些。
 
(2)因为发送方收到了3个连续的数据包,所以发送方现在认为网络很可能没有发生拥塞,因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口cwnd现在不设置为1),而是把cwnd值设置为慢开始门限ssthresh减半后的数值(如:12),然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大
 
(3)每次收到一个重复的确认时,设置cwnd=cwnd+SMSS(拥塞窗口cwnd加1).此时发送端可以发送新的TCP报文段
 
(4)当收到新数据的确认时,设置cwnd=ssthresh(如:12。ssthresh是新的慢启动门限值,由第一步计算得到)
    原因是因为该ack确认了新的数据,说明从重复ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免算法
 
快速重传和快速恢复完成之后,拥塞控制将恢复到拥塞避免阶段。
    
    
    
   
 如有问题欢迎指出
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值