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