webrtc弱网-PccMonitorInterval类源码分析与算法原理

        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);
}

五. 设计亮点

  1. 时间窗口精确控制:严格区分监控间隔内外的数据包,确保性能评估的准确性

  2. 线性回归延迟分析:使用统计方法分析延迟趋势,比单纯的平均延迟更能反映网络状态

  3. 接收端速率测量:基于实际接收时间计算传输速率,反映真实网络吞吐能力

  4. 阈值过滤机制:避免微小延迟波动对算法产生干扰,提高稳定性

  5. 反馈完整性检测:通过检测后续数据包自动判断反馈收集完成

六. 典型工作流程

时序图

流程图

关键部分说明

  • 时间窗口控制:只处理 (start_time_, start_time_ + interval_duration_] 范围内的数据包

  • 反馈完整性:当收到监控间隔后发送的包反馈时,认为当前间隔反馈收集完成

  • 性能指标计算:基于收集的完整数据计算延迟趋势、丢包率和实际吞吐量

  • 数据分类:明确区分成功接收包和丢失包,分别用于不同指标计算

这种设计使得 PCC 算法能够准确评估不同发送速率下的网络性能,为速率调整提供可靠依据。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值