RFC8836 对实时交互式音视频应用的拥塞控制算法需求进行了较为全面的总结

  • 延迟 拥塞控制算法应该尽可能降低延时,尤其是算法本身引入的延时。与此同时仍然需要提供可用的带宽水平。

    -吞吐率:在相应场景下吞吐率应尽可能高。
  • 公平性:拥塞控制算法应该能够和其他实时流量和 TCP 流量公平地共享链路带宽。
  • 避免“饿死”:媒体流在与 TCP 流竞争中不应被“饿死”,也不能把 TCP 流“饿死”。
  • 收敛速度:在媒体流启动阶段尽可能快地收敛到稳定状态。
  • 网络支持:算法不应要求特殊网络特性支持。
  • 稳定性:算法应该在媒体流变化时保持稳定,比如媒体流暂时的传输中断
  • 快速响应:算法应该快速响应网络环境的变化,比如瓶颈带宽变化、链路延时变化等。

所以

一是如何快速准确地进行网络拥塞探测;

二是采取适当的拥塞应对措施尽量避免拥塞以及尽可能快地从拥塞状态恢复

基于丢包的算法(Loss-based) 为了探测链路容量而不断增加发送带宽,直至丢包事件发生

基于延时的算法(Delay-based) 对延时的测量来判断网络拥塞, 重点考虑需求总结中的避免“饿死”问题。

基于延时的算法一般通过测量 RTT(round-trip time 往返延时)或者 OWD(one-way delay 单向延时)来判断拥塞。

RTT 测量比较直观,但是由于是测量双向延时的总体情况,因此反向的延时变化会对媒体流方向的网络拥塞判断造成干扰。OWD 延时观测则避免了这个问题。如下图所示:

OWD 通过观测发送间隔与接收间隔的变化来判断网络排队延时的状况。

根据发送端所采取的其他弱网对抗策略,可能的速率调节手段包括调节音视频编码器速率、调节重传速率、调节 FEC 冗余度等.

webrtc 1.0 REMB

  • 发送端采用基于丢包

    丢包率<2%,增加发送带宽 8%;

    丢包率 2% ~ 10%,发送带宽保持不变;

    丢包率>10%,降低发送带宽(1-0.5*丢包率)。
  • 接收端采用基于延时的算法

    通过统计单向延时变化并通过卡尔曼滤波对当前的传输延时进行估计,再结合当前的实际接收带宽评估一个最佳的目标带宽,通过 RTCP 消息反馈给发送端。发送端取两个算法结果的最小值作为最终的目标带宽。

webrtc 2.0 gcc

新的框架改进了网络延时估计算法,通过对单向延时变化数据进行线性回归分析,评估当前网络排队延时变化趋势,即判断出延时正在增加、没有变化、正在降低三种趋势,再结合当前发送速率,给出最佳目标带宽估计。

除了改进拥塞探测算法,新的框架也引入了主动带宽探测机制,优化了整个拥塞控制算法的性能,经过比较,在启动阶段收敛速度、网络环境变化的响应速度上都有比较明显的改进

丢包重传ARQ

首次请求延时:应结合其他策略考虑发现丢包时是否立即请求,比如结合 FEC 策略考虑。

重复请求间隔考虑:同一个数据包重复请求间隔要大于当前 RTT。

请求次数限制:结合当前 RTT 与容忍的最大延时来计算。

发送端重传带宽限制:重传带宽作为总传输带宽的一部分,不能超出总体带宽限制。

重传包回传机制:建议采用单独的 RTP 码流发送,利于丢包率统计与重传带宽计算。

前向纠错

ULPFEC:ULP(Uneven Level Protection,不均等保护)根据数据包重要程度使用不同级别的保护策略。

FlexFEC:Flexible Forward Error Correction,此标准在 RTP 协议框架下定义了交织与非交织的奇偶校验 FEC 编码包格式。

丢包重传和FEC 配合

抖动延时的估计,Google 在其 WebRTC 框架中用了两种方法

1. 音频 直方图加遗忘因子



图中的 Iat 意为间隔达到时间,WebRTC 通过对音频包到达间隔用直方图进行统计,取 95 分位数的延时时长作为音频抖动延时。

2. 视频抗抖动方面,WebRTC 采用不同于音频的抖动延时估计算法,通过对实际的帧尺寸变化与延时变化数据的测量与统计,利用卡尔曼滤波器动态地进行最优抖动延时估计。

融云说的

拥塞控制方面,基于 Google GCC 算法进行改进。除了统计单向延时变化进行拥塞趋势判断之外,同时对丢包模式进行进一步分析,提升带宽预测的准确率。

抗丢包方面,基于 FlexFEC 框架,采用高修复能力的 FEC 编码,并进行综合调优来提升抗丢包能力。

优化 ARQ 与 FEC 机制的配合,力求抗丢包付出的代价最小。抗抖动方面,采用场景适应性更强的抖动延时估计方法,力求提升流畅度的同时减少延时。

