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

Unified Diff: net/quic/congestion_control/tcp_cubic_sender.cc

Issue 688593002: Refactor Cubic congestion control to separate out PRR into a distinct (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@Move_receive_window_78692549
Patch Set: Created 6 years, 2 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « net/quic/congestion_control/tcp_cubic_sender.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: net/quic/congestion_control/tcp_cubic_sender.cc
diff --git a/net/quic/congestion_control/tcp_cubic_sender.cc b/net/quic/congestion_control/tcp_cubic_sender.cc
index 03cf38baa7f09faed12994c204ca9c2a63e47205..9ea96aed5f5b171c0c6e60ecb4c9d02b76897f51 100644
--- a/net/quic/congestion_control/tcp_cubic_sender.cc
+++ b/net/quic/congestion_control/tcp_cubic_sender.cc
@@ -7,6 +7,7 @@
#include <algorithm>
#include "base/metrics/histogram.h"
+#include "net/quic/congestion_control/prr_sender.h"
#include "net/quic/congestion_control/rtt_stats.h"
#include "net/quic/crypto/crypto_protocol.h"
@@ -23,7 +24,7 @@ const QuicPacketCount kMinimumCongestionWindow = 2;
const QuicByteCount kMaxSegmentSize = kDefaultTCPMSS;
const int64 kInitialCongestionWindow = 10;
const int kMaxBurstLength = 3;
-}; // namespace
+} // namespace
TcpCubicSender::TcpCubicSender(
const QuicClock* clock,
@@ -38,10 +39,6 @@ TcpCubicSender::TcpCubicSender(
reno_(reno),
num_connections_(2),
congestion_window_count_(0),
- prr_out_(0),
- prr_delivered_(0),
- ack_count_since_loss_(0),
- bytes_in_flight_before_loss_(0),
largest_sent_sequence_number_(0),
largest_acked_sequence_number_(0),
largest_sent_at_last_cutback_(0),
@@ -106,7 +103,8 @@ void TcpCubicSender::OnPacketAcked(
largest_acked_sequence_number_ = max(acked_sequence_number,
largest_acked_sequence_number_);
if (InRecovery()) {
- PrrOnPacketAcked(acked_bytes);
+ // PRR is used when in recovery.
+ prr_.OnPacketAcked(acked_bytes);
return;
}
MaybeIncreaseCwnd(acked_sequence_number, bytes_in_flight);
@@ -131,7 +129,8 @@ void TcpCubicSender::OnPacketLost(QuicPacketSequenceNumber sequence_number,
if (InSlowStart()) {
++stats_->slowstart_packets_lost;
}
- PrrOnPacketLost(bytes_in_flight);
+
+ prr_.OnPacketLost(bytes_in_flight);
if (reno_) {
congestion_window_ = congestion_window_ >> 1;
@@ -161,8 +160,10 @@ bool TcpCubicSender::OnPacketSent(QuicTime /*sent_time*/,
if (is_retransmittable != HAS_RETRANSMITTABLE_DATA) {
return false;
}
-
- prr_out_ += bytes;
+ if (InRecovery()) {
+ // PRR is used when in recovery.
+ prr_.OnPacketSent(bytes);
+ }
DCHECK_LT(largest_sent_sequence_number_, sequence_number);
largest_sent_sequence_number_ = sequence_number;
hybrid_slow_start_.OnPacketSent(sequence_number);
@@ -178,7 +179,9 @@ QuicTime::Delta TcpCubicSender::TimeUntilSend(
return QuicTime::Delta::Zero();
}
if (InRecovery()) {
- return PrrTimeUntilSend(bytes_in_flight);
+ // PRR is used when in recovery.
+ return prr_.TimeUntilSend(GetCongestionWindow(), bytes_in_flight,
+ slowstart_threshold_);
}
if (GetCongestionWindow() > bytes_in_flight) {
return QuicTime::Delta::Zero();
@@ -315,46 +318,6 @@ void TcpCubicSender::RevertRetransmissionTimeout() {
previous_congestion_window_ = 0;
}
-void TcpCubicSender::PrrOnPacketLost(QuicByteCount bytes_in_flight) {
- prr_out_ = 0;
- bytes_in_flight_before_loss_ = bytes_in_flight;
- prr_delivered_ = 0;
- ack_count_since_loss_ = 0;
-}
-
-void TcpCubicSender::PrrOnPacketAcked(QuicByteCount acked_bytes) {
- prr_delivered_ += acked_bytes;
- ++ack_count_since_loss_;
-}
-
-QuicTime::Delta TcpCubicSender::PrrTimeUntilSend(
- QuicByteCount bytes_in_flight) const {
- DCHECK(InRecovery());
- // Return QuicTime::Zero In order to ensure limited transmit always works.
- if (prr_out_ == 0 || bytes_in_flight < kMaxSegmentSize) {
- return QuicTime::Delta::Zero();
- }
- if (GetCongestionWindow() > bytes_in_flight) {
- // During PRR-SSRB, limit outgoing packets to 1 extra MSS per ack, instead
- // of sending the entire available window. This prevents burst retransmits
- // when more packets are lost than the CWND reduction.
- // limit = MAX(prr_delivered - prr_out, DeliveredData) + MSS
- if (prr_delivered_ + ack_count_since_loss_ * kMaxSegmentSize <= prr_out_) {
- return QuicTime::Delta::Infinite();
- }
- return QuicTime::Delta::Zero();
- }
- // Implement Proportional Rate Reduction (RFC6937)
- // Checks a simplified version of the PRR formula that doesn't use division:
- // AvailableSendWindow =
- // CEIL(prr_delivered * ssthresh / BytesInFlightAtLoss) - prr_sent
- if (prr_delivered_ * slowstart_threshold_ * kMaxSegmentSize >
- prr_out_ * bytes_in_flight_before_loss_) {
- return QuicTime::Delta::Zero();
- }
- return QuicTime::Delta::Infinite();
-}
-
CongestionControlType TcpCubicSender::GetCongestionControlType() const {
return reno_ ? kReno : kCubic;
}
« no previous file with comments | « net/quic/congestion_control/tcp_cubic_sender.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698