blob: 82984ebd1d850b77c856d20536eb06427e272319 [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// 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.
4
5#include "net/third_party/quiche/src/quic/core/quic_received_packet_manager.h"
6
7#include <algorithm>
8#include <limits>
9#include <utility>
10
11#include "net/third_party/quiche/src/quic/core/congestion_control/rtt_stats.h"
12#include "net/third_party/quiche/src/quic/core/crypto/crypto_protocol.h"
13#include "net/third_party/quiche/src/quic/core/quic_connection_stats.h"
14#include "net/third_party/quiche/src/quic/platform/api/quic_bug_tracker.h"
15#include "net/third_party/quiche/src/quic/platform/api/quic_logging.h"
16
17namespace quic {
18
19namespace {
20
21// The maximum number of packets to ack immediately after a missing packet for
22// fast retransmission to kick in at the sender. This limit is created to
23// reduce the number of acks sent that have no benefit for fast retransmission.
24// Set to the number of nacks needed for fast retransmit plus one for protection
25// against an ack loss
26const size_t kMaxPacketsAfterNewMissing = 4;
27
28// Maximum number of retransmittable packets received before sending an ack.
29const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2;
30// Minimum number of packets received before ack decimation is enabled.
31// This intends to avoid the beginning of slow start, when CWNDs may be
32// rapidly increasing.
33const QuicPacketCount kMinReceivedBeforeAckDecimation = 100;
34// Wait for up to 10 retransmittable packets before sending an ack.
35const QuicPacketCount kMaxRetransmittablePacketsBeforeAck = 10;
36// One quarter RTT delay when doing ack decimation.
37const float kAckDecimationDelay = 0.25;
38// One eighth RTT delay when doing ack decimation.
39const float kShortAckDecimationDelay = 0.125;
40} // namespace
41
42QuicReceivedPacketManager::QuicReceivedPacketManager(QuicConnectionStats* stats)
43 : ack_frame_updated_(false),
44 max_ack_ranges_(0),
45 time_largest_observed_(QuicTime::Zero()),
46 save_timestamps_(false),
47 stats_(stats),
48 ack_mode_(GetQuicReloadableFlag(quic_enable_ack_decimation)
49 ? ACK_DECIMATION
50 : TCP_ACKING),
51 num_retransmittable_packets_received_since_last_ack_sent_(0),
52 min_received_before_ack_decimation_(kMinReceivedBeforeAckDecimation),
53 ack_frequency_before_ack_decimation_(
54 kDefaultRetransmittablePacketsBeforeAck),
55 ack_decimation_delay_(kAckDecimationDelay),
56 unlimited_ack_decimation_(false),
57 fast_ack_after_quiescence_(false),
58 ack_timeout_(QuicTime::Zero()),
59 time_of_previous_received_packet_(QuicTime::Zero()),
60 was_last_packet_missing_(false),
61 decide_when_to_send_acks_(
62 GetQuicReloadableFlag(quic_deprecate_ack_bundling_mode) &&
63 GetQuicReloadableFlag(quic_rpm_decides_when_to_send_acks)) {}
64
65QuicReceivedPacketManager::~QuicReceivedPacketManager() {}
66
67void QuicReceivedPacketManager::SetFromConfig(const QuicConfig& config,
68 Perspective perspective) {
69 DCHECK(decide_when_to_send_acks_);
70 if (GetQuicReloadableFlag(quic_enable_ack_decimation) &&
71 config.HasClientSentConnectionOption(kACD0, perspective)) {
72 ack_mode_ = TCP_ACKING;
73 }
74 if (config.HasClientSentConnectionOption(kACKD, perspective)) {
75 ack_mode_ = ACK_DECIMATION;
76 }
77 if (config.HasClientSentConnectionOption(kAKD2, perspective)) {
78 ack_mode_ = ACK_DECIMATION_WITH_REORDERING;
79 }
80 if (config.HasClientSentConnectionOption(kAKD3, perspective)) {
81 ack_mode_ = ACK_DECIMATION;
82 ack_decimation_delay_ = kShortAckDecimationDelay;
83 }
84 if (config.HasClientSentConnectionOption(kAKD4, perspective)) {
85 ack_mode_ = ACK_DECIMATION_WITH_REORDERING;
86 ack_decimation_delay_ = kShortAckDecimationDelay;
87 }
88 if (config.HasClientSentConnectionOption(kAKDU, perspective)) {
89 unlimited_ack_decimation_ = true;
90 }
91 if (config.HasClientSentConnectionOption(kACKQ, perspective)) {
92 fast_ack_after_quiescence_ = true;
93 }
94}
95
96void QuicReceivedPacketManager::RecordPacketReceived(
97 const QuicPacketHeader& header,
98 QuicTime receipt_time) {
99 const QuicPacketNumber packet_number = header.packet_number;
100 DCHECK(IsAwaitingPacket(packet_number)) << " packet_number:" << packet_number;
101 if (decide_when_to_send_acks_) {
102 was_last_packet_missing_ = IsMissing(packet_number);
103 }
104 if (!ack_frame_updated_) {
105 ack_frame_.received_packet_times.clear();
106 }
107 ack_frame_updated_ = true;
108
109 if (LargestAcked(ack_frame_).IsInitialized() &&
110 LargestAcked(ack_frame_) > packet_number) {
111 // Record how out of order stats.
112 ++stats_->packets_reordered;
113 stats_->max_sequence_reordering =
114 std::max(stats_->max_sequence_reordering,
115 LargestAcked(ack_frame_) - packet_number);
116 int64_t reordering_time_us =
117 (receipt_time - time_largest_observed_).ToMicroseconds();
118 stats_->max_time_reordering_us =
119 std::max(stats_->max_time_reordering_us, reordering_time_us);
120 }
121 if (!LargestAcked(ack_frame_).IsInitialized() ||
122 packet_number > LargestAcked(ack_frame_)) {
123 ack_frame_.largest_acked = packet_number;
124 time_largest_observed_ = receipt_time;
125 }
126 ack_frame_.packets.Add(packet_number);
127
128 if (save_timestamps_) {
129 // The timestamp format only handles packets in time order.
130 if (!ack_frame_.received_packet_times.empty() &&
131 ack_frame_.received_packet_times.back().second > receipt_time) {
132 LOG(WARNING)
133 << "Receive time went backwards from: "
134 << ack_frame_.received_packet_times.back().second.ToDebuggingValue()
135 << " to " << receipt_time.ToDebuggingValue();
136 } else {
137 ack_frame_.received_packet_times.push_back(
138 std::make_pair(packet_number, receipt_time));
139 }
140 }
141
142 if (least_received_packet_number_.IsInitialized()) {
143 least_received_packet_number_ =
144 std::min(least_received_packet_number_, packet_number);
145 } else {
146 least_received_packet_number_ = packet_number;
147 }
148}
149
150bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) {
151 return LargestAcked(ack_frame_).IsInitialized() &&
152 packet_number < LargestAcked(ack_frame_) &&
153 !ack_frame_.packets.Contains(packet_number);
154}
155
156bool QuicReceivedPacketManager::IsAwaitingPacket(
QUICHE teamb23daa72019-03-21 08:37:48 -0700157 QuicPacketNumber packet_number) const {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500158 return quic::IsAwaitingPacket(ack_frame_, packet_number,
159 peer_least_packet_awaiting_ack_);
160}
161
162const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame(
163 QuicTime approximate_now) {
164 if (!decide_when_to_send_acks_) {
165 ack_frame_updated_ = false;
166 }
167 if (time_largest_observed_ == QuicTime::Zero()) {
168 // We have received no packets.
169 ack_frame_.ack_delay_time = QuicTime::Delta::Infinite();
170 } else {
171 // Ensure the delta is zero if approximate now is "in the past".
172 ack_frame_.ack_delay_time = approximate_now < time_largest_observed_
173 ? QuicTime::Delta::Zero()
174 : approximate_now - time_largest_observed_;
175 }
176 while (max_ack_ranges_ > 0 &&
177 ack_frame_.packets.NumIntervals() > max_ack_ranges_) {
178 ack_frame_.packets.RemoveSmallestInterval();
179 }
180 // Clear all packet times if any are too far from largest observed.
181 // It's expected this is extremely rare.
182 for (auto it = ack_frame_.received_packet_times.begin();
183 it != ack_frame_.received_packet_times.end();) {
184 if (LargestAcked(ack_frame_) - it->first >=
185 std::numeric_limits<uint8_t>::max()) {
186 it = ack_frame_.received_packet_times.erase(it);
187 } else {
188 ++it;
189 }
190 }
191
192 return QuicFrame(&ack_frame_);
193}
194
195void QuicReceivedPacketManager::DontWaitForPacketsBefore(
196 QuicPacketNumber least_unacked) {
197 if (!least_unacked.IsInitialized()) {
198 return;
199 }
200 // ValidateAck() should fail if peer_least_packet_awaiting_ack shrinks.
201 DCHECK(!peer_least_packet_awaiting_ack_.IsInitialized() ||
202 peer_least_packet_awaiting_ack_ <= least_unacked);
203 if (!peer_least_packet_awaiting_ack_.IsInitialized() ||
204 least_unacked > peer_least_packet_awaiting_ack_) {
205 peer_least_packet_awaiting_ack_ = least_unacked;
206 bool packets_updated = ack_frame_.packets.RemoveUpTo(least_unacked);
207 if (packets_updated) {
208 // Ack frame gets updated because packets set is updated because of stop
209 // waiting frame.
210 ack_frame_updated_ = true;
211 }
212 }
213 DCHECK(ack_frame_.packets.Empty() ||
214 !peer_least_packet_awaiting_ack_.IsInitialized() ||
215 ack_frame_.packets.Min() >= peer_least_packet_awaiting_ack_);
216}
217
218void QuicReceivedPacketManager::MaybeUpdateAckTimeout(
219 bool should_last_packet_instigate_acks,
220 QuicPacketNumber last_received_packet_number,
221 QuicTime time_of_last_received_packet,
222 QuicTime now,
223 const RttStats* rtt_stats,
224 QuicTime::Delta delayed_ack_time) {
225 DCHECK(decide_when_to_send_acks_);
226 if (!ack_frame_updated_) {
227 // ACK frame has not been updated, nothing to do.
228 return;
229 }
230
231 if (was_last_packet_missing_ && last_sent_largest_acked_.IsInitialized() &&
232 last_received_packet_number < last_sent_largest_acked_) {
233 // Only ack immediately if an ACK frame was sent with a larger largest acked
234 // than the newly received packet number.
235 ack_timeout_ = now;
236 return;
237 }
238
239 if (!should_last_packet_instigate_acks) {
240 return;
241 }
242
243 ++num_retransmittable_packets_received_since_last_ack_sent_;
244 if (ack_mode_ != TCP_ACKING &&
245 last_received_packet_number >= PeerFirstSendingPacketNumber() +
246 min_received_before_ack_decimation_) {
247 // Ack up to 10 packets at once unless ack decimation is unlimited.
248 if (!unlimited_ack_decimation_ &&
249 num_retransmittable_packets_received_since_last_ack_sent_ >=
250 kMaxRetransmittablePacketsBeforeAck) {
251 ack_timeout_ = now;
252 return;
253 }
254 // Wait for the minimum of the ack decimation delay or the delayed ack time
255 // before sending an ack.
256 QuicTime::Delta ack_delay = std::min(
257 delayed_ack_time, rtt_stats->min_rtt() * ack_decimation_delay_);
258 if (fast_ack_after_quiescence_ && now - time_of_previous_received_packet_ >
259 rtt_stats->SmoothedOrInitialRtt()) {
260 // Ack the first packet out of queiscence faster, because QUIC does
261 // not pace the first few packets and commonly these may be handshake
262 // or TLP packets, which we'd like to acknowledge quickly.
263 ack_delay = QuicTime::Delta::FromMilliseconds(1);
264 }
265 MaybeUpdateAckTimeoutTo(now + ack_delay);
266 } else {
267 // Ack with a timer or every 2 packets by default.
268 if (num_retransmittable_packets_received_since_last_ack_sent_ >=
269 ack_frequency_before_ack_decimation_) {
270 ack_timeout_ = now;
271 } else if (fast_ack_after_quiescence_ &&
272 (now - time_of_previous_received_packet_) >
273 rtt_stats->SmoothedOrInitialRtt()) {
274 // Ack the first packet out of queiscence faster, because QUIC does
275 // not pace the first few packets and commonly these may be handshake
276 // or TLP packets, which we'd like to acknowledge quickly.
277 MaybeUpdateAckTimeoutTo(now + QuicTime::Delta::FromMilliseconds(1));
278 } else {
279 MaybeUpdateAckTimeoutTo(now + delayed_ack_time);
280 }
281 }
282
283 // If there are new missing packets to report, send an ack immediately.
284 if (HasNewMissingPackets()) {
285 if (ack_mode_ == ACK_DECIMATION_WITH_REORDERING) {
286 // Wait the minimum of an eighth min_rtt and the existing ack time.
287 QuicTime ack_time = now + kShortAckDecimationDelay * rtt_stats->min_rtt();
288 MaybeUpdateAckTimeoutTo(ack_time);
289 } else {
290 ack_timeout_ = now;
291 }
292 }
293
294 if (fast_ack_after_quiescence_) {
295 time_of_previous_received_packet_ = time_of_last_received_packet;
296 }
297}
298
299void QuicReceivedPacketManager::ResetAckStates() {
300 DCHECK(decide_when_to_send_acks_);
301 ack_frame_updated_ = false;
302 ack_timeout_ = QuicTime::Zero();
303 num_retransmittable_packets_received_since_last_ack_sent_ = 0;
304 last_sent_largest_acked_ = LargestAcked(ack_frame_);
305}
306
307void QuicReceivedPacketManager::MaybeUpdateAckTimeoutTo(QuicTime time) {
308 DCHECK(decide_when_to_send_acks_);
309 if (!ack_timeout_.IsInitialized() || ack_timeout_ > time) {
310 ack_timeout_ = time;
311 }
312}
313
314bool QuicReceivedPacketManager::HasMissingPackets() const {
315 if (ack_frame_.packets.Empty()) {
316 return false;
317 }
318 if (ack_frame_.packets.NumIntervals() > 1) {
319 return true;
320 }
321 if (!GetQuicRestartFlag(quic_enable_accept_random_ipn)) {
322 return ack_frame_.packets.Min() >
323 (peer_least_packet_awaiting_ack_.IsInitialized()
324 ? peer_least_packet_awaiting_ack_
325 : QuicPacketNumber(1));
326 }
327 return peer_least_packet_awaiting_ack_.IsInitialized() &&
328 ack_frame_.packets.Min() > peer_least_packet_awaiting_ack_;
329}
330
331bool QuicReceivedPacketManager::HasNewMissingPackets() const {
332 return HasMissingPackets() &&
333 ack_frame_.packets.LastIntervalLength() <= kMaxPacketsAfterNewMissing;
334}
335
336bool QuicReceivedPacketManager::ack_frame_updated() const {
337 return ack_frame_updated_;
338}
339
340QuicPacketNumber QuicReceivedPacketManager::GetLargestObserved() const {
341 return LargestAcked(ack_frame_);
342}
343
344QuicPacketNumber QuicReceivedPacketManager::PeerFirstSendingPacketNumber()
345 const {
346 if (!GetQuicRestartFlag(quic_enable_accept_random_ipn)) {
347 return QuicPacketNumber(1);
348 }
349 if (!least_received_packet_number_.IsInitialized()) {
350 QUIC_BUG << "No packets have been received yet";
351 return QuicPacketNumber(1);
352 }
353 return least_received_packet_number_;
354}
355
356} // namespace quic