webrtc弱網-AlrDetector類源碼分析與算法原理

? ? ? ?AlrDetector(應用受限區域檢測器)是WebRTC中用于檢測發送端是否處于應用層限速狀態的核心組件。它通過維護一個基于時間間隔的預算系統,監控實際發送數據量與網絡容量之間的關系。當發送速率持續低于網絡容量的設定比例(如65%)時,判定進入ALR狀態;當發送速率恢復時退出該狀態。該檢測為擁塞控制算法提供關鍵狀態信號,幫助區分網絡擁塞和應用層限速,從而優化帶寬估計和速率調整策略。

一、核心功能

AlrDetector(Application Limited Region Detector)用于檢測是否處于應用受限區域(Application Limited Region, ALR)。當應用程序發送數據的速度低于網絡容量時,就處于 ALR 狀態。該檢測器通過監控發送字節數和時間間隔,結合當前估計的帶寬,判斷是否進入或退出 ALR 狀態。


二、核心算法原理

  1. 基于預算的比例判斷
    • 使用?IntervalBudget?來模擬一個“發送預算”。

    • 預算隨時間的推移而增加(按目標帶寬比例),隨數據發送而減少。

    • 當預算比例超過?start_budget_level_ratio?時,判定進入 ALR;

    • 當預算比例低于?stop_budget_level_ratio?時,判定退出 ALR。

  2. 帶寬使用率控制
    • 使用?bandwidth_usage_ratio(默認 0.65)來設定目標發送速率(即估計帶寬的 65%),避免過于激進地判斷 ALR。


三、關鍵數據結構

1.?AlrDetectorConfig
struct AlrDetectorConfig {double bandwidth_usage_ratio = 0.65;  // 帶寬使用比例double start_budget_level_ratio = 0.80; // 開始ALR的預算比例閾值double stop_budget_level_ratio = 0.50;  // 結束ALR的預算比例閾值std::unique_ptr<StructParametersParser> Parser();
};
2.?AlrDetector?類成員
class AlrDetector {private:const AlrDetectorConfig conf_;          // 配置參數absl::optional<int64_t> last_send_time_ms_; // 上次發送時間IntervalBudget alr_budget_;             // 間隔預算器absl::optional<int64_t> alr_started_time_ms_; // ALR開始時間(若存在則表示處于ALR)RtcEventLog* event_log_;                // 事件日志(可選)
};

四、核心方法詳解

1. 構造函數
AlrDetector::AlrDetector(AlrDetectorConfig config, RtcEventLog* event_log): conf_(config), alr_budget_(0, true), event_log_(event_log) {}
  • 初始化配置和?IntervalBudget,初始預算為0,啟用“可變目標模式”。

2.?OnBytesSent
void AlrDetector::OnBytesSent(size_t bytes_sent, int64_t send_time_ms) {if (!last_send_time_ms_.has_value()) {last_send_time_ms_ = send_time_ms;return;}int64_t delta_time_ms = send_time_ms - *last_send_time_ms_;last_send_time_ms_ = send_time_ms;alr_budget_.UseBudget(bytes_sent);          // 使用預算(發送數據)alr_budget_.IncreaseBudget(delta_time_ms);  // 增加預算(隨時間)bool state_changed = false;if (alr_budget_.budget_ratio() > conf_.start_budget_level_ratio &&!alr_started_time_ms_) {alr_started_time_ms_.emplace(rtc::TimeMillis()); // 進入ALRstate_changed = true;} else if (alr_budget_.budget_ratio() < conf_.stop_budget_level_ratio &&alr_started_time_ms_) {state_changed = true;alr_started_time_ms_.reset(); // 退出ALR}if (event_log_ && state_changed) {event_log_->Log(std::make_unique<RtcEventAlrState>(alr_started_time_ms_.has_value()));}
}
  • 每次發送數據時調用,更新預算并判斷ALR狀態變化。

  • 記錄狀態變化事件(如啟用了事件日志)。

3.?SetEstimatedBitrate
void AlrDetector::SetEstimatedBitrate(int bitrate_bps) {RTC_DCHECK(bitrate_bps);int target_rate_kbps = static_cast<double>(bitrate_bps) * conf_.bandwidth_usage_ratio / 1000;alr_budget_.set_target_rate_kbps(target_rate_kbps);
}
  • 根據當前估計帶寬設置?IntervalBudget?的目標速率(按比例縮放)。

4.?GetApplicationLimitedRegionStartTime
absl::optional<int64_t> AlrDetector::GetApplicationLimitedRegionStartTime() const {return alr_started_time_ms_;
}
  • 返回當前ALR狀態的開始時間(若存在則表示正處于ALR)。


五、設計亮點

  1. 靈活配置:支持通過字段試驗(Field Trials)動態調整參數,適應不同網絡環境和應用場景。

  2. 事件日志:可記錄ALR狀態變化事件,便于后續分析和調試。

  3. 預算比例判斷:使用相對比例而非絕對值,更具適應性和魯棒性。

  4. 輕量級設計:僅依賴時間戳和字節數,無需復雜計算,適合實時系統。


