| OLD | NEW |
| 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 is_at_full_bandwidth_(false), | 112 is_at_full_bandwidth_(false), |
| 113 rounds_without_bandwidth_gain_(0), | 113 rounds_without_bandwidth_gain_(0), |
| 114 bandwidth_at_last_round_(QuicBandwidth::Zero()), | 114 bandwidth_at_last_round_(QuicBandwidth::Zero()), |
| 115 exiting_quiescence_(false), | 115 exiting_quiescence_(false), |
| 116 exit_probe_rtt_at_(QuicTime::Zero()), | 116 exit_probe_rtt_at_(QuicTime::Zero()), |
| 117 probe_rtt_round_passed_(false), | 117 probe_rtt_round_passed_(false), |
| 118 last_sample_is_app_limited_(false), | 118 last_sample_is_app_limited_(false), |
| 119 recovery_state_(NOT_IN_RECOVERY), | 119 recovery_state_(NOT_IN_RECOVERY), |
| 120 end_recovery_at_(0), | 120 end_recovery_at_(0), |
| 121 recovery_window_(max_congestion_window_), | 121 recovery_window_(max_congestion_window_), |
| 122 bytes_recently_acked_(0) { | 122 bytes_recently_acked_(0), |
| 123 rate_based_recovery_(false) { |
| 123 EnterStartupMode(); | 124 EnterStartupMode(); |
| 124 } | 125 } |
| 125 | 126 |
| 126 BbrSender::~BbrSender() {} | 127 BbrSender::~BbrSender() {} |
| 127 | 128 |
| 128 bool BbrSender::InSlowStart() const { | 129 bool BbrSender::InSlowStart() const { |
| 129 return mode_ == STARTUP; | 130 return mode_ == STARTUP; |
| 130 } | 131 } |
| 131 | 132 |
| 132 bool BbrSender::OnPacketSent(QuicTime sent_time, | 133 bool BbrSender::OnPacketSent(QuicTime sent_time, |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 | 198 |
| 198 QuicBandwidth BbrSender::BandwidthEstimate() const { | 199 QuicBandwidth BbrSender::BandwidthEstimate() const { |
| 199 return max_bandwidth_.GetBest(); | 200 return max_bandwidth_.GetBest(); |
| 200 } | 201 } |
| 201 | 202 |
| 202 QuicByteCount BbrSender::GetCongestionWindow() const { | 203 QuicByteCount BbrSender::GetCongestionWindow() const { |
| 203 if (mode_ == PROBE_RTT) { | 204 if (mode_ == PROBE_RTT) { |
| 204 return kMinimumCongestionWindow; | 205 return kMinimumCongestionWindow; |
| 205 } | 206 } |
| 206 | 207 |
| 207 if (InRecovery()) { | 208 if (InRecovery() && !rate_based_recovery_) { |
| 208 return std::min(congestion_window_, recovery_window_); | 209 return std::min(congestion_window_, recovery_window_); |
| 209 } | 210 } |
| 210 | 211 |
| 211 return congestion_window_; | 212 return congestion_window_; |
| 212 } | 213 } |
| 213 | 214 |
| 214 QuicByteCount BbrSender::GetSlowStartThreshold() const { | 215 QuicByteCount BbrSender::GetSlowStartThreshold() const { |
| 215 return 0; | 216 return 0; |
| 216 } | 217 } |
| 217 | 218 |
| 218 bool BbrSender::InRecovery() const { | 219 bool BbrSender::InRecovery() const { |
| 219 return recovery_state_ != NOT_IN_RECOVERY; | 220 return recovery_state_ != NOT_IN_RECOVERY; |
| 220 } | 221 } |
| 221 | 222 |
| 222 void BbrSender::SetFromConfig(const QuicConfig& config, | 223 void BbrSender::SetFromConfig(const QuicConfig& config, |
| 223 Perspective perspective) { | 224 Perspective perspective) { |
| 224 if (config.HasClientRequestedIndependentOption(k1RTT, perspective)) { | 225 if (config.HasClientRequestedIndependentOption(k1RTT, perspective)) { |
| 225 num_startup_rtts_ = 1; | 226 num_startup_rtts_ = 1; |
| 226 } | 227 } |
| 227 if (config.HasClientRequestedIndependentOption(k2RTT, perspective)) { | 228 if (config.HasClientRequestedIndependentOption(k2RTT, perspective)) { |
| 228 num_startup_rtts_ = 2; | 229 num_startup_rtts_ = 2; |
| 229 } | 230 } |
| 231 if (FLAGS_quic_reloadable_flag_quic_bbr_rate_recovery && |
| 232 config.HasClientRequestedIndependentOption(kBBRR, perspective)) { |
| 233 rate_based_recovery_ = true; |
| 234 } |
| 230 } | 235 } |
| 231 | 236 |
| 232 void BbrSender::ResumeConnectionState( | 237 void BbrSender::ResumeConnectionState( |
| 233 const CachedNetworkParameters& cached_network_params, | 238 const CachedNetworkParameters& cached_network_params, |
| 234 bool max_bandwidth_resumption) { | 239 bool max_bandwidth_resumption) { |
| 235 if (!FLAGS_quic_reloadable_flag_quic_bbr_bandwidth_resumption) { | 240 if (!FLAGS_quic_reloadable_flag_quic_bbr_bandwidth_resumption) { |
| 236 return; | 241 return; |
| 237 } | 242 } |
| 238 | 243 |
| 239 QUIC_FLAG_COUNT(quic_reloadable_flag_quic_bbr_bandwidth_resumption); | 244 QUIC_FLAG_COUNT(quic_reloadable_flag_quic_bbr_bandwidth_resumption); |
| (...skipping 363 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 603 max_ack_height_.Update(aggregation_epoch_bytes_ - expected_bytes_acked, | 608 max_ack_height_.Update(aggregation_epoch_bytes_ - expected_bytes_acked, |
| 604 round_trip_count_); | 609 round_trip_count_); |
| 605 } | 610 } |
| 606 | 611 |
| 607 void BbrSender::CalculatePacingRate() { | 612 void BbrSender::CalculatePacingRate() { |
| 608 if (BandwidthEstimate().IsZero()) { | 613 if (BandwidthEstimate().IsZero()) { |
| 609 return; | 614 return; |
| 610 } | 615 } |
| 611 | 616 |
| 612 QuicBandwidth target_rate = pacing_gain_ * BandwidthEstimate(); | 617 QuicBandwidth target_rate = pacing_gain_ * BandwidthEstimate(); |
| 618 if (rate_based_recovery_ && InRecovery()) { |
| 619 QUIC_FLAG_COUNT(quic_reloadable_flag_quic_bbr_rate_recovery); |
| 620 pacing_rate_ = pacing_gain_ * max_bandwidth_.GetThirdBest(); |
| 621 } |
| 613 if (is_at_full_bandwidth_) { | 622 if (is_at_full_bandwidth_) { |
| 614 pacing_rate_ = target_rate; | 623 pacing_rate_ = target_rate; |
| 615 return; | 624 return; |
| 616 } | 625 } |
| 617 | 626 |
| 618 // Pace at the rate of initial_window / RTT as soon as RTT measurements are | 627 // Pace at the rate of initial_window / RTT as soon as RTT measurements are |
| 619 // available. | 628 // available. |
| 620 if (pacing_rate_.IsZero() && !rtt_stats_->min_rtt().IsZero()) { | 629 if (pacing_rate_.IsZero() && !rtt_stats_->min_rtt().IsZero()) { |
| 621 pacing_rate_ = QuicBandwidth::FromBytesAndTimeDelta( | 630 pacing_rate_ = QuicBandwidth::FromBytesAndTimeDelta( |
| 622 initial_congestion_window_, rtt_stats_->min_rtt()); | 631 initial_congestion_window_, rtt_stats_->min_rtt()); |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 congestion_window_ = congestion_window_ + bytes_acked; | 682 congestion_window_ = congestion_window_ + bytes_acked; |
| 674 } | 683 } |
| 675 | 684 |
| 676 // Enforce the limits on the congestion window. | 685 // Enforce the limits on the congestion window. |
| 677 congestion_window_ = std::max(congestion_window_, kMinimumCongestionWindow); | 686 congestion_window_ = std::max(congestion_window_, kMinimumCongestionWindow); |
| 678 congestion_window_ = std::min(congestion_window_, max_congestion_window_); | 687 congestion_window_ = std::min(congestion_window_, max_congestion_window_); |
| 679 } | 688 } |
| 680 | 689 |
| 681 void BbrSender::CalculateRecoveryWindow(QuicByteCount bytes_acked, | 690 void BbrSender::CalculateRecoveryWindow(QuicByteCount bytes_acked, |
| 682 QuicByteCount bytes_lost) { | 691 QuicByteCount bytes_lost) { |
| 692 if (rate_based_recovery_) { |
| 693 return; |
| 694 } |
| 683 if (FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation2) { | 695 if (FLAGS_quic_reloadable_flag_quic_bbr_fix_conservation2) { |
| 684 if (recovery_state_ == NOT_IN_RECOVERY) { | 696 if (recovery_state_ == NOT_IN_RECOVERY) { |
| 685 return; | 697 return; |
| 686 } | 698 } |
| 687 | 699 |
| 688 // Set up the initial recovery window. | 700 // Set up the initial recovery window. |
| 689 if (recovery_window_ == 0) { | 701 if (recovery_window_ == 0) { |
| 690 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_fix_conservation2, 2, 3); | 702 QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_fix_conservation2, 2, 3); |
| 691 recovery_window_ = unacked_packets_->bytes_in_flight() + bytes_acked; | 703 recovery_window_ = unacked_packets_->bytes_in_flight() + bytes_acked; |
| 692 recovery_window_ = std::max(kMinimumCongestionWindow, recovery_window_); | 704 recovery_window_ = std::max(kMinimumCongestionWindow, recovery_window_); |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue() | 799 os << "Minimum RTT timestamp: " << state.min_rtt_timestamp.ToDebuggingValue() |
| 788 << std::endl; | 800 << std::endl; |
| 789 | 801 |
| 790 os << "Last sample is app-limited: " | 802 os << "Last sample is app-limited: " |
| 791 << (state.last_sample_is_app_limited ? "yes" : "no"); | 803 << (state.last_sample_is_app_limited ? "yes" : "no"); |
| 792 | 804 |
| 793 return os; | 805 return os; |
| 794 } | 806 } |
| 795 | 807 |
| 796 } // namespace net | 808 } // namespace net |
| OLD | NEW |