| 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 "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/stl_util.h" | 8 #include "base/stl_util.h" |
| 9 #include "net/quic/congestion_control/pacing_sender.h" | 9 #include "net/quic/congestion_control/pacing_sender.h" |
| 10 #include "net/quic/crypto/crypto_protocol.h" | 10 #include "net/quic/crypto/crypto_protocol.h" |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 60 } | 60 } |
| 61 | 61 |
| 62 } // namespace | 62 } // namespace |
| 63 | 63 |
| 64 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") | 64 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") |
| 65 | 65 |
| 66 QuicSentPacketManager::QuicSentPacketManager(bool is_server, | 66 QuicSentPacketManager::QuicSentPacketManager(bool is_server, |
| 67 const QuicClock* clock, | 67 const QuicClock* clock, |
| 68 QuicConnectionStats* stats, | 68 QuicConnectionStats* stats, |
| 69 CongestionFeedbackType type) | 69 CongestionFeedbackType type) |
| 70 : unacked_packets_(is_server), | 70 : unacked_packets_(), |
| 71 is_server_(is_server), | 71 is_server_(is_server), |
| 72 clock_(clock), | 72 clock_(clock), |
| 73 stats_(stats), | 73 stats_(stats), |
| 74 send_algorithm_(SendAlgorithmInterface::Create(clock, type, stats)), | 74 send_algorithm_( |
| 75 SendAlgorithmInterface::Create(clock, &rtt_stats_, type, stats)), |
| 75 loss_algorithm_(LossDetectionInterface::Create()), | 76 loss_algorithm_(LossDetectionInterface::Create()), |
| 76 rtt_sample_(QuicTime::Delta::Infinite()), | |
| 77 largest_observed_(0), | 77 largest_observed_(0), |
| 78 pending_crypto_packet_count_(0), | |
| 79 consecutive_rto_count_(0), | 78 consecutive_rto_count_(0), |
| 80 consecutive_tlp_count_(0), | 79 consecutive_tlp_count_(0), |
| 81 consecutive_crypto_retransmission_count_(0), | 80 consecutive_crypto_retransmission_count_(0), |
| 82 max_tail_loss_probes_(kDefaultMaxTailLossProbes), | 81 max_tail_loss_probes_(kDefaultMaxTailLossProbes), |
| 83 using_pacing_(false) { | 82 using_pacing_(false) { |
| 84 } | 83 } |
| 85 | 84 |
| 86 QuicSentPacketManager::~QuicSentPacketManager() { | 85 QuicSentPacketManager::~QuicSentPacketManager() { |
| 87 } | 86 } |
| 88 | 87 |
| 89 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { | 88 void QuicSentPacketManager::SetFromConfig(const QuicConfig& config) { |
| 90 if (config.initial_round_trip_time_us() > 0 && | 89 if (config.initial_round_trip_time_us() > 0) { |
| 91 rtt_sample_.IsInfinite()) { | |
| 92 // The initial rtt should already be set on the client side. | 90 // The initial rtt should already be set on the client side. |
| 93 DVLOG_IF(1, !is_server_) | 91 DVLOG_IF(1, !is_server_) |
| 94 << "Client did not set an initial RTT, but did negotiate one."; | 92 << "Client did not set an initial RTT, but did negotiate one."; |
| 95 rtt_sample_ = | 93 rtt_stats_.set_initial_rtt_us(config.initial_round_trip_time_us()); |
| 96 QuicTime::Delta::FromMicroseconds(config.initial_round_trip_time_us()); | |
| 97 send_algorithm_->UpdateRtt(rtt_sample_); | |
| 98 } | 94 } |
| 99 if (config.congestion_control() == kPACE) { | 95 if (config.congestion_control() == kPACE) { |
| 100 MaybeEnablePacing(); | 96 MaybeEnablePacing(); |
| 101 } | 97 } |
| 102 send_algorithm_->SetFromConfig(config, is_server_); | 98 send_algorithm_->SetFromConfig(config, is_server_); |
| 103 } | 99 } |
| 104 | 100 |
| 105 // TODO(ianswett): Combine this method with OnPacketSent once packets are always | 101 // TODO(ianswett): Combine this method with OnPacketSent once packets are always |
| 106 // sent in order and the connection tracks RetransmittableFrames for longer. | 102 // sent in order and the connection tracks RetransmittableFrames for longer. |
| 107 void QuicSentPacketManager::OnSerializedPacket( | 103 void QuicSentPacketManager::OnSerializedPacket( |
| 108 const SerializedPacket& serialized_packet) { | 104 const SerializedPacket& serialized_packet) { |
| 109 if (serialized_packet.retransmittable_frames) { | 105 if (serialized_packet.retransmittable_frames) { |
| 110 ack_notifier_manager_.OnSerializedPacket(serialized_packet); | 106 ack_notifier_manager_.OnSerializedPacket(serialized_packet); |
| 111 | |
| 112 if (serialized_packet.retransmittable_frames->HasCryptoHandshake() | |
| 113 == IS_HANDSHAKE) { | |
| 114 ++pending_crypto_packet_count_; | |
| 115 } | |
| 116 } | 107 } |
| 117 | 108 |
| 118 unacked_packets_.AddPacket(serialized_packet); | 109 unacked_packets_.AddPacket(serialized_packet); |
| 119 } | 110 } |
| 120 | 111 |
| 121 void QuicSentPacketManager::OnRetransmittedPacket( | 112 void QuicSentPacketManager::OnRetransmittedPacket( |
| 122 QuicPacketSequenceNumber old_sequence_number, | 113 QuicPacketSequenceNumber old_sequence_number, |
| 123 QuicPacketSequenceNumber new_sequence_number) { | 114 QuicPacketSequenceNumber new_sequence_number) { |
| 124 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); | 115 DCHECK(ContainsKey(pending_retransmissions_, old_sequence_number)); |
| 125 | 116 |
| (...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 } | 297 } |
| 307 | 298 |
| 308 SequenceNumberSet all_transmissions = *transmission_info.all_transmissions; | 299 SequenceNumberSet all_transmissions = *transmission_info.all_transmissions; |
| 309 SequenceNumberSet::reverse_iterator all_transmissions_it = | 300 SequenceNumberSet::reverse_iterator all_transmissions_it = |
| 310 all_transmissions.rbegin(); | 301 all_transmissions.rbegin(); |
| 311 QuicPacketSequenceNumber newest_transmission = *all_transmissions_it; | 302 QuicPacketSequenceNumber newest_transmission = *all_transmissions_it; |
| 312 if (newest_transmission != sequence_number) { | 303 if (newest_transmission != sequence_number) { |
| 313 ++stats_->packets_spuriously_retransmitted; | 304 ++stats_->packets_spuriously_retransmitted; |
| 314 } | 305 } |
| 315 | 306 |
| 316 bool has_cryto_handshake = HasCryptoHandshake( | 307 bool has_crypto_handshake = HasCryptoHandshake( |
| 317 unacked_packets_.GetTransmissionInfo(newest_transmission)); | 308 unacked_packets_.GetTransmissionInfo(newest_transmission)); |
| 318 if (has_cryto_handshake) { | |
| 319 --pending_crypto_packet_count_; | |
| 320 } | |
| 321 while (all_transmissions_it != all_transmissions.rend()) { | 309 while (all_transmissions_it != all_transmissions.rend()) { |
| 322 QuicPacketSequenceNumber previous_transmission = *all_transmissions_it; | 310 QuicPacketSequenceNumber previous_transmission = *all_transmissions_it; |
| 323 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = | 311 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = |
| 324 unacked_packets_.GetTransmissionInfo(previous_transmission); | 312 unacked_packets_.GetTransmissionInfo(previous_transmission); |
| 325 if (ContainsKey(pending_retransmissions_, previous_transmission)) { | 313 if (ContainsKey(pending_retransmissions_, previous_transmission)) { |
| 326 // Don't bother retransmitting this packet, if it has been | 314 // Don't bother retransmitting this packet, if it has been |
| 327 // marked for retransmission. | 315 // marked for retransmission. |
| 328 pending_retransmissions_.erase(previous_transmission); | 316 pending_retransmissions_.erase(previous_transmission); |
| 329 } | 317 } |
| 330 if (has_cryto_handshake) { | 318 if (has_crypto_handshake) { |
| 331 // If it's a crypto handshake packet, discard it and all retransmissions, | 319 // If it's a crypto handshake packet, discard it and all retransmissions, |
| 332 // since they won't be acked now that one has been processed. | 320 // since they won't be acked now that one has been processed. |
| 333 if (transmission_info.pending) { | 321 if (transmission_info.pending) { |
| 334 OnPacketAbandoned(previous_transmission); | 322 OnPacketAbandoned(previous_transmission); |
| 335 } | 323 } |
| 336 unacked_packets_.SetNotPending(previous_transmission); | 324 unacked_packets_.SetNotPending(previous_transmission); |
| 337 } | 325 } |
| 338 if (!transmission_info.pending) { | 326 if (!transmission_info.pending) { |
| 339 unacked_packets_.RemovePacket(previous_transmission); | 327 unacked_packets_.RemovePacket(previous_transmission); |
| 340 } else { | 328 } else { |
| (...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 | 480 |
| 493 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); | 481 send_algorithm_->OnRetransmissionTimeout(packets_retransmitted); |
| 494 if (packets_retransmitted) { | 482 if (packets_retransmitted) { |
| 495 ++consecutive_rto_count_; | 483 ++consecutive_rto_count_; |
| 496 } | 484 } |
| 497 } | 485 } |
| 498 | 486 |
| 499 QuicSentPacketManager::RetransmissionTimeoutMode | 487 QuicSentPacketManager::RetransmissionTimeoutMode |
| 500 QuicSentPacketManager::GetRetransmissionMode() const { | 488 QuicSentPacketManager::GetRetransmissionMode() const { |
| 501 DCHECK(unacked_packets_.HasPendingPackets()); | 489 DCHECK(unacked_packets_.HasPendingPackets()); |
| 502 if (pending_crypto_packet_count_ > 0) { | 490 if (unacked_packets_.HasPendingCryptoPackets()) { |
| 503 return HANDSHAKE_MODE; | 491 return HANDSHAKE_MODE; |
| 504 } | 492 } |
| 505 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { | 493 if (loss_algorithm_->GetLossTimeout() != QuicTime::Zero()) { |
| 506 return LOSS_MODE; | 494 return LOSS_MODE; |
| 507 } | 495 } |
| 508 if (consecutive_tlp_count_ < max_tail_loss_probes_) { | 496 if (consecutive_tlp_count_ < max_tail_loss_probes_) { |
| 509 if (unacked_packets_.HasUnackedRetransmittableFrames()) { | 497 if (unacked_packets_.HasUnackedRetransmittableFrames()) { |
| 510 return TLP_MODE; | 498 return TLP_MODE; |
| 511 } | 499 } |
| 512 } | 500 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 555 } | 543 } |
| 556 | 544 |
| 557 InvokeLossDetection(ack_receive_time); | 545 InvokeLossDetection(ack_receive_time); |
| 558 } | 546 } |
| 559 | 547 |
| 560 void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { | 548 void QuicSentPacketManager::InvokeLossDetection(QuicTime time) { |
| 561 SequenceNumberSet lost_packets = | 549 SequenceNumberSet lost_packets = |
| 562 loss_algorithm_->DetectLostPackets(unacked_packets_, | 550 loss_algorithm_->DetectLostPackets(unacked_packets_, |
| 563 time, | 551 time, |
| 564 largest_observed_, | 552 largest_observed_, |
| 565 send_algorithm_->SmoothedRtt(), | 553 rtt_stats_); |
| 566 rtt_sample_); | |
| 567 for (SequenceNumberSet::const_iterator it = lost_packets.begin(); | 554 for (SequenceNumberSet::const_iterator it = lost_packets.begin(); |
| 568 it != lost_packets.end(); ++it) { | 555 it != lost_packets.end(); ++it) { |
| 569 QuicPacketSequenceNumber sequence_number = *it; | 556 QuicPacketSequenceNumber sequence_number = *it; |
| 570 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it | 557 // TODO(ianswett): If it's expected the FEC packet may repair the loss, it |
| 571 // should be recorded as a loss to the send algorithm, but not retransmitted | 558 // should be recorded as a loss to the send algorithm, but not retransmitted |
| 572 // until it's known whether the FEC packet arrived. | 559 // until it's known whether the FEC packet arrived. |
| 573 ++stats_->packets_lost; | 560 ++stats_->packets_lost; |
| 574 send_algorithm_->OnPacketLost(sequence_number, time); | 561 send_algorithm_->OnPacketLost(sequence_number, time); |
| 575 OnPacketAbandoned(sequence_number); | 562 OnPacketAbandoned(sequence_number); |
| 576 | 563 |
| (...skipping 19 matching lines...) Expand all Loading... |
| 596 // sequence numbers will include the ACK aggregation delay. | 583 // sequence numbers will include the ACK aggregation delay. |
| 597 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = | 584 const QuicUnackedPacketMap::TransmissionInfo& transmission_info = |
| 598 unacked_packets_.GetTransmissionInfo(received_info.largest_observed); | 585 unacked_packets_.GetTransmissionInfo(received_info.largest_observed); |
| 599 // Don't update the RTT if it hasn't been sent. | 586 // Don't update the RTT if it hasn't been sent. |
| 600 if (transmission_info.sent_time == QuicTime::Zero()) { | 587 if (transmission_info.sent_time == QuicTime::Zero()) { |
| 601 return; | 588 return; |
| 602 } | 589 } |
| 603 | 590 |
| 604 QuicTime::Delta send_delta = | 591 QuicTime::Delta send_delta = |
| 605 ack_receive_time.Subtract(transmission_info.sent_time); | 592 ack_receive_time.Subtract(transmission_info.sent_time); |
| 606 if (send_delta > received_info.delta_time_largest_observed) { | 593 rtt_stats_.UpdateRtt(send_delta, received_info.delta_time_largest_observed); |
| 607 rtt_sample_ = send_delta.Subtract( | 594 send_algorithm_->UpdateRtt(rtt_stats_.latest_rtt()); |
| 608 received_info.delta_time_largest_observed); | |
| 609 } else if (rtt_sample_.IsInfinite()) { | |
| 610 // Even though we received information from the peer suggesting | |
| 611 // an invalid (negative) RTT, we can use the send delta as an | |
| 612 // approximation until we get a better estimate. | |
| 613 rtt_sample_ = send_delta; | |
| 614 } | |
| 615 send_algorithm_->UpdateRtt(rtt_sample_); | |
| 616 } | 595 } |
| 617 | 596 |
| 618 QuicTime::Delta QuicSentPacketManager::TimeUntilSend( | 597 QuicTime::Delta QuicSentPacketManager::TimeUntilSend( |
| 619 QuicTime now, | 598 QuicTime now, |
| 620 TransmissionType transmission_type, | 599 TransmissionType transmission_type, |
| 621 HasRetransmittableData retransmittable, | 600 HasRetransmittableData retransmittable, |
| 622 IsHandshake handshake) { | 601 IsHandshake handshake) { |
| 623 return send_algorithm_->TimeUntilSend(now, transmission_type, retransmittable, | 602 return send_algorithm_->TimeUntilSend(now, transmission_type, retransmittable, |
| 624 handshake); | 603 handshake); |
| 625 } | 604 } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 // of the last pending packet which still has retransmittable frames. | 638 // of the last pending packet which still has retransmittable frames. |
| 660 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); | 639 const QuicTime sent_time = unacked_packets_.GetLastPacketSentTime(); |
| 661 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); | 640 const QuicTime tlp_time = sent_time.Add(GetTailLossProbeDelay()); |
| 662 // Ensure the tlp timer never gets set to a time in the past. | 641 // Ensure the tlp timer never gets set to a time in the past. |
| 663 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); | 642 return QuicTime::Max(clock_->ApproximateNow(), tlp_time); |
| 664 } | 643 } |
| 665 case RTO_MODE: { | 644 case RTO_MODE: { |
| 666 // The RTO is based on the first pending packet. | 645 // The RTO is based on the first pending packet. |
| 667 const QuicTime sent_time = | 646 const QuicTime sent_time = |
| 668 unacked_packets_.GetFirstPendingPacketSentTime(); | 647 unacked_packets_.GetFirstPendingPacketSentTime(); |
| 669 // Always wait at least 1.5 * RTT after the first sent packet. | 648 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
| 649 // Always wait at least 1.5 * RTT from now. |
| 670 QuicTime min_timeout = clock_->ApproximateNow().Add( | 650 QuicTime min_timeout = clock_->ApproximateNow().Add( |
| 671 SmoothedRtt().Multiply(1.5)); | 651 SmoothedRtt().Multiply(1.5)); |
| 672 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); | |
| 673 | 652 |
| 674 return QuicTime::Max(min_timeout, rto_timeout); | 653 return QuicTime::Max(min_timeout, rto_timeout); |
| 675 } | 654 } |
| 676 } | 655 } |
| 677 DCHECK(false); | 656 DCHECK(false); |
| 678 return QuicTime::Zero(); | 657 return QuicTime::Zero(); |
| 679 } | 658 } |
| 680 | 659 |
| 681 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() | 660 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() |
| 682 const { | 661 const { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 retransmission_delay = retransmission_delay.Multiply( | 694 retransmission_delay = retransmission_delay.Multiply( |
| 716 1 << min<size_t>(consecutive_rto_count_, kMaxRetransmissions)); | 695 1 << min<size_t>(consecutive_rto_count_, kMaxRetransmissions)); |
| 717 | 696 |
| 718 if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { | 697 if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { |
| 719 return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); | 698 return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); |
| 720 } | 699 } |
| 721 return retransmission_delay; | 700 return retransmission_delay; |
| 722 } | 701 } |
| 723 | 702 |
| 724 const QuicTime::Delta QuicSentPacketManager::SmoothedRtt() const { | 703 const QuicTime::Delta QuicSentPacketManager::SmoothedRtt() const { |
| 725 return send_algorithm_->SmoothedRtt(); | 704 return rtt_stats_.SmoothedRtt(); |
| 726 } | 705 } |
| 727 | 706 |
| 728 QuicBandwidth QuicSentPacketManager::BandwidthEstimate() const { | 707 QuicBandwidth QuicSentPacketManager::BandwidthEstimate() const { |
| 729 return send_algorithm_->BandwidthEstimate(); | 708 return send_algorithm_->BandwidthEstimate(); |
| 730 } | 709 } |
| 731 | 710 |
| 732 QuicByteCount QuicSentPacketManager::GetCongestionWindow() const { | 711 QuicByteCount QuicSentPacketManager::GetCongestionWindow() const { |
| 733 return send_algorithm_->GetCongestionWindow(); | 712 return send_algorithm_->GetCongestionWindow(); |
| 734 } | 713 } |
| 735 | 714 |
| 736 void QuicSentPacketManager::MaybeEnablePacing() { | 715 void QuicSentPacketManager::MaybeEnablePacing() { |
| 737 if (!FLAGS_enable_quic_pacing) { | 716 if (!FLAGS_enable_quic_pacing) { |
| 738 return; | 717 return; |
| 739 } | 718 } |
| 740 | 719 |
| 741 if (using_pacing_) { | 720 if (using_pacing_) { |
| 742 return; | 721 return; |
| 743 } | 722 } |
| 744 | 723 |
| 745 using_pacing_ = true; | 724 using_pacing_ = true; |
| 746 send_algorithm_.reset( | 725 send_algorithm_.reset( |
| 747 new PacingSender(send_algorithm_.release(), | 726 new PacingSender(send_algorithm_.release(), |
| 748 QuicTime::Delta::FromMicroseconds(1))); | 727 QuicTime::Delta::FromMicroseconds(1))); |
| 749 } | 728 } |
| 750 | 729 |
| 751 } // namespace net | 730 } // namespace net |
| OLD | NEW |