WebRTC拥塞控制算法
背景
网络拥塞是基于IP协议的数据报交换网络中常见的一种网络传输问题,它对网络传输的质量有严重的影响,网络拥塞是导致网络吞吐降低,网络丢包等的主要原因之一,这些问题使得上层应用无法有效的利用网络带宽获得高质量的网络传输效果。特别是在通信领域,网络拥塞导致的丢包,延迟,抖动等问题,严重的影响了通信质量,如果不能很好的解决这些问题,一个通信产品就无法在现实环境中正常使用。丢包带宽估计
基于丢包的拥塞控制比较简单,其基本思想是根据丢包的多少来判断网络的拥塞程度。丢包越多则认为网络越拥塞,那么我们就要降低发送速率来缓解网络拥塞;如果没有丢包,这说明网络状况很好,这时候就可以提高发送码率,向上探测是否有更多的带宽可用。实现该算法有两点:一是获得接收端的丢包率,一是确定降低码率和提升码率的阈值。
Ashat(i)Ashat(i1),2丢包率10,保持不变Ashat(i)Ashat(i1)(10。5p),丢包率10,下降,p是丢包率Ashat(i)1。05Ashat(i1),丢包率2,上升
webrtc中发送端收到RTCPRR报文并解析得到丢包率后,根据下图公式计算发送端码率:当丢包率大于0。1时,说明网络发生拥塞,此时降低发送端码率;当丢包率小于0。02时,说明网络状况良好,此时增大发送端码率;其他情况下,发送端码率保持不变。延迟带宽估计GoogREMB
基于接收端的延迟算法,利用延迟值,通过卡尔曼滤波器估计出下一时刻的网络带宽趋势,效果的准确性和公平性不如TransportCC,目前已经被webrtc的新版本所淘汰TransportCC
基于发送端的延迟算法,也是利用区间延迟值,通过TrendLine滤波器(最小二乘法滤波器),通过斜率的增加或者减小来判断当前网络的拥塞状况时延梯度计算
首先我们通过一张图看下时延梯度的计算:
对于两个包组:i以及i1,它们的时延梯度:
在WebRTC中,延迟梯度不是一个个包来计算的,而是通过将包分组,然后计算这些包组之间的延迟,这样做可以减少计算次数,同时减少误差。包组的划分原则为在一个bursttime间隔内的一系列的包构成一个组。建议bursttime为5ms。
C音视频开发WebRTC学习资料:点击领取音视频开发(资料文档视频教程面试题)(FFmpegWebRTCRTMPRTSPHLSRTP)
TrendLine滤波器(最小二乘法滤波器)
使用到了线性回归的方法进行时延趋势预测,通过最小二乘法求得拟合的直线斜率
对于一堆样本点(x,y),拟合直线方程yaxb的斜率a按如下公式计算
具体方式就是对距离平方和的最小值,根据求导推出a的值
代码实现路径,googcctrendlineestimator。cc,实现和上述推导公式一致absl::optionaldoubleLinearFitSlope(conststd::dequeTrendlineEstimator::PacketTimingpackets){RTCDCHECK(packets。size()2);Computethecenterofmass。doublesumx0;doublesumy0;for(constautopacket:packets){计算x,y的总值sumxpacket。arrivaltimems;sumypacket。smootheddelayms;}计算x,y的平均值doublexavgsumxpackets。size();doubleyavgsumypackets。size();Computetheslopeksum(xixavg)(yiyavg)sum(xixavg)2doublenumerator0;doubledenominator0;for(constautopacket:packets){doublexpacket。arrivaltimems;doubleypacket。smootheddelayms;numerator(xxavg)(yyavg);denominator(xxavg)(xxavg);}if(denominator0)returnabsl::nullopt;returnnumeratordenominator;}
整体调用流程为LinearFitSlopeUpdateTrendlineLinearFitSlopeLinearFitSlopeTrendlineEstimator::DetectTrendlineEstimator::UpdateThresholdUpdateTrendline
这个方法主要是做一些数据的统计计算之后,调用LinearFitSlope计算斜率voidTrendlineEstimator::UpdateTrendline(doublerecvdeltams,doublesenddeltams,int64tsendtimems,int64tarrivaltimems,sizetpacketsize){时延变化:接收时间差发送时间差constdoubledeltamsrecvdeltamssenddeltams;numofdeltas;numofdeltasstd::min(numofdeltas,kDeltaCounterMax);if(firstarrivaltimems1)firstarrivaltimemsarrivaltimems;Exponentialbackofffilter。accumulateddelaydeltams;BWETESTLOGGINGPLOT(1,accumulateddelayms,arrivaltimems,accumulateddelay);根据1)中的时延累积值计算得到平滑后的时延:smoothingcoef为0。9smootheddelaysmoothingcoefsmootheddelay(1smoothingcoef)accumulateddelay;BWETESTLOGGINGPLOT(1,smootheddelayms,arrivaltimems,smootheddelay);if(delayhist。size()settings。windowsize)delayhist。popfront();Simplelinearregression。doubletrendprevtrend;当队列delayhist大小等于设定的窗口大小时,开始进行时延变化趋势计算,得到直线斜率if(delayhist。size()settings。windowsize){trendLinearFitSlope(delayhist)。valueor(trend);if(settings。enablecap){absl::optionaldoublecapComputeSlopeCap(delayhist,settings);Weonlyusethecaptofilteroutoverusedetections,nottodetectadditionalunderuses。if(trend0cap。hasvalue()trendcap。value()){trendcap。value();}}}BWETESTLOGGINGPLOT(1,trendlineslope,arrivaltimems,trend);传入trend来计算当前网络状态Detect(trend,senddeltams,arrivaltimems);}Detect
该函数主要根据时延变化增长趋势计算当前网络状态。在Detect函数内部,会根据前面计算得到的斜率得到一个调整后的斜率值:modifiedtrend:
【小编强力推荐】音视频开发教程视频:【免费】FFmpegWebRTCRTMPNDKAndroid音视频流媒体高级开发学习视频教程腾讯课堂
C音视频开发WebRTC学习资料:点击领取音视频开发(资料文档视频教程面试题)(FFmpegWebRTCRTMPRTSPHLSRTP)
voidTrendlineEstimator::Detect(doubletrend,doubletsdelta,int64tnowms){if(numofdeltas2){hypothesisBandwidthUsage::kBwNormal;return;}constdoublemodifiedtrendstd::min(numofdeltas,kMinNumDeltas)trendthresholdgain;prevmodifiedtrendmodifiedtrend;BWETESTLOGGINGPLOT(1,T,nowms,modifiedtrend);BWETESTLOGGINGPLOT(1,threshold,nowms,threshold);1。if(modifiedtrendthreshold){if(timeoverusing1){Initializethetimer。Assumethatwevebeenoverusinghalfofthetimesincetheprevioussample。timeoverusingtsdelta2;}else{Incrementtimertimeoverusingtsdelta;}overusecounter;23if(timeoverusingoverusingtimethresholdoverusecounter1){4if(trendprevtrend){timeoverusing0;overusecounter0;hypothesisBandwidthUsage::kBwOverusing;}}}elseif(modifiedtrendthreshold){timeoverusing1;overusecounter0;hypothesisBandwidthUsage::kBwUnderusing;}else{timeoverusing1;overusecounter0;hypothesisBandwidthUsage::kBwNormal;}prevtrendtrend;UpdateThreshold(modifiedtrend,nowms);}
constdoublemodifiedtrendstd::min(numofdeltas,kMinNumDeltas)trendthresholdgain;
numofdeltas表示包组间延迟梯度计算的次数,取值范围是〔2,60〕,thresholdgain是Trendline滤波器的增益参数,其默认值为4,这两个变量都会对延迟梯度趋势值进行放大。这里的关键就在于为何要放大的意义trend在于是一个斜率值,取值范围(1,1),这个值很小,而阈值要跟随的变化而变化,这可能导致很容易的超过从而触发连续的过载信号。放大可以使得算法不会因为的波动而过于敏感。
判断为过载的条件延迟梯度斜率值当前阈值过载总时长kOverUsingTimeThreshold(10ms)过载次数1当前延迟梯度斜率值上一次的延迟梯度斜率值,即延迟在不断恶化。UpdateThreshold
阈值threshold动态调整为了改变算法对时延梯度的敏感度。根据主要是,时延梯度是变化的,有时很大,有时很小,如果阈值是固定的,对于时延梯度来说可能太大或者太小,这样就会出现检测不够敏感,无法检测到网络拥塞,或者过于敏感,导致一直检测为网络拥塞;voidTrendlineEstimator::UpdateThreshold(doublemodifiedtrend,int64tnowms){根据斜率上升还是下降定义K系数kdown(0。039)kup(0。0087),constdoublekfabs(modifiedtrend)threshold?kdown:kup;constint64tkMaxTimeDeltaMs100;计算上一次更新time的时间,和100ms取最小值int64ttimedeltamsstd::min(nowmslastupdatems,kMaxTimeDeltaMs);将k和timedeltams,进行计算,更新阈值thresholdk(fabs(modifiedtrend)threshold)timedeltams;thresholdrtc::SafeClamp(threshold,6。f,600。f);lastupdatemsnowms;}
不住在三亚,怎么才能上三亚车牌?大家好!我是普通男人,海南的一名普通男人。楼主这个问题我来回答,可以明确告诉楼主,不管你户口在哪里,哪怕是在外省,在海口或者三亚买的车照样能上三亚的车牌!但是有个条件,必须拥有三亚
山东原来每个县都有酒厂,能说一下各县区的品牌酒吗?县县有酒厂,人人能喝酒,这句话大概说的就是山东。山东是白酒生产大省,同时也是白酒消费大省,以至于江湖中一直流传着关于山东人酒量的传说灵光一闪捂脸捂脸酒厂众多也造成了鲁酒过于分散偏居
盘点那些电视播音主持人失误的瞬间有哪些?我们对播音主持人一直都喜爱溢于言表,特别是央视的主持人,专业的素养和文字功底能力,更是让我们赞叹不已。今天我们就来盘点一下播音主持人偶然的失误,看能否给大家带来夏日的清爽。我们没有
为什么大部分程序员的工资比其他行业高那么多?我用事实回答这个问题。年前去看孙女,疫情让我留在孩子家半年,真真切切看到了程序员工作是啥样。一般行业八小时工作,可程序员工作没有点。疫情让他们改在网上办公,我在家里就看到了他们工作
研究生毕业后薪酬如何?读研值吗?感谢悟空小秘书头条教育联盟的邀请。2019年2月15日,小西看到不少朋友晒出的10年考研成绩,有280多分担心单科不过线的,也有402分问题不大的。在看抖音视频时,刷出一个学生查成
怀孕期间我一直都在抽烟,而且烟量一天一包,这样的孩子可以要吗?不明白你为什么知道自己怀孕了,还无法控制自己的烟瘾,每天一包的量,说是个老烟民也不为过,不为你自己考虑,难道也不为肚子里的宝宝考虑吗?吸烟对腹中胎儿的影响1。吸烟可能会导致孩子畸形
10岁男孩说想跳楼,我该怎么做?这背后或许要有深层的原因,如果背后的原因不了解清楚,你永远不知道为什么十岁的孩子有跳楼这种想法。你说孩子学习成绩有点糟糕,这样孩子本身在学校就会有点自卑,那如果老师再批评,同学嘲讽
以前老辈人说过的哪些话,现在都应验了?大约在上世纪六七十年代,我们这里一个老市委书记,修了一条连接主城区到另外一个区的公路,由于这条路修的太宽了,从当时的角度来看确实太宽了,双向至少六车道以上,甚至,个别路段达到了双向
王者荣耀国际版里面的英雄与国服版比较,造型起名和操作有哪些不同?刚刚得到好消息,老帅所在的中国队在亚运会王者荣耀国际版比赛项目中,20轻松战胜韩国队,进入胜者组!两局比赛,老帅两局MVP,真的是为国争光!借着这个机会,小编带领各位玩家认识一下王
肌酐115严重吗?人体的大部分血中的肌酐是通过肾脏排出的,肌酐是人体的一种最为常见的尿毒症毒素。如果肾脏受损出了问题尤其是慢性肾功能衰竭尿毒症期,血中的肌酐通过肾脏的排出减少或者无法通过肾脏排出,肌
首钢对辽篮CBA第2阶段第一场比赛,有人说辽篮会放水可信吗?输了就是故意放水,赢了就是实力碾压,反正只有两种可能性,咋都行大金牙我也看到了有关辽蓝对北京首钢第二阶段首场比放水的说法,应该说辽蓝原本不会这么做,但是,由于辽蓝有四名国手参加了世