首页 > 其他分享 >第四十一章 发送方码率预估揭秘

第四十一章 发送方码率预估揭秘

时间:2024-10-12 09:17:22浏览次数:11  
标签:GCC 码率 包组 发送 delta 第四十一章 接收 揭秘

WebRTC使用的是Google Congestion Control (简称GCC)拥塞控制,目前有两种实现:

  • 旧的实现是接收方根据收到的音视频RTP报文, 预估码率,并使用REMB RTCP报文反馈回发送方。 * 新的实现是在发送方根据接收方反馈的TransportFeedback RTCP报文,预估码率。

基于延迟的拥塞控制原理

先来看下Google Congestion Control(GCC)的标准草案:draft-ietf-rmcat-gcc-02 结合草案,可以得知GCC是基于网络延迟梯度的拥塞控制算法,判断的依据如下图:

发送方发送两个包组的间隔为 : Ds = Ts1 – Ts0

接收方接收两个包组的间隔为: Dr = Tr1 – Tr0

如果网络没有任何抖动,那么 [ delta = Dr – Ds ] 应该是一个恒定不变的值,但是现实中网络有抖动、拥塞、丢包等情况,所以delta也是一个抖动的值。 GCC通过测量delta,来判断当前网络的使用情况,分为 OverUse (过载),Normal(正常),UnderUse(轻载) 这三种情况。 有同学可能会问,发送方和接收方时钟不统一,怎么计算差值呢,需要做时间对齐或者NTP同步吗?

不需要,因为我们对比的是delta,只需要单位一致即可,举个例子: seq1的包 发送时间为 16000ms(发送方时钟),接收时间为 900ms(接收方时钟) seq2的包 发送时间为 16001ms(发送方时钟),接收时间为 905ms(接收方时钟) 那么延迟梯度delta=(905-900) – (16001-16000) = 4

Pacing和包组

值得注意的是,延迟梯度的判断是以包组为单位的,而且必须在发送方开启pacing发送, 有以下几点原因: 单个包测量误差会过大,基于包组的测量更能反应网络的情况。

burst发送容易冲击网络,影响测量的精度。 那么怎么判断哪几个包属于一个包组呢,非常简单,按发送方的pacing速率分包组。 WebRTC pacing默认是5ms一个包组,如下图所示

TransportFeedback RTCP报文

再来看看transport-feedback的包结构:draft-holmer-rmcat-transport-wide-cc-extensions-01

解析这个报文,我们可以得到下面的信息:

  • 接收到的包seq和包的接收时间
  • 丢失的包seq
  • 可以看到本质上transport-feedback是接收方对数据的ACK,并且捎带了接收的延迟梯度。

发送方码率预估

收到transport-feedback报文后需要怎么处理,结合GCC的算法来看,分为以下几步: 1.计算接收方ack了多少个字节, 统计在采样的时间窗口内接收方的接收速率 看看GCC怎么说:

按照这个算法实现acked_bitrate_estimate,可以计算出接收方在当前时间窗口内的接收速率。

2.将包按包组归类, 计算包组的发送时间 接收时间的差值 在前面的【Pacing和包组】中已经讲过,这里不再赘述

3.按包组的delta, 进行网络状态评估 GCC的标准草案里面使用的是卡尔曼滤波器(接收方评估),发送方评估默认的实现是Trendline Filter。

基本的原理是最小二乘法, 将多个时间点的网络抖动(delta)拟合成一条直线,如下图所示:

根据直线斜率的变化趋势判断网络的负载情况。 上面已经得到了包组的delta,对delta做平滑计算后,按照(时间点, 平滑后的delta), 可以在坐标系上绘制出散点图,使用最小二乘法拟合出delta随时间变化的直线,根据直线斜率计算出变化趋势。 来看看GCC里面的说法:

  • m(i)为i时刻的包组delta,del_var_th(i)为当前判断是否过载的门槛
  • m(i) < -del_var_th(i),判断为under-use(低载)
  • m(i) > del_var_th(i) 且持续至少overuse_time_th时长,判断为over-use(过载)

del_var_th必须动态调整,不然可能会在跟TCP的竞争中被饿死(出于公平性考虑)。过大的del_var_th会对延迟变化不敏感,过小的del_var_th则会过于敏感,抖动容易被频繁误判为过载,必须动态调整,才能和基于丢包的连接(比如TCP)竞争。

根据探测的网络情况, 预估码率

总体的思想是根据当前接收方的接收码率,结合当前的网络负载情况,进行AIMD码率调整:

  • 在接近收敛前,使用乘性增,接近收敛时使,用加性增。
  • 当网络过载时,使用乘性减。

在Decrease状态下,会不停的计算平均最大码率(average max bitrate),当前预估码率和平均最大码率差值在3个标准差以内时,进行乘性增,否则进行加性增。如果包到达速率超过了平均最大码率的3个标准差,那么需要重新计算平均最大码率。

乘性增期间,每秒最多增加8%的码率

加性增期间,每个rtt增加“半个”包大小

评估出的码率不能超过接收速率的1.5倍

当探测到网络过载时,按照0.85的速率降低码率

发送方码率预估的算法流程

将上面的几步结合起来,可以得到一个大致的算法框架

struct FeedbackResultVector {
    int64_t send_time_ms; // 包发送时间(发送时记录)int64_t recv_time_ms; // 包接收时间(从TransportFeedback RTCP报文解析得到)int packet_size; // 包大小
};

// 解析TransportFeedback RTCP报文
FeedbackResultVector feedback_result_vec =
    TransportFeedbackRtcp.Parse(rtcp_feedback);
