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/quic_ack_notifier_manager.h" | 10 #include "net/quic/quic_ack_notifier_manager.h" |
11 | 11 |
12 using std::make_pair; | 12 using std::make_pair; |
13 using std::max; | 13 using std::max; |
14 using std::min; | 14 using std::min; |
15 | 15 |
16 // TODO(rtenneti): Remove this. | 16 // TODO(rtenneti): Remove this. |
17 // Do not flip this flag until the flakiness of the | 17 // Do not flip this flag until the flakiness of the |
18 // net/tools/quic/end_to_end_test is fixed. | 18 // net/tools/quic/end_to_end_test is fixed. |
19 // If true, then QUIC connections will track the retransmission history of a | 19 // If true, then QUIC connections will track the retransmission history of a |
20 // packet so that an ack of a previous transmission will ack the data of all | 20 // packet so that an ack of a previous transmission will ack the data of all |
21 // other transmissions. | 21 // other transmissions. |
22 bool FLAGS_track_retransmission_history = false; | 22 bool FLAGS_track_retransmission_history = false; |
23 | 23 |
24 // A test-only flag to prevent the RTO from backing off when multiple sequential | |
25 // tail drops occur. | |
26 bool FLAGS_limit_rto_increase_for_tests = false; | |
27 | |
28 // Do not remove this flag until the Finch-trials described in b/11706275 | 24 // Do not remove this flag until the Finch-trials described in b/11706275 |
29 // are complete. | 25 // are complete. |
30 // If true, QUIC connections will support the use of a pacing algorithm when | 26 // If true, QUIC connections will support the use of a pacing algorithm when |
31 // sending packets, in an attempt to reduce packet loss. The client must also | 27 // sending packets, in an attempt to reduce packet loss. The client must also |
32 // request pacing for the server to enable it. | 28 // request pacing for the server to enable it. |
33 bool FLAGS_enable_quic_pacing = false; | 29 bool FLAGS_enable_quic_pacing = false; |
34 | 30 |
35 namespace net { | 31 namespace net { |
36 namespace { | 32 namespace { |
37 static const int kBitrateSmoothingPeriodMs = 1000; | 33 static const int kBitrateSmoothingPeriodMs = 1000; |
(...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); | 846 QuicTime rto_timeout = sent_time.Add(GetRetransmissionDelay()); |
851 | 847 |
852 return QuicTime::Max(min_timeout, rto_timeout); | 848 return QuicTime::Max(min_timeout, rto_timeout); |
853 } | 849 } |
854 default: | 850 default: |
855 DCHECK(false); | 851 DCHECK(false); |
856 } | 852 } |
857 return QuicTime::Zero(); | 853 return QuicTime::Zero(); |
858 } | 854 } |
859 | 855 |
860 const QuicTime::Delta | 856 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() |
861 QuicSentPacketManager::GetCryptoRetransmissionDelay() const { | 857 const { |
862 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive | 858 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive |
863 // because crypto handshake messages don't incur a delayed ack time. | 859 // because crypto handshake messages don't incur a delayed ack time. |
864 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, | 860 int64 delay_ms = max<int64>(kMinHandshakeTimeoutMs, |
865 1.5 * SmoothedRtt().ToMilliseconds()); | 861 1.5 * SmoothedRtt().ToMilliseconds()); |
866 return QuicTime::Delta::FromMilliseconds( | 862 return QuicTime::Delta::FromMilliseconds( |
867 delay_ms << consecutive_crypto_retransmission_count_); | 863 delay_ms << consecutive_crypto_retransmission_count_); |
868 } | 864 } |
869 | 865 |
870 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { | 866 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { |
871 QuicTime::Delta srtt = SmoothedRtt(); | 867 QuicTime::Delta srtt = SmoothedRtt(); |
872 if (pending_packets_.size() == 1) { | 868 if (pending_packets_.size() == 1) { |
873 return QuicTime::Delta::Max( | 869 return QuicTime::Delta::Max( |
874 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); | 870 srtt.Multiply(1.5).Add(DelayedAckTime()), srtt.Multiply(2)); |
875 } | 871 } |
876 return QuicTime::Delta::FromMilliseconds( | 872 return QuicTime::Delta::FromMilliseconds( |
877 max(kMinTailLossProbeTimeoutMs, | 873 max(kMinTailLossProbeTimeoutMs, |
878 static_cast<int64>(2 * srtt.ToMilliseconds()))); | 874 static_cast<int64>(2 * srtt.ToMilliseconds()))); |
879 } | 875 } |
880 | 876 |
881 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { | 877 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { |
882 size_t number_retransmissions = consecutive_rto_count_; | |
883 // TODO(ianswett): Remove this flag now that EndToEndTest is no longer flaky. | |
884 if (FLAGS_limit_rto_increase_for_tests) { | |
885 const size_t kTailDropWindowSize = 5; | |
886 const size_t kTailDropMaxRetransmissions = 4; | |
887 if (pending_packets_.size() <= kTailDropWindowSize) { | |
888 // Avoid exponential backoff of RTO when there are only a few packets | |
889 // outstanding. This helps avoid the situation where fake packet loss | |
890 // causes a packet and it's retransmission to be dropped causing | |
891 // test timouts. | |
892 if (number_retransmissions <= kTailDropMaxRetransmissions) { | |
893 number_retransmissions = 0; | |
894 } else { | |
895 number_retransmissions -= kTailDropMaxRetransmissions; | |
896 } | |
897 } | |
898 } | |
899 | |
900 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); | 878 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); |
901 if (retransmission_delay.IsZero()) { | 879 if (retransmission_delay.IsZero()) { |
902 // We are in the initial state, use default timeout values. | 880 // We are in the initial state, use default timeout values. |
903 retransmission_delay = | 881 retransmission_delay = |
904 QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); | 882 QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); |
905 } | 883 } |
906 // Calculate exponential back off. | 884 // Calculate exponential back off. |
907 retransmission_delay = retransmission_delay.Multiply( | 885 retransmission_delay = retransmission_delay.Multiply( |
908 1 << min<size_t>(number_retransmissions, kMaxRetransmissions)); | 886 1 << min<size_t>(consecutive_rto_count_, kMaxRetransmissions)); |
909 | 887 |
910 // TODO(rch): This code should move to |send_algorithm_|. | 888 // TODO(rch): This code should move to |send_algorithm_|. |
911 if (retransmission_delay.ToMilliseconds() < kMinRetransmissionTimeMs) { | 889 if (retransmission_delay.ToMilliseconds() < kMinRetransmissionTimeMs) { |
912 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs); | 890 return QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs); |
913 } | 891 } |
914 if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { | 892 if (retransmission_delay.ToMilliseconds() > kMaxRetransmissionTimeMs) { |
915 return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); | 893 return QuicTime::Delta::FromMilliseconds(kMaxRetransmissionTimeMs); |
916 } | 894 } |
917 return retransmission_delay; | 895 return retransmission_delay; |
918 } | 896 } |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
959 return; | 937 return; |
960 } | 938 } |
961 | 939 |
962 using_pacing_ = true; | 940 using_pacing_ = true; |
963 send_algorithm_.reset( | 941 send_algorithm_.reset( |
964 new PacingSender(send_algorithm_.release(), | 942 new PacingSender(send_algorithm_.release(), |
965 QuicTime::Delta::FromMicroseconds(1))); | 943 QuicTime::Delta::FromMicroseconds(1))); |
966 } | 944 } |
967 | 945 |
968 } // namespace net | 946 } // namespace net |
OLD | NEW |