webrtc的某个版本中实现BBR算法,后来被移除了。但是没有给出原因。
 这一个多月,我在仿真环境中[1]测试了BBR算法,在某些测试环境中竟然可以观测到超过50%的丢包。正常的BBR算法一般也就2%~3%的丢包,50%的丢包率属实有点变态。
 到这里,可能得出结论,BBR不适用于webrtc,就完事了。寻找原因,耗时多而又功劳少。幸亏我是临时工,没有kpi的要求。
 我原来觉得是quic中的BBR算法存在瑕疵,后来移植了TCP BBR的代码到webrtc中,在一些测试例子中,看到了正常的工作曲线。但是换了一些网络链路测试参数(带宽,时延),就有不正常的结果。
 什么原因导致了这么高的丢包?
 BBR算法在多个流争抢带宽的条件下,网络中的时延不可避免地增加。参看链接[2]的测试图片。在互联网这种数据转发模式下,不管什么拥塞控制算法,只要它要探测更高的带宽,总会在某个时刻导致网络传输时延的增长。
  BBR控制发包节奏的因子:congestion_window(cwnd)和pacing_rate。在webrtc中,还有另一个因素,编码器的目标码率(target_rate)。参考链接[3]给出的源码,webrtc中实现的BBR算法按照窗口滤波器的值配置target_rate。

NetworkControlUpdate BbrNetworkController::CreateRateUpdate(Timestamp at_time) const {DataRate bandwidth = BandwidthEstimate();if (bandwidth.IsZero())bandwidth = default_bandwidth_;TimeDelta rtt = GetMinRtt();DataRate pacing_rate = PacingRate();DataRate target_rate =config_.pacing_rate_as_target ? pacing_rate : bandwidth;// ....
// ....update.congestion_window = GetCongestionWindow();return update;
}

 在PROBE_BW,cwnd = 2 * BandwidthEstimate() * min_rtt_。当往返时延(smooth_rtt)增加时,可能会出现这样这一种现象:BandwidthEstimate() > (cwnd / smooth_rtt)。这个时候,编码器target_rate大于(cwnd / smooth_rtt),cwnd成为瓶颈。当网络中飞行的数据包大于cwnd,pacer暂停向网络中发送数据包。会限制数据包向网络中的发送速度。尽管PacingController中的的pacing rate>=target_rate,由于cwnd的限制,PacingController会暂停向网络中发送数据包。

absl::optional<bool> RtpTransportControllerSend::GetCongestedStateUpdate()const {bool congested = transport_feedback_adapter_.GetOutstandingData() >=congestion_window_size_;if (congested != is_congested_)return congested;return absl::nullopt;
}
void PacingController::SetCongested(bool congested) {if (congested_ && !congested) {UpdateBudgetWithElapsedTime(UpdateTimeAndGetElapsed(CurrentTime()));}congested_ = congested;
}

 编码器生成的数据包,只能在PacingController缓存,造成 packet_queue_数据包排队时延的增长。当时延超过一定的阈值时候,PacingController完全不按照BBR设置的速率控制发包节奏。为了限制最大的排队时延,PacingController存在超发机制。根据期望时延,重新计算发包速率(adjusted_media_rate_ )。比如根据我的日志,BBR要求pacing_rate为3Mbps,而PacingController最终决定的发送速率可能是6Mbps。