webrtc 拥塞控制相关的更多相关文章

  1. webRTC中音频相关的netEQ(五):DSP处理

    上篇(webRTC中音频相关的netEQ(四):控制命令决策)讲了MCU模块是怎么根据网络延时.抖动缓冲延时和反馈报告等来决定给DSP模块发什么控制命令的.DSP模块根据收到的命令进行相关处理,处理简 ...

  2. webRTC中音频相关的netEQ(四):控制命令决策

    上篇(webRTC中音频相关的netEQ(三):存取包和延时计算)讲了语音包的存取以及网络延时和抖动缓冲延时的计算,MCU也收到了DSP模块发来的反馈报告.本文讲MCU模块如何根据网络延时.抖动缓冲延 ...

  3. webRTC中音频相关的netEQ(三):存取包和延时计算

    上篇(webRTC中音频相关的netEQ(二):数据结构)讲了netEQ里主要的数据结构,为理解netEQ的机制打好了基础.本篇主要讲MCU中从网络上收到的RTP包是怎么放进packet buffer ...

  4. webRTC中音频相关的netEQ(二):数据结构

    上篇(webRTC中音频相关的netEQ(一):概述)是netEQ的概述,知道了它主要是用于解决网络延时抖动丢包等问题提高语音质量的,也知道了它有两大单元MCU和DSP组成.MCU 主要是把从网络收到 ...

  5. webRTC中音频相关的netEQ(一):概述

    上篇文章(语音通信中终端上的时延(latency)及减小方法)说从本篇开始会切入webRTC中的netEQ主题,netEQ是webRTC中音频技术方面的两大核心技术之一(另一核心技术是音频的前后处理, ...

  6. TCP系列39—拥塞控制—2、拥塞相关算法及基础知识

    一.拥塞控制的相关算法 早期的TCP协议只有基于窗口的流控(flow control)机制而没有拥塞控制机制,因而易导致网络拥塞.1988年Jacobson针对TCP在网络拥塞控制方面的不足,提出了& ...

  7. 基于webrtc的资源释放问题(二)

    基于webrtc的资源释放问题(二) ——建立连接的过程中意外中断 应用背景: 我们在打电话的时候会不会遇到这种情况?打电话的时候未接通之前挂掉了电话,或者在接通之后建立的连接的过程中挂掉电话? 特别 ...

  8. 基于webrtc的资源释放问题(一)

    基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...

  9. Android IOS WebRTC 音视频开发总结(四四)-- webrtc图书

    本文主要介绍即将出版的webrtc图书相关信息,支持原创,转载必须说明出处,更多详见www.rtc.help --------------------------------------------- ...

  10. WebRTC 音视频开发

    WebRTC 音视频开发 webrtc   Android IOS WebRTC 音视频开发总结(七八)-- 为什么WebRTC端到端监控很关键? 摘要: 本文主要介绍WebRTC端到端监控(我们翻译 ...

随机推荐

  1. 与时俱进的治疗策略不断提高RA无药缓解机会[EULAR2015_SAT0058]

    随时代变迁而进化的治疗策略不断提高RA无药缓解机会 SAT0058 DMARD-FREE SUSTAINED REMISSION IN RHEUMATOID ARTHRITIS: AN OUTCOME ...

  2. Json.stringfiy json未定义

    在文档的顶部添加 <!DOCTYPE html> 没有它,IE10是一个奇怪的兼容模式,许多"新"功能不可用,例如JSON.如果你任然需要使用早期版本的IE,你可以使用 ...

  3. vue api封装 request.js

    import axios from 'axios' import { Message, MessageBox } from 'element-ui' import store from '../sto ...

  4. xr32f429开发环境搭建

    XR32是全志科技的一款MCU芯片,基本参数如下所示: 环境的搭建首先是下载芯片对应的资料和手册(QQ群723687715)软硬件资料 官网工具下载:注册全志服务平台 下载无线连接工具和无线MCU 工 ...

  5. 一步步入门Jenkins+Net Core3.1+Gitlab,实现 CICD

    架构说明: 由浅入深,我们暂时不考虑分布式,安装Jenkins到用户服务器进行CICD 需要两台服务器 Gitlab:192.168.232.128:12080 源代码仓库,可以参考<安装git ...

  6. Linux命令执行时,提示commond not found的处理办法

    执行chattr命令时,或其他命令时,若出现命令没发现,commond not found 那么就是有可能命令文件丢了,执行find / -name chattr,如果没有命令了,可以拷贝一个或yum ...

  7. Day 24 24.2:逆向分析2 - 完美世界案例

    完美世界逆向分析 url:https://passport.wanmei.com/login?location=L3NhZmUv 定位到正确的断点位置 进行js改写操作 断点代码的关键字:setPub ...

  8. javaSE学习一

    java基础 java是一种强类型语言:要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用. java的数据类型有两大类:基本数据类型和引用类型(类.接口.数组) 八大基本数据类型: 1.整 ...

  9. 【C学习笔记】day3-3 编写程序数一下 1到 100 的所有整数中出现多少个数字9

    #include <stdio.h> int main() { int cou=0; for (int i = 1; i <= 100; i++) { if (i % 10 == 9 ...

  10. SAP 采购订单行项目客制化字段增强

    需求: 在采购订单行项目中新增客制化字段,区分采购的项目中的物料是量产还是研发物料 开发步骤 主要使用二代增强出口:MM06E005 创建增强项目 事务码T-code:CMOD 创建项目ZEMM001 ...