• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "net/quic/quic_sent_packet_manager.h"
6 
7 #include <algorithm>
8 
9 #include "base/logging.h"
10 #include "base/stl_util.h"
11 #include "net/quic/congestion_control/pacing_sender.h"
12 #include "net/quic/crypto/crypto_protocol.h"
13 #include "net/quic/quic_ack_notifier_manager.h"
14 #include "net/quic/quic_connection_stats.h"
15 #include "net/quic/quic_flags.h"
16 #include "net/quic/quic_utils_chromium.h"
17 
18 using std::make_pair;
19 using std::max;
20 using std::min;
21 
22 namespace net {
23 namespace {
24 static const int kDefaultRetransmissionTimeMs = 500;
25 // TCP RFC calls for 1 second RTO however Linux differs from this default and
26 // define the minimum RTO to 200ms, we will use the same until we have data to
27 // support a higher or lower value.
28 static const int kMinRetransmissionTimeMs = 200;
29 static const int kMaxRetransmissionTimeMs = 60000;
30 static const size_t kMaxRetransmissions = 10;
31 
32 // Only exponentially back off the handshake timer 5 times due to a timeout.
33 static const size_t kMaxHandshakeRetransmissionBackoffs = 5;
34 static const size_t kMinHandshakeTimeoutMs = 10;
35 
36 // Sends up to two tail loss probes before firing an RTO,
37 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe.
38 static const size_t kDefaultMaxTailLossProbes = 2;
39 static const int64 kMinTailLossProbeTimeoutMs = 10;
40 
41 // Number of samples before we force a new recent min rtt to be captured.
42 static const size_t kNumMinRttSamplesAfterQuiescence = 2;
43 
HasCryptoHandshake(const TransmissionInfo & transmission_info)44 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) {
45   if (transmission_info.retransmittable_frames == NULL) {
46     return false;
47   }
48   return transmission_info.retransmittable_frames->HasCryptoHandshake() ==
49       IS_HANDSHAKE;
50 }
51 
52 }  // namespace
53 
54 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
55 
QuicSentPacketManager(bool is_server,const QuicClock * clock,QuicConnectionStats * stats,CongestionFeedbackType type,LossDetectionType loss_type)56 QuicSentPacketManager::QuicSentPacketManager(bool is_server,
57                                              const QuicClock* clock,
58                                              QuicConnectionStats* stats,
59                                              CongestionFeedbackType type,
60                                              LossDetectionType loss_type)
61     : unacked_packets_(),
62       is_server_(is_server),
63       clock_(clock),
64       stats_(stats),
65       debug_delegate_(NULL),
66       send_algorithm_(
67           SendAlgorithmInterface::Create(clock, &rtt_stats_, type, stats)),
68       loss_algorithm_(LossDetectionInterface::Create(loss_type)),
69       largest_observed_(0),
70       consecutive_rto_count_(0),
71       consecutive_tlp_count_(0),
72       consecutive_crypto_retransmission_count_(0),
73       pending_tlp_transmission_(false),
74       max_tail_loss_probes_(kDefaultMaxTailLossProbes),
75       using_pacing_(false) {
76 }
77 
~QuicSentPacketManager()78 QuicSentPacketManager::~QuicSentPacketManager() {
79 }
80 
SetFromConfig(const QuicConfig & config)81 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) {
82   if (config.HasReceivedInitialRoundTripTimeUs() &&
83       config.ReceivedInitialRoundTripTimeUs() > 0) {
84     rtt_stats_.set_initial_rtt_us(min(kMaxInitialRoundTripTimeUs,
85                                       config.ReceivedInitialRoundTripTimeUs()));
86   }
87   // TODO(ianswett): BBR is currently a server only feature.
88   if (config.HasReceivedCongestionOptions() &&
89       ContainsQuicTag(config.ReceivedCongestionOptions(), kTBBR)) {
90     send_algorithm_.reset(
91         SendAlgorithmInterface::Create(clock_, &rtt_stats_, kTCPBBR, stats_));
92   }
93   if (config.congestion_feedback() == kPACE) {
94     MaybeEnablePacing();
95   }
96   if (config.HasReceivedLossDetection() &&
97       config.ReceivedLossDetection() == kTIME) {
98     loss_algorithm_.reset(LossDetectionInterface::Create(kTime));
99   }
100   send_algorithm_->SetFromConfig(config, is_server_);
101 }
102 
103 // TODO(ianswett): Combine this method with OnPacketSent once packets are always
104 // sent in order and the connection tracks RetransmittableFrames for longer.
OnSerializedPacket(const SerializedPacket & serialized_packet)105 void QuicSentPacketManager::OnSerializedPacket(
106     const SerializedPacket& serialized_packet) {
107   if (serialized_packet.retransmittable_frames) {
108     ack_notifier_manager_.OnSerializedPacket(serialized_packet);
109   }
110 
111   unacked_packets_.AddPacket(serialized_packet);
112 }
113 
OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number,QuicPacketSequenceNumber new_sequence_number)114 void QuicSentPacketManager::OnRetransmittedPacket(
115     QuicPacketSequenceNumber old_sequence_number,
116     QuicPacketSequenceNumber new_sequence_number) {
117   TransmissionType transmission_type;
118   PendingRetransmissionMap::iterator it =
119       pending_retransmissions_.find(old_sequence_number);
120   if (it != pending_retransmissions_.end()) {
121     transmission_type = it->second;
122     pending_retransmissions_.erase(it);
123   } else {
124     DLOG(DFATAL) << "Expected sequence number to be in "
125         "pending_retransmissions_.  sequence_number: " << old_sequence_number;
126     transmission_type = NOT_RETRANSMISSION;
127   }
128 
129   // A notifier may be waiting to hear about ACKs for the original sequence
130   // number. Inform them that the sequence number has changed.
131   ack_notifier_manager_.UpdateSequenceNumber(old_sequence_number,
132                                              new_sequence_number);
133 
134   unacked_packets_.OnRetransmittedPacket(old_sequence_number,
135                                          new_sequence_number,
136                                          transmission_type);
137 }
138 
OnIncomingAck(const ReceivedPacketInfo & received_info,QuicTime ack_receive_time)139 void QuicSentPacketManager::OnIncomingAck(
140     const ReceivedPacketInfo& received_info,
141     QuicTime ack_receive_time) {
142   QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight();
143 
144   // We rely on delta_time_largest_observed to compute an RTT estimate, so
145   // we only update rtt when the largest observed gets acked.
146   bool largest_observed_acked = MaybeUpdateRTT(received_info, ack_receive_time);
147   if (largest_observed_ < received_info.largest_observed) {
148     largest_observed_ = received_info.largest_observed;
149     unacked_packets_.IncreaseLargestObserved(largest_observed_);
150   }
151   HandleAckForSentPackets(received_info);
152   InvokeLossDetection(ack_receive_time);
153   MaybeInvokeCongestionEvent(largest_observed_acked, bytes_in_flight);
154 
155   // If we have received a truncated ack, then we need to clear out some
156   // previous transmissions to allow the peer to actually ACK new packets.
157   if (received_info.is_truncated) {
158     unacked_packets_.ClearPreviousRetransmissions(
159         received_info.missing_packets.size() / 2);
160   }
161 
162   // Anytime we are making forward progress and have a new RTT estimate, reset
163   // the backoff counters.
164   if (largest_observed_acked) {
165     // Reset all retransmit counters any time a new packet is acked.
166     consecutive_rto_count_ = 0;
167     consecutive_tlp_count_ = 0;
168     consecutive_crypto_retransmission_count_ = 0;
169   }
170 }
171 
MaybeInvokeCongestionEvent(bool rtt_updated,QuicByteCount bytes_in_flight)172 void QuicSentPacketManager::MaybeInvokeCongestionEvent(
173     bool rtt_updated, QuicByteCount bytes_in_flight) {
174   if (rtt_updated || !packets_acked_.empty() ||
175       !packets_lost_.empty()) {
176     send_algorithm_->OnCongestionEvent(
177         rtt_updated, bytes_in_flight, packets_acked_, packets_lost_);
178     packets_acked_.clear();
179     packets_lost_.clear();
180   }
181 }
182 
HandleAckForSentPackets(const ReceivedPacketInfo & received_info)183 void QuicSentPacketManager::HandleAckForSentPackets(
184     const ReceivedPacketInfo& received_info) {
185   // Go through the packets we have not received an ack for and see if this
186   // incoming_ack shows they've been seen by the peer.
187   QuicTime::Delta delta_largest_observed =
188       received_info.delta_time_largest_observed;
189   QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
190   while (it != unacked_packets_.end()) {
191     QuicPacketSequenceNumber sequence_number = it->first;
192     if (sequence_number > received_info.largest_observed) {
193       // These packets are still in flight.
194       break;
195     }
196 
197     if (IsAwaitingPacket(received_info, sequence_number)) {
198       // Consider it multiple nacks when there is a gap between the missing
199       // packet and the largest observed, since the purpose of a nack
200       // threshold is to tolerate re-ordering.  This handles both StretchAcks
201       // and Forward Acks.
202       // The nack count only increases when the largest observed increases.
203       size_t min_nacks = received_info.largest_observed - sequence_number;
204       // Truncated acks can nack the largest observed, so use a min of 1.
205       if (min_nacks == 0) {
206         min_nacks = 1;
207       }
208       unacked_packets_.NackPacket(sequence_number, min_nacks);
209       ++it;
210       continue;
211     }
212     // Packet was acked, so remove it from our unacked packet list.
213     DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number;
214     // If data is associated with the most recent transmission of this
215     // packet, then inform the caller.
216     if (it->second.in_flight) {
217       packets_acked_[sequence_number] = it->second;
218     }
219     it = MarkPacketHandled(it, delta_largest_observed);
220   }
221 
222   // Discard any retransmittable frames associated with revived packets.
223   for (SequenceNumberSet::const_iterator revived_it =
224            received_info.revived_packets.begin();
225        revived_it != received_info.revived_packets.end(); ++revived_it) {
226     MarkPacketRevived(*revived_it, delta_largest_observed);
227   }
228 }
229 
HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number) const230 bool QuicSentPacketManager::HasRetransmittableFrames(
231     QuicPacketSequenceNumber sequence_number) const {
232   return unacked_packets_.HasRetransmittableFrames(sequence_number);
233 }
234 
RetransmitUnackedPackets(RetransmissionType retransmission_type)235 void QuicSentPacketManager::RetransmitUnackedPackets(
236     RetransmissionType retransmission_type) {
237   QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
238   while (it != unacked_packets_.end()) {
239     const RetransmittableFrames* frames = it->second.retransmittable_frames;
240     // TODO(ianswett): Consider adding a new retransmission type which removes
241     // all these old packets from unacked and retransmits them as new sequence
242     // numbers with no connection to the previous ones.
243     if (frames != NULL && (retransmission_type == ALL_PACKETS ||
244                            frames->encryption_level() == ENCRYPTION_INITIAL)) {
245       MarkForRetransmission(it->first, ALL_UNACKED_RETRANSMISSION);
246     }
247     ++it;
248   }
249 }
250 
NeuterUnencryptedPackets()251 void QuicSentPacketManager::NeuterUnencryptedPackets() {
252   QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
253   while (it != unacked_packets_.end()) {
254     const RetransmittableFrames* frames = it->second.retransmittable_frames;
255     QuicPacketSequenceNumber sequence_number = it->first;
256     ++it;
257     if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) {
258       // Once you're forward secure, no unencrypted packets will be sent, crypto
259       // or otherwise. Unencrypted packets are neutered and abandoned, to ensure
260       // they are not retransmitted or considered lost from a congestion control
261       // perspective.
262       pending_retransmissions_.erase(sequence_number);
263       unacked_packets_.RemoveFromInFlight(sequence_number);
264       // RemoveRetransmittibility is safe because only the newest sequence
265       // number can have frames.
266       unacked_packets_.RemoveRetransmittability(sequence_number);
267     }
268   }
269 }
270 
MarkForRetransmission(QuicPacketSequenceNumber sequence_number,TransmissionType transmission_type)271 void QuicSentPacketManager::MarkForRetransmission(
272     QuicPacketSequenceNumber sequence_number,
273     TransmissionType transmission_type) {
274   const TransmissionInfo& transmission_info =
275       unacked_packets_.GetTransmissionInfo(sequence_number);
276   LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL);
277   if (transmission_type != TLP_RETRANSMISSION) {
278     unacked_packets_.RemoveFromInFlight(sequence_number);
279   }
280   // TODO(ianswett): Currently the RTO can fire while there are pending NACK
281   // retransmissions for the same data, which is not ideal.
282   if (ContainsKey(pending_retransmissions_, sequence_number)) {
283     return;
284   }
285 
286   pending_retransmissions_[sequence_number] = transmission_type;
287 }
288 
RecordSpuriousRetransmissions(const SequenceNumberSet & all_transmissions,QuicPacketSequenceNumber acked_sequence_number)289 void QuicSentPacketManager::RecordSpuriousRetransmissions(
290     const SequenceNumberSet& all_transmissions,
291     QuicPacketSequenceNumber acked_sequence_number) {
292   for (SequenceNumberSet::const_iterator
293            it = all_transmissions.upper_bound(acked_sequence_number),
294            end = all_transmissions.end();
295        it != end;
296        ++it) {
297     const TransmissionInfo& retransmit_info =
298         unacked_packets_.GetTransmissionInfo(*it);
299 
300     stats_->bytes_spuriously_retransmitted += retransmit_info.bytes_sent;
301     ++stats_->packets_spuriously_retransmitted;
302     if (debug_delegate_ != NULL) {
303       debug_delegate_->OnSpuriousPacketRetransmition(
304           retransmit_info.transmission_type,
305           retransmit_info.bytes_sent);
306     }
307   }
308 }
309 
HasPendingRetransmissions() const310 bool QuicSentPacketManager::HasPendingRetransmissions() const {
311   return !pending_retransmissions_.empty();
312 }
313 
314 QuicSentPacketManager::PendingRetransmission
NextPendingRetransmission()315     QuicSentPacketManager::NextPendingRetransmission() {
316   DCHECK(!pending_retransmissions_.empty());
317   QuicPacketSequenceNumber sequence_number =
318       pending_retransmissions_.begin()->first;
319   TransmissionType transmission_type = pending_retransmissions_.begin()->second;
320   if (unacked_packets_.HasPendingCryptoPackets()) {
321     // Ensure crypto packets are retransmitted before other packets.
322     PendingRetransmissionMap::const_iterator it =
323         pending_retransmissions_.begin();
324     do {
325       if (HasCryptoHandshake(unacked_packets_.GetTransmissionInfo(it->first))) {
326         sequence_number = it->first;
327         transmission_type = it->second;
328         break;
329       }
330       ++it;
331     } while (it != pending_retransmissions_.end());
332   }
333   DCHECK(unacked_packets_.IsUnacked(sequence_number)) << sequence_number;
334   const TransmissionInfo& transmission_info =
335       unacked_packets_.GetTransmissionInfo(sequence_number);
336   DCHECK(transmission_info.retransmittable_frames);
337 
338   return PendingRetransmission(sequence_number,
339                                transmission_type,
340                                *transmission_info.retransmittable_frames,
341                                transmission_info.sequence_number_length);
342 }
343 
MarkPacketRevived(QuicPacketSequenceNumber sequence_number,QuicTime::Delta delta_largest_observed)344 void QuicSentPacketManager::MarkPacketRevived(
345     QuicPacketSequenceNumber sequence_number,
346     QuicTime::Delta delta_largest_observed) {
347   if (!unacked_packets_.IsUnacked(sequence_number)) {
348     return;
349   }
350 
351   const TransmissionInfo& transmission_info =
352       unacked_packets_.GetTransmissionInfo(sequence_number);
353   QuicPacketSequenceNumber newest_transmission =
354       *transmission_info.all_transmissions->rbegin();
355   // This packet has been revived at the receiver. If we were going to
356   // retransmit it, do not retransmit it anymore.
357   pending_retransmissions_.erase(newest_transmission);
358 
359   // The AckNotifierManager needs to be notified for revived packets,
360   // since it indicates the packet arrived from the appliction's perspective.
361   if (transmission_info.retransmittable_frames) {
362     ack_notifier_manager_.OnPacketAcked(
363         newest_transmission, delta_largest_observed);
364   }
365 
366   unacked_packets_.RemoveRetransmittability(sequence_number);
367 }
368 
MarkPacketHandled(QuicUnackedPacketMap::const_iterator it,QuicTime::Delta delta_largest_observed)369 QuicUnackedPacketMap::const_iterator QuicSentPacketManager::MarkPacketHandled(
370     QuicUnackedPacketMap::const_iterator it,
371     QuicTime::Delta delta_largest_observed) {
372   LOG_IF(DFATAL, it == unacked_packets_.end())
373       << "MarkPacketHandled must be passed a valid iterator entry.";
374   const QuicPacketSequenceNumber sequence_number = it->first;
375   const TransmissionInfo& transmission_info = it->second;
376 
377   QuicPacketSequenceNumber newest_transmission =
378       *transmission_info.all_transmissions->rbegin();
379   // Remove the most recent packet, if it is pending retransmission.
380   pending_retransmissions_.erase(newest_transmission);
381 
382   // Notify observers about the ACKed packet.
383   {
384     // The AckNotifierManager needs to be notified about the most recent
385     // transmission, since that's the one only one it tracks.
386     ack_notifier_manager_.OnPacketAcked(newest_transmission,
387                                         delta_largest_observed);
388     if (newest_transmission != sequence_number) {
389       RecordSpuriousRetransmissions(*transmission_info.all_transmissions,
390                                     sequence_number);
391     }
392   }
393 
394   // Two cases for MarkPacketHandled:
395   // 1) Handle the most recent or a crypto packet, so remove all transmissions.
396   // 2) Handle old transmission, keep all other pending transmissions,
397   //    but disassociate them from one another.
398 
399   // If it's a crypto handshake packet, discard it and all retransmissions,
400   // since they won't be acked now that one has been processed.
401   // TODO(ianswett): Instead of handling all crypto packets in a special way,
402   // only handle NULL encrypted packets in a special way.
403   if (HasCryptoHandshake(
404           unacked_packets_.GetTransmissionInfo(newest_transmission))) {
405     unacked_packets_.RemoveFromInFlight(newest_transmission);
406   }
407   unacked_packets_.RemoveFromInFlight(sequence_number);
408   unacked_packets_.RemoveRetransmittability(sequence_number);
409 
410   QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin();
411   while (next_unacked != unacked_packets_.end() &&
412          next_unacked->first <= sequence_number) {
413     ++next_unacked;
414   }
415   return next_unacked;
416 }
417 
IsUnacked(QuicPacketSequenceNumber sequence_number) const418 bool QuicSentPacketManager::IsUnacked(
419     QuicPacketSequenceNumber sequence_number) const {
420   return unacked_packets_.IsUnacked(sequence_number);
421 }
422 
HasUnackedPackets() const423 bool QuicSentPacketManager::HasUnackedPackets() const {
424   return unacked_packets_.HasUnackedPackets();
425 }
426 
427 QuicPacketSequenceNumber
GetLeastUnackedSentPacket() const428 QuicSentPacketManager::GetLeastUnackedSentPacket() const {
429   return unacked_packets_.GetLeastUnackedSentPacket();
430 }
431 
OnPacketSent(QuicPacketSequenceNumber sequence_number,QuicTime sent_time,QuicByteCount bytes,TransmissionType transmission_type,HasRetransmittableData has_retransmittable_data)432 bool QuicSentPacketManager::OnPacketSent(
433     QuicPacketSequenceNumber sequence_number,
434     QuicTime sent_time,
435     QuicByteCount bytes,
436     TransmissionType transmission_type,
437     HasRetransmittableData has_retransmittable_data) {
438   DCHECK_LT(0u, sequence_number);
439   LOG_IF(DFATAL, bytes == 0) << "Cannot send empty packets.";
440   pending_tlp_transmission_ = false;
441   // In rare circumstances, the packet could be serialized, sent, and then acked
442   // before OnPacketSent is called.
443   if (!unacked_packets_.IsUnacked(sequence_number)) {
444     return false;
445   }
446 
447   if (unacked_packets_.bytes_in_flight() == 0) {
448     // TODO(ianswett): Consider being less aggressive to force a new
449     // recent_min_rtt, likely by not discarding a relatively new sample.
450     DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:"
451              << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms";
452     rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence);
453   }
454 
455   // Only track packets as in flight that the send algorithm wants us to track.
456   const bool in_flight =
457       send_algorithm_->OnPacketSent(sent_time,
458                                     unacked_packets_.bytes_in_flight(),
459                                     sequence_number,
460                                     bytes,
461                                     has_retransmittable_data);
462   unacked_packets_.SetSent(sequence_number, sent_time, bytes, in_flight);
463 
464   // Reset the retransmission timer anytime a pending packet is sent.
465   return in_flight;
466 }
467 
OnRetransmissionTimeout()468 void QuicSentPacketManager::OnRetransmissionTimeout() {
469   DCHECK(unacked_packets_.HasInFlightPackets());
470   DCHECK(!pending_tlp_transmission_);
471   // Handshake retransmission, timer based loss detection, TLP, and RTO are
472   // implemented with a single alarm. The handshake alarm is set when the
473   // handshake has not completed, the loss alarm is set when the loss detection
474   // algorithm says to, and the TLP and  RTO alarms are set after that.
475   // The TLP alarm is always set to run for under an RTO.
476   switch (GetRetransmissionMode()) {
477     case HANDSHAKE_MODE:
478       ++stats_->crypto_retransmit_count;
479       RetransmitCryptoPackets();
480       return;
481     case LOSS_MODE: {
482       ++stats_->loss_timeout_count;
483       QuicByteCount bytes_in_flight = unacked_packets_.bytes_in_flight();
484       InvokeLossDetection(clock_->Now());
485       MaybeInvokeCongestionEvent(false, bytes_in_flight);
486       return;
487     }
488     case TLP_MODE:
489       // If no tail loss probe can be sent, because there are no retransmittable
490       // packets, execute a conventional RTO to abandon old packets.
491       ++stats_->tlp_count;
492       ++consecutive_tlp_count_;
493       pending_tlp_transmission_ = true;
494       // TLPs prefer sending new data instead of retransmitting data, so
495       // give the connection a chance to write before completing the TLP.
496       return;
497     case RTO_MODE:
498       ++stats_->rto_count;
499       RetransmitAllPackets();
500       return;
501   }
502 }
503 
RetransmitCryptoPackets()504 void QuicSentPacketManager::RetransmitCryptoPackets() {
505   DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode());
506   // TODO(ianswett): Typical TCP implementations only retransmit 5 times.
507   consecutive_crypto_retransmission_count_ =
508       min(kMaxHandshakeRetransmissionBackoffs,
509           consecutive_crypto_retransmission_count_ + 1);
510   bool packet_retransmitted = false;
511   for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
512        it != unacked_packets_.end(); ++it) {
513     QuicPacketSequenceNumber sequence_number = it->first;
514     const RetransmittableFrames* frames = it->second.retransmittable_frames;
515     // Only retransmit frames which are in flight, and therefore have been sent.
516     if (!it->second.in_flight || frames == NULL ||
517         frames->HasCryptoHandshake() != IS_HANDSHAKE) {
518       continue;
519     }
520     packet_retransmitted = true;
521     MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION);
522   }
523   DCHECK(packet_retransmitted) << "No crypto packets found to retransmit.";
524 }
525 
MaybeRetransmitTailLossProbe()526 bool QuicSentPacketManager::MaybeRetransmitTailLossProbe() {
527   if (!pending_tlp_transmission_) {
528     return false;
529   }
530   for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
531        it != unacked_packets_.end(); ++it) {
532     QuicPacketSequenceNumber sequence_number = it->first;
533     const RetransmittableFrames* frames = it->second.retransmittable_frames;
534     // Only retransmit frames which are in flight, and therefore have been sent.
535     if (!it->second.in_flight || frames == NULL) {
536       continue;
537     }
538     DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake());
539     MarkForRetransmission(sequence_number, TLP_RETRANSMISSION);
540     return true;
541   }
542   DLOG(FATAL)
543     << "No retransmittable packets, so RetransmitOldestPacket failed.";
544   return false;
545 }
546 
RetransmitAllPackets()547 void QuicSentPacketManager::RetransmitAllPackets() {
548   DVLOG(1) << "RetransmitAllPackets() called with "
549            << unacked_packets_.GetNumUnackedPackets() << " unacked packets.";
550   // Request retransmission of all retransmittable packets when the RTO
551   // fires, and let the congestion manager decide how many to send
552   // immediately and the remaining packets will be queued.
553   // Abandon any non-retransmittable packets that are sufficiently old.
554   bool packets_retransmitted = false;
555   QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin();
556   while (it != unacked_packets_.end()) {
557     const RetransmittableFrames* frames = it->second.retransmittable_frames;
558     QuicPacketSequenceNumber sequence_number = it->first;
559     ++it;
560     if (frames != NULL) {
561       packets_retransmitted = true;
562       MarkForRetransmission(sequence_number, RTO_RETRANSMISSION);
563     } else {
564       unacked_packets_.RemoveFromInFlight(sequence_number);
565     }
566   }
567 
568   send_algorithm_->OnRetransmissionTimeout(packets_retransmitted);
569   if (packets_retransmitted) {
570     ++consecutive_rto_count_;
571   }
572 }
573 
574 QuicSentPacketManager::RetransmissionTimeoutMode
GetRetransmissionMode() const575     QuicSentPacketManager::GetRetransmissionMode() const {
576   DCHECK(unacked_packets_.HasInFlightPackets());
577   if (unacked_packets_.HasPendingCryptoPackets()) {
578     return HANDSHAKE_MODE;
579   }
580   if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) {
581     return LOSS_MODE;
582   }
583   if (consecutive_tlp_count_ < max_tail_loss_probes_) {
584     if (unacked_packets_.HasUnackedRetransmittableFrames()) {
585       return TLP_MODE;
586     }
587   }
588   return RTO_MODE;
589 }
590 
OnIncomingQuicCongestionFeedbackFrame(const QuicCongestionFeedbackFrame & frame,const QuicTime & feedback_receive_time)591 void QuicSentPacketManager::OnIncomingQuicCongestionFeedbackFrame(
592     const QuicCongestionFeedbackFrame& frame,
593     const QuicTime& feedback_receive_time) {
594   send_algorithm_->OnIncomingQuicCongestionFeedbackFrame(
595       frame, feedback_receive_time);
596 }
597 
InvokeLossDetection(QuicTime time)598 void QuicSentPacketManager::InvokeLossDetection(QuicTime time) {
599   SequenceNumberSet lost_packets =
600       loss_algorithm_->DetectLostPackets(unacked_packets_,
601                                          time,
602                                          largest_observed_,
603                                          rtt_stats_);
604   for (SequenceNumberSet::const_iterator it = lost_packets.begin();
605        it != lost_packets.end(); ++it) {
606     QuicPacketSequenceNumber sequence_number = *it;
607     const TransmissionInfo& transmission_info =
608         unacked_packets_.GetTransmissionInfo(sequence_number);
609     // TODO(ianswett): If it's expected the FEC packet may repair the loss, it
610     // should be recorded as a loss to the send algorithm, but not retransmitted
611     // until it's known whether the FEC packet arrived.
612     ++stats_->packets_lost;
613     packets_lost_[sequence_number] = transmission_info;
614     DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number;
615 
616     if (transmission_info.retransmittable_frames != NULL) {
617       MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION);
618     } else {
619       // Since we will not retransmit this, we need to remove it from
620       // unacked_packets_.   This is either the current transmission of
621       // a packet whose previous transmission has been acked, a packet that has
622       // been TLP retransmitted, or an FEC packet.
623       unacked_packets_.RemoveFromInFlight(sequence_number);
624     }
625   }
626 }
627 
MaybeUpdateRTT(const ReceivedPacketInfo & received_info,const QuicTime & ack_receive_time)628 bool QuicSentPacketManager::MaybeUpdateRTT(
629     const ReceivedPacketInfo& received_info,
630     const QuicTime& ack_receive_time) {
631   if (!unacked_packets_.IsUnacked(received_info.largest_observed)) {
632     return false;
633   }
634   // We calculate the RTT based on the highest ACKed sequence number, the lower
635   // sequence numbers will include the ACK aggregation delay.
636   const TransmissionInfo& transmission_info =
637       unacked_packets_.GetTransmissionInfo(received_info.largest_observed);
638   // Don't update the RTT if it hasn't been sent.
639   if (transmission_info.sent_time == QuicTime::Zero()) {
640     return false;
641   }
642 
643   QuicTime::Delta send_delta =
644       ack_receive_time.Subtract(transmission_info.sent_time);
645   rtt_stats_.UpdateRtt(
646       send_delta, received_info.delta_time_largest_observed, ack_receive_time);
647   return true;
648 }
649 
TimeUntilSend(QuicTime now,HasRetransmittableData retransmittable)650 QuicTime::Delta QuicSentPacketManager::TimeUntilSend(
651     QuicTime now,
652     HasRetransmittableData retransmittable) {
653   // The TLP logic is entirely contained within QuicSentPacketManager, so the
654   // send algorithm does not need to be consulted.
655   if (pending_tlp_transmission_) {
656     return QuicTime::Delta::Zero();
657   }
658   return send_algorithm_->TimeUntilSend(
659       now, unacked_packets_.bytes_in_flight(), retransmittable);
660 }
661 
662 // Ensures that the Delayed Ack timer is always set to a value lesser
663 // than the retransmission timer's minimum value (MinRTO). We want the
664 // delayed ack to get back to the QUIC peer before the sender's
665 // retransmission timer triggers.  Since we do not know the
666 // reverse-path one-way delay, we assume equal delays for forward and
667 // reverse paths, and ensure that the timer is set to less than half
668 // of the MinRTO.
669 // There may be a value in making this delay adaptive with the help of
670 // the sender and a signaling mechanism -- if the sender uses a
671 // different MinRTO, we may get spurious retransmissions. May not have
672 // any benefits, but if the delayed ack becomes a significant source
673 // of (likely, tail) latency, then consider such a mechanism.
DelayedAckTime() const674 const QuicTime::Delta QuicSentPacketManager::DelayedAckTime() const {
675   return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2);
676 }
677 
GetRetransmissionTime() const678 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const {
679   // Don't set the timer if there are no packets in flight or we've already
680   // queued a tlp transmission and it hasn't been sent yet.
681   if (!unacked_packets_.HasInFlightPackets() || pending_tlp_transmission_) {
682     return QuicTime::Zero();
683   }
684   switch (GetRetransmissionMode()) {
685     case HANDSHAKE_MODE:
686       return clock_->ApproximateNow().Add(GetCryptoRetransmissionDelay());
687     case LOSS_MODE:
688       return loss_algorithm_->GetLossTimeout();
689     case TLP_MODE: {
690       // TODO(ianswett): When CWND is available, it would be preferable to
691       // set the timer based on the earliest retransmittable packet.
692       // Base the updated timer on the send time of the last packet.
693       const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime();
694       const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay());
695       // Ensure the TLP timer never gets set to a time in the past.
696       return QuicTime::Max(clock_->ApproximateNow(), tlp_time);
697     }
698     case RTO_MODE: {
699       // The RTO is based on the first outstanding packet.
700       const QuicTime sent_time =
701           unacked_packets_.GetFirstInFlightPacketSentTime();
702       QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay());
703       // Always wait at least 1.5 * RTT from now.
704       QuicTime min_timeout = clock_->ApproximateNow().Add(
705           rtt_stats_.SmoothedRtt().Multiply(1.5));
706 
707       return QuicTime::Max(min_timeout, rto_timeout);
708     }
709   }
710   DCHECK(false);
711   return QuicTime::Zero();
712 }
713 
GetCryptoRetransmissionDelay() const714 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay()
715     const {
716   // This is equivalent to the TailLossProbeDelay, but slightly more aggressive
717   // because crypto handshake messages don't incur a delayed ack time.
718   int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs,
719                               1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds());
720   return QuicTime::Delta::FromMilliseconds(
721       delay_ms << consecutive_crypto_retransmission_count_);
722 }
723 
GetTailLossProbeDelay() const724 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const {
725   QuicTime::Delta srtt = rtt_stats_.SmoothedRtt();
726   if (!unacked_packets_.HasMultipleInFlightPackets()) {
727     return QuicTime::Delta::Max(
728         srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2));
729   }
730   return QuicTime::Delta::FromMilliseconds(
731       max(kMinTailLossProbeTimeoutMs,
732           static_cast<int64>(2 * srtt.ToMilliseconds())));
733 }
734 
GetRetransmissionDelay() const735 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const {
736   QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay();
737   // TODO(rch): This code should move to |send_algorithm_|.
738   if (retransmission_delay.IsZero()) {
739     // We are in the initial state, use default timeout values.
740     retransmission_delay =
741         QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs);
742   } else if (retransmission_delay.ToMilliseconds() < kMinRetransmissionTimeMs) {
743     retransmission_delay =
744         QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs);
745   }
746 
747   // Calculate exponential back off.
748   retransmission_delay = retransmission_delay.Multiply(
749       1 << min<size_t>(consecutive_rto_count_, kMaxRetransmissions));
750 
751   if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) {
752     return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs);
753   }
754   return retransmission_delay;
755 }
756 
GetRttStats() const757 const RttStats* QuicSentPacketManager::GetRttStats() const {
758   return &rtt_stats_;
759 }
760 
BandwidthEstimate() const761 QuicBandwidth QuicSentPacketManager::BandwidthEstimate() const {
762   return send_algorithm_->BandwidthEstimate();
763 }
764 
GetCongestionWindow() const765 QuicByteCount QuicSentPacketManager::GetCongestionWindow() const {
766   return send_algorithm_->GetCongestionWindow();
767 }
768 
MaybeEnablePacing()769 void QuicSentPacketManager::MaybeEnablePacing() {
770   if (!FLAGS_enable_quic_pacing) {
771     return;
772   }
773 
774   if (using_pacing_) {
775     return;
776   }
777 
778   // Set up a pacing sender with a 5 millisecond alarm granularity.
779   using_pacing_ = true;
780   send_algorithm_.reset(
781       new PacingSender(send_algorithm_.release(),
782                        QuicTime::Delta::FromMilliseconds(5)));
783 }
784 
785 }  // namespace net
786