webrtc gcc算法(1)

news2024/11/19 8:43:12

老的webrtc gcc算法,大概流程:

这两个拥塞控制算法分别是在发送端和接收端实现的, 接收端的拥塞控制算法所计算出的估计带宽, 会通过RTCP的remb反馈到发送端, 发送端综合两个控制算法的结果得到一个最终的发送码率,并以此码率发送数据包。

Loss-Based Controller在发送端负责基于丢包的拥塞控制,它的输入比较简单, 只需要根据从接收端反馈的丢包率, 就可以做带宽估算; 上图右侧比较复杂, 做的是基于延迟的带宽估计, 这也是本文后面主要介绍的部分。在最近的WebRTC实现中, GCC把它的两种拥塞控制算法都移到了发送端来实现, 但是两种算法本身并没有改变,只是在发送端需要计算延迟, 因而需要一些额外的feedback信息, 为此WebRTC扩展了RTCP协议, 其中最主要的是增加了Transport-CC Feedback,该包携带了接收端接收到的每个媒体包的到达时间。

基于延迟的拥塞控制比较复杂, WebRTC使用延迟梯度来判断网络的拥塞程度,延迟梯段的概念后文会详细介绍;其算法分为几个部分:

  • 到达时间滤波器
  • 过载检测器
  • 速率控制器

在获得两个拥塞控制算法分别结算到的发送码率之后, GCC最终的发送码率取的是两种算法的最小值。下面我们详细介绍WebRTC的拥塞控制算法GCC。

一、基于丢包的带宽估计

基于丢包的拥塞控制比较简单, 其基本思想是根据丢包的多少来判断网络的拥塞程度, 丢包越多则认为网络越拥塞, 那么我们就要降低发送速率来缓解网络拥塞;如果没有丢包,这说明网络状况很好, 这时候就可以提高发送码率, 向上探测是否有更多的带宽可用。实现该算法有两点:一是获得接收端的丢包率, 一是确定降低码率和提升码率的阈值。

WebRTC通过RTCP协议的Receive Report反馈包来获取接收端的丢包率。Receive Report包中有一个fraction lost 字段, 包含了接收端的丢包率,如下图所示。

发送端接收RR报文,并根据丢包率调整估计带宽As

  1. 如果丢包率 < 2%,估计带宽在以前的基础上增长5%;
  2. 如果丢包率在[2%, 10%]之间,估计带宽保持不变;
  3. 如果丢包率 > 10%,估计带宽在以前的基础上降低(丢包率 * 50%)

而这部分的丢包则需要通过其他的如NACK或FEC等手段来恢复。

二、基于延迟梯度的带宽估计

WebRTC实现的基于延迟梯度的带宽估计有两种版本:

  • 最早一种是在接受端实现,评估的带宽结果通过RTCP REMB消息反馈到发送端。 在此种实现中, 为了准确计算延迟梯度,WebRTC添加了一种RTP扩展头部abs-send-time, 用来表示每个RTP包的精确发送时间, 从而避免发送端延迟给网络传播延迟的估计带来误差。这种模式也是RFC和google的paper中描述的模式。
  • 在新近的WebRTC的实现中,所有的带宽估计都放在了发送端, 也就说发送端除了做基于丢包的带宽估计, 同时也做基于延迟梯度的带宽估计。 为了能够在接受端做基于延迟梯度的带宽估计, WebRTC扩展了RTP/RTCP协议, 其一是增加了RTP扩展头部, 添加了一个session级别的sequence number, 目的是基于一个session做反馈信息的统计, 而不紧紧是一条音频流或视频流; 其二是增加了一个RTCP反馈信息transport-cc-feedback, 该消息负责反馈接受端收到的所有媒体包的到达时间。接收端根据包间的接受延迟和发送间隔可以计算出延迟梯度,从而估计带宽。

关于如何根据延迟梯度推断当前网络状况, 后面会分几点详细展开讲, 总体来说分为以下几个步骤:

  • 到达时间滤波器
  • 过载检测器
  • 速率控制器