void PacingController::MaybeUpdateMediaRateDueToLongQueue(Timestamp now) {adjusted_media_rate_ = pacing_rate_;if (!drain_large_queues_) {return;}DataSize queue_size_data = QueueSizeData();if (queue_size_data > DataSize::Zero()) {// Assuming equal size packets and input/output rate, the average packet// has avg_time_left_ms left to get queue_size_bytes out of the queue, if// time constraint shall be met. Determine bitrate needed for that.packet_queue_.UpdateAverageQueueTime(now);TimeDelta avg_time_left =std::max(TimeDelta::Millis(1),queue_time_limit_ - packet_queue_.AverageQueueTime());DataRate min_rate_needed = queue_size_data / avg_time_left;if (min_rate_needed > pacing_rate_) {adjusted_media_rate_ = min_rate_needed;RTC_LOG(LS_VERBOSE) << "bwe:large_pacing_queue pacing_rate_kbps="<< pacing_rate_.kbps();}}
}

 BBR的工作机制和webrtc的pacer原理,使得BBR算法完全处于失控状态,造成了极其变态的丢包率。
 如果关掉超发机制(drain_large_queues_ = false),就要忍受PacingController排队时延的不断膨胀。过高的时延是RTC类业务要尽力避免的。
 所以,BBR算法被移除,还是不冤枉的。
 那么,如何改进。
 这两周来,我一直在魔改算法参数,希望能够得到一个正常结果。比如在probe_cruise时,我设置target_rate 为0.95 * BandwidthEstimate()。在一些测试中,能够观测到正常的结果,在其他场景中,就不行。
  我尝试去掉拥塞窗口的限制。在几个测试例子里,算法测试还算正常。
  主要更改点:

  • 参考BBR v2,每5秒进入一次probe rtt,设置窗口为BDP/2。算法只在probe rtt限制拥塞窗口值:
if (PROBE_RTT == mode_) {
update.congestion_window = ProbeRttCongestionWindow();
} else {
update.congestion_window = DataSize::Infinity();
}
  • 在probe down 状态(pacing_gain = 0.75),设置编码器的目标码率为0.5 * BandwidthEstimate()。

Refer:
[1] webrtc-gcc-ns3
[2] quic-on-ns3
[3] bbr in webrtc

why bbr is removed from webrtc?相关推荐

  1. WebRTC拥塞控制原理解析

    前言 WebRTC包含三种拥塞控制算法,GCC.BBR和PCC.其中,BBR一开始是针对TCP的拥塞控制提出来的.它的输入为ACK/SACK,输出为拥塞窗口(congestion_window)发送速 ...

  2. webrtc拥塞控制算法对比-GCC vs BBR vs PCC

    1.前言 现有集成在webrtc中的拥塞控制算法有三种, 分别是: 谷歌自研发的gcc, 谷歌自研发的BBR算法, 斯坦福大学提出的基于机器学习凸优化的PCC算法. 本文将探讨一下三个算法的区别和优缺 ...

  3. WebRTC Google的 BBR拥塞控制算法解析

    正文之前,给出本文的图例: BBR的组成 bbr算法实际上非常简单,在实现上它由5部分组成: 1.即时速率的计算 计算一个即时的带宽bw,该带宽是bbr一切计算的基准,bbr将会根据当前的即时带宽以及 ...

  4. webrtc bbr

    1.STARTUP   阶段计算最大带宽,               码率增益系数大于1,逐渐的增大发送码率 探索带宽上限               窗口增益系数:2.885000         ...

  5. 干货 | BBR及其在实时音视频领域的应用

    实时音视频系统要求低延时,流畅性好,而实际网络状态却是复杂多变的,丢包,延时和网络带宽都在时刻变化,这就对网络拥塞控制算法提出了很高的要求.本文来自网易云信资深工程师肖磊在LiveVideoStack ...

  6. BBR在实时音视频领域的应用

    小议BBR算法 BBR全称Bottleneck Bandwidth and RTT,它是谷歌在2016年推出的全新的网络拥塞控制算法.要说明BBR算法,就不能不提TCP拥塞算法. 传统的TCP拥塞控制 ...

  7. BBR及其在实时音视频领域的应用

    实时音视频系统要求低延时,流畅性好,而实际网络状态却是复杂多变的,丢包,延时和网络带宽都在时刻变化,这就对网络拥塞控制算法提出了很高的要求.本文来自网易云信资深工程师肖磊在LiveVideoStack ...

  8. 基于Licode的WebRTC全球分布式架构

    随着在线教育行业的兴起, 许多人把目光投向了国外市场,而如何搭建全球化的音视频网络就成为了其中的关键问题.百家云研发工程师陈聪详细介绍了如何利用Licode 开源服务器搭建全球分布式架构以解决常见的教 ...

  9. webrtc视频引擎之video_render(视频渲染)介绍

    此部分为webrtc视频渲染显示,代码结构如下: 其实此部分代码与<webrtc视频引擎之vedio_capture_module介绍>的代码结构一样 1,图中能够直接看到的.h和.cc文 ...

最新文章

  1. 果园机器人能干什么_24* 果园机器人优秀教学实录
  2. isinstance函数和@staticmethod用法
  3. asp.net 开发疑问?
  4. YunYang1994/tensorflow-yolov3 ValueError: cannot reshape array of size 43095 into shape (6) 解决办法
  5. [spfa][差分约束] 洛谷 P3084 照片Photo
  6. Socket网络编程--小小网盘程序(3)
  7. 'umi' 不是内部或外部命令,也不是可运行的程序 或批处理文件或umi: command not found
  8. Lifewire文档阅读笔记-如何使用IP地址找对应的MAC地址
  9. spring和redis的整合-超越昨天的自己系列(7)
  10. 538.把二叉搜索树转换为累加树(结合自己的理解解释一下别人题解的递归部分)
  11. 牛比的表格处理模块tablib
  12. homework week02
  13. please verify the preference field with the prompt:Tomcat JDK name
  14. php表单美化,使用css美化html表单控件详细示例(表单美化)_HTML/Xhtml_网页制作
  15. 机器学习深度学习面试题——Python基础知识
  16. HTML制作菜鸟教程首页
  17. java查找pdf关键字_Java定位PDF中关键字的坐标
  18. Java开发培训班该怎样选择?
  19. 机器学习与人工智能顶会论文列表汇总
  20. 托管配置文件格式不正确 error: unsupported rule type RULE-SET

热门文章

  1. 看看行业现状,你愿意去日本做码农吗?
  2. 值得收藏——一文让你读懂人脸识别技术
  3. 赚四五百万,一款打卡作弊软件的 CEO 被判5年6个月!因破坏了钉钉系统获取用户真实地理位置...
  4. C#WindowsMediaPlayer的播放列表
  5. 【Laravel3.0.0源码阅读分析】文件会话类file.php
  6. opengl绘制三次hermite曲线,三次cardinal曲线
  7. 福布斯富豪榜结果出炉,王健林财富缩水682.4亿元
  8. busybox源码介绍
  9. Shell开发环境vim编辑器的配置文件vimrc的参数优化
  10. 计算机系统(二):进程与线程(上篇)