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

news/2024/5/6 21:42:43/文章来源:https://blog.csdn.net/yinshipin007/article/details/129283002

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.luyixian.cn/news_show_75817.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[软件测试]如何使用Eclipse导入项目并打开

🧑‍🎓个人介绍:大二软件生,现学JAVA、Linux、MySQL、算法 💻博客主页:渡过晚枫渡过晚枫 👓系列专栏:[编程神域 C语言],[java/初学者],[蓝桥杯] &#x1f4d…

数据结构与算法基础-学习-14-线性表之串

一、串的定义由0-n个字符组成的有限序列。(n>0)二、串的相关术语1、子串串中任意个连续字符组成的子序列成为该串的子串。2、主串包含子串的串成为主串。3、字符位置字符在序列中的序号为该字符在串中的位置。4、子串位置子串第一个字符在主串中的位置…

[Java·算法·中等]LeetCode17. 电话号码的字母组合

每天一题,防止痴呆题目示例分析思路1题解1分析思路2题解2题目 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。…

CSS简单使用

凡是html中的标签都可以进行选中&#xff0c;p代表标签中所有的p标签都遵从以上格式。<!DOCTYPE html> <html lang"en"> <head><style type"text/css">p{background-color: red;font-size: 40px;}.p1{font-family:楷体;}</styl…

爆品分析第4期 | 从周销12件到3700+件,这款收腰裤热度和口碑都爆了!

衣食住行&#xff0c;衣是排在第一位的&#xff0c;作为复购率最高的类目之一&#xff0c;服饰一直是TikTok上电商选品的风向标&#xff0c;是衡量电商发展情况的重要参考指标。随着疫情的结束和经济的日渐好转&#xff0c;消费者对服装类的需求上升。除了时装、T恤等日常消费的…

关于PPP-RTK技术优势的一些思考与总结

文章目录一、前言二、SSR修正与PPP三、RTK与PPP-RTK的对比四、PPP-RTK的技术优势五、总结参考文章欢迎关注个人公众号&#xff1a;导航员学习札记 一、前言 感觉近几年PPP和PPP-RTK一直都是GNSS比较火的方向&#xff0c;也有越来越多的国内外厂商提供相关服务&#xff0c;播发…

HTTP2.0协议学习

背景 在优化页面加载速度的时候&#xff0c;发现了HTTP1.1并发数的限制&#xff0c;为了解除这个限制&#xff0c;准备把网站协议升级到HTTP2.0. 之前在学习《趣谈网络协议》的时候&#xff0c;有学习过HTTP2.0协议&#xff0c;但是没有输出成文档&#xff0c;因此借这个机会&…

DIY-BETAFPV和DIY(ESP-01F+E19-900M20S2模块)915MHz信号测试对比

DIY-BETAFPV和DIY&#xff08;ESP-01FE19-900M20S2模块&#xff09;915MHz信号测试对比1. 前提条件2. 实测效果2.1 起点附近&#xff08;距离3m左右&#xff09;2.2 30m米距离&#xff08;树梢&#xff09;2.3 80米距离3. 整体比较4. PCBA分析4.1 DIY-BETAFPV4.2 DIY&#xff0…

阿里云服务器ECS的功能特性有哪些?

本文介绍云服务器ECS的功能特性&#xff0c;帮助您更好地了解和使用云服务器ECS。 1、实例 实例是云上的虚拟计算服务器&#xff0c;内含vCPU、内存、操作系统、网络、磁盘等基础组件。您可以使用阿里云提供的控制台、API等管理工具创建和管理ECS实例&#xff0c;像使用本地服…

Java-封装、继承、多态

封装 访问控制权限又成为“封装”&#xff0c;是面向对象三大特征中的一种。核心是&#xff0c;只对需要的类可见。 继承 继承是所有OOP&#xff08;Object Oriented Programming&#xff09;语言和Java语言都不可或缺的一部分。 只要创建一个类&#xff0c;就隐式继承自Obje…

openpnp - configure - 矫正里程碑

文章目录openpnp - configure - 矫正里程碑概述备注ENDopenpnp - configure - 矫正里程碑 概述 进入矫正里程碑了 查找问题 现在第一个问题是X轴的齿隙矫正 根据提示, 将顶部相机移动到主基准点上, 选择容差(就选用默认的0.025), 开始矫正. 正好开机后, 使能了视觉原点归零. …

Puppeteer项目结构梳理

最近接触了一个个人感觉很奈斯的项目&#xff0c;故记录思路如下&#xff1a; puppeteer项目梳理&#xff1a; 入口文件 run.js 入口命令 node run.js YourConfig.json 1、我们可以在自己的config.json里面设置好 ①、登录的用户名密码;aws或其它服务器的access等id,accessKey…

linux--多线程(一)

文章目录Linux线程的概念线程的优点线程的缺点线程异常线程的控制创建线程线程ID以及进程地址空间终止线程线程等待线程分离线程互斥进程线程间的互斥相关概念互斥量mutex有线程安全问题的售票系统查看ticket--部分的汇编代码互斥量的接口互斥量实现原理探究可重入和线程安全常…

校园外卖点餐系统——Day05【套餐管理业务开发】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

jQuery 属性操作

jQuery 属性操作 Date: February 28, 2023 Sum: jQuery属性操作、文本属性值、元素操作、尺寸、位置操作 jQuery 属性操作 设置或获取元素固有属性值 prop() 所谓元素固有属性就是元素本身自带的属性&#xff0c;比如 元素里面的 href &#xff0c;比如 元素里面的 type。 …

爆文制造机!小红书热榜3个方向,告诉你选题诀窍!

我们知道&#xff0c;不论是达人创作内容&#xff0c;还是品牌制定Brief&#xff0c;都需要提前调研筛选海量信息&#xff0c;这时候如果有一个自己的内容素材库&#xff0c;就省事多啦。按照内容需求&#xff0c;我们可以按3个角度划分小红书内容素材&#xff1a;笔记类型、竞…

挑战图像处理100问(24)——伽玛校正

伽马校正&#xff08;Gamma Correction&#xff09;是一种图像处理技术&#xff0c;用于校正显示设备的非线性响应。通过对图像进行伽马变换&#xff0c;可以将图像的亮度范围映射到显示设备的亮度范围内&#xff0c;从而提高图像的对比度和细节&#xff0c;改善图像的视觉效果…

【JavaSE】对象的比较

哈喽&#xff0c;大家好&#xff01;我是保护小周ღ&#xff0c;本期为大家带来的是Java中自定义类型&#xff08;对象&#xff09;的三种比较方式&#xff0c;equals 方法, Comparable 泛型接口, Comparator 泛型接口 。在日常编程中&#xff0c;我们常常会需要比较的问题&…

Linux 自带按键驱动

目录 一、内核检查 二、驱动文件 三、设备树 四、验证 一、内核检查 内核一般默认已经使能了 KEY 驱动&#xff0c;但是还是要检查一下。按照如下路径找到相应的配置选项&#xff1a; Device Drivers -> Input device support -> Generic in…

Laravel-admin之自定义操作日志

laravel-admin是封装性极好的框架&#xff0c;自带的就有操作日志的记录&#xff0c;但是对于非开发人员可能看不懂这个日志&#xff0c;所以就想着给修改一下&#xff0c;以谁修改了什么&#xff0c;谁删除了什么&#xff0c;谁审核了什么&#xff0c;谁添加了什么类似&#x…