OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 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 | 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/quic_sent_packet_manager.h" | 5 #include "net/quic/quic_sent_packet_manager.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
189 min_nacks = 1; | 189 min_nacks = 1; |
190 } | 190 } |
191 unacked_packets_.NackPacket(sequence_number, min_nacks); | 191 unacked_packets_.NackPacket(sequence_number, min_nacks); |
192 ++it; | 192 ++it; |
193 continue; | 193 continue; |
194 } | 194 } |
195 // Packet was acked, so remove it from our unacked packet list. | 195 // Packet was acked, so remove it from our unacked packet list. |
196 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; | 196 DVLOG(1) << ENDPOINT << "Got an ack for packet " << sequence_number; |
197 // If data is associated with the most recent transmission of this | 197 // If data is associated with the most recent transmission of this |
198 // packet, then inform the caller. | 198 // packet, then inform the caller. |
199 if (it->second.pending) { | 199 if (it->second.in_flight) { |
200 packets_acked_[sequence_number] = it->second; | 200 packets_acked_[sequence_number] = it->second; |
201 } | 201 } |
202 it = MarkPacketHandled(it, delta_largest_observed); | 202 it = MarkPacketHandled(it, delta_largest_observed); |
203 } | 203 } |
204 | 204 |
205 // Discard any retransmittable frames associated with revived packets. | 205 // Discard any retransmittable frames associated with revived packets. |
206 for (SequenceNumberSet::const_iterator revived_it = | 206 for (SequenceNumberSet::const_iterator revived_it = |
207 received_info.revived_packets.begin(); | 207 received_info.revived_packets.begin(); |
208 revived_it != received_info.revived_packets.end(); ++revived_it) { | 208 revived_it != received_info.revived_packets.end(); ++revived_it) { |
209 MarkPacketRevived(*revived_it, delta_largest_observed); | 209 MarkPacketRevived(*revived_it, delta_largest_observed); |
210 } | 210 } |
211 } | 211 } |
212 | 212 |
213 bool QuicSentPacketManager::HasRetransmittableFrames( | 213 bool QuicSentPacketManager::HasRetransmittableFrames( |
214 QuicPacketSequenceNumber sequence_number) const { | 214 QuicPacketSequenceNumber sequence_number) const { |
215 return unacked_packets_.HasRetransmittableFrames(sequence_number); | 215 return unacked_packets_.HasRetransmittableFrames(sequence_number); |
216 } | 216 } |
217 | 217 |
218 void QuicSentPacketManager::RetransmitUnackedPackets( | 218 void QuicSentPacketManager::RetransmitUnackedPackets( |
219 RetransmissionType retransmission_type) { | 219 RetransmissionType retransmission_type) { |
220 QuicUnackedPacketMap::const_iterator unacked_it = unacked_packets_.begin(); | 220 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
221 while (unacked_it != unacked_packets_.end()) { | 221 while (it != unacked_packets_.end()) { |
222 const RetransmittableFrames* frames = | 222 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
223 unacked_it->second.retransmittable_frames; | |
224 // TODO(ianswett): Consider adding a new retransmission type which removes | 223 // TODO(ianswett): Consider adding a new retransmission type which removes |
225 // all these old packets from unacked and retransmits them as new sequence | 224 // all these old packets from unacked and retransmits them as new sequence |
226 // numbers with no connection to the previous ones. | 225 // numbers with no connection to the previous ones. |
227 if (frames != NULL && (retransmission_type == ALL_PACKETS || | 226 if (frames != NULL && (retransmission_type == ALL_PACKETS || |
228 frames->encryption_level() == ENCRYPTION_INITIAL)) { | 227 frames->encryption_level() == ENCRYPTION_INITIAL)) { |
229 MarkForRetransmission(unacked_it->first, ALL_UNACKED_RETRANSMISSION); | 228 MarkForRetransmission(it->first, ALL_UNACKED_RETRANSMISSION); |
230 } | 229 } |
231 ++unacked_it; | 230 ++it; |
232 } | 231 } |
233 } | 232 } |
234 | 233 |
235 void QuicSentPacketManager::NeuterUnencryptedPackets() { | 234 void QuicSentPacketManager::NeuterUnencryptedPackets() { |
236 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 235 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
237 while (it != unacked_packets_.end()) { | 236 while (it != unacked_packets_.end()) { |
238 const RetransmittableFrames* frames = | 237 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
239 it->second.retransmittable_frames; | |
240 QuicPacketSequenceNumber sequence_number = it->first; | 238 QuicPacketSequenceNumber sequence_number = it->first; |
241 ++it; | 239 ++it; |
242 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { | 240 if (frames != NULL && frames->encryption_level() == ENCRYPTION_NONE) { |
243 // Once you're forward secure, no unencrypted packets will be sent, crypto | 241 // Once you're forward secure, no unencrypted packets will be sent, crypto |
244 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure | 242 // or otherwise. Unencrypted packets are neutered and abandoned, to ensure |
245 // they are not retransmitted or considered lost from a congestion control | 243 // they are not retransmitted or considered lost from a congestion control |
246 // perspective. | 244 // perspective. |
247 pending_retransmissions_.erase(sequence_number); | 245 pending_retransmissions_.erase(sequence_number); |
248 unacked_packets_.SetNotPending(sequence_number); | 246 unacked_packets_.RemoveFromInFlight(sequence_number); |
249 // RemoveRetransmittibility is safe because only the newest sequence | 247 // RemoveRetransmittibility is safe because only the newest sequence |
250 // number can have frames. | 248 // number can have frames. |
251 unacked_packets_.RemoveRetransmittability(sequence_number); | 249 unacked_packets_.RemoveRetransmittability(sequence_number); |
252 } | 250 } |
253 } | 251 } |
254 } | 252 } |
255 | 253 |
256 void QuicSentPacketManager::MarkForRetransmission( | 254 void QuicSentPacketManager::MarkForRetransmission( |
257 QuicPacketSequenceNumber sequence_number, | 255 QuicPacketSequenceNumber sequence_number, |
258 TransmissionType transmission_type) { | 256 TransmissionType transmission_type) { |
259 const TransmissionInfo& transmission_info = | 257 const TransmissionInfo& transmission_info = |
260 unacked_packets_.GetTransmissionInfo(sequence_number); | 258 unacked_packets_.GetTransmissionInfo(sequence_number); |
261 LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL); | 259 LOG_IF(DFATAL, transmission_info.retransmittable_frames == NULL); |
262 if (transmission_type != TLP_RETRANSMISSION) { | 260 if (transmission_type != TLP_RETRANSMISSION) { |
263 unacked_packets_.SetNotPending(sequence_number); | 261 unacked_packets_.RemoveFromInFlight(sequence_number); |
264 } | 262 } |
265 // TODO(ianswett): Currently the RTO can fire while there are pending NACK | 263 // TODO(ianswett): Currently the RTO can fire while there are pending NACK |
266 // retransmissions for the same data, which is not ideal. | 264 // retransmissions for the same data, which is not ideal. |
267 if (ContainsKey(pending_retransmissions_, sequence_number)) { | 265 if (ContainsKey(pending_retransmissions_, sequence_number)) { |
268 return; | 266 return; |
269 } | 267 } |
270 | 268 |
271 pending_retransmissions_[sequence_number] = transmission_type; | 269 pending_retransmissions_[sequence_number] = transmission_type; |
272 } | 270 } |
273 | 271 |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 // transmission, since that's the one only one it tracks. | 354 // transmission, since that's the one only one it tracks. |
357 ack_notifier_manager_.OnPacketAcked(newest_transmission, | 355 ack_notifier_manager_.OnPacketAcked(newest_transmission, |
358 delta_largest_observed); | 356 delta_largest_observed); |
359 | 357 |
360 // If it's a crypto handshake packet, discard it and all retransmissions, | 358 // If it's a crypto handshake packet, discard it and all retransmissions, |
361 // since they won't be acked now that one has been processed. | 359 // since they won't be acked now that one has been processed. |
362 // TODO(ianswett): Instead of handling all crypto packets in a special way, | 360 // TODO(ianswett): Instead of handling all crypto packets in a special way, |
363 // only handle NULL encrypted packets in a special way. | 361 // only handle NULL encrypted packets in a special way. |
364 if (HasCryptoHandshake( | 362 if (HasCryptoHandshake( |
365 unacked_packets_.GetTransmissionInfo(newest_transmission))) { | 363 unacked_packets_.GetTransmissionInfo(newest_transmission))) { |
366 unacked_packets_.SetNotPending(newest_transmission); | 364 unacked_packets_.RemoveFromInFlight(newest_transmission); |
367 } | 365 } |
368 unacked_packets_.SetNotPending(sequence_number); | 366 unacked_packets_.RemoveFromInFlight(sequence_number); |
369 unacked_packets_.RemoveRetransmittability(sequence_number); | 367 unacked_packets_.RemoveRetransmittability(sequence_number); |
370 | 368 |
371 QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin(); | 369 QuicUnackedPacketMap::const_iterator next_unacked = unacked_packets_.begin(); |
372 while (next_unacked != unacked_packets_.end() && | 370 while (next_unacked != unacked_packets_.end() && |
373 next_unacked->first <= sequence_number) { | 371 next_unacked->first <= sequence_number) { |
374 ++next_unacked; | 372 ++next_unacked; |
375 } | 373 } |
376 return next_unacked; | 374 return next_unacked; |
377 } | 375 } |
378 | 376 |
(...skipping 26 matching lines...) Expand all Loading... |
405 } | 403 } |
406 | 404 |
407 if (unacked_packets_.bytes_in_flight() == 0) { | 405 if (unacked_packets_.bytes_in_flight() == 0) { |
408 // TODO(ianswett): Consider being less aggressive to force a new | 406 // TODO(ianswett): Consider being less aggressive to force a new |
409 // recent_min_rtt, likely by not discarding a relatively new sample. | 407 // recent_min_rtt, likely by not discarding a relatively new sample. |
410 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:" | 408 DVLOG(1) << "Sampling a new recent min rtt within 2 samples. currently:" |
411 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms"; | 409 << rtt_stats_.recent_min_rtt().ToMilliseconds() << "ms"; |
412 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence); | 410 rtt_stats_.SampleNewRecentMinRtt(kNumMinRttSamplesAfterQuiescence); |
413 } | 411 } |
414 | 412 |
415 // Only track packets as pending that the send algorithm wants us to track. | 413 // Only track packets as in flight that the send algorithm wants us to track. |
416 const bool pending = | 414 const bool in_flight = |
417 send_algorithm_->OnPacketSent(sent_time, | 415 send_algorithm_->OnPacketSent(sent_time, |
418 unacked_packets_.bytes_in_flight(), | 416 unacked_packets_.bytes_in_flight(), |
419 sequence_number, | 417 sequence_number, |
420 bytes, | 418 bytes, |
421 has_retransmittable_data); | 419 has_retransmittable_data); |
422 unacked_packets_.SetSent(sequence_number, sent_time, bytes, pending); | 420 unacked_packets_.SetSent(sequence_number, sent_time, bytes, in_flight); |
423 | 421 |
424 // Reset the retransmission timer anytime a pending packet is sent. | 422 // Reset the retransmission timer anytime a pending packet is sent. |
425 return pending; | 423 return in_flight; |
426 } | 424 } |
427 | 425 |
428 void QuicSentPacketManager::OnRetransmissionTimeout() { | 426 void QuicSentPacketManager::OnRetransmissionTimeout() { |
429 DCHECK(unacked_packets_.HasPendingPackets()); | 427 DCHECK(unacked_packets_.HasInFlightPackets()); |
430 // Handshake retransmission, timer based loss detection, TLP, and RTO are | 428 // Handshake retransmission, timer based loss detection, TLP, and RTO are |
431 // implemented with a single alarm. The handshake alarm is set when the | 429 // implemented with a single alarm. The handshake alarm is set when the |
432 // handshake has not completed, the loss alarm is set when the loss detection | 430 // handshake has not completed, the loss alarm is set when the loss detection |
433 // algorithm says to, and the TLP and RTO alarms are set after that. | 431 // algorithm says to, and the TLP and RTO alarms are set after that. |
434 // The TLP alarm is always set to run for under an RTO. | 432 // The TLP alarm is always set to run for under an RTO. |
435 switch (GetRetransmissionMode()) { | 433 switch (GetRetransmissionMode()) { |
436 case HANDSHAKE_MODE: | 434 case HANDSHAKE_MODE: |
437 ++stats_->crypto_retransmit_count; | 435 ++stats_->crypto_retransmit_count; |
438 RetransmitCryptoPackets(); | 436 RetransmitCryptoPackets(); |
439 return; | 437 return; |
(...skipping 21 matching lines...) Expand all Loading... |
461 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); | 459 DCHECK_EQ(HANDSHAKE_MODE, GetRetransmissionMode()); |
462 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. | 460 // TODO(ianswett): Typical TCP implementations only retransmit 5 times. |
463 consecutive_crypto_retransmission_count_ = | 461 consecutive_crypto_retransmission_count_ = |
464 min(kMaxHandshakeRetransmissionBackoffs, | 462 min(kMaxHandshakeRetransmissionBackoffs, |
465 consecutive_crypto_retransmission_count_ + 1); | 463 consecutive_crypto_retransmission_count_ + 1); |
466 bool packet_retransmitted = false; | 464 bool packet_retransmitted = false; |
467 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 465 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
468 it != unacked_packets_.end(); ++it) { | 466 it != unacked_packets_.end(); ++it) { |
469 QuicPacketSequenceNumber sequence_number = it->first; | 467 QuicPacketSequenceNumber sequence_number = it->first; |
470 const RetransmittableFrames* frames = it->second.retransmittable_frames; | 468 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
471 // Only retransmit frames which are pending, and therefore have been sent. | 469 // Only retransmit frames which are in flight, and therefore have been sent. |
472 if (!it->second.pending || frames == NULL || | 470 if (!it->second.in_flight || frames == NULL || |
473 frames->HasCryptoHandshake() != IS_HANDSHAKE) { | 471 frames->HasCryptoHandshake() != IS_HANDSHAKE) { |
474 continue; | 472 continue; |
475 } | 473 } |
476 packet_retransmitted = true; | 474 packet_retransmitted = true; |
477 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); | 475 MarkForRetransmission(sequence_number, HANDSHAKE_RETRANSMISSION); |
478 } | 476 } |
479 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; | 477 DCHECK(packet_retransmitted) << "No crypto packets found to retransmit."; |
480 } | 478 } |
481 | 479 |
482 void QuicSentPacketManager::RetransmitOldestPacket() { | 480 void QuicSentPacketManager::RetransmitOldestPacket() { |
483 DCHECK_EQ(TLP_MODE, GetRetransmissionMode()); | 481 DCHECK_EQ(TLP_MODE, GetRetransmissionMode()); |
484 ++consecutive_tlp_count_; | 482 ++consecutive_tlp_count_; |
485 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 483 for (QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
486 it != unacked_packets_.end(); ++it) { | 484 it != unacked_packets_.end(); ++it) { |
487 QuicPacketSequenceNumber sequence_number = it->first; | 485 QuicPacketSequenceNumber sequence_number = it->first; |
488 const RetransmittableFrames* frames = it->second.retransmittable_frames; | 486 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
489 // Only retransmit frames which are pending, and therefore have been sent. | 487 // Only retransmit frames which are in flight, and therefore have been sent. |
490 if (!it->second.pending || frames == NULL) { | 488 if (!it->second.in_flight || frames == NULL) { |
491 continue; | 489 continue; |
492 } | 490 } |
493 DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake()); | 491 DCHECK_NE(IS_HANDSHAKE, frames->HasCryptoHandshake()); |
494 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); | 492 MarkForRetransmission(sequence_number, TLP_RETRANSMISSION); |
495 return; | 493 return; |
496 } | 494 } |
497 DLOG(FATAL) | 495 DLOG(FATAL) |
498 << "No retransmittable packets, so RetransmitOldestPacket failed."; | 496 << "No retransmittable packets, so RetransmitOldestPacket failed."; |
499 } | 497 } |
500 | 498 |
501 void QuicSentPacketManager::RetransmitAllPackets() { | 499 void QuicSentPacketManager::RetransmitAllPackets() { |
502 // Abandon all retransmittable packets and packets older than the | 500 // Abandon all retransmittable packets and packets older than the |
503 // retransmission delay. | 501 // retransmission delay. |
504 | 502 |
505 DVLOG(1) << "OnRetransmissionTimeout() fired with " | 503 DVLOG(1) << "OnRetransmissionTimeout() fired with " |
506 << unacked_packets_.GetNumUnackedPackets() << " unacked packets."; | 504 << unacked_packets_.GetNumUnackedPackets() << " unacked packets."; |
507 | 505 |
508 // Request retransmission of all retransmittable packets when the RTO | 506 // Request retransmission of all retransmittable packets when the RTO |
509 // fires, and let the congestion manager decide how many to send | 507 // fires, and let the congestion manager decide how many to send |
510 // immediately and the remaining packets will be queued. | 508 // immediately and the remaining packets will be queued. |
511 // Abandon any non-retransmittable packets that are sufficiently old. | 509 // Abandon any non-retransmittable packets that are sufficiently old. |
512 bool packets_retransmitted = false; | 510 bool packets_retransmitted = false; |
513 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); | 511 QuicUnackedPacketMap::const_iterator it = unacked_packets_.begin(); |
514 while (it != unacked_packets_.end()) { | 512 while (it != unacked_packets_.end()) { |
515 const RetransmittableFrames* frames = | 513 const RetransmittableFrames* frames = it->second.retransmittable_frames; |
516 it->second.retransmittable_frames; | |
517 QuicPacketSequenceNumber sequence_number = it->first; | 514 QuicPacketSequenceNumber sequence_number = it->first; |
518 ++it; | 515 ++it; |
519 if (frames != NULL) { | 516 if (frames != NULL) { |
520 packets_retransmitted = true; | 517 packets_retransmitted = true; |
521 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); | 518 MarkForRetransmission(sequence_number, RTO_RETRANSMISSION); |
522 } else { | 519 } else { |
523 unacked_packets_.SetNotPending(sequence_number); | 520 unacked_packets_.RemoveFromInFlight(sequence_number); |
524 } | 521 } |
525 } | 522 } |
526 | 523 |
527 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); | 524 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); |
528 if (packets_retransmitted) { | 525 if (packets_retransmitted) { |
529 ++consecutive_rto_count_; | 526 ++consecutive_rto_count_; |
530 } | 527 } |
531 } | 528 } |
532 | 529 |
533 QuicSentPacketManager::RetransmissionTimeoutMode | 530 QuicSentPacketManager::RetransmissionTimeoutMode |
534 QuicSentPacketManager::GetRetransmissionMode() const { | 531 QuicSentPacketManager::GetRetransmissionMode() const { |
535 DCHECK(unacked_packets_.HasPendingPackets()); | 532 DCHECK(unacked_packets_.HasInFlightPackets()); |
536 if (unacked_packets_.HasPendingCryptoPackets()) { | 533 if (unacked_packets_.HasPendingCryptoPackets()) { |
537 return HANDSHAKE_MODE; | 534 return HANDSHAKE_MODE; |
538 } | 535 } |
539 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { | 536 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { |
540 return LOSS_MODE; | 537 return LOSS_MODE; |
541 } | 538 } |
542 if (consecutive_tlp_count_ < max_tail_loss_probes_) { | 539 if (consecutive_tlp_count_ < max_tail_loss_probes_) { |
543 if (unacked_packets_.HasUnackedRetransmittableFrames()) { | 540 if (unacked_packets_.HasUnackedRetransmittableFrames()) { |
544 return TLP_MODE; | 541 return TLP_MODE; |
545 } | 542 } |
(...skipping 26 matching lines...) Expand all Loading... |
572 packets_lost_[sequence_number] = transmission_info; | 569 packets_lost_[sequence_number] = transmission_info; |
573 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; | 570 DVLOG(1) << ENDPOINT << "Lost packet " << sequence_number; |
574 | 571 |
575 if (transmission_info.retransmittable_frames != NULL) { | 572 if (transmission_info.retransmittable_frames != NULL) { |
576 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); | 573 MarkForRetransmission(sequence_number, LOSS_RETRANSMISSION); |
577 } else { | 574 } else { |
578 // Since we will not retransmit this, we need to remove it from | 575 // Since we will not retransmit this, we need to remove it from |
579 // unacked_packets_. This is either the current transmission of | 576 // unacked_packets_. This is either the current transmission of |
580 // a packet whose previous transmission has been acked, a packet that has | 577 // a packet whose previous transmission has been acked, a packet that has |
581 // been TLP retransmitted, or an FEC packet. | 578 // been TLP retransmitted, or an FEC packet. |
582 unacked_packets_.SetNotPending(sequence_number); | 579 unacked_packets_.RemoveFromInFlight(sequence_number); |
583 } | 580 } |
584 } | 581 } |
585 } | 582 } |
586 | 583 |
587 bool QuicSentPacketManager::MaybeUpdateRTT( | 584 bool QuicSentPacketManager::MaybeUpdateRTT( |
588 const ReceivedPacketInfo& received_info, | 585 const ReceivedPacketInfo& received_info, |
589 const QuicTime& ack_receive_time) { | 586 const QuicTime& ack_receive_time) { |
590 if (!unacked_packets_.IsUnacked(received_info.largest_observed)) { | 587 if (!unacked_packets_.IsUnacked(received_info.largest_observed)) { |
591 return false; | 588 return false; |
592 } | 589 } |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
629 // There may be a value in making this delay adaptive with the help of | 626 // There may be a value in making this delay adaptive with the help of |
630 // the sender and a signaling mechanism -- if the sender uses a | 627 // the sender and a signaling mechanism -- if the sender uses a |
631 // different MinRTO, we may get spurious retransmissions. May not have | 628 // different MinRTO, we may get spurious retransmissions. May not have |
632 // any benefits, but if the delayed ack becomes a significant source | 629 // any benefits, but if the delayed ack becomes a significant source |
633 // of (likely, tail) latency, then consider such a mechanism. | 630 // of (likely, tail) latency, then consider such a mechanism. |
634 const QuicTime::Delta QuicSentPacketManager::DelayedAckTime() const { | 631 const QuicTime::Delta QuicSentPacketManager::DelayedAckTime() const { |
635 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2); | 632 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs/2); |
636 } | 633 } |
637 | 634 |
638 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { | 635 const QuicTime QuicSentPacketManager::GetRetransmissionTime() const { |
639 // Don't set the timer if there are no pending packets. | 636 // Don't set the timer if there are no packets in flight. |
640 if (!unacked_packets_.HasPendingPackets()) { | 637 if (!unacked_packets_.HasInFlightPackets()) { |
641 return QuicTime::Zero(); | 638 return QuicTime::Zero(); |
642 } | 639 } |
643 switch (GetRetransmissionMode()) { | 640 switch (GetRetransmissionMode()) { |
644 case HANDSHAKE_MODE: | 641 case HANDSHAKE_MODE: |
645 return clock_->ApproximateNow().Add(GetCryptoRetransmissionDelay()); | 642 return clock_->ApproximateNow().Add(GetCryptoRetransmissionDelay()); |
646 case LOSS_MODE: | 643 case LOSS_MODE: |
647 return loss_algorithm_->GetLossTimeout(); | 644 return loss_algorithm_->GetLossTimeout(); |
648 case TLP_MODE: { | 645 case TLP_MODE: { |
649 // TODO(ianswett): When CWND is available, it would be preferable to | 646 // TODO(ianswett): When CWND is available, it would be preferable to |
650 // set the timer based on the earliest retransmittable packet. | 647 // set the timer based on the earliest retransmittable packet. |
651 // Base the updated timer on the send time of the last packet. | 648 // Base the updated timer on the send time of the last packet. |
652 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); | 649 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); |
653 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); | 650 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); |
654 // Ensure the TLP timer never gets set to a time in the past. | 651 // Ensure the TLP timer never gets set to a time in the past. |
655 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); | 652 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); |
656 } | 653 } |
657 case RTO_MODE: { | 654 case RTO_MODE: { |
658 // The RTO is based on the first pending packet. | 655 // The RTO is based on the first outstanding packet. |
659 const QuicTime sent_time = | 656 const QuicTime sent_time = |
660 unacked_packets_.GetFirstPendingPacketSentTime(); | 657 unacked_packets_.GetFirstInFlightPacketSentTime(); |
661 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); | 658 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
662 // Always wait at least 1.5 * RTT from now. | 659 // Always wait at least 1.5 * RTT from now. |
663 QuicTime min_timeout = clock_->ApproximateNow().Add( | 660 QuicTime min_timeout = clock_->ApproximateNow().Add( |
664 rtt_stats_.SmoothedRtt().Multiply(1.5)); | 661 rtt_stats_.SmoothedRtt().Multiply(1.5)); |
665 | 662 |
666 return QuicTime::Max(min_timeout, rto_timeout); | 663 return QuicTime::Max(min_timeout, rto_timeout); |
667 } | 664 } |
668 } | 665 } |
669 DCHECK(false); | 666 DCHECK(false); |
670 return QuicTime::Zero(); | 667 return QuicTime::Zero(); |
671 } | 668 } |
672 | 669 |
673 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() | 670 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() |
674 const { | 671 const { |
675 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive | 672 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive |
676 // because crypto handshake messages don't incur a delayed ack time. | 673 // because crypto handshake messages don't incur a delayed ack time. |
677 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, | 674 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, |
678 1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds()); | 675 1.5 * rtt_stats_.SmoothedRtt().ToMilliseconds()); |
679 return QuicTime::Delta::FromMilliseconds( | 676 return QuicTime::Delta::FromMilliseconds( |
680 delay_ms << consecutive_crypto_retransmission_count_); | 677 delay_ms << consecutive_crypto_retransmission_count_); |
681 } | 678 } |
682 | 679 |
683 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { | 680 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { |
684 QuicTime::Delta srtt = rtt_stats_.SmoothedRtt(); | 681 QuicTime::Delta srtt = rtt_stats_.SmoothedRtt(); |
685 if (!unacked_packets_.HasMultiplePendingPackets()) { | 682 if (!unacked_packets_.HasMultipleInFlightPackets()) { |
686 return QuicTime::Delta::Max( | 683 return QuicTime::Delta::Max( |
687 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); | 684 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); |
688 } | 685 } |
689 return QuicTime::Delta::FromMilliseconds( | 686 return QuicTime::Delta::FromMilliseconds( |
690 max(kMinTailLossProbeTimeoutMs, | 687 max(kMinTailLossProbeTimeoutMs, |
691 static_cast<int64>(2 * srtt.ToMilliseconds()))); | 688 static_cast<int64>(2 * srtt.ToMilliseconds()))); |
692 } | 689 } |
693 | 690 |
694 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { | 691 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { |
695 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); | 692 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
734 return; | 731 return; |
735 } | 732 } |
736 | 733 |
737 using_pacing_ = true; | 734 using_pacing_ = true; |
738 send_algorithm_.reset( | 735 send_algorithm_.reset( |
739 new PacingSender(send_algorithm_.release(), | 736 new PacingSender(send_algorithm_.release(), |
740 QuicTime::Delta::FromMicroseconds(1))); | 737 QuicTime::Delta::FromMicroseconds(1))); |
741 } | 738 } |
742 | 739 |
743 } // namespace net | 740 } // namespace net |
OLD | NEW |