六、典型工作流程

  1. 初始化:構造?AlrDetector,設置初始帶寬(通常為0,后續通過?SetEstimatedBitrate?設置)。

  2. 發送數據:每次發送數據包后調用?OnBytesSent,更新預算并判斷ALR狀態。

  3. 帶寬更新:當網絡帶寬估計更新時,調用?SetEstimatedBitrate?調整目標速率。

  4. 狀態查詢:通過?GetApplicationLimitedRegionStartTime?獲取當前是否處于ALR及其開始時間。

  5. 事件記錄:若狀態變化且啟用了事件日志,則記錄?RtcEventAlrState?事件。

七、整體流程圖

處理發送數據 (OnBytesSent) 流程

檢查預算比例并更新ALR狀態流程

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/97863.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/97863.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/97863.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸

ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? ?? 目錄 ABP + Verify(快照) 驅動的 PDF/Excel 導出回歸 ?? 0) TL;DR ? 1) 背景與目標 ?? 2) 架構與職責(解耦渲染器) ?? 3) “確定性”前置條件(去偽差異) ?? 4) PDF 回歸策略(以 QuestPDF 為例) ?? 4.…

SIFT特征匹配實戰:KNN算法實現指紋認證

這個利用了前面學到的SIFT特征檢測來實現的&#xff0c;然后這里主要就是引入了一個新的匹配器。這里匹配是用KNN算法進行匹配的。下面來看下細節。介紹函數由于要頻繁展示&#xff0c;所以這里定義了一個函數。def cv_show(name, img):cv2.imshow(name, img)cv2.waitKey(0)導入…

網絡安全滲透測試第一步信息收集

信息收集是滲透測試中最基礎且關鍵的一步&#xff0c;它直接影響后續漏洞發現和利用的成功率。本文將系統介紹信息收集的常用方法、工具和技巧&#xff0c;幫助你在實戰中高效定位目標弱點。 一、搜索引擎利用 1. Google Hacking 通過Google搜索語法快速定位敏感信息、后臺地…

C++——類和對象1

1.類的定義1.1 類定義格式class為定義類的關鍵字&#xff0c;Stack為類的名字&#xff0c;{ }中的內容是類的主題為了&#xff0c;注意類定義結束時后面的分號不能省略。類體中的內容稱為類的成員&#xff1a;類中的變量稱為類的屬性或成員變量&#xff1b;類中的函數稱為類的方…

動手學Agent:Agent設計模式——構建有效Agent的7種模型

Agent本身的定義也不是絕對的&#xff0c;從LLM到最高等級的Agent&#xff0c;中間是有大量灰度地帶的&#xff0c;在Anthropic看來&#xff0c;Agent可以以多種方式定義&#xff0c;有些人將完全自主系統定義為Agent&#xff0c;而另一些團隊則將預定義的工作流程定義為Agent。…

Windows 下 .venv 激活腳本深度定制:同時注入 PyTorch 調試日志與國內網絡加速通道——從“能跑”到“好調”的完整工程化方案

Windows 下 .venv 激活腳本深度定制&#xff1a;同時注入 PyTorch 調試日志與國內網絡加速通道 ——從“能跑”到“好調”的完整工程化方案 一、為什么非得改激活腳本&#xff1f; 重復勞動最耗時 每次打開終端都要敲四五行 set/export&#xff0c;人腦就是不可靠的剪貼板。 環…

[BX]和loop指令,debug和masm匯編編譯器對指令的不同處理,循環,大小寄存器的包含關系,操作數據長度與寄存器的關系,段前綴

[bx]是什么[bx]這個表達方式和[0]很像&#xff0c;他們倆的功能也很像。之前就提到了&#xff0c;[0]表示一個內存單元&#xff0c;他的偏移地址是0。從這邊我們可以引出內存單元的定義&#xff1a;要有內存單元的地址&#xff0c;要有內存單元的長度&#xff08;類型&#xff…

域格YM310 X09移芯CAT1模組HTTPS連接服務器

HTTPS連接服務器 本文檔介紹了HTTPS連接服務器的大致流程&#xff0c;測試服務器為httpbin.org。 HTTPS連接服務器流程 創建證書文件 創建一個文件 ATFSCREATE<filename>參數&#xff1a;<filename> 文件名 寫入CA證書 ATFSWRITE<filename>,<mode&…

【ManiSkill】常見envs學習筆記

1. StackCube-v1 用于模擬機器人在桌面場景中將紅色立方體&#xff08;cubeA&#xff09;堆疊到綠色立方體&#xff08;cubeB&#xff09;上的操作。該任務強調精確抓取、放置和穩定性控制。成功條件包括紅色立方體穩定堆疊在綠色立方體上且不被機器人抓取。 參數 (Arguments…

