| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/types.h> | 8 #include <sys/types.h> |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 62 const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20; | 62 const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20; |
| 63 | 63 |
| 64 // Maximum number of retransmittable packets received before sending an ack. | 64 // Maximum number of retransmittable packets received before sending an ack. |
| 65 const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2; | 65 const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2; |
| 66 // Minimum number of packets received before ack decimation is enabled. | 66 // Minimum number of packets received before ack decimation is enabled. |
| 67 // This intends to avoid the beginning of slow start, when CWNDs may be | 67 // This intends to avoid the beginning of slow start, when CWNDs may be |
| 68 // rapidly increasing. | 68 // rapidly increasing. |
| 69 const QuicPacketCount kMinReceivedBeforeAckDecimation = 100; | 69 const QuicPacketCount kMinReceivedBeforeAckDecimation = 100; |
| 70 // Wait for up to 10 retransmittable packets before sending an ack. | 70 // Wait for up to 10 retransmittable packets before sending an ack. |
| 71 const QuicPacketCount kMaxRetransmittablePacketsBeforeAck = 10; | 71 const QuicPacketCount kMaxRetransmittablePacketsBeforeAck = 10; |
| 72 // One quarter RTT delay when doing ack decimation. |
| 73 const float kAckDecimationDelay = 0.25; |
| 74 // One eighth RTT delay when doing ack decimation. |
| 75 const float kShortAckDecimationDelay = 0.125; |
| 72 | 76 |
| 73 bool Near(QuicPacketNumber a, QuicPacketNumber b) { | 77 bool Near(QuicPacketNumber a, QuicPacketNumber b) { |
| 74 QuicPacketNumber delta = (a > b) ? a - b : b - a; | 78 QuicPacketNumber delta = (a > b) ? a - b : b - a; |
| 75 return delta <= kMaxPacketGap; | 79 return delta <= kMaxPacketGap; |
| 76 } | 80 } |
| 77 | 81 |
| 78 bool IsInitializedIPEndPoint(const IPEndPoint& address) { | 82 bool IsInitializedIPEndPoint(const IPEndPoint& address) { |
| 79 return net::GetAddressFamily(address.address()) != | 83 return net::GetAddressFamily(address.address()) != |
| 80 net::ADDRESS_FAMILY_UNSPECIFIED; | 84 net::ADDRESS_FAMILY_UNSPECIFIED; |
| 81 } | 85 } |
| (...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 239 idle_timeout_connection_close_behavior_( | 243 idle_timeout_connection_close_behavior_( |
| 240 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET), | 244 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET), |
| 241 close_connection_after_five_rtos_(false), | 245 close_connection_after_five_rtos_(false), |
| 242 received_packet_manager_(&stats_), | 246 received_packet_manager_(&stats_), |
| 243 ack_queued_(false), | 247 ack_queued_(false), |
| 244 num_retransmittable_packets_received_since_last_ack_sent_(0), | 248 num_retransmittable_packets_received_since_last_ack_sent_(0), |
| 245 last_ack_had_missing_packets_(false), | 249 last_ack_had_missing_packets_(false), |
| 246 num_packets_received_since_last_ack_sent_(0), | 250 num_packets_received_since_last_ack_sent_(0), |
| 247 stop_waiting_count_(0), | 251 stop_waiting_count_(0), |
| 248 ack_mode_(TCP_ACKING), | 252 ack_mode_(TCP_ACKING), |
| 253 ack_decimation_delay_(kAckDecimationDelay), |
| 249 delay_setting_retransmission_alarm_(false), | 254 delay_setting_retransmission_alarm_(false), |
| 250 pending_retransmission_alarm_(false), | 255 pending_retransmission_alarm_(false), |
| 251 defer_send_in_response_to_packets_(false), | 256 defer_send_in_response_to_packets_(false), |
| 252 arena_(), | 257 arena_(), |
| 253 ack_alarm_( | 258 ack_alarm_( |
| 254 alarm_factory_->CreateAlarm(arena_.New<AckAlarm>(this), &arena_)), | 259 alarm_factory_->CreateAlarm(arena_.New<AckAlarm>(this), &arena_)), |
| 255 retransmission_alarm_( | 260 retransmission_alarm_( |
| 256 alarm_factory_->CreateAlarm(arena_.New<RetransmissionAlarm>(this), | 261 alarm_factory_->CreateAlarm(arena_.New<RetransmissionAlarm>(this), |
| 257 &arena_)), | 262 &arena_)), |
| 258 send_alarm_( | 263 send_alarm_( |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 } | 370 } |
| 366 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) { | 371 if (config.HasClientSentConnectionOption(kMTUL, perspective_)) { |
| 367 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeLow); | 372 SetMtuDiscoveryTarget(kMtuDiscoveryTargetPacketSizeLow); |
| 368 } | 373 } |
| 369 if (debug_visitor_ != nullptr) { | 374 if (debug_visitor_ != nullptr) { |
| 370 debug_visitor_->OnSetFromConfig(config); | 375 debug_visitor_->OnSetFromConfig(config); |
| 371 } | 376 } |
| 372 if (config.HasClientSentConnectionOption(kACKD, perspective_)) { | 377 if (config.HasClientSentConnectionOption(kACKD, perspective_)) { |
| 373 ack_mode_ = ACK_DECIMATION; | 378 ack_mode_ = ACK_DECIMATION; |
| 374 } | 379 } |
| 375 if (FLAGS_quic_ack_decimation2 && | 380 if (config.HasClientSentConnectionOption(kAKD2, perspective_)) { |
| 376 config.HasClientSentConnectionOption(kAKD2, perspective_)) { | |
| 377 ack_mode_ = ACK_DECIMATION_WITH_REORDERING; | 381 ack_mode_ = ACK_DECIMATION_WITH_REORDERING; |
| 378 } | 382 } |
| 383 if (config.HasClientSentConnectionOption(kAKD3, perspective_)) { |
| 384 ack_mode_ = ACK_DECIMATION; |
| 385 ack_decimation_delay_ = kShortAckDecimationDelay; |
| 386 } |
| 387 if (config.HasClientSentConnectionOption(kAKD4, perspective_)) { |
| 388 ack_mode_ = ACK_DECIMATION_WITH_REORDERING; |
| 389 ack_decimation_delay_ = kShortAckDecimationDelay; |
| 390 } |
| 379 if (FLAGS_quic_enable_rto_timeout && | 391 if (FLAGS_quic_enable_rto_timeout && |
| 380 config.HasClientSentConnectionOption(k5RTO, perspective_)) { | 392 config.HasClientSentConnectionOption(k5RTO, perspective_)) { |
| 381 close_connection_after_five_rtos_ = true; | 393 close_connection_after_five_rtos_ = true; |
| 382 } | 394 } |
| 383 } | 395 } |
| 384 | 396 |
| 385 void QuicConnection::OnSendConnectionState( | 397 void QuicConnection::OnSendConnectionState( |
| 386 const CachedNetworkParameters& cached_network_params) { | 398 const CachedNetworkParameters& cached_network_params) { |
| 387 if (debug_visitor_ != nullptr) { | 399 if (debug_visitor_ != nullptr) { |
| 388 debug_visitor_->OnSendConnectionState(cached_network_params); | 400 debug_visitor_->OnSendConnectionState(cached_network_params); |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 757 } | 769 } |
| 758 | 770 |
| 759 if (debug_visitor_ != nullptr) { | 771 if (debug_visitor_ != nullptr) { |
| 760 debug_visitor_->OnStopWaitingFrame(frame); | 772 debug_visitor_->OnStopWaitingFrame(frame); |
| 761 } | 773 } |
| 762 | 774 |
| 763 last_stop_waiting_frame_ = frame; | 775 last_stop_waiting_frame_ = frame; |
| 764 return connected_; | 776 return connected_; |
| 765 } | 777 } |
| 766 | 778 |
| 779 bool QuicConnection::OnPaddingFrame(const QuicPaddingFrame& frame) { |
| 780 DCHECK(connected_); |
| 781 if (debug_visitor_ != nullptr) { |
| 782 debug_visitor_->OnPaddingFrame(frame); |
| 783 } |
| 784 return true; |
| 785 } |
| 786 |
| 767 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 787 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
| 768 DCHECK(connected_); | 788 DCHECK(connected_); |
| 769 if (debug_visitor_ != nullptr) { | 789 if (debug_visitor_ != nullptr) { |
| 770 debug_visitor_->OnPingFrame(frame); | 790 debug_visitor_->OnPingFrame(frame); |
| 771 } | 791 } |
| 772 should_last_packet_instigate_acks_ = true; | 792 should_last_packet_instigate_acks_ = true; |
| 773 return true; | 793 return true; |
| 774 } | 794 } |
| 775 | 795 |
| 776 const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 796 const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
| (...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 991 if (ack_mode_ != TCP_ACKING && | 1011 if (ack_mode_ != TCP_ACKING && |
| 992 last_header_.packet_number > kMinReceivedBeforeAckDecimation) { | 1012 last_header_.packet_number > kMinReceivedBeforeAckDecimation) { |
| 993 // Ack up to 10 packets at once. | 1013 // Ack up to 10 packets at once. |
| 994 if (num_retransmittable_packets_received_since_last_ack_sent_ >= | 1014 if (num_retransmittable_packets_received_since_last_ack_sent_ >= |
| 995 kMaxRetransmittablePacketsBeforeAck) { | 1015 kMaxRetransmittablePacketsBeforeAck) { |
| 996 ack_queued_ = true; | 1016 ack_queued_ = true; |
| 997 } else if (!ack_alarm_->IsSet()) { | 1017 } else if (!ack_alarm_->IsSet()) { |
| 998 // Wait the minimum of a quarter min_rtt and the delayed ack time. | 1018 // Wait the minimum of a quarter min_rtt and the delayed ack time. |
| 999 QuicTime::Delta ack_delay = QuicTime::Delta::Min( | 1019 QuicTime::Delta ack_delay = QuicTime::Delta::Min( |
| 1000 sent_packet_manager_.DelayedAckTime(), | 1020 sent_packet_manager_.DelayedAckTime(), |
| 1001 sent_packet_manager_.GetRttStats()->min_rtt().Multiply(0.25)); | 1021 sent_packet_manager_.GetRttStats()->min_rtt().Multiply( |
| 1022 ack_decimation_delay_)); |
| 1002 ack_alarm_->Set(clock_->ApproximateNow().Add(ack_delay)); | 1023 ack_alarm_->Set(clock_->ApproximateNow().Add(ack_delay)); |
| 1003 } | 1024 } |
| 1004 } else { | 1025 } else { |
| 1005 // Ack with a timer or every 2 packets by default. | 1026 // Ack with a timer or every 2 packets by default. |
| 1006 if (num_retransmittable_packets_received_since_last_ack_sent_ >= | 1027 if (num_retransmittable_packets_received_since_last_ack_sent_ >= |
| 1007 kDefaultRetransmittablePacketsBeforeAck) { | 1028 kDefaultRetransmittablePacketsBeforeAck) { |
| 1008 ack_queued_ = true; | 1029 ack_queued_ = true; |
| 1009 } else if (!ack_alarm_->IsSet()) { | 1030 } else if (!ack_alarm_->IsSet()) { |
| 1010 ack_alarm_->Set(clock_->ApproximateNow().Add( | 1031 ack_alarm_->Set(clock_->ApproximateNow().Add( |
| 1011 sent_packet_manager_.DelayedAckTime())); | 1032 sent_packet_manager_.DelayedAckTime())); |
| (...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1783 ack_queued_ = false; | 1804 ack_queued_ = false; |
| 1784 stop_waiting_count_ = 0; | 1805 stop_waiting_count_ = 0; |
| 1785 num_retransmittable_packets_received_since_last_ack_sent_ = 0; | 1806 num_retransmittable_packets_received_since_last_ack_sent_ = 0; |
| 1786 last_ack_had_missing_packets_ = received_packet_manager_.HasMissingPackets(); | 1807 last_ack_had_missing_packets_ = received_packet_manager_.HasMissingPackets(); |
| 1787 num_packets_received_since_last_ack_sent_ = 0; | 1808 num_packets_received_since_last_ack_sent_ = 0; |
| 1788 | 1809 |
| 1789 packet_generator_.SetShouldSendAck(true); | 1810 packet_generator_.SetShouldSendAck(true); |
| 1790 } | 1811 } |
| 1791 | 1812 |
| 1792 void QuicConnection::OnRetransmissionTimeout() { | 1813 void QuicConnection::OnRetransmissionTimeout() { |
| 1793 if (!sent_packet_manager_.HasUnackedPackets()) { | 1814 if (FLAGS_quic_always_has_unacked_packets_on_timeout) { |
| 1794 return; | 1815 DCHECK(sent_packet_manager_.HasUnackedPackets()); |
| 1816 } else { |
| 1817 if (!sent_packet_manager_.HasUnackedPackets()) { |
| 1818 return; |
| 1819 } |
| 1795 } | 1820 } |
| 1796 | 1821 |
| 1797 if (close_connection_after_five_rtos_ && | 1822 if (close_connection_after_five_rtos_ && |
| 1798 sent_packet_manager_.consecutive_rto_count() >= 4) { | 1823 sent_packet_manager_.consecutive_rto_count() >= 4) { |
| 1799 // Close on the 5th consecutive RTO, so after 4 previous RTOs have occurred. | 1824 // Close on the 5th consecutive RTO, so after 4 previous RTOs have occurred. |
| 1800 CloseConnection(QUIC_TOO_MANY_RTOS, "5 consecutive retransmission timeouts", | 1825 CloseConnection(QUIC_TOO_MANY_RTOS, "5 consecutive retransmission timeouts", |
| 1801 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); | 1826 ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); |
| 1802 return; | 1827 return; |
| 1803 } | 1828 } |
| 1804 | 1829 |
| (...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2362 } | 2387 } |
| 2363 | 2388 |
| 2364 StringPiece QuicConnection::GetCurrentPacket() { | 2389 StringPiece QuicConnection::GetCurrentPacket() { |
| 2365 if (current_packet_data_ == nullptr) { | 2390 if (current_packet_data_ == nullptr) { |
| 2366 return StringPiece(); | 2391 return StringPiece(); |
| 2367 } | 2392 } |
| 2368 return StringPiece(current_packet_data_, last_size_); | 2393 return StringPiece(current_packet_data_, last_size_); |
| 2369 } | 2394 } |
| 2370 | 2395 |
| 2371 } // namespace net | 2396 } // namespace net |
| OLD | NEW |