在WebRTC中,ModifiedVivaceUtilityFunction类和VivaceUtilityFunction类的效用函数类是PCC拥塞控制算法的核心决策组件。它通过数学建模将网络性能指标(吞吐量、延迟梯度、丢包率)转化为单一效用值,指导发送速率优化。
1. 核心功能分析
ModifiedVivaceUtilityFunction类和VivaceUtilityFunction类实现了PCC(Performance-oriented Congestion Control)算法中的效用函数模块,用于评估网络传输性能并指导拥塞控制决策。
2. 核心算法原理
2.1 Vivace效用函数
数学公式:
U = α × R^β - γ × R × D - δ × R × L
其中:
-
R: 发送速率(bitrate)
-
D: 延迟梯度(delay gradient)
-
L: 丢包率(loss rate)
-
α, β, γ, δ: 可配置参数
注释精要:
double VivaceUtilityFunction::Compute(const PccMonitorInterval& monitor_interval) const {
RTC_DCHECK(monitor_interval.IsFeedbackCollectionDone());
double bitrate = monitor_interval.GetTargetSendingRate().bps(); // 获取目标发送速率R
double loss_rate = monitor_interval.GetLossRate(); // 获取丢包率L
// 计算延迟梯度D,并进行阈值处理
double rtt_gradient = monitor_interval.ComputeDelayGradient(delay_gradient_threshold_);
rtt_gradient = std::max(rtt_gradient, -delay_gradient_negative_bound_);
// 应用效用函数公式:U = α×R^β - γ×R×D - δ×R×L
return (throughput_coefficient_ * std::pow(bitrate, throughput_power_)) -
(delay_gradient_coefficient_ * bitrate * rtt_gradient) -
(loss_coefficient_ * bitrate * loss_rate);
}
2.2 ModifiedVivace效用函数
数学公式:
U = α × R^(β+1) - γ × R² × D - δ × R² × L
改进点: 各项都与速率的高次方成正比,使得梯度更新随发送速率线性缩放。
注释精要:
double ModifiedVivaceUtilityFunction::Compute(const PccMonitorInterval& monitor_interval) const {
RTC_DCHECK(monitor_interval.IsFeedbackCollectionDone());
double bitrate = monitor_interval.GetTargetSendingRate().bps();
double loss_rate = monitor_interval.GetLossRate();
double rtt_gradient = monitor_interval.ComputeDelayGradient(delay_gradient_threshold_);
rtt_gradient = std::max(rtt_gradient, -delay_gradient_negative_bound_);
// 改进的效用函数:各项都乘以bitrate,使得更新与速率平方相关
return (throughput_coefficient_ * std::pow(bitrate, throughput_power_) * bitrate) -
(delay_gradient_coefficient_ * bitrate * bitrate * rtt_gradient) -
(loss_coefficient_ * bitrate * bitrate * loss_rate);
}
3. 关键数据结构
3.1 接口类
class PccUtilityFunctionInterface {
public:
virtual double Compute(const PccMonitorInterval& monitor_interval) const = 0;
virtual ~PccUtilityFunctionInterface() = default;
};
3.2 实现类参数
private: const double delay_gradient_coefficient_; // γ: 延迟梯度系数 const double loss_coefficient_; // δ: 丢包率系数 const double throughput_power_; // β: 吞吐量幂次 const double throughput_coefficient_; // α: 吞吐量系数 const double delay_gradient_threshold_; // 延迟梯度阈值 const double delay_gradient_negative_bound_; // 延迟梯度负向边界
4. 核心方法详解
4.1 构造函数
VivaceUtilityFunction::VivaceUtilityFunction(
double delay_gradient_coefficient, // γ - 延迟梯度惩罚权重
double loss_coefficient, // δ - 丢包率惩罚权重
double throughput_coefficient, // α - 吞吐量奖励权重
double throughput_power, // β - 吞吐量非线性因子
double delay_gradient_threshold, // 延迟梯度检测阈值
double delay_gradient_negative_bound) // 延迟梯度负向限制
4.2 延迟梯度处理
// 计算延迟梯度,并进行边界处理 double rtt_gradient = monitor_interval.ComputeDelayGradient(delay_gradient_threshold_); rtt_gradient = std::max(rtt_gradient, -delay_gradient_negative_bound_); // 作用:避免负向延迟梯度过大,防止过度乐观估计
5. 设计亮点
5.1 策略模式设计
-
通过接口类
PccUtilityFunctionInterface实现开闭原则 -
支持多种效用函数策略的灵活替换
5.2 参数化配置
-
所有系数都可配置,便于算法调优
-
支持不同网络环境下的自适应调整
5.3 数学建模优化
-
Vivace: 基础版本,平衡吞吐量、延迟、丢包
-
ModifiedVivace: 改进版本,速率相关梯度更新,单发送者性能更优
5.4 边界保护
RTC_DCHECK_GE(delay_gradient_negative_bound_, 0); // 确保负向边界非负 rtt_gradient = std::max(rtt_gradient, -delay_gradient_negative_bound_); // 限制梯度范围
6. 典型工作流程
6.1 流程图

6.2 时序图

6.3 关键步骤说明
-
监控间隔初始化
-
PCC控制器创建监控间隔对象
-
设置目标发送速率并开始数据收集
-
-
性能数据收集
-
收集吞吐量、往返时间、丢包率等指标
-
计算延迟梯度(RTT变化趋势)
-
-
效用函数计算
-
调用
Compute()方法 -
应用效用函数公式计算综合得分
-
得分反映当前速率的"好坏程度"
-
-
拥塞控制决策
-
PCC控制器比较不同速率的效用得分
-
选择效用最大化的发送速率
-
进入下一个监控间隔继续优化
-
这种基于效用函数的拥塞控制方法,通过数学建模将复杂的网络状态转化为单一的优化目标,实现了数据驱动的速率调整策略。
1035

被折叠的 条评论
为什么被折叠?