Java 網絡編程全解析

前言&#xff1a;網絡編程的意義與價值 前言&#xff1a;網絡編程的意義與價值 在當今互聯網時代&#xff0c;網絡編程是軟件開發的核心技能之一。無論是桌面應用、移動應用還是企業級系統&#xff0c;幾乎都需要與網絡交互。Java 作為一門跨平臺的編程語言&#xff0c;提供了完…

HarmonyOS應用拉起系列(三):如何直接拉起騰訊/百度/高德地圖進行導航

在鴻蒙應用開發中&#xff0c;經常需要跳轉第三方地圖應用&#xff08;如 騰訊地圖、百度地圖、高德地圖&#xff09;進行導航。無論是出行類 App、物流類 App&#xff0c;還是線下活動類應用&#xff0c;都存在“跳轉地圖導航”的實際需求。寫完HarmonyOS應用拉起系列一和二后…

PCGrad解決多任務沖突

論文解讀&#xff1a;"Gradient Surgery for Multi-Task Learning" 1. 論文標題直譯 Gradient Surgery: 梯度手術for Multi-Task Learning: 應用于多任務學習 合在一起就是&#xff1a;為多任務學習量身定制的梯度手術。這個名字非常形象地概括了它的核心思想。 …

Nvidia顯卡架構解析與cuda應用生態淺析

文章目錄 0. Nvidia顯卡簡介 一、主要顯卡系列 二、主要GPU架構與代表產品 1.main 1.1 CUDA 13.0 的重大變化 1.2 V100 的硬件短板已顯現 1.3 這意味著什么? 1.4 寫在后面 彩蛋:V100 0. Nvidia顯卡簡介 一、主要顯卡系列 GeForce 系列(消費級) 用途:游戲、創作、日常圖形…

開發指南:使用 MQTTNet 庫構建 .Net 物聯網 MQTT 應用程序

一、背景介紹 隨著物聯網的興起&#xff0c;.Net 框架在構建物聯網應用程序方面變得越來越流行。微軟的 .Net Core 和 .Net 框架為開發人員提供了一組工具和庫&#xff0c;以構建可以在 Raspberry Pi、HummingBoard、BeagleBoard、Pine A64 等平臺上運行的物聯網應用程序。 MQT…

突破性能瓶頸:基于騰訊云EdgeOne的AI圖片生成器全球加速實踐

1. 項目背景與挑戰 1.1 開發背景 隨著AIGC技術爆發&#xff0c;我們團隊決定開發一款多模型支持的AI圖片生成器&#xff0c;主要解決以下痛點&#xff1a; 不同AI模型的參數規范不統一生成結果難以系統化管理缺乏企業級的安全水印方案全球用戶訪問延遲高&#xff0c;中國用戶…

一、Java 基礎入門:從 0 到 1 認識 Java(詳細筆記)

1.1 Java 語言簡介與發展歷程 Java 是一門面向對象的高級編程語言&#xff0c;以“跨平臺、安全、穩定”為核心特性&#xff0c;自誕生以來長期占據編程語言排行榜前列&#xff0c;廣泛應用于后端開發、移動端開發、大數據等領域。 1.1.1 起源與核心人物 起源背景&#xff1…

uniapp:根據目的地經緯度,名稱,喚起高德/百度地圖來導航,兼容App,H5,小程序

1、需要自行申請高德地圖的key,配置manifest.json 2、MapSelector選擇組件封裝 <template><view><u-action-sheet :list="mapList" v-model="show" @click="changeMap"></u-action-sheet></view> </template&…

我對 WPF 動搖時的選擇:.NET Framework 4.6.2+WPF+Islands+UWP+CompostionApi

目錄 NET Framework 4.6.2的最大亮點 為什么固守462不升級 WPF-開發體驗的巔峰 為什么對WPF動搖了 基于IslandsUWP的濾鏡嘗試 總結 NET Framework 4.6.2的最大亮點 安全性能大提升&#xff1a; 默認啟用TLS1.2協議&#xff0c;更安全&#xff0c;它為后續的版本提供了重…

SpringBoot大文件下載失敗解決方案

SpringBoot大文件下載失敗解決方案 后端以文件流方式給前端接收下載文件,文件過大時出現下載失敗的情況或者打開后提示文件損壞,實際是字節未完全讀取寫入。 針對大文件下載失敗的情況,以下是詳細的解決方案: 大文件下載失敗的主要原因 內存溢出:一次性加載大文件到內存…

torch.gather

torch.gather 介紹 torch.gather(input, dim, index, *, sparse_gradFalse, outNone) → Tensor 沿由 dim 指定的軸收集值。 對于三維張量&#xff0c;輸出按如下方式確定&#xff1a; out[i][j][k] input[index[i][j][k]][j][k] # 如果 dim 0 out[i][j][k] input[i][i…