其过程就是, 到达时间滤波器根据包间的到达时延和发送间隔,计算出延迟变化, 这里会用到卡尔曼滤波对延迟变化做平滑以消除网络噪音带来的误差;延迟变化会作为过载检测器的输入,由过载检测器判断当前网络的状态,有三种网络状态返回overuse/underuse/normal,检测的依据是比较延迟变化和一个阈值, 其中该阈值非常关键且是动态调整的。最后根据网络状态的变化, 速率控制器根据一个带宽估计公式计算带宽估计值。

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

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

相关文章

记次好玩的XXX模式

看到很多框架里都用了这种方式

深入了解Java位运算符

1.前言 位运算在我们刷题时候&#xff0c;对于效率和空间都是很大的提升&#xff0c;所以位运算符&#xff0c;对于我们的作用也是不可或缺的。 里面就存在一个很重要的思想就是位图&#xff0c;此次我讲解位运算符的作用主要是为他服务的 位图的原理:通过一个整数模拟&#xf…

Dubbo的整体框架和主要模块

1 整体框架 Dubbo的整体框架如下图所示&#xff1a; 上层依赖下层提供的功能&#xff0c;下层的改变对上层不可见。 2 主要模块 &#xff08;1&#xff09;主要模块如下所示&#xff1a; &#xff08;2&#xff09;各子模块描述如下所示&#xff1a; 3 参考文献 &#xff08…

CN论文编写提示词-示例

建议用GPT-4或者Bing 现在开始你是一位计算机学科的研究员!教授!擅长研究和撰写论文!我需要你协助我一起研究一个课题:《计算机信息技术在智能交通系统中的应用》!你认为这个题目如何!有哪些参考资料!这个题目作为论文题目的话有哪些创新意义和价值! 你扮演计算机信息技…

第六章 应用层 | 计算机网络(谢希仁 第八版)

文章目录 第六章 应用层6.1 域名系统DNS6.1.1 域名系统概述6.1.2 互联网的域名结构6.1.3 域名服务器 6.2 文件传送协议6.2.1 FTP概述6.2.2 FTP的基本工作原理6.2.3 简单文件传送协议TFTP 6.3 远程终端协议TELNET6.4 万维网www6.4.1 万维网概述6.4.2 统一资源定位符URL6.4.3 超文…

VBA技术资料MF70:从单元格文本中取消或删除上标

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。我的教程一共九套&#xff0c;分为初级、中级、高级三大部分。是对VBA的系统讲解&#xff0c;从简单的入门&#xff0c;到…

力扣刷题 day46:10-16

1.最大整除子集 给你一个由 无重复 正整数组成的集合 nums &#xff0c;请你找出并返回其中最大的整除子集 answer &#xff0c;子集中每一元素对 (answer[i], answer[j]) 都应当满足&#xff1a; answer[i] % answer[j] 0 &#xff0c;或 answer[j] % answer[i] 0 如果存在…

2.SpringSecurity - 处理器简单说明

文章目录 SpringSecurity 返回json一、登录成功处理器1.1 统一响应类HttpResult1.2 登录成功处理器1.3 配置登录成功处理器1.4 登录 二、登录失败处理器2.1 登录失败处理器2.2 配置登录失败处理器2.3 登录 三、退出成功处理器3.1 退出成功处理器3.2 配置退出成功处理器3.3 退出…

前端需要了解的浏览器缓存知识

文章目录 前言为什么需要缓存&#xff1f;DNS缓存缓存读写顺序缓存位置memory cache&#xff08;浏览器本地缓存&#xff09;disk cache&#xff08;硬盘缓存&#xff09;重点&#xff01;&#xff01;&#xff01; 缓存策略 - 强缓存和协商缓存1&#xff09;强缓存ExpiresCach…

认识测试---什么是测试?

文章目录 测试软件测试的性质测试人员的基本素养什么是需求什么是BUG 开发模型和测试模型软件的生命周期开发模型瀑布模型螺旋模型增加&#xff0c;迭代敏捷开发scrume 测试模型V模型W模型&#xff08;双V模型&#xff09; 测试 一个好的开发者&#xff0c;不仅要懂技术也要懂…

