[feat] implementation for send side congestion controller

This commit is contained in:
dijunkun
2025-01-14 17:31:18 +08:00
parent ba268016e4
commit a8e9609736
16 changed files with 1747 additions and 82 deletions

60
src/qos/alr_detector.h Normal file
View File

@@ -0,0 +1,60 @@
/*
* @Author: DI JUNKUN
* @Date: 2025-01-14
* Copyright (c) 2025 by DI JUNKUN, All Rights Reserved.
*/
#ifndef _ALR_DETECTOR_H_
#define _ALR_DETECTOR_H_
#include <stddef.h>
#include <stdint.h>
#include <memory>
#include <optional>
#include "interval_budget.h"
struct AlrDetectorConfig {
// Sent traffic ratio as a function of network capacity used to determine
// application-limited region. ALR region start when bandwidth usage drops
// below kAlrStartUsageRatio and ends when it raises above
// kAlrEndUsageRatio. NOTE: This is intentionally conservative at the moment
// until BW adjustments of application limited region is fine tuned.
double bandwidth_usage_ratio = 0.65;
double start_budget_level_ratio = 0.80;
double stop_budget_level_ratio = 0.50;
};
// Application limited region detector is a class that utilizes signals of
// elapsed time and bytes sent to estimate whether network traffic is
// currently limited by the application's ability to generate traffic.
//
// AlrDetector provides a signal that can be utilized to adjust
// estimate bandwidth.
// Note: This class is not thread-safe.
class AlrDetector {
public:
AlrDetector(AlrDetectorConfig config);
AlrDetector();
~AlrDetector();
void OnBytesSent(size_t bytes_sent, int64_t send_time_ms);
// Set current estimated bandwidth.
void SetEstimatedBitrate(int bitrate_bps);
// Returns time in milliseconds when the current application-limited region
// started or empty result if the sender is currently not application-limited.
std::optional<int64_t> GetApplicationLimitedRegionStartTime() const;
private:
friend class GoogCcStatePrinter;
const AlrDetectorConfig conf_;
std::optional<int64_t> last_send_time_ms_;
IntervalBudget alr_budget_;
std::optional<int64_t> alr_started_time_ms_;
};
#endif