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

news2024/9/28 7:20:02

1.前言


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

2.背景


迈聆会议从17年到现在, 一直使用的是基于谷歌的gcc算法自研的Omcc算法(optimization of Mindlinker in network congestion controller), 经过这么多年的优化, 在现有表现上已经可以在大部分网络场景下准确预估带宽. Omcc算法已经可以做到抗50%丢包, 抗800ms抖动, 抗2s延时, 在300k-10mbps带宽范围下也可以准确预估带宽值, 在保障低延时的情况下, 能够尽可能提高带宽利用率。

本文将讨论webrtc自带的三种算法的优缺点, 并给出部分测试报告。

3.GCC算法


gcc算法是webrtc默认的算法. 其具体原理本文不再赘述, 已经有各种参考资料去详细讲解了gcc算法的原理.

3.1 gcc算法优点

灵敏度高, 能够及时响应, 提前避免拥塞. 基于抖动和基于丢包的预估值可以很好的预测网络拥塞.

3.2 现有GCC算法所面临的问题和难点

1.带宽对发送数据量的强相关

对于GCC算法, 其网络模型是依靠丢包和抖动去检测网络的拥塞, 从而及时响应网络的动态变化. 原版的GCC算法所能允许的丢包非常小, 丢包大于10%就断崖式下跌带宽. 所能允许的抖动和延时也不高. 通过我们现在的优化之后, 丢包上限达到了50%, 延时增长不是那么敏感, 抗抖动范围也会更高. 但这样带来的结果是, 在带宽预估的稳定性和准确性上面很难做好. GCC算法的逻辑是和数据发送量强相关的, 网络好时发送量多, 带宽预估才会上去. 发送100kbps的码率, 带宽预估很难超过200kbps. 此外, 现有有些发送逻辑是需要去降低发送量, 从而给用户节省带宽的, 比如桌面共享场景下静止画面和动态画面数据量可以从20kbps波动到4mbps.剧烈波动的发送量导致在某些场景下带宽预估的剧烈波动. 波动这么剧烈的场景下, 怎样在既保持带宽预估稳定的同时又不降低发送量呢, 此问题在现有webrtc的策略下很难去解决.

2.带宽恢复速度

GCC算法的核心是慢升快降, 在网络拥塞的时候指数下降带宽, 在网络恢复后, 龟速上涨带宽. 带宽缓慢恢复对于网络来说是一件好事, 但是, 低带宽恢复高带宽需要非常多的时间, 对用户体验不太好. 此外我们有全面放慢带宽上涨的速率, 用于维持在带宽限制场景下的带宽稳定性. 现在的带宽从300kbps上涨到3mbps需要1min, 上涨到6mbps需要90s. 这个问题现无法在算法层面去解决, 如果增加恢复速度后会更容易导致一些场景下带宽高估和带宽波动. 恢复速度和带宽稳定两者当前算法很难做到兼容.

3.带宽准确性

GCC算法在带宽准确性方面还是存在一个硬问题, 首先GCC算法中, 带宽稳定性要和发送码率准确性强相关, 和丢包率和延时又是强相关, GCC算法对网络拥塞很敏感, 稍微的拥塞就会导致带宽波动, 且波动范围挺大的. 如果要适应高抖动高延时等网络变化场景, GCC原生算法会很容易下降到不可接受的范围. 在一些固定丢包场景下GCC是带宽准确性会变得非常差.

4.带宽稳定性

稳定性方面是一个很难去优化的点, 本来带宽就是动态变化, 而且还是比较频繁的, 在限制带宽场景下, 带宽容忍一些上下波动. 但是这个波动范围不能偏离太多, 下图是我们在测试时原生GCC算法的波动情况, 如图波动范围会变化非常大

服务端限制1.5mbps带宽限制后的波动

客户端限制1.5mbps带宽限制后的波动

5.4G弱网环境

在4G弱网场景下, 延时会变得很大, 且和发送量相关, 没有丢包, 这种网络模型属于肥长管道形网络, GCC算法在此场景中会变得非常迟钝, 因为网络中没有丢包, 网络延时平滑增长, 且抖动很小. 导致基于抖动计算的带宽值会变得非常迟钝. 无法准确预估出低延时下的带宽值.

4G弱网场景下发送数据量太多后, 延时会变得非常非常大, 却不会出现网络丢包

4.BBR算法


BBR核心思路就是通过调整发送量去探测到网络的最大带宽和最小延时. 最大带宽通过发送超过网络容量的数据去获取, 当增加发送量后延时也开始增加时, 此时就是最大带宽. 最小延时通过发送低于网络容量的数据去计算, 当降低发送量后延时不降低时, 此时的RTT就是最小延时. 找到下图的理想点, 也就是BDP, 就是我们现在可以发送的最大带宽.

BBR算法网络模型

