WebRTC 拥塞控制 | 网络带宽过载检测

简介: 本文是 WebRTC 拥塞控制 第 3 篇

作者:泰一
来源:码神说公众号

  • 导读
  • 网络带宽使用状态
  • 自适应阈值的设计
    • 为什么要动态自适应?
    • 阈值自适应算法
  • 源码分析
    • Detect 函数
    • UpdateThreshold 函数
  • 测试用例

导读

上一篇介绍了 Trendline 滤波器计算延迟梯度趋势的过程,求得了最终值 trendline_slope。接下来,就要用这个斜率值与阈值进行比较,从而检测网络带宽的使用状态,比如是否过载。实际的带宽检测过程涉及到:调整延迟梯度斜率值、过载触发条件、阈值自适应,本篇将介绍这个过程。

网络带宽使用状态
WebRTC 定义了三种网络带宽的使用状态:Normal、Underuse、Overuse,即正常、低载、过载。

enumclass BandwidthUsage {
  kBwNormal = 0,
  kBwUnderusing = 1,
  kBwOverusing = 2,
};

下图展示了过载检测中三种信号的产生机制,其中,上下两条红色曲线表示动态阈值:image.png
蓝色曲线表示调整后的延迟梯度斜率值:image.png

image.png

过载检测原理


可知,网络带宽使用状态的判定方法为:

image.png

自适应阈值的设计

为什么要动态自适应?

image.png

adaptive threshold is able to solve the starvation issue and allows the GCC flow to share the bottleneck fairly with the concurrent TCP flow,γ(t) follows m(t) with a smaller time constant which avoids the generation of a large number of consecutive overuse signals and prevents the starvation of the GCC flow.

理想的网络环境中,延迟梯度为 0,而在实际的网络环境中,延迟梯度则是不断变化的,让阈值跟随延迟梯度的变化而进行动态调整,可以降低 GCC 算法对延迟梯度变化的敏感度。

阈值自适应算法

GCC 提出的阈值自适应算法公式如下:
image.png

源码分析

基于 WebRTC 71 版本。

网络带宽的过载检测与动态阈值的更新也是在 TrendlineEstimator 类中实现的,函数声明如下:

class TrendlineEstimator {
private:
  void Detect(double trend,
    double ts_delta,
    int64_t now_ms);

  void UpdateThreshold(
    double modified_trend,
    int64_t now_ms);
};

每个数据包组(除了首个包组)的到来都会触发过载检测和阈值的动态更新。

Detect 函数

该函数输入延迟梯度趋势的值、包组的发送时间差、包组的到达时间,从而评估网络带宽的使用状态,比如是否过载?

image.png

constexprint kMinNumDeltas = 60;
constdouble modified_trend =
  std::min(num_of_deltas_, kMinNumDeltas) *
  trend * threshold_gain_;

num_of_deltas_ 表示包组间延迟梯度计算的次数,取值范围是 [2, 60],threshold_gain_ 是 Trendline 滤波器的增益参数,其默认值为 4,这两个变量都会对延迟梯度趋势值进行放大。

image.png

if (modified_trend > threshold_) {
  if (time_over_using_ == -1) {
    time_over_using_ = ts_delta / 2;
  } else {
    time_over_using_ += ts_delta;
  }
  overuse_counter_++;
  if (time_over_using_ >
      overusing_time_threshold_ &&
      overuse_counter_ > 1) {
    if (trend >= prev_trend_) {
      time_over_using_ = 0;
      overuse_counter_ = 0;
      hypothesis_ =
        BandwidthUsage::kBwOverusing;
    }
  }
}

值得一提的是,源码关于过载时间的计算是:过载时长等于包组发送时间差值 send_delta_ms 的累加。但是在首次检测到过载时,过载时长会初始化为包组发送时间差的一半,我把这个做法理解为一种类似于 TCP 的慢启动策略。注意,在满足所有条件触发过载信号后,过载时长与过载次数这两个变量要重置为 0。

UpdateThreshold 函数

该函数动态更新延迟梯度趋势的阈值。

当延迟梯度斜率和阈值的差值大于 kMaxAdaptOffsetMs (15) 时,不更新阈值。

if (fabs(modified_trend) > threshold_ +
  kMaxAdaptOffsetMs) {
    last_update_ms_ = now_ms;
    return;
}

这种情况可能发生在这样的场景:因为某些原因,网络链路的容量突然降低,导致延迟梯度瞬间急剧增长。

image.png

int64_t time_delta_ms = std::min(now_ms - last_update_ms_, kMaxTimeDeltaMs);
threshold_ += k * (fabs(modified_trend) - threshold_) * time_delta_ms;
threshold_ = rtc::SafeClamp(threshold_, 6.f, 600.f);

还有两点值得一提:

阈值计算公式中的 time_delta_ms 指的是包组的到达时间差 arrival_delta_ms,而上文中过载时长则是根据包组的发送时间差 send_delta_ms 来计算。
初始阈值设置为 12.5,计算后的阈值需要控制到 [6, 600] 这个区间内。GCC 草案解释了这么做的原因:

since a too small del_var_th(i) can cause the detector to become overly sensitive.

测试用例

继续使用了上篇的测试用例,一共构造了 41 个包组,来模拟过载检测的过程,输出如下:

image.png

测试输出


