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

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

Issue 851503003: Update from https://crrev.com/311076 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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
Index: net/quic/congestion_control/tcp_loss_algorithm.cc
diff --git a/net/quic/congestion_control/tcp_loss_algorithm.cc b/net/quic/congestion_control/tcp_loss_algorithm.cc
index 9366105e82229c04fb1408fe211c1a374a145c94..f657cc225fe5ac217f57bcdfa6b51f4006728e15 100644
--- a/net/quic/congestion_control/tcp_loss_algorithm.cc
+++ b/net/quic/congestion_control/tcp_loss_algorithm.cc
@@ -10,10 +10,17 @@
namespace net {
namespace {
+
+// The minimum delay before a packet will be considered lost,
+// regardless of SRTT. Half of the minimum TLP, since the loss algorithm only
+// triggers when a nack has been receieved for the packet.
+static const size_t kMinLossDelayMs = 5;
+
// How many RTTs the algorithm waits before determining a packet is lost due
// to early retransmission.
static const double kEarlyRetransmitLossDelayMultiplier = 1.25;
-}
+
+} // namespace
TCPLossAlgorithm::TCPLossAlgorithm()
: loss_detection_timeout_(QuicTime::Zero()) { }
@@ -30,8 +37,10 @@ SequenceNumberSet TCPLossAlgorithm::DetectLostPackets(
const RttStats& rtt_stats) {
SequenceNumberSet lost_packets;
loss_detection_timeout_ = QuicTime::Zero();
- QuicTime::Delta loss_delay =
- rtt_stats.smoothed_rtt().Multiply(kEarlyRetransmitLossDelayMultiplier);
+ QuicTime::Delta early_retransmit_delay = QuicTime::Delta::Max(
+ QuicTime::Delta::FromMilliseconds(kMinLossDelayMs),
+ rtt_stats.smoothed_rtt().Multiply(kEarlyRetransmitLossDelayMultiplier));
+
QuicPacketSequenceNumber sequence_number = unacked_packets.GetLeastUnacked();
for (QuicUnackedPacketMap::const_iterator it = unacked_packets.begin();
it != unacked_packets.end() && sequence_number <= largest_observed;
@@ -49,6 +58,16 @@ SequenceNumberSet TCPLossAlgorithm::DetectLostPackets(
continue;
}
+ // Immediately lose the packet if it's been an srtt between the sent time
+ // of it and the largest observed. This speeds recovery from timer based
+ // retransmissions, such as TLP and RTO, when there may be fewer than
+ // kNumberOfNacksBeforeRetransmission nacks.
+ if (it->sent_time.Add(rtt_stats.smoothed_rtt()) <
+ unacked_packets.GetTransmissionInfo(largest_observed).sent_time) {
+ lost_packets.insert(sequence_number);
+ continue;
+ }
+
// Only early retransmit(RFC5827) when the last packet gets acked and
// there are retransmittable packets in flight.
// This also implements a timer-protected variant of FACK.
@@ -56,12 +75,12 @@ SequenceNumberSet TCPLossAlgorithm::DetectLostPackets(
unacked_packets.largest_sent_packet() == largest_observed) {
// Early retransmit marks the packet as lost once 1.25RTTs have passed
// since the packet was sent and otherwise sets an alarm.
- if (time >= it->sent_time.Add(loss_delay)) {
+ if (time >= it->sent_time.Add(early_retransmit_delay)) {
lost_packets.insert(sequence_number);
} else {
// Set the timeout for the earliest retransmittable packet where early
// retransmit applies.
- loss_detection_timeout_ = it->sent_time.Add(loss_delay);
+ loss_detection_timeout_ = it->sent_time.Add(early_retransmit_delay);
break;
}
}
« no previous file with comments | « net/quic/congestion_control/tcp_cubic_sender_test.cc ('k') | net/quic/congestion_control/tcp_loss_algorithm_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698