【cpu_entry_area mapping】SCTF2023-sycrop

前言 也算学习到了&#xff0c;这样对 DB_stack 的利用与 pt_regs 很相似。都是利用在用户态切换在内核态时&#xff0c;会保存用户态的上下文信息在内核栈中&#xff0c;所以我们就可以控制部分内核栈中的数据&#xff0c;以此为我们栈迁移做好准备。 程序分析 启动脚本啥的…

14-k8s-基本存储之EmptyDir、HostPath、NFS

文章目录 一、相关概念二、EmptyDir存储三、HostPath存储四、NFS存储 一、相关概念 概述 Volumn定义在Pod上&#xff0c;然后被该Pod里面的多个容器挂载到具体的文件目录下。实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命周期不和Pod中的单个容器的…

出海 SaaS 企业增长修炼手册:聊聊 PLG 的关键指标、技术栈和挑战

产品驱动增长 Product-Led Growth (PLG) 近几年可谓火遍海外 SaaS 圈&#xff0c;但想要真正落地 PLG 还是存在不少挑战的。了解 PLG 背后的增长指标&#xff0c;不仅可以帮助企业跟上发展节奏&#xff0c;更能从纷繁复杂的业务细节中获取有价值洞察。那么&#xff0c;如何高效…

【3】c++11新特性(稳定性和兼容性)—>类成员的快速初始化

在进行类成员变量初始化的时候&#xff0c;C11标准对于C98做了补充&#xff0c;允许在定义类的时候在类的内部直接对非静态变量进行初始化&#xff0c;在初始化的时候可以使用等号&#xff0c;也可以使用花括号{}&#xff0c;等号可以省略不写&#xff1b;静态成员变量需要在类…

二叉树的三种遍历方式的本质

二叉树的定义就不在这里多说了&#xff0c;下面这个图就是一个简单的二叉树&#xff1a; 二叉树的三种遍历方式&#xff1a; 前序遍历&#xff1a;头左右&#xff0c;也就是先头后左再右&#xff1a;1245367 public static void prePrint(BinaryTreeNode root) {if (root ! n…

pycharm社区版创建Django项目的一种方式

pycharm社区版创建Django项目 pycharm创建New project安装django&#xff0c;如果安装过可略过安装完成后查看安装情况生成Django项目需要的文件这里注意生成语句后面的 . 不可以省略 生成文件后&#xff0c;框架搭建完成&#xff0c;配置启动我这里在配置完后&#xff0c;报了…

徐建鸿:深耕中医康养的“托钵行者”

为什么是“庄人堂”&#xff1f;杭州“庄人堂”医药科技公司董事长徐建鸿很乐意和别人分享这个名称的由来&#xff0c;一方面是庄子首先提出“养生”这个概念&#xff0c;接近上工治未病的上医&#xff0c;取名“庄人堂”代表庄子门生&#xff0c;向古哲先贤致敬&#xff01;另…

vscode使用code runner乱码

"code-runner.executorMap": {"python": "set PYTHONIOENCODINGutf8 && python $fullFileName"}

unordered_set unordered_map 的封装

目录 1. 哈希的概念 1.1. 哈希冲突 1.2. 哈希函数&#xff1a; 1. 直接定址法 2. 除留余数法 1.3. 闭散列实现哈希 1.4. 开散列实现哈希 2. 哈希的应用 2.1 位图的概念 2.1.1. 问题&#xff1a; 2.2.1. set ​编辑 2.2.2. reset 2.2.3. test() 2.2. 位图的实现…

软件工程与计算总结(十五)详细设计中面向对象方法下的信息隐藏

软件工程与计算总结&#xff08;十三&#xff09;详细设计中的模块化与信息隐藏 之前的博客中&#xff0c;模块需要隐藏的决策主要由“职责的实现”and“实现的变更”两类&#xff0c;在面向对象方法中&#xff0c;需要做到的就是&#xff1a; 封装类的职责&#xff0c;隐藏职…