Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Side by Side Diff: net/quic/core/congestion_control/bbr_sender.cc

Issue 2823083004: Base QUIC BBR's CWND on SRTT instead of min_rtt. Protected by FLAGS_quic_reloadable_flag_quic_base… (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | net/quic/core/congestion_control/bbr_sender_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/core/congestion_control/bbr_sender.h" 5 #include "net/quic/core/congestion_control/bbr_sender.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <sstream> 8 #include <sstream>
9 9
10 #include "net/quic/core/congestion_control/rtt_stats.h" 10 #include "net/quic/core/congestion_control/rtt_stats.h"
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after
147 147
148 QuicBandwidth BbrSender::PacingRate(QuicByteCount bytes_in_flight) const { 148 QuicBandwidth BbrSender::PacingRate(QuicByteCount bytes_in_flight) const {
149 if (pacing_rate_.IsZero()) { 149 if (pacing_rate_.IsZero()) {
150 return kHighGain * QuicBandwidth::FromBytesAndTimeDelta( 150 return kHighGain * QuicBandwidth::FromBytesAndTimeDelta(
151 initial_congestion_window_, GetMinRtt()); 151 initial_congestion_window_, GetMinRtt());
152 } 152 }
153 if (FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate && 153 if (FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate &&
154 mode_ == PROBE_BW && bytes_in_flight > congestion_window_) { 154 mode_ == PROBE_BW && bytes_in_flight > congestion_window_) {
155 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate, 155 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate,
156 1, 2); 156 1, 2);
157 return max_bandwidth_.GetThirdBest(); 157 if (pacing_gain_ > 1) {
158 return max_bandwidth_.GetBest();
159 } else {
160 return max_bandwidth_.GetThirdBest();
161 }
158 } 162 }
159 return pacing_rate_; 163 return pacing_rate_;
160 } 164 }
161 165
162 QuicBandwidth BbrSender::BandwidthEstimate() const { 166 QuicBandwidth BbrSender::BandwidthEstimate() const {
163 return max_bandwidth_.GetBest(); 167 return max_bandwidth_.GetBest();
164 } 168 }
165 169
166 QuicByteCount BbrSender::GetCongestionWindow() const { 170 QuicByteCount BbrSender::GetCongestionWindow() const {
167 if (mode_ == PROBE_RTT) { 171 if (mode_ == PROBE_RTT) {
168 return kMinimumCongestionWindow; 172 return kMinimumCongestionWindow;
169 } 173 }
170 174
171 if (InRecovery()) { 175 if (InRecovery()) {
172 return std::min(congestion_window_, recovery_window_); 176 return std::min(congestion_window_, recovery_window_);
173 } 177 }
174 178
175 if (FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate && 179 if (FLAGS_quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate &&
176 mode_ == PROBE_BW) { 180 mode_ == PROBE_BW && pacing_gain_ >= 1) {
177 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate, 181 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_keep_sending_at_recent_rate,
178 2, 2); 182 2, 2);
179 // Send for another SRTT at a more recently measured bandwidth. 183 // Send for another SRTT at a more recently measured bandwidth.
180 return congestion_window_ + 184 return congestion_window_ +
181 max_bandwidth_.GetThirdBest() * rtt_stats_->smoothed_rtt(); 185 max_bandwidth_.GetThirdBest() * rtt_stats_->smoothed_rtt();
182 } 186 }
183 187
184 return congestion_window_; 188 return congestion_window_;
185 } 189 }
186 190
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 } 291 }
288 292
289 QuicTime::Delta BbrSender::GetMinRtt() const { 293 QuicTime::Delta BbrSender::GetMinRtt() const {
290 return !min_rtt_.IsZero() 294 return !min_rtt_.IsZero()
291 ? min_rtt_ 295 ? min_rtt_
292 : QuicTime::Delta::FromMicroseconds(rtt_stats_->initial_rtt_us()); 296 : QuicTime::Delta::FromMicroseconds(rtt_stats_->initial_rtt_us());
293 } 297 }
294 298
295 QuicByteCount BbrSender::GetTargetCongestionWindow(float gain) const { 299 QuicByteCount BbrSender::GetTargetCongestionWindow(float gain) const {
296 QuicByteCount bdp = GetMinRtt() * BandwidthEstimate(); 300 QuicByteCount bdp = GetMinRtt() * BandwidthEstimate();
301 if (FLAGS_quic_reloadable_flag_quic_bbr_base_cwnd_on_srtt &&
302 mode_ == PROBE_BW && gain >= 1 && !rtt_stats_->smoothed_rtt().IsZero()) {
303 bdp = rtt_stats_->smoothed_rtt() * BandwidthEstimate();
304 }
297 QuicByteCount congestion_window = gain * bdp; 305 QuicByteCount congestion_window = gain * bdp;
298 306
299 // BDP estimate will be zero if no bandwidth samples are available yet. 307 // BDP estimate will be zero if no bandwidth samples are available yet.
300 if (congestion_window == 0) { 308 if (congestion_window == 0) {
301 congestion_window = gain * initial_congestion_window_; 309 congestion_window = gain * initial_congestion_window_;
302 } 310 }
303 311
304 return std::max(congestion_window, kMinimumCongestionWindow); 312 return std::max(congestion_window, kMinimumCongestionWindow);
305 } 313 }
306 314
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
727 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue() 735 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue()
728 << std::endl; 736 << std::endl;
729 737
730 os << "Last sample is app-limited: " 738 os << "Last sample is app-limited: "
731 << (state.last_sample_is_app_limited ? "yes" : "no"); 739 << (state.last_sample_is_app_limited ? "yes" : "no");
732 740
733 return os; 741 return os;
734 } 742 }
735 743
736 } // namespace net 744 } // namespace net
OLDNEW
« no previous file with comments | « no previous file | net/quic/core/congestion_control/bbr_sender_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698