观察日志输出,有几个比较关键的点:
  1. 初始的延迟梯度阈值设置为 12.5,随后开始动态自适应,一直调整到了 GCC 草案建议的阈值范围的最小值 6,在包组 21 到来并开始计算延迟梯度斜率之前,保持不变。
  2. 包组 21 到来之前,样本点数量未达到窗口大小,虽然不会进行延迟梯度斜率的计算,但是会执行过载检测和动态阈值更新,由于斜率初始化为 0,小于阈值 6,故认为网络状态正常。
  3. 包组 21 到来之后,样本点达到窗口大小 20,开始计算延迟梯度斜率,可以看出,阈值跟随斜率而变动,但由于斜率一直大于阈值,故网络一直处于过载状态。

至此,网络带宽过载检测的内容介绍完毕。下一篇将介绍三种网络带宽使用状态的信号(normal、overuse、underuse)如何驱动 AIMD 码率控制器工作,从而有效的进行拥塞控制,感谢阅读。

参考资料
[1]Gcc Analysis: https://c3lab.poliba.it/images/6/65/Gcc-analysis.pdf

[2]GCC 草案: https://tools.ietf.org/html/draft-ietf-rmcat-gcc-02#section-5.4

「视频云技术」你最值得关注的音视频技术公众号,每周推送来自阿里云一线的实践技术文章,在这里与音视频领域一流工程师交流切磋。

image.png

相关文章
|
2月前
|
JSON 监控 API
在线网络PING接口检测服务器连通状态免费API教程
接口盒子提供免费PING检测API,可测试域名或IP的连通性与响应速度,支持指定地域节点,适用于服务器运维和网络监控。
|
2月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
70 2
|
7月前
|
机器学习/深度学习 算法 数据安全/隐私保护
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
本研究基于MATLAB 2022a,使用GRU网络对QAM调制信号进行检测。QAM是一种高效调制技术,广泛应用于现代通信系统。传统方法在复杂环境下性能下降,而GRU通过门控机制有效提取时间序列特征,实现16QAM、32QAM、64QAM、128QAM的准确检测。仿真结果显示,GRU在低SNR下表现优异,且训练速度快,参数少。核心程序包括模型预测、误检率和漏检率计算,并绘制准确率图。
180 65
基于GRU网络的MQAM调制信号检测算法matlab仿真,对比LSTM
|
3月前
|
机器学习/深度学习 算法 5G
基于DNN深度神经网络的OFDM+QPSK信号检测与误码率matlab仿真
本内容展示了基于深度神经网络(DNN)的OFDM-QPSK信号检测算法在Matlab2022a中的仿真效果。通过构建包含多层全连接层和ReLU激活函数的DNN模型,结合信号预处理与特征提取,实现了复杂通信环境下的高效信号检测。仿真结果对比了传统LS、MMSE方法与DNN方法在不同信噪比(SNR)条件下的误码率(BER)和符号错误率(SER),验证了DNN方法的优越性能。核心程序涵盖了QPSK调制、导频插入、OFDM发射、信道传输及DNN预测等关键步骤,为现代通信系统提供了可靠的技术支持。
57 0
|
5月前
|
SQL 数据采集 人工智能
“服务器老被黑?那是你没上AI哨兵!”——聊聊基于AI的网络攻击检测那些事儿
“服务器老被黑?那是你没上AI哨兵!”——聊聊基于AI的网络攻击检测那些事儿
221 12
|
5月前
|
机器学习/深度学习 人工智能 运维
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
AI“捕风捉影”:深度学习如何让网络事件检测更智能?
129 8
|
6月前
|
机器学习/深度学习 存储 算法
基于MobileNet深度学习网络的活体人脸识别检测算法matlab仿真
本内容主要介绍一种基于MobileNet深度学习网络的活体人脸识别检测技术及MQAM调制类型识别方法。完整程序运行效果无水印,需使用Matlab2022a版本。核心代码包含详细中文注释与操作视频。理论概述中提到,传统人脸识别易受非活体攻击影响,而MobileNet通过轻量化的深度可分离卷积结构,在保证准确性的同时提升检测效率。活体人脸与非活体在纹理和光照上存在显著差异,MobileNet可有效提取人脸高级特征,为无线通信领域提供先进的调制类型识别方案。
|
6月前
|
机器学习/深度学习 数据采集 算法
基于yolov2和googlenet网络的疲劳驾驶检测算法matlab仿真
本内容展示了基于深度学习的疲劳驾驶检测算法,包括算法运行效果预览(无水印)、Matlab 2022a 软件版本说明、部分核心程序(完整版含中文注释与操作视频)。理论部分详细阐述了疲劳检测原理,通过对比疲劳与正常状态下的特征差异,结合深度学习模型提取驾驶员面部特征变化。具体流程包括数据收集、预处理、模型训练与评估,使用数学公式描述损失函数和推理过程。课题基于 YOLOv2 和 GoogleNet,先用 YOLOv2 定位驾驶员面部区域,再由 GoogleNet 分析特征判断疲劳状态,提供高准确率与鲁棒性的检测方法。
|
9月前
|
运维 监控 安全
公司监控软件:SAS 数据分析引擎驱动网络异常精准检测
在数字化商业环境中,企业网络系统面临复杂威胁。SAS 数据分析引擎凭借高效处理能力,成为网络异常检测的关键技术。通过统计分析、时间序列分析等方法,SAS 帮助企业及时发现并处理异常流量,确保网络安全和业务连续性。
146 11
|
9月前
|
XML JSON 网络协议
【网络原理】——拥塞控制,延时/捎带应答,面向字节流,异常情况
拥塞控制,延时应答,捎带应答,面向字节流(粘包问题),异常情况(心跳包)

热门文章

最新文章