BBR设置了一个状态机用于不断获取当前变化网络的最小RTT和最大带宽, 但是探测BDP的过程只占整个周期的2%, 98%的场景是用于以正常速率去传输的. 毫无疑问, BBR天生就可以解决限制带宽场景下的带宽预估稳定性和准确性问题, 针对4G网络这种肥长网络模型也有对应的策略. 而且其带宽预估的准确性会很好. 但是发送数据的强相关性还是个问题, BBR在类似桌面共享这种场景下的发送码率变化剧烈的场景下估计适应性不会很好.

4.1 BBR算法的缺点

\1. 收敛速度慢\2. 抗丢包能力不足\3. ProbeRTT状态只发送四个包, 不适合低延时流媒体应用\4. 发送码率周期性波动\5. 上下行RTT和Loss相互影响(估计是有潜在bug)

4.2 BBR算法的优点

a. Probe_RTT 阶段的隐藏弱化b. 上行网络丢包带宽补偿c. 上行网络RTT突变以及高Jitter场景优化d. 下行链路抖动以及丢包的优化e. Padding流量的优化f. 快速上探机制的实现

测试webrtc中BBR的表现, 在带宽准确性和稳定性方面和上面描述的一致, 延时和抖动适应也都没问题, 抗持续丢包在25%左右.

5.PCC算法


PCC的目标是开发一种性能明显优于TCP传统算法的传输协议, 且保持一定的实际可部署性. 这种性能的改进是根据各种网络设置的吞吐量和各种公平的度量来衡量的. 其和以往传统的基于网络事件(丢包变化或者延时变化或者抖动变化之类)的hardwired-mapping硬连接映射不同, 是基于更广泛的网络条件来实时作出发送速率决策. 其具有网络学习的能力. 这一点是传统网络所不具备的;

PCC通过在执行期间不断以不同的速率发送数据进行A/B测试去测量网络. 最终的目的是通过目标函数去进行凸优化, 从而找到全局最优解, 并以此速率去运行. 对比PCC和BBR, 两者都是类似A/B测试去测量网络, BBR使用网络白盒建模的方式去转换表现测量, PCC使用黑盒机制, 在特定速率发送时去观察表现矩阵以及效用函数, 来调整发送策略.

5.1 PCC的优点

* 在2018年发明的pcc变种-vivace算法测试性能要好于BBR, 尤其是在抗丢包性能上.

算法考虑的参数有延时和丢包, 可以适应更多场景下的网络环境

5.2 PCC的缺点

\1. 算法太新了, 现在还处于理论实现的地步, 业界并没有什么实际的应用.\2. webrtc中的pcc算法存在各种问题, 且使用起来效果非常不好.\3. 目标函数采用的观测变量是rtt, 所以还是会存在上下行相互影响的场景, 需要花更多的时间去专门优化.

6.附录


网损场景中测试WebRTC中的GCC, BBR, PCC算法效果:

· 测试环境:

○ Windows, 编译webrtc的p2p demo, 对等连接

○ 网损控制使用ATC去设置

○ 有线连接

· 网损场景设置:

○ 带宽限制: 500kbps 1mbps 2mbps

○ 丢包限制: 10% 20%

○ 延时限制: 100ms 200ms

○ 抖动限制: 100ms 200ms

○ 混合网损模拟A: 1mbps+10%+100ms延时

○ 混合网损模拟B: 10%+100ms延时+100ms抖动

测试结果

原文https://zhuanlan.zhihu.com/p/448850999

★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【基于机器学习的推荐系统项目实战-1】初识推荐系统

本文目录一、为什么我们需要推荐系统?二、推荐系统的发展阶段三、推荐系统模型四、通用推荐系统框架4.1 数据生产4.2 数据存储4.3 算法召回4.4 结果排序4.5 结果应用4.6 新浪微博的框架开源结构图五、推荐常用特征5.1 用户特征5.2 物品特征六、推荐常用算法七、结果…

正点原子IMX6ULL开发板-liunx内核移植例程-uboot卡在Starting kernel...问题

环境 虚拟机与Linux版本: VMware 17.0.0 Ubuntu16 NXP提供的U-boot与Linux版本: u-boot:uboot-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 linux:linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2 开发板: 正点原子-IMX6ULL_EMMC版本,底板版…

国产光刻机再突破后,能实现7nm芯片量产?专家:别再盲目自大

众所周知,不能生产高端芯片,一直都是我国芯片产业一个无法抹去的痛。加上老美近几年的刻意打压,部分中芯企更是苦不堪言,因此大部分人心里也都憋着一口气,这几年也是铆足了劲,大力推动国产芯片技术的发展。…

小家电品牌私域增长解决方案来了

小家电品牌的私域优势 01、行业线上化发展程度高 相对于大家电动辄上千上万元的价格,小家电的客单价较低。而且与大家电偏刚需属性不同的是,小家电的消费需求侧重场景化,用户希望通过购买小家电来提高自身的生活品质。这就决定了用户的决策…

【数组】JavaScript 全栈体系(六)

JavaScript 基础 第十章 循环-for 一、for循环基本使用 实现循环的 3 要素 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><…

嘉宾阵容公布 | Impact Tech, She Can 2023 对话升级

