| 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" |
| 11 #include "net/quic/congestion_control/pacing_sender.h" | 11 #include "net/quic/congestion_control/pacing_sender.h" |
| 12 #include "net/quic/crypto/crypto_protocol.h" | 12 #include "net/quic/crypto/crypto_protocol.h" |
| 13 #include "net/quic/proto/cached_network_parameters.pb.h" | 13 #include "net/quic/proto/cached_network_parameters.pb.h" |
| 14 #include "net/quic/quic_connection_stats.h" | 14 #include "net/quic/quic_connection_stats.h" |
| 15 #include "net/quic/quic_flags.h" | 15 #include "net/quic/quic_flags.h" |
| 16 #include "net/quic/quic_utils_chromium.h" | 16 #include "net/quic/quic_utils_chromium.h" |
| 17 | 17 |
| 18 using std::max; | 18 using std::max; |
| 19 using std::min; | 19 using std::min; |
| 20 | 20 |
| 21 namespace net { | 21 namespace net { |
| 22 | 22 |
| 23 // The length of the recent min rtt window in seconds. Windowing is disabled for | 23 // The length of the recent min rtt window in seconds. Windowing is disabled for |
| 24 // values less than or equal to 0. | 24 // values less than or equal to 0. |
| 25 int32 FLAGS_quic_recent_min_rtt_window_s = 60; | 25 int32_t FLAGS_quic_recent_min_rtt_window_s = 60; |
| 26 | 26 |
| 27 namespace { | 27 namespace { |
| 28 static const int64 kDefaultRetransmissionTimeMs = 500; | 28 static const int64_t kDefaultRetransmissionTimeMs = 500; |
| 29 // TCP RFC calls for 1 second RTO however Linux differs from this default and | 29 // TCP RFC calls for 1 second RTO however Linux differs from this default and |
| 30 // define the minimum RTO to 200ms, we will use the same until we have data to | 30 // define the minimum RTO to 200ms, we will use the same until we have data to |
| 31 // support a higher or lower value. | 31 // support a higher or lower value. |
| 32 static const int64 kMinRetransmissionTimeMs = 200; | 32 static const int64_t kMinRetransmissionTimeMs = 200; |
| 33 static const int64 kMaxRetransmissionTimeMs = 60000; | 33 static const int64_t kMaxRetransmissionTimeMs = 60000; |
| 34 // Maximum number of exponential backoffs used for RTO timeouts. | 34 // Maximum number of exponential backoffs used for RTO timeouts. |
| 35 static const size_t kMaxRetransmissions = 10; | 35 static const size_t kMaxRetransmissions = 10; |
| 36 // Maximum number of packets retransmitted upon an RTO. | 36 // Maximum number of packets retransmitted upon an RTO. |
| 37 static const size_t kMaxRetransmissionsOnTimeout = 2; | 37 static const size_t kMaxRetransmissionsOnTimeout = 2; |
| 38 | 38 |
| 39 // Ensure the handshake timer isnt't faster than 10ms. | 39 // Ensure the handshake timer isnt't faster than 10ms. |
| 40 // This limits the tenth retransmitted packet to 10s after the initial CHLO. | 40 // This limits the tenth retransmitted packet to 10s after the initial CHLO. |
| 41 static const int64 kMinHandshakeTimeoutMs = 10; | 41 static const int64_t kMinHandshakeTimeoutMs = 10; |
| 42 | 42 |
| 43 // Sends up to two tail loss probes before firing an RTO, | 43 // Sends up to two tail loss probes before firing an RTO, |
| 44 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. | 44 // per draft RFC draft-dukkipati-tcpm-tcp-loss-probe. |
| 45 static const size_t kDefaultMaxTailLossProbes = 2; | 45 static const size_t kDefaultMaxTailLossProbes = 2; |
| 46 static const int64 kMinTailLossProbeTimeoutMs = 10; | 46 static const int64_t kMinTailLossProbeTimeoutMs = 10; |
| 47 | 47 |
| 48 // Number of unpaced packets to send after quiescence. | 48 // Number of unpaced packets to send after quiescence. |
| 49 static const size_t kInitialUnpacedBurst = 10; | 49 static const size_t kInitialUnpacedBurst = 10; |
| 50 | 50 |
| 51 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { | 51 bool HasCryptoHandshake(const TransmissionInfo& transmission_info) { |
| 52 if (transmission_info.retransmittable_frames == nullptr) { | 52 if (transmission_info.retransmittable_frames == nullptr) { |
| 53 return false; | 53 return false; |
| 54 } | 54 } |
| 55 return transmission_info.retransmittable_frames->HasCryptoHandshake() == | 55 return transmission_info.retransmittable_frames->HasCryptoHandshake() == |
| 56 IS_HANDSHAKE; | 56 IS_HANDSHAKE; |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 179 | 179 |
| 180 if (network_change_visitor_ != nullptr) { | 180 if (network_change_visitor_ != nullptr) { |
| 181 network_change_visitor_->OnCongestionWindowChange(); | 181 network_change_visitor_->OnCongestionWindowChange(); |
| 182 } | 182 } |
| 183 } | 183 } |
| 184 | 184 |
| 185 void QuicSentPacketManager::ResumeConnectionState( | 185 void QuicSentPacketManager::ResumeConnectionState( |
| 186 const CachedNetworkParameters& cached_network_params, | 186 const CachedNetworkParameters& cached_network_params, |
| 187 bool max_bandwidth_resumption) { | 187 bool max_bandwidth_resumption) { |
| 188 if (cached_network_params.has_min_rtt_ms()) { | 188 if (cached_network_params.has_min_rtt_ms()) { |
| 189 uint32 initial_rtt_us = | 189 uint32_t initial_rtt_us = |
| 190 kNumMicrosPerMilli * cached_network_params.min_rtt_ms(); | 190 kNumMicrosPerMilli * cached_network_params.min_rtt_ms(); |
| 191 rtt_stats_.set_initial_rtt_us( | 191 rtt_stats_.set_initial_rtt_us( |
| 192 max(kMinInitialRoundTripTimeUs, | 192 max(kMinInitialRoundTripTimeUs, |
| 193 min(kMaxInitialRoundTripTimeUs, initial_rtt_us))); | 193 min(kMaxInitialRoundTripTimeUs, initial_rtt_us))); |
| 194 } | 194 } |
| 195 send_algorithm_->ResumeConnectionState(cached_network_params, | 195 send_algorithm_->ResumeConnectionState(cached_network_params, |
| 196 max_bandwidth_resumption); | 196 max_bandwidth_resumption); |
| 197 } | 197 } |
| 198 | 198 |
| 199 void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) { | 199 void QuicSentPacketManager::SetNumOpenStreams(size_t num_streams) { |
| (...skipping 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 } | 869 } |
| 870 | 870 |
| 871 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() | 871 const QuicTime::Delta QuicSentPacketManager::GetCryptoRetransmissionDelay() |
| 872 const { | 872 const { |
| 873 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive | 873 // This is equivalent to the TailLossProbeDelay, but slightly more aggressive |
| 874 // because crypto handshake messages don't incur a delayed ack time. | 874 // because crypto handshake messages don't incur a delayed ack time. |
| 875 QuicTime::Delta srtt = rtt_stats_.smoothed_rtt(); | 875 QuicTime::Delta srtt = rtt_stats_.smoothed_rtt(); |
| 876 if (srtt.IsZero()) { | 876 if (srtt.IsZero()) { |
| 877 srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()); | 877 srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()); |
| 878 } | 878 } |
| 879 int64 delay_ms = max(kMinHandshakeTimeoutMs, | 879 int64_t delay_ms = max(kMinHandshakeTimeoutMs, |
| 880 static_cast<int64>(1.5 * srtt.ToMilliseconds())); | 880 static_cast<int64_t>(1.5 * srtt.ToMilliseconds())); |
| 881 return QuicTime::Delta::FromMilliseconds( | 881 return QuicTime::Delta::FromMilliseconds( |
| 882 delay_ms << consecutive_crypto_retransmission_count_); | 882 delay_ms << consecutive_crypto_retransmission_count_); |
| 883 } | 883 } |
| 884 | 884 |
| 885 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { | 885 const QuicTime::Delta QuicSentPacketManager::GetTailLossProbeDelay() const { |
| 886 QuicTime::Delta srtt = rtt_stats_.smoothed_rtt(); | 886 QuicTime::Delta srtt = rtt_stats_.smoothed_rtt(); |
| 887 if (srtt.IsZero()) { | 887 if (srtt.IsZero()) { |
| 888 srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()); | 888 srtt = QuicTime::Delta::FromMicroseconds(rtt_stats_.initial_rtt_us()); |
| 889 } | 889 } |
| 890 if (enable_half_rtt_tail_loss_probe_ && consecutive_tlp_count_ == 0u) { | 890 if (enable_half_rtt_tail_loss_probe_ && consecutive_tlp_count_ == 0u) { |
| 891 return QuicTime::Delta::FromMilliseconds( | 891 return QuicTime::Delta::FromMilliseconds( |
| 892 max(kMinTailLossProbeTimeoutMs, | 892 max(kMinTailLossProbeTimeoutMs, |
| 893 static_cast<int64>(0.5 * srtt.ToMilliseconds()))); | 893 static_cast<int64_t>(0.5 * srtt.ToMilliseconds()))); |
| 894 } | 894 } |
| 895 if (!unacked_packets_.HasMultipleInFlightPackets()) { | 895 if (!unacked_packets_.HasMultipleInFlightPackets()) { |
| 896 return QuicTime::Delta::Max( | 896 return QuicTime::Delta::Max( |
| 897 srtt.Multiply(2), | 897 srtt.Multiply(2), |
| 898 srtt.Multiply(1.5).Add( | 898 srtt.Multiply(1.5).Add( |
| 899 QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs / 2))); | 899 QuicTime::Delta::FromMilliseconds(kMinRetransmissionTimeMs / 2))); |
| 900 } | 900 } |
| 901 return QuicTime::Delta::FromMilliseconds( | 901 return QuicTime::Delta::FromMilliseconds( |
| 902 max(kMinTailLossProbeTimeoutMs, | 902 max(kMinTailLossProbeTimeoutMs, |
| 903 static_cast<int64>(2 * srtt.ToMilliseconds()))); | 903 static_cast<int64_t>(2 * srtt.ToMilliseconds()))); |
| 904 } | 904 } |
| 905 | 905 |
| 906 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { | 906 const QuicTime::Delta QuicSentPacketManager::GetRetransmissionDelay() const { |
| 907 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); | 907 QuicTime::Delta retransmission_delay = send_algorithm_->RetransmissionDelay(); |
| 908 if (retransmission_delay.IsZero()) { | 908 if (retransmission_delay.IsZero()) { |
| 909 // We are in the initial state, use default timeout values. | 909 // We are in the initial state, use default timeout values. |
| 910 retransmission_delay = | 910 retransmission_delay = |
| 911 QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); | 911 QuicTime::Delta::FromMilliseconds(kDefaultRetransmissionTimeMs); |
| 912 } else if (retransmission_delay.ToMilliseconds() < kMinRetransmissionTimeMs) { | 912 } else if (retransmission_delay.ToMilliseconds() < kMinRetransmissionTimeMs) { |
| 913 retransmission_delay = | 913 retransmission_delay = |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 993 // Rtt and cwnd do not need to be reset when the peer address change is | 993 // Rtt and cwnd do not need to be reset when the peer address change is |
| 994 // considered to be caused by NATs. | 994 // considered to be caused by NATs. |
| 995 return; | 995 return; |
| 996 } | 996 } |
| 997 | 997 |
| 998 rtt_stats_.OnConnectionMigration(); | 998 rtt_stats_.OnConnectionMigration(); |
| 999 send_algorithm_->OnConnectionMigration(); | 999 send_algorithm_->OnConnectionMigration(); |
| 1000 } | 1000 } |
| 1001 | 1001 |
| 1002 } // namespace net | 1002 } // namespace net |
| OLD | NEW |