For BBRv2,
- Change the default STARTUP and DRAIN cwnd gain to 2.0.
- Change the meaning of BBQ2 to use 2.885 cwnd gain for STARTUP and DRAIN.
Flag is default true since cwnd gain 2.0 has been tried in a finch experiment for a long time.
Protected by FLAGS_quic_reloadable_flag_quic_bbr2_flip_bbq2.
PiperOrigin-RevId: 336296878
Change-Id: I8e14586fe92313c0418d03ea5f4ffae610e2ece1
diff --git a/quic/core/congestion_control/bbr2_misc.h b/quic/core/congestion_control/bbr2_misc.h
index 8732118..f68092b 100644
--- a/quic/core/congestion_control/bbr2_misc.h
+++ b/quic/core/congestion_control/bbr2_misc.h
@@ -76,8 +76,9 @@
*/
// The gain for both CWND and PacingRate at startup.
+ float startup_cwnd_gain =
+ GetQuicReloadableFlag(quic_bbr2_flip_bbq2) ? 2.0 : 2.885;
// TODO(wub): Maybe change to the newly derived value of 2.773 (4 * ln(2)).
- float startup_cwnd_gain = 2.885;
float startup_pacing_gain = 2.885;
// Full bandwidth is declared if the total bandwidth growth is less than
@@ -94,7 +95,8 @@
/*
* DRAIN parameters.
*/
- float drain_cwnd_gain = 2.885;
+ float drain_cwnd_gain =
+ GetQuicReloadableFlag(quic_bbr2_flip_bbq2) ? 2.0 : 2.885;
float drain_pacing_gain = 1.0 / 2.885;
/*
diff --git a/quic/core/congestion_control/bbr2_sender.cc b/quic/core/congestion_control/bbr2_sender.cc
index fe32835..6de304a 100644
--- a/quic/core/congestion_control/bbr2_sender.cc
+++ b/quic/core/congestion_control/bbr2_sender.cc
@@ -142,9 +142,14 @@
void Bbr2Sender::ApplyConnectionOptions(
const QuicTagVector& connection_options) {
if (ContainsQuicTag(connection_options, kBBQ2)) {
- // 2 is the lower, derived gain for CWND.
- params_.startup_cwnd_gain = 2;
- params_.drain_cwnd_gain = 2;
+ if (GetQuicReloadableFlag(quic_bbr2_flip_bbq2)) {
+ params_.startup_cwnd_gain = 2.885;
+ params_.drain_cwnd_gain = 2.885;
+ } else {
+ // 2 is the lower, derived gain for CWND.
+ params_.startup_cwnd_gain = 2;
+ params_.drain_cwnd_gain = 2;
+ }
}
if (ContainsQuicTag(connection_options, kBSAO)) {
model_.EnableOverestimateAvoidance();
diff --git a/quic/core/congestion_control/bbr2_simulator_test.cc b/quic/core/congestion_control/bbr2_simulator_test.cc
index 1f5db20..ca8ac7e 100644
--- a/quic/core/congestion_control/bbr2_simulator_test.cc
+++ b/quic/core/congestion_control/bbr2_simulator_test.cc
@@ -589,10 +589,18 @@
ASSERT_EQ(Bbr2Mode::DRAIN, sender_->ExportDebugState().mode);
EXPECT_APPROX_EQ(sender_->BandwidthEstimate() * (1 / 2.885f),
sender_->PacingRate(0), 0.01f);
- // BBR uses CWND gain of 2.88 during STARTUP, hence it will fill the buffer
- // with approximately 1.88 BDPs. Here, we use 1.5 to give some margin for
- // error.
- EXPECT_GE(queue->bytes_queued(), 1.5 * params.BDP());
+
+ if (GetQuicReloadableFlag(quic_bbr2_flip_bbq2)) {
+ // BBR uses CWND gain of 2 during STARTUP, hence it will fill the buffer
+ // with approximately 1 BDP. Here, we use 0.95 to give some margin for
+ // error.
+ EXPECT_GE(queue->bytes_queued(), 0.95 * params.BDP());
+ } else {
+ // BBR uses CWND gain of 2.88 during STARTUP, hence it will fill the buffer
+ // with approximately 1.88 BDPs. Here, we use 1.5 to give some margin for
+ // error.
+ EXPECT_GE(queue->bytes_queued(), 1.5 * params.BDP());
+ }
// Observe increased RTT due to bufferbloat.
const QuicTime::Delta queueing_delay =
diff --git a/quic/core/crypto/crypto_protocol.h b/quic/core/crypto/crypto_protocol.h
index bf3a97c..d272aeb 100644
--- a/quic/core/crypto/crypto_protocol.h
+++ b/quic/core/crypto/crypto_protocol.h
@@ -100,8 +100,8 @@
const QuicTag kBBRS = TAG('B', 'B', 'R', 'S'); // DEPRECATED
const QuicTag kBBQ1 = TAG('B', 'B', 'Q', '1'); // BBR with lower 2.77 STARTUP
// pacing and CWND gain.
-const QuicTag kBBQ2 = TAG('B', 'B', 'Q', '2'); // BBR with lower 2.0 STARTUP
- // CWND gain.
+const QuicTag kBBQ2 = TAG('B', 'B', 'Q', '2'); // BBRv2 with 2.885 STARTUP and
+ // DRAIN CWND gain.
const QuicTag kBBQ3 = TAG('B', 'B', 'Q', '3'); // BBR with ack aggregation
// compensation in STARTUP.
const QuicTag kBBQ5 = TAG('B', 'B', 'Q', '5'); // Expire ack aggregation upon