KCP源码解析系列(五)拥塞控制

流量控制和拥塞控制的区别

如果你约了你的朋友见面聊一件事,有两种沟通方式:

  • 第一种是一次只说一句话,然后等待你的朋友回应“收到”,确认他在听之后,再说下一句话,如此反复,直到事情说完。
  • 第二种是一次性把所有话说完,然后再等朋友点头确认他都听到了。
    理想情况下,第二种方式是最好的,因为这样来回沟通的次数较少。然而,在实际过程中,还需要考虑以下几个因素:
  • 对方的理解能力。一次说太多,可能对方无法完全理解和接收。
  • 聊天环境。如果环境较为嘈杂,比如在KTV里,那么一次性说太多可能会导致对方听不清,从而产生困惑和尴尬。
    第一个因素涉及到流量控制(Flow Control),主要考虑接收方的信息处理能力。第二个因素涉及到拥塞控制(Congestion Control),主要考虑网络或沟通环境能承受的信息量。

拥塞控制的方式

  1. 慢开始(Slow-start)、拥塞避免(Congestion Avoidance)

  2. 快重传(Fast Restrangsmit)、快恢复(Fast Recovery)

下图可以表示整个拥塞控制的流程,但这是TCP的,KCP原理一样,但增速有差异。这个图初一看很复杂,但理解起来很简单。
在这里插入图片描述

拥塞控制的思路

  1. 当主机开始发送数据时,如果立即将较大的发送窗口的全部数据字节都注入到网络中,那么由于不清楚网络的情况,有可能引其网络拥塞

  2. 比较好的方法是试探一下,即从小到大逐渐增大发送端的拥塞控制窗口数值。这就叫慢开始。虽然开始的慢,但增速快。通常在刚刚开始发送报文段时可先将拥塞窗口cwnd设置为一个最大报文段的MSS的数值。在每收到一个对新报文段确认后,将拥塞窗口增加一个MSS的数值。

  3. 需要设定一个ssthresh,传输门限值,这是一个动态调整的阈值,根据cwnd和ssthresh的比较,采用不同的策略。

1)当cwnd < ssthresh时,使用慢开始算法

2)当cwnd > ssthresh时,停止使用慢开始算法而改用拥塞避免算法

3)当cwnd = ssthresh时 即可以使用慢开始算法,也可以使用拥塞避免算法。

  1. 随着cwnd逐步的增大,发送速度也可能会逐步增大,网络就可能发生拥塞,具体就是发生丢包。此时就会触发快重传。快重传很简单,就是比如你发送了1,2,3,4,5这几个包,然后收到了1,3,4,5的ack,2被连续跳过了三次,就直接把2重新发一次。

  2. 当发生快重传时,说明网络环境不太好,这是可以快速降低ssthresh,避免网络进一步发生堵塞,这个就叫快恢复。

KCP源码中的拥塞控制

慢开始和拥塞避免

 //当发送窗口的snd_una右移,说明可以更新拥塞窗口了
    if (_itimediff(kcp->snd_una, prev_una) > 0) {
   
   
        // 如果拥塞窗口小于远端窗口,表示还有发送空间
        if (kcp->cwnd < kcp->rmt_wnd) {
   
   
            
            IUINT32 mss = kcp->mss;
            // 慢开始的处理
            if (kcp->cwnd < kcp->ssthresh) {
   
   
                kcp->cwnd++;
                kcp->incr += mss;// 拥塞窗口增加量加上一个 MSS,增速较快。
            } else {
   
   // 拥塞避免阶段
                // 保证 incr 不小于 MSS
                if (kcp->incr < mss) {
   
   
                    kcp->incr = mss;
                }
                //这里的 /kcp->incr 表示增量会随着incr的增长而放缓, + (mss / 16)这部分是一个调节增加量,避免增长过于缓慢。
                kcp->incr += (mss * mss) / kcp->incr + (mss / 16);
                //这部分代码是为了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值