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
3 // found in the LICENSE file.
5 // TCP cubic send side congestion algorithm, emulates the behavior of
8 #ifndef NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_
9 #define NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_
11 #include "base/basictypes.h"
12 #include "base/compiler_specific.h"
13 #include "net/base/net_export.h"
14 #include "net/quic/congestion_control/cubic.h"
15 #include "net/quic/congestion_control/hybrid_slow_start.h"
16 #include "net/quic/congestion_control/send_algorithm_interface.h"
17 #include "net/quic/quic_bandwidth.h"
18 #include "net/quic/quic_protocol.h"
19 #include "net/quic/quic_time.h"
23 // Default maximum packet size used in Linux TCP implementations.
24 const QuicByteCount kDefaultTCPMSS = 1460;
27 class TcpCubicSenderPeer;
30 class NET_EXPORT_PRIVATE TcpCubicSender : public SendAlgorithmInterface {
32 // Reno option and max_tcp_congestion_window are provided for testing.
33 TcpCubicSender(const QuicClock* clock,
35 QuicTcpCongestionWindow max_tcp_congestion_window);
36 virtual ~TcpCubicSender();
38 // Start implementation of SendAlgorithmInterface.
39 virtual void SetFromConfig(const QuicConfig& config, bool is_server) OVERRIDE;
40 virtual void SetMaxPacketSize(QuicByteCount max_packet_size) OVERRIDE;
41 virtual void OnIncomingQuicCongestionFeedbackFrame(
42 const QuicCongestionFeedbackFrame& feedback,
43 QuicTime feedback_receive_time,
44 const SentPacketsMap& sent_packets) OVERRIDE;
45 virtual void OnPacketAcked(QuicPacketSequenceNumber acked_sequence_number,
46 QuicByteCount acked_bytes) OVERRIDE;
47 virtual void OnPacketLost(QuicPacketSequenceNumber largest_loss,
48 QuicTime ack_receive_time) OVERRIDE;
49 virtual bool OnPacketSent(QuicTime sent_time,
50 QuicPacketSequenceNumber sequence_number,
52 TransmissionType transmission_type,
53 HasRetransmittableData is_retransmittable) OVERRIDE;
54 virtual void OnRetransmissionTimeout(bool packets_retransmitted) OVERRIDE;
55 virtual void OnPacketAbandoned(QuicPacketSequenceNumber sequence_number,
56 QuicByteCount abandoned_bytes) OVERRIDE;
57 virtual QuicTime::Delta TimeUntilSend(
59 TransmissionType transmission_type,
60 HasRetransmittableData has_retransmittable_data,
61 IsHandshake handshake) OVERRIDE;
62 virtual QuicBandwidth BandwidthEstimate() const OVERRIDE;
63 virtual void UpdateRtt(QuicTime::Delta rtt_sample) OVERRIDE;
64 virtual QuicTime::Delta SmoothedRtt() const OVERRIDE;
65 virtual QuicTime::Delta RetransmissionDelay() const OVERRIDE;
66 virtual QuicByteCount GetCongestionWindow() const OVERRIDE;
67 // End implementation of SendAlgorithmInterface.
70 friend class test::TcpCubicSenderPeer;
72 QuicByteCount AvailableSendWindow();
73 QuicByteCount SendWindow();
75 void MaybeIncreaseCwnd(QuicPacketSequenceNumber acked_sequence_number);
76 bool IsCwndLimited() const;
77 bool InRecovery() const;
80 HybridSlowStart hybrid_slow_start_;
83 // Reno provided for testing.
86 // ACK counter for the Reno implementation.
87 int64 congestion_window_count_;
89 // Receiver side advertised window.
90 QuicByteCount receive_window_;
92 // Bytes in flight, aka bytes on the wire.
93 QuicByteCount bytes_in_flight_;
95 // Bytes sent and acked since the last loss event. Used for PRR.
96 QuicByteCount prr_out_;
97 QuicByteCount prr_delivered_;
98 size_t ack_count_since_loss_;
100 // The congestion window before the last loss event.
101 QuicByteCount bytes_in_flight_before_loss_;
103 // We need to keep track of the end sequence number of each RTT "burst".
104 bool update_end_sequence_number_;
105 QuicPacketSequenceNumber end_sequence_number_;
107 // Track the largest packet that has been sent.
108 QuicPacketSequenceNumber largest_sent_sequence_number_;
110 // Track the largest packet that has been acked.
111 QuicPacketSequenceNumber largest_acked_sequence_number_;
113 // Track the largest sequence number outstanding when a CWND cutback occurs.
114 QuicPacketSequenceNumber largest_sent_at_last_cutback_;
116 // Congestion window in packets.
117 QuicTcpCongestionWindow congestion_window_;
119 // Slow start congestion window in packets, aka ssthresh.
120 QuicTcpCongestionWindow slowstart_threshold_;
122 // Maximum number of outstanding packets for tcp.
123 QuicTcpCongestionWindow max_tcp_congestion_window_;
125 // Min RTT during this session.
126 QuicTime::Delta delay_min_;
128 // Smoothed RTT during this session.
129 QuicTime::Delta smoothed_rtt_;
131 // Mean RTT deviation during this session.
132 // Approximation of standard deviation, the error is roughly 1.25 times
133 // larger than the standard deviation, for a normally distributed signal.
134 QuicTime::Delta mean_deviation_;
136 DISALLOW_COPY_AND_ASSIGN(TcpCubicSender);
141 #endif // NET_QUIC_CONGESTION_CONTROL_TCP_CUBIC_SENDER_H_