// 遍历每个包, 进行处理for (feedback_result : feedback_result_vec) {
    double delta = 0.0;
    // 计算ack速率(接收方接收速率)
    AckBitrateEstimate.Update(now_ms, feedback_result.packet_size);
    // 把接收反馈包按照包组分类,计算包组deltabool compute_delta = PacketGroup.AddPacket(feedback_result, delta);
    if (comupute_delta) {
        // 探测网络状态
        TrendLineFilter.Detect(delta);
        // 根据GCC状态机,进行AIMD码率调整
        AimdRateControl.Update(
            TrendLineFilter.NetState(),
            AckBitrateEstimate.Bitrate()
        );
    }
}

Reference:

WebRTC研究:包组时间差计算-InterArrival: WebRTC研究:包组时间差计算-InterArrival - 剑痴乎 WebRTC研究:Trendline滤波器-TrendlineEstimator: WebRTC研究:Trendline滤波器-TrendlineEstimator - 剑痴乎 袁荣喜的一个GCC C语言的实现: https://github.com/yuanrongxi/razor

标签:GCC,码率,包组,发送,delta,第四十一章,接收,揭秘
From: https://blog.csdn.net/ms44/article/details/142847677

相关文章

  • 解锁京东店铺潜力:15大场景揭秘商品列表API接口
    随着电子商务的蓬勃发展,API接口成为连接商家与平台的重要桥梁。京东作为中国领先的电商平台,提供了丰富的API接口,帮助商家更高效地管理店铺和商品。主要用作于一下场景商品展示:在商家自己的网站或移动应用上展示京东店铺的商品列表,方便用户浏览和购买。库存管理:实时获取商......
  • kafka集群升级新策略,Cloudera运维专家来揭秘:助你轻松应对大数据挑战
    项目背景我们团队负责维护的Kafka集群承载了公司大部分实时数据的收集与传输任务。然而,目前存在一些问题,严重影响了集群的稳定性、用户体验以及管理员的运维效率:当前集群版本较低,且低版本的bug频繁出现,导致集群稳定性受到威胁。例如,violet集群最近因触发bug而出现不可......
  • 上海交通大学震撼发布:首个OpenAI O1项目复现报告,揭秘独家经验!
    来源 |机器之心团队介绍:本项目的核心开发团队主要由上海交通大学GAIR研究组的本科三年级、四年级学生以及直博一年级研究生组成。项目得到了来自NYU等一线大型语言模型领域顶尖研究科学家的指导。详细作者介绍见:https://github.com/GAIR-NLP/O1-Journey#about-the-te......
  • 学校为何纷纷拥抱国产电路仿真软件?揭秘背后的四大驱动力
    在当今数字化教育飞速发展的时代,学校教学工具的选择正悄然发生着变化。一个显著的趋势是,越来越多的学校开始大量采用国产电路仿真软件,这一转变背后蕴含着多重驱动力。本文将深入探讨学校选择国产电路仿真软件的四大原因,揭示其背后的深刻意义。‌一、信息安全与技术自主可控的......
  • Steam库存共享大揭秘:如何设置家庭共享6人组,实现库存翻倍的共享乐趣?
    在Steam这个全球最大的数字游戏分发平台上,家庭共享功能无疑是一项非常贴心且实用的设计。它允许用户将自己的游戏库与最多10个Steam账户(包括用户自己的账户)进行共享,使得家庭成员或好友能够在不同的设备上轻松访问并游玩你的游戏库中的游戏。今天,我们就来深入揭秘如何设置Steam......
  • FTP的终结者:揭秘最佳FTP替代方案!
    自1971年诞生以来,FTP凭借其独特优势成为因特网最重要的协议之一。但随着网络技术的发展,FTP呈现出来的弊端也逐渐凸显出来,存在多个方面无法满足大型企业的安全传输需求,需要寻找FTP替代方案:1.安全性不足:FTP协议在传输数据时,数据是以明文形式进行传输的,没有进行任何加密或认证。这......
  • 基于FPGA的8PSK调制解调系统,包含testbench,高斯信道模块,误码率统计模块,可以设置不
    1.算法仿真效果       本系统在以前写过的8PSK调制解调系统的基础上,增加了高斯信道模块,误码率统计模块,可以验证不同SNR情况下的8PSK误码情况。 VIVADO2019.2仿真结果如下(完整代码运行后无水印): 设置SNR=30db   其对应星座图:   设置SNR=15db  ......
  • 《 C++ 修炼全景指南:十四 》大数据杀手锏:揭秘 C++ 中 BitSet 与 BloomFilter 的神奇性
    本篇博客深入探讨了C++中的两种重要数据结构——BitSet和BloomFilter。我们首先介绍了它们的基本概念和使用场景,然后详细分析了它们的实现方法,包括高效接口设计和性能优化策略。接着,我们通过对比这两种数据结构的性能,探讨了在不同应用场景中的选择依据。最后,博客还涵盖......
  • 揭秘SSL:如何成为您的在线隐私守护者
    2021年11月1日,在公民个人信息保护领域国家正式实施了一部具有重要意义的法律——《中华人民共和国个人信息保护法》,该部法律在个人信息保护方面做了相关规定,使得公民个人信息保护走上了法治的轨道,公民在保护个人信息方面开始有法可依。国家颁布实施的这部法律一方面彰显了在保......
  • 揭秘!尤雨溪成立的VoidZero如何改变前端世界
    前言Vue和Vite之父尤雨溪宣布成立公司VoidZero,目前已经融资3200万。这篇文章欧阳将带你了解VoidZero是如何改变javascript的世界!关注公众号:【前端欧阳】,给自己一个进阶vue的机会痛点1:工具太多,学不动公司项目一般是多人维护,为了保证大家写出来的代码风格一致,以及在coding......