2023 年&#xff0c;在三八妇女节来临之际&#xff0c;Jina AI 联合将门创投、OpenMMLab、亚马逊云科技、稀土掘金、开源中国、CSDN等 14 家科技行业伙伴&#xff0c;发起了第二届「Impact Tech, She Can」线上对话。活动信息通过 2 场圆桌对话、1 场技术分享&#xff0c;希望让…

函数栈帧详解

写在前面 这个模块临近C语言的边界&#xff0c;学起来需要一定的时间&#xff0c;不过当我们知道这些知识后&#xff0c;在C语言函数这块我们看到的不仅仅是表象了&#xff0c;可以真正了解函数是怎么调用的。不过我的能力有限&#xff0c;下面的的知识若是不当&#xff0c;还…

一些关于linux process 和python process的记录

python mulprocess 主要用来生成另一个进程并运行 def func(i):print(helloworld)from multiprocessing import Process p Process(targetfunc,args(i, )) p.start()如果想要调用shell命令&#xff0c;可以采用os.popen 或者是 subprocess.run 但是前者只能执行命令并获取输…

【链表OJ题(二)】链表的中间节点

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录链表OJ题(二)1. 链表…

每日学术速递3.1

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Directed Diffusion: Direct Control of Object Placement through Attention Guidance 标题&#xff1a;定向扩散&#xff1a;通过注意力引导直接控制物体放置 作者&#xff1a;…

Kafka入门(六)

下面聊聊Kafka中的Offset位移 1、Offset位移概述 在引入Kafka服务后&#xff0c;当consumer消费完数据后需要进行位移提交&#xff0c;那么提交的位移数据究竟存储到那里&#xff0c;有以何种方式进行存储&#xff1f; Kafka旧版本&#xff08;<0.8&#xff09;是重度依赖Z…

【python学习】批量从含有多列数据的txt文件中提取某个数据,并存入csv文件

批量从含有多列数据的txt文件中提取某个数据&#xff0c;并存入csv文件任务需求与解读代码实现导入相关库提取txt文件的三列数据存为列表按条件提取某个数据存入字典将字典写入csv文件任务需求与解读 昨天收到一个需求&#xff0c;希望能将电化学工作站的数据文件(.bin后缀)转…

欧文数据建模师 erwin Data Modeler Crack

欧文数据建模师 erwin Data Modeler 是一款屡获殊荣的数据建模工具&#xff0c; 用于查找、可视化、设计、部署和标准化高质量的企业数据资产。从任何地方发现和记录任何数据&#xff0c;以在大规模数据集成、主数据管理、元数据管理、大数据、商业智能和分析计划中实现一致性、…

kubernetes--安全沙箱运行容器gVisor

gVisor介绍 所知&#xff0c;容器的应用程序可以直接访问Linux内核的系统调用&#xff0c;容器在安全隔离上还是比较弱&#xff0c;虽然内核在不断的增强自身的安全特性&#xff0c;但由于内核自身代码极端复杂&#xff0c;CVE漏洞层出不穷。 所以要想减少这方面安全风险&#…

MATLAB | 这些花里胡哨的热图怎么画

好早之前写过一个绘制相关系数矩阵的代码&#xff0c;但是会自动求相关系数&#xff0c;而且画出来的热图只能是方形&#xff0c;这里写一款允许nan值出现&#xff0c;任意形状的热图绘制代码&#xff0c;绘制效果如下&#xff1a; 如遇到bug请后台提出&#xff0c;并去gitee下…

Spring Boot+Vue前后端分离项目练习02之网盘项目利用token进行登陆验证

1.添加依赖 首先需要添加jwt对应的依赖。 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency>2.添加配置 JWT由三部分构成&#xff0c;分别是 header, pa…

详解数据结构中的顺序表的手动实现,顺序表功能接口【数据结构】

文章目录线性表顺序表接口实现尾插尾删头插头删指定位置插入指定位置删除练习线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列…

Freemarker动态模板渲染flyingsaucer将html转PDF(多页固定头尾)

目录一、序言二、CSS样式控制打印模板三、代码示例1、pom.xml2、application.yml3、PdfGenerationController4、Freemarker模板内容四、展示效果一、序言 一般正常来说&#xff0c;生成PDF的操作都是通过将HTML转成PDF&#xff0c;HTML动态渲染可以借助模板引擎&#xff0c;如…

从外行到外包,从手工测试到知名互联大厂测开,我经历了什么...

本人本科就读于某普通一本院校&#xff08;非985&#xff0c;211&#xff09;&#xff0c;经管类专业&#xff0c;从大四实习到15年毕业后前两年一直在从事自己专业相关的工作。17年时决定想要转业从事计算机相关领域工作&#xff0c;在17年9月的一个机遇大跨度转行到测试行业&…

vue子组件监听父组件数据变化并作出改变(亲测有效)

vue子组件监听父组件数据变化并作出改变&#xff08;亲测有效&#xff09; 1. 问题 1.1 封装组件时经常会遇到子组件需要根据父组件数据变化并执行对应的操作逻辑 1.2 监听方法中加了deep、immediate 等参数监听数组/对象还是没有生效 1.3 类型table组件需要根据父组件数据…