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
3 // found in the LICENSE file.
5 #ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
6 #define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_
16 #include "base/containers/hash_tables.h"
17 #include "base/memory/scoped_ptr.h"
18 #include "net/base/linked_hash_map.h"
19 #include "net/quic/congestion_control/loss_detection_interface.h"
20 #include "net/quic/congestion_control/send_algorithm_interface.h"
21 #include "net/quic/quic_ack_notifier_manager.h"
22 #include "net/quic/quic_protocol.h"
23 #include "net/quic/quic_unacked_packet_map.h"
25 NET_EXPORT_PRIVATE
extern bool FLAGS_track_retransmission_history
;
26 NET_EXPORT_PRIVATE
extern bool FLAGS_enable_quic_pacing
;
31 class QuicConnectionPeer
;
32 class QuicSentPacketManagerPeer
;
37 struct QuicConnectionStats
;
39 // Class which tracks the set of packets sent on a QUIC connection and contains
40 // a send algorithm to decide when to send new packets. It keeps track of any
41 // retransmittable data associated with each packet. If a packet is
42 // retransmitted, it will keep track of each version of a packet so that if a
43 // previous transmission is acked, the data will not be retransmitted.
44 class NET_EXPORT_PRIVATE QuicSentPacketManager
{
46 // Struct to store the pending retransmission information.
47 struct PendingRetransmission
{
48 PendingRetransmission(QuicPacketSequenceNumber sequence_number
,
49 TransmissionType transmission_type
,
50 const RetransmittableFrames
& retransmittable_frames
,
51 QuicSequenceNumberLength sequence_number_length
)
52 : sequence_number(sequence_number
),
53 transmission_type(transmission_type
),
54 retransmittable_frames(retransmittable_frames
),
55 sequence_number_length(sequence_number_length
) {
58 QuicPacketSequenceNumber sequence_number
;
59 TransmissionType transmission_type
;
60 const RetransmittableFrames
& retransmittable_frames
;
61 QuicSequenceNumberLength sequence_number_length
;
64 QuicSentPacketManager(bool is_server
,
65 const QuicClock
* clock
,
66 QuicConnectionStats
* stats
,
67 CongestionFeedbackType congestion_type
);
68 virtual ~QuicSentPacketManager();
70 virtual void SetFromConfig(const QuicConfig
& config
);
72 // Called when a new packet is serialized. If the packet contains
73 // retransmittable data, it will be added to the unacked packet map.
74 void OnSerializedPacket(const SerializedPacket
& serialized_packet
);
76 // Called when a packet is retransmitted with a new sequence number.
77 // Replaces the old entry in the unacked packet map with the new
79 void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number
,
80 QuicPacketSequenceNumber new_sequence_number
);
82 // Processes the incoming ack and returns true if the retransmission or ack
83 // alarm should be reset.
84 bool OnIncomingAck(const ReceivedPacketInfo
& received_info
,
85 QuicTime ack_receive_time
);
87 // Discards any information for the packet corresponding to |sequence_number|.
88 // If this packet has been retransmitted, information on those packets
89 // will be discarded as well. Also discards it from the congestion window if
91 void DiscardUnackedPacket(QuicPacketSequenceNumber sequence_number
);
93 // Returns true if the non-FEC packet |sequence_number| is unacked.
94 bool IsUnacked(QuicPacketSequenceNumber sequence_number
) const;
96 // Requests retransmission of all unacked packets of |retransmission_type|.
97 void RetransmitUnackedPackets(RetransmissionType retransmission_type
);
99 // Returns true if the unacked packet |sequence_number| has retransmittable
100 // frames. This will only return false if the packet has been acked, if a
101 // previous transmission of this packet was ACK'd, or if this packet has been
102 // retransmitted as with different sequence number.
103 bool HasRetransmittableFrames(QuicPacketSequenceNumber sequence_number
) const;
105 // Returns true if there are pending retransmissions.
106 bool HasPendingRetransmissions() const;
108 // Retrieves the next pending retransmission.
109 PendingRetransmission
NextPendingRetransmission();
111 bool HasUnackedPackets() const;
113 // Returns the smallest sequence number of a serialized packet which has not
114 // been acked by the peer. If there are no unacked packets, returns 0.
115 QuicPacketSequenceNumber
GetLeastUnackedSentPacket() const;
117 // Called when a congestion feedback frame is received from peer.
118 virtual void OnIncomingQuicCongestionFeedbackFrame(
119 const QuicCongestionFeedbackFrame
& frame
,
120 const QuicTime
& feedback_receive_time
);
122 // Called when we have sent bytes to the peer. This informs the manager both
123 // the number of bytes sent and if they were retransmitted. Returns true if
124 // the sender should reset the retransmission timer.
125 virtual bool OnPacketSent(QuicPacketSequenceNumber sequence_number
,
128 TransmissionType transmission_type
,
129 HasRetransmittableData has_retransmittable_data
);
131 // Called when the retransmission timer expires.
132 virtual void OnRetransmissionTimeout();
134 // Calculate the time until we can send the next packet to the wire.
135 // Note 1: When kUnknownWaitTime is returned, there is no need to poll
136 // TimeUntilSend again until we receive an OnIncomingAckFrame event.
137 // Note 2: Send algorithms may or may not use |retransmit| in their
139 virtual QuicTime::Delta
TimeUntilSend(QuicTime now
,
140 TransmissionType transmission_type
,
141 HasRetransmittableData retransmittable
,
142 IsHandshake handshake
);
144 // Returns amount of time for delayed ack timer.
145 const QuicTime::Delta
DelayedAckTime() const;
147 // Returns the current delay for the retransmission timer, which may send
148 // either a tail loss probe or do a full RTO. Returns QuicTime::Zero() if
149 // there are no retransmittable packets.
150 const QuicTime
GetRetransmissionTime() const;
152 // Returns the estimated smoothed RTT calculated by the congestion algorithm.
153 const QuicTime::Delta
SmoothedRtt() const;
155 // Returns the estimated bandwidth calculated by the congestion algorithm.
156 QuicBandwidth
BandwidthEstimate() const;
158 // Returns the size of the current congestion window in bytes. Note, this is
159 // not the *available* window. Some send algorithms may not use a congestion
160 // window and will return 0.
161 QuicByteCount
GetCongestionWindow() const;
163 // Enables pacing if it has not already been enabled, and if
164 // FLAGS_enable_quic_pacing is set.
165 void MaybeEnablePacing();
167 bool using_pacing() const { return using_pacing_
; }
170 friend class test::QuicConnectionPeer
;
171 friend class test::QuicSentPacketManagerPeer
;
173 enum ReceivedByPeer
{
175 NOT_RECEIVED_BY_PEER
,
178 enum RetransmissionTimeoutMode
{
184 typedef linked_hash_map
<QuicPacketSequenceNumber
,
185 TransmissionType
> PendingRetransmissionMap
;
187 // Process the incoming ack looking for newly ack'd data packets.
188 void HandleAckForSentPackets(const ReceivedPacketInfo
& received_info
);
190 // Called when a packet is timed out, such as an RTO. Removes the bytes from
191 // the congestion manager, but does not change the congestion window size.
192 void OnPacketAbandoned(QuicPacketSequenceNumber sequence_number
);
194 // Returns the current retransmission mode.
195 RetransmissionTimeoutMode
GetRetransmissionMode() const;
197 // Retransmits all crypto stream packets.
198 void RetransmitCryptoPackets();
200 // Retransmits the oldest pending packet.
201 void RetransmitOldestPacket();
203 // Retransmits all the packets and abandons by invoking a full RTO.
204 void RetransmitAllPackets();
206 // Returns the timer for retransmitting crypto handshake packets.
207 const QuicTime::Delta
GetCryptoRetransmissionDelay() const;
209 // Returns the timer for a new tail loss probe.
210 const QuicTime::Delta
GetTailLossProbeDelay() const;
212 // Returns the retransmission timeout, after which a full RTO occurs.
213 const QuicTime::Delta
GetRetransmissionDelay() const;
215 // Update the RTT if the ack is for the largest acked sequence number.
216 void MaybeUpdateRTT(const ReceivedPacketInfo
& received_info
,
217 const QuicTime
& ack_receive_time
);
219 // Chooses whether to nack retransmit any packets based on the receipt info.
220 // All acks have been handled before this method is invoked.
221 void MaybeRetransmitOnAckFrame(const ReceivedPacketInfo
& received_info
,
222 const QuicTime
& ack_receive_time
);
224 // Invokes the loss detection algorithm and loses and retransmits packets if
226 void InvokeLossDetection(QuicTime time
);
228 // Marks |sequence_number| as being fully handled, either due to receipt
229 // by the peer, or having been discarded as indecipherable. Returns an
230 // iterator to the next remaining unacked packet.
231 QuicUnackedPacketMap::const_iterator
MarkPacketHandled(
232 QuicPacketSequenceNumber sequence_number
,
233 ReceivedByPeer received_by_peer
);
235 // Request that |sequence_number| be retransmitted after the other pending
236 // retransmissions. Does not add it to the retransmissions if it's already
237 // a pending retransmission.
238 void MarkForRetransmission(QuicPacketSequenceNumber sequence_number
,
239 TransmissionType transmission_type
);
241 // Newly serialized retransmittable and fec packets are added to this map,
242 // which contains owning pointers to any contained frames. If a packet is
243 // retransmitted, this map will contain entries for both the old and the new
244 // packet. The old packet's retransmittable frames entry will be NULL, while
245 // the new packet's entry will contain the frames to retransmit.
246 // If the old packet is acked before the new packet, then the old entry will
247 // be removed from the map and the new entry's retransmittable frames will be
249 QuicUnackedPacketMap unacked_packets_
;
251 // Pending retransmissions which have not been packetized and sent yet.
252 PendingRetransmissionMap pending_retransmissions_
;
254 // Tracks if the connection was created by the server.
257 // An AckNotifier can register to be informed when ACKs have been received for
258 // all packets that a given block of data was sent in. The AckNotifierManager
259 // maintains the currently active notifiers.
260 AckNotifierManager ack_notifier_manager_
;
262 const QuicClock
* clock_
;
263 QuicConnectionStats
* stats_
;
264 scoped_ptr
<SendAlgorithmInterface
> send_algorithm_
;
265 scoped_ptr
<LossDetectionInterface
> loss_algorithm_
;
266 QuicTime::Delta rtt_sample_
; // RTT estimate from the most recent ACK.
267 QuicPacketSequenceNumber largest_observed_
; // From the most recent ACK.
268 // Number of outstanding crypto handshake packets.
269 size_t pending_crypto_packet_count_
;
270 // Number of times the RTO timer has fired in a row without receiving an ack.
271 size_t consecutive_rto_count_
;
272 // Number of times the tail loss probe has been sent.
273 size_t consecutive_tlp_count_
;
274 // Number of times the crypto handshake has been retransmitted.
275 size_t consecutive_crypto_retransmission_count_
;
276 // Maximum number of tail loss probes to send before firing an RTO.
277 size_t max_tail_loss_probes_
;
280 DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager
);
285 #endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_