PccMonitorInterval是WebRTC中PCC拥塞控制算法的核心监控单元,负责在固定时间窗口内评估特定发送速率下的网络性能表现。它通过收集数据包的延迟、丢包和接收速率等多维度指标,为拥塞控制决策提供关键数据支撑。该类采用线性回归算法计算延迟梯度趋势,精确反映网络状态变化,并通过智能反馈机制确保数据完整性。其设计实现了网络性能的精细化测量,是PCC算法实现动态速率调整和网络优化的基础组件。
一. 核心功能
PccMonitorInterval 类是 PCC (Performance-oriented Congestion Control) 拥塞控制算法的核心组件,用于监控特定发送速率下的网络性能表现。主要功能包括:
-
速率测试:在固定时间窗口内以特定目标速率发送数据
-
性能指标收集:统计丢包率、计算延迟梯度、测量实际传输速率
-
反馈处理:处理网络反馈的包信息,区分已接收和丢失的数据包
二. 核心算法原理
延迟梯度计算算法(线性回归)
数学公式:
斜率 = Σ((t_i - t_avg) × (d_i - d_avg)) / Σ((t_i - t_avg)²)
其中:
-
t_i= 第i个包的相对发送时间 -
d_i= 第i个包的延迟 -
t_avg= 平均相对发送时间 -
d_avg= 平均延迟
double PccMonitorInterval::ComputeDelayGradient(double delay_gradient_threshold) const {
// 防止除零:检查包数量和时间跨度
if (received_packets_.empty() || received_packets_.front().sent_time ==
received_packets_.back().sent_time) {
return 0;
}
// 计算所有包相对于第一个包的时间差总和
double sum_times = 0;
for (const ReceivedPacket& packet : received_packets_) {
double time_delta_us = (packet.sent_time - received_packets_[0].sent_time).us();
sum_times += time_delta_us;
}
// 计算线性回归的分子和分母
double sum_squared_scaled_time_deltas = 0;
double sum_scaled_time_delta_dot_delay = 0;
for (const ReceivedPacket& packet : received_packets_) {
double time_delta_us = (packet.sent_time - received_packets_[0].sent_time).us();
double delay = packet.delay.us();
// 计算去中心化的时间差:t_i - t_avg
double scaled_time_delta_us = time_delta_us - sum_times / received_packets_.size();
// 分母:Σ(t_i - t_avg)²
sum_squared_scaled_time_deltas += scaled_time_delta_us * scaled_time_delta_us;
// 分子:Σ(t_i - t_avg) × d_i
sum_scaled_time_delta_dot_delay += scaled_time_delta_us * delay;
}
// 计算斜率(延迟梯度)
double rtt_gradient = sum_scaled_time_delta_dot_delay / sum_squared_scaled_time_deltas;
// 应用阈值过滤,避免微小波动
if (std::abs(rtt_gradient) < delay_gradient_threshold)
rtt_gradient = 0;
return rtt_gradient;
}
丢包率计算算法
数学公式:
丢包率 = 丢失包数量 / (丢失包数量 + 接收包数量)
三. 关键数据结构
struct ReceivedPacket {
TimeDelta delay; // 包延迟(接收时间 - 发送时间)
Timestamp sent_time; // 包发送时间
};
// 关键成员变量:
DataRate target_sending_rate_; // 目标发送速率
Timestamp start_time_; // 监控间隔开始时间
TimeDelta interval_duration_; // 监控间隔时长
std::vector<ReceivedPacket> received_packets_; // 成功接收的包信息
std::vector<Timestamp> lost_packets_sent_time_; // 丢失包的发送时间
DataSize received_packets_size_; // 接收包的总大小
bool feedback_collection_done_; // 反馈收集完成标志
四. 核心方法详解
OnPacketsFeedback - 反馈包处理
void PccMonitorInterval::OnPacketsFeedback(
const std::vector<PacketResult>& packets_results) {
for (const PacketResult& packet_result : packets_results) {
// 过滤在监控间隔开始前发送的包
if (packet_result.sent_packet.send_time <= start_time_) {
continue;
}
// 检测是否收到监控间隔后的包,标记反馈收集完成
if (packet_result.sent_packet.send_time > start_time_ + interval_duration_) {
feedback_collection_done_ = true;
return;
}
// 分类处理:丢失包 vs 成功接收包
if (!packet_result.IsReceived()) {
lost_packets_sent_time_.push_back(packet_result.sent_packet.send_time);
} else {
received_packets_.push_back(
{packet_result.receive_time - packet_result.sent_packet.send_time,
packet_result.sent_packet.send_time});
received_packets_size_ += packet_result.sent_packet.size;
}
}
}
GetTransmittedPacketsRate - 实际传输速率计算
DataRate PccMonitorInterval::GetTransmittedPacketsRate() const {
if (received_packets_.empty()) {
return target_sending_rate_;
}
// 计算第一个和最后一个包的接收时间间隔
Timestamp receive_time_of_first_packet =
received_packets_.front().sent_time + received_packets_.front().delay;
Timestamp receive_time_of_last_packet =
received_packets_.back().sent_time + received_packets_.back().delay;
// 防止除零错误
if (receive_time_of_first_packet == receive_time_of_last_packet) {
return target_sending_rate_;
}
// 实际速率 = 接收数据总量 / 接收时间窗口
return received_packets_size_ /
(receive_time_of_last_packet - receive_time_of_first_packet);
}
五. 设计亮点
-
时间窗口精确控制:严格区分监控间隔内外的数据包,确保性能评估的准确性
-
线性回归延迟分析:使用统计方法分析延迟趋势,比单纯的平均延迟更能反映网络状态
-
接收端速率测量:基于实际接收时间计算传输速率,反映真实网络吞吐能力
-
阈值过滤机制:避免微小延迟波动对算法产生干扰,提高稳定性
-
反馈完整性检测:通过检测后续数据包自动判断反馈收集完成
六. 典型工作流程
时序图

流程图

关键部分说明:
-
时间窗口控制:只处理
(start_time_, start_time_ + interval_duration_]范围内的数据包 -
反馈完整性:当收到监控间隔后发送的包反馈时,认为当前间隔反馈收集完成
-
性能指标计算:基于收集的完整数据计算延迟趋势、丢包率和实际吞吐量
-
数据分类:明确区分成功接收包和丢失包,分别用于不同指标计算
这种设计使得 PCC 算法能够准确评估不同发送速率下的网络性能,为速率调整提供可靠依据。

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



