Annotate
diff --git a/quiche/src/recovery/gcongestion/bbr2.rs b/quiche/src/recovery/gcongestion/bbr2.rs
index b25f5e3..93f584a 100644
--- a/quiche/src/recovery/gcongestion/bbr2.rs
+++ b/quiche/src/recovery/gcongestion/bbr2.rs
@@ -219,24 +219,93 @@
}
const DEFAULT_PARAMS: Params = Params {
+ // Experiment
+ // - function: how aggressively to capture a share of the bandwidth at startup
+ // - modify: bbrv3 reduced to 2.0 from 2.89. We should experiment with higher value to confirm
+ // the value is not too conservative.
+ // - risk: other flows need to yield bandwidth; which takes time. Probing too quickly could
+ // lead to packet loss and increased congestion.
+ //
+ // Note: based on the spec, this should match drain_cwnd_gain
startup_cwnd_gain: 2.0,
+ // Experiment
+ // - function: how aggressively to capture a share of the bandwidth at startup
+ // - modify: bbrv3 reduced to 2.77 from 2.89. We should experiment with higher value to confirm
+ // the value is not too conservative.
+ // - risk: other flows need to yield bandwidth; which takes time. Probing too quickly could
+ // lead to packet loss and increased congestion.
startup_pacing_gain: 2.773,
+ // Experiment
+ // - function: the threshold is used to determining when to exit startup and probing_up modes.
+ // Its also used to determine the low bw estimates on congestion event. The current value
+ // matches the spec and implementation.
+ // - modify: not recommended for initial experimentation since the value is tightly coupled
+ // across multiple BBR calculation.
+ // - risk: increasing this value would result in being less responsive to congestion and
+ // maintaining a higher inflight which continue to result in more loss and network
+ // degradation. Note: network degradation matters most when the network is congested.
+ //
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/quic/core/congestion_control/bbr2_misc.h#L85
full_bw_threshold: 1.25,
startup_full_bw_rounds: 3,
max_startup_queue_rounds: 0,
+ // Experiment TODO
+ //
+ // [BBRv3] updates this to 6, however the google quiche impl still uses the value of 8.
+ //
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/common/quiche_protocol_flags_list.h#L151-L153
+ // [BBRv3]: https://datatracker.ietf.org/meeting/117/materials/slides-117-ccwg-bbrv3-algorithm-bug-fixes-and-public-internet-deployment
startup_full_loss_count: 8,
+ // Experiment
+ //
+ // Note: based on the spec, this should match startup_cwnd_gain
drain_cwnd_gain: 2.0,
+ // Experiment TODO
+ //
+ // Needs more investigation.
+ //
+ // https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02#name-drain
+ // The spec defines this is as 1/BBRStartupCwndGain, which means this should be 1/2. However...
+ //
+ // https://github.com/google/quiche/blob/7aec9bcbc0d32f18674e3eab8ecb27c0de1c6df1/quiche/quic/core/congestion_control/bbr2_misc.h#L111
+ // The current value is based on google quiche impl.
+ //
+ // ```
+ // # not the startup_cwnd_gain is 2 and break with the spec calculation.
+ // float startup_cwnd_gain = 2.0;
+ // float drain_pacing_gain = 1.0 / 2.885;
+ // ```
+ //
+ // Notably, BBRv3 also makes changes to a few related parameters.
+ //
+ // [BBRv3]: https://datatracker.ietf.org/meeting/117/materials/slides-117-ccwg-bbrv3-algorithm-bug-fixes-and-public-internet-deployment
drain_pacing_gain: 1.0 / 2.885,
+ // Related to reno coexistence
+ //
+ // Value seems to assume "Public Internet last mile traffic".
+ // spec: https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02#name-bandwidth-probing-and-coexi
+ //
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/quic/core/congestion_control/bbr2_misc.h#L119-L120
probe_bw_probe_max_rounds: 63,
+ // Experiment
+ //
+ // - function: allow for cross flows using cubic/reno to claim a fair share of the bandwidth
+ // - modify: not recommended.
+ // - risk: There are a lot assumptions backed by decades of google experiments built into this
+ // calculation. Without being able to measure the impact to cross traffic flows, disabling or
+ // modifying the reno-coexistence calculation seems risky.
+ //
+ // spec: https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02#name-bandwidth-probing-and-coexi
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/quic/core/congestion_control/bbr2_misc.h#L122-L124
enable_reno_coexistence: true,
probe_bw_probe_reno_gain: 1.0,
@@ -245,28 +314,93 @@
probe_bw_full_loss_count: 2,
+ // Experiment
+ //
+ // Possibly change in conjunction with `probe_bw_cwnd_gain`.
+ // Possibly change in conjunction with `probe_bw_probe_down_pacing_gain` to balance draining
+ // the queue.
+ //
+ // - function: used to accelerate the sending rate during probe_up mode. The probe_up operation runs
+ // periodically to probe for higher capacity.
+ // - modify: we should experiment with higher values. Since a higher pacing rate is useful if
+ // the cwnd is also growing faster, it might make sense to couple this experiment with a higher
+ // probe_bw_cwnd_gain.
+ // - risk: A higher value results in a more aggressive probe up phase. If the value is too
+ // high, it will result in more congestion and worse performance.
+ //
+ // https://github.com/google/quiche/blob/cfe837e3581c47701a2697659f51b098f70fc77c/quiche/quic/core/congestion_control/bbr2_misc.h#L141
probe_bw_probe_up_pacing_gain: 1.25,
+ // Experiment
+ //
+ // Possibly lower if increasing `probe_bw_probe_up_pacing_gain`.
+ //
+ // https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02#name-probebw_down
+ // > The pacing_gain value of 0.9 is derived based on the ProbeBW_UP pacing gain of 1.25, as the
+ // > minimum pacing_gain value that allows bandwidth-based convergence to approximate fairness.
+ //
+ // - function: used to deaccelerate the sending rate during probe_down in order to achieve
+ // fairness. the google quiche use a value 0.91. The probe_drain mode runs periodically to
+ // counter the probe_up phase.
+ // - modify: we should experiment with higher values. A higher value would allow us to
+ // "retain" the higher bandwidth we discovered during the probe_up mode
+ // - risk: A higher value results in a more aggressive probe_down phase. If the value is too
+ // high, we will hog all the bandwidth and make it unfair for new flows joining the
+ // connection. Retaining more bandwidth can also lead to higher congestion.
+ //
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/quic/core/congestion_control/bbr2_misc.h#L142
probe_bw_probe_down_pacing_gain: 0.9, // BBRv3
probe_bw_default_pacing_gain: 1.0,
+ // Experiment
+ //
+ // Possibly change in conjunction with `probe_bw_probe_up_pacing_gain`.
+ //
+ // BBRv3 recommends 2.25 but google quiche is still using a value of 2.0.
+ //
+ // - function: controls how fast the cwnd will grow during the probe_bw mode. Its probably
+ // most relavant during the probe_up mode.
+ // - modify: we should experiment with higher values. Since a higher value allows for more
+ // in-flight packets, it might make sense to couple this experiment with a higher
+ // probe_bw_probe_up_pacing_gain
+ // - risk: A higher value results in a more aggressive probe up phase. If the value is too
+ // high, it will result in more congestion and worse performance.
+ //
+ // https://github.com/google/quiche/blob/cfe837e3581c47701a2697659f51b098f70fc77c/quiche/quic/core/congestion_control/bbr2_misc.h#L145
+ // [BBRv3]: https://datatracker.ietf.org/meeting/117/materials/slides-117-ccwg-bbrv3-algorithm-bug-fixes-and-public-internet-deployment
probe_bw_cwnd_gain: 2.25, // BBRv3
probe_up_ignore_inflight_hi: false,
+ // Experiment TODO
+ //
+ // google quiche seems to configure this value. Is setting this to `0` (disabling) this
+ // appropriate?
+ // https://github.com/search?q=repo%3Agoogle%2Fquiche%20max_probe_up_queue_rounds&type=code
max_probe_up_queue_rounds: 2,
probe_rtt_inflight_target_bdp_fraction: 0.5,
+ // The default period for entering PROBE_RTT. 10s
probe_rtt_period: Duration::from_millis(10000),
+ // The default time to spend in PROBE_RTT mode
probe_rtt_duration: Duration::from_millis(200),
initial_max_ack_height_filter_window: 10,
inflight_hi_headroom: 0.15,
+ // Experiment
+ // - function: controls when loss is "sufficiently" high to stop probing. Both the spec and
+ // google quiche impl use a value of 2%.
+ // - modify: we should increase this value up to 2%.
+ // - risk: a higher loss threshold would result in more packet loss and network degradation.
+ // Note: network degradation matters most when the network is already congested.
+ //
+ // https://github.com/google/quiche/blob/98c9cdb4cd17ea043243037bfdee3cdf024cab54/quiche/common/quiche_protocol_flags_list.h#L146-L149
+ // https://datatracker.ietf.org/doc/html/draft-cardwell-iccrg-bbr-congestion-control-02#section-2.8
loss_threshold: 0.015,
beta: 0.3,
@@ -279,12 +413,34 @@
startup_loss_exit_use_max_delivered_for_inflight_hi: true,
+ // Experiment TODO
+ // This is set to false by default in google quiche. Needs investigation
+ //
+ // https://github.com/google/quiche/blob/7aec9bcbc0d32f18674e3eab8ecb27c0de1c6df1/quiche/quic/core/congestion_control/bbr2_misc.h#L209
use_bytes_delivered_for_inflight_hi: true,
+ // Experiment
+ // This is set to false by default in google quiche
+ //
+ // https://github.com/google/quiche/blob/7aec9bcbc0d32f18674e3eab8ecb27c0de1c6df1/quiche/quic/core/congestion_control/bbr2_misc.h#L226
+ //
+ // Potentially also missing some checks in startup:
+ // https://github.com/google/quiche/blob/7aec9bcbc0d32f18674e3eab8ecb27c0de1c6df1/quiche/quic/core/congestion_control/bbr2_startup.cc#L73
decrease_startup_pacing_at_end_of_round: true,
overestimate_avoidance: true,
+ // Experiment
+ //
+ // Requires more investigation to fully understand behavior, but it's worth experimenting since
+ // there is known set of options.
+ //
+ // - function: Controls bandwidth_lo reduction on congestion event. Clearing bandwidth_lo when
+ // entering probe_down mode (Default mode). Determining if pacing rate should change on
+ // congestion event (Default mode).
+ // - modify: we should try different modes and compare behavior.
+ // - risk: the risk is unclear with using different options. The `Default` mode enables some
+ // new code paths which could merit a closer look.
bw_lo_mode: BwLoMode::InflightReduction,
};