blob: 0a91709d1a06e589e18c3815c74a786ec966308d [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"
ianswett95cf3832020-01-21 07:58:25 -080015#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050016#include "net/third_party/quiche/src/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
QUICHE teama6ef0a62019-03-07 20:34:33 -050029// One eighth RTT delay when doing ack decimation.
30const float kShortAckDecimationDelay = 0.125;
31} // namespace
32
QUICHE team1dfa46b2019-03-22 10:39:10 -070033QuicReceivedPacketManager::QuicReceivedPacketManager()
34 : QuicReceivedPacketManager(nullptr) {}
35
QUICHE teama6ef0a62019-03-07 20:34:33 -050036QuicReceivedPacketManager::QuicReceivedPacketManager(QuicConnectionStats* stats)
37 : ack_frame_updated_(false),
38 max_ack_ranges_(0),
39 time_largest_observed_(QuicTime::Zero()),
40 save_timestamps_(false),
41 stats_(stats),
QUICHE teama6ef0a62019-03-07 20:34:33 -050042 num_retransmittable_packets_received_since_last_ack_sent_(0),
43 min_received_before_ack_decimation_(kMinReceivedBeforeAckDecimation),
haoyuewange7415a52020-07-27 17:12:26 -070044 ack_frequency_(kDefaultRetransmittablePacketsBeforeAck),
QUICHE teama6ef0a62019-03-07 20:34:33 -050045 ack_decimation_delay_(kAckDecimationDelay),
46 unlimited_ack_decimation_(false),
ianswett95cf3832020-01-21 07:58:25 -080047 one_immediate_ack_(false),
haoyuewang2d2fdd12020-09-16 11:26:56 -070048 ignore_order_(false),
ianswett309987e2019-08-02 13:16:26 -070049 local_max_ack_delay_(
50 QuicTime::Delta::FromMilliseconds(kDefaultDelayedAckTimeMs)),
QUICHE teama6ef0a62019-03-07 20:34:33 -050051 ack_timeout_(QuicTime::Zero()),
52 time_of_previous_received_packet_(QuicTime::Zero()),
haoyuewang2d2fdd12020-09-16 11:26:56 -070053 was_last_packet_missing_(false),
54 last_ack_frequency_frame_sequence_number_(-1) {}
QUICHE teama6ef0a62019-03-07 20:34:33 -050055
56QuicReceivedPacketManager::~QuicReceivedPacketManager() {}
57
58void QuicReceivedPacketManager::SetFromConfig(const QuicConfig& config,
59 Perspective perspective) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050060 if (config.HasClientSentConnectionOption(kAKD3, perspective)) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050061 ack_decimation_delay_ = kShortAckDecimationDelay;
62 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050063 if (config.HasClientSentConnectionOption(kAKDU, perspective)) {
64 unlimited_ack_decimation_ = true;
65 }
ianswettba594832020-03-09 08:53:15 -070066 if (config.HasClientSentConnectionOption(k1ACK, perspective)) {
ianswett95cf3832020-01-21 07:58:25 -080067 one_immediate_ack_ = true;
68 }
QUICHE teama6ef0a62019-03-07 20:34:33 -050069}
70
71void QuicReceivedPacketManager::RecordPacketReceived(
72 const QuicPacketHeader& header,
73 QuicTime receipt_time) {
74 const QuicPacketNumber packet_number = header.packet_number;
75 DCHECK(IsAwaitingPacket(packet_number)) << " packet_number:" << packet_number;
fayangf477f732019-06-20 07:03:06 -070076 was_last_packet_missing_ = IsMissing(packet_number);
QUICHE teama6ef0a62019-03-07 20:34:33 -050077 if (!ack_frame_updated_) {
78 ack_frame_.received_packet_times.clear();
79 }
80 ack_frame_updated_ = true;
81
82 if (LargestAcked(ack_frame_).IsInitialized() &&
83 LargestAcked(ack_frame_) > packet_number) {
84 // Record how out of order stats.
85 ++stats_->packets_reordered;
86 stats_->max_sequence_reordering =
87 std::max(stats_->max_sequence_reordering,
88 LargestAcked(ack_frame_) - packet_number);
89 int64_t reordering_time_us =
90 (receipt_time - time_largest_observed_).ToMicroseconds();
91 stats_->max_time_reordering_us =
92 std::max(stats_->max_time_reordering_us, reordering_time_us);
93 }
94 if (!LargestAcked(ack_frame_).IsInitialized() ||
95 packet_number > LargestAcked(ack_frame_)) {
96 ack_frame_.largest_acked = packet_number;
97 time_largest_observed_ = receipt_time;
98 }
99 ack_frame_.packets.Add(packet_number);
100
101 if (save_timestamps_) {
102 // The timestamp format only handles packets in time order.
103 if (!ack_frame_.received_packet_times.empty() &&
104 ack_frame_.received_packet_times.back().second > receipt_time) {
dschinazi87c39c12019-05-07 21:01:12 -0700105 QUIC_LOG(WARNING)
QUICHE teama6ef0a62019-03-07 20:34:33 -0500106 << "Receive time went backwards from: "
107 << ack_frame_.received_packet_times.back().second.ToDebuggingValue()
108 << " to " << receipt_time.ToDebuggingValue();
109 } else {
110 ack_frame_.received_packet_times.push_back(
111 std::make_pair(packet_number, receipt_time));
112 }
113 }
114
115 if (least_received_packet_number_.IsInitialized()) {
116 least_received_packet_number_ =
117 std::min(least_received_packet_number_, packet_number);
118 } else {
119 least_received_packet_number_ = packet_number;
120 }
121}
122
123bool QuicReceivedPacketManager::IsMissing(QuicPacketNumber packet_number) {
124 return LargestAcked(ack_frame_).IsInitialized() &&
125 packet_number < LargestAcked(ack_frame_) &&
126 !ack_frame_.packets.Contains(packet_number);
127}
128
129bool QuicReceivedPacketManager::IsAwaitingPacket(
QUICHE teamb23daa72019-03-21 08:37:48 -0700130 QuicPacketNumber packet_number) const {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500131 return quic::IsAwaitingPacket(ack_frame_, packet_number,
132 peer_least_packet_awaiting_ack_);
133}
134
135const QuicFrame QuicReceivedPacketManager::GetUpdatedAckFrame(
136 QuicTime approximate_now) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500137 if (time_largest_observed_ == QuicTime::Zero()) {
138 // We have received no packets.
139 ack_frame_.ack_delay_time = QuicTime::Delta::Infinite();
140 } else {
141 // Ensure the delta is zero if approximate now is "in the past".
142 ack_frame_.ack_delay_time = approximate_now < time_largest_observed_
143 ? QuicTime::Delta::Zero()
144 : approximate_now - time_largest_observed_;
145 }
146 while (max_ack_ranges_ > 0 &&
147 ack_frame_.packets.NumIntervals() > max_ack_ranges_) {
148 ack_frame_.packets.RemoveSmallestInterval();
149 }
150 // Clear all packet times if any are too far from largest observed.
151 // It's expected this is extremely rare.
152 for (auto it = ack_frame_.received_packet_times.begin();
153 it != ack_frame_.received_packet_times.end();) {
154 if (LargestAcked(ack_frame_) - it->first >=
155 std::numeric_limits<uint8_t>::max()) {
156 it = ack_frame_.received_packet_times.erase(it);
157 } else {
158 ++it;
159 }
160 }
161
dschinazi440ea722020-08-26 18:21:54 -0700162#if QUIC_FRAME_DEBUG
163 QuicFrame frame = QuicFrame(&ack_frame_);
164 frame.delete_forbidden = true;
165 return frame;
166#else // QUIC_FRAME_DEBUG
QUICHE teama6ef0a62019-03-07 20:34:33 -0500167 return QuicFrame(&ack_frame_);
dschinazi440ea722020-08-26 18:21:54 -0700168#endif // QUIC_FRAME_DEBUG
QUICHE teama6ef0a62019-03-07 20:34:33 -0500169}
170
171void QuicReceivedPacketManager::DontWaitForPacketsBefore(
172 QuicPacketNumber least_unacked) {
173 if (!least_unacked.IsInitialized()) {
174 return;
175 }
176 // ValidateAck() should fail if peer_least_packet_awaiting_ack shrinks.
177 DCHECK(!peer_least_packet_awaiting_ack_.IsInitialized() ||
178 peer_least_packet_awaiting_ack_ <= least_unacked);
179 if (!peer_least_packet_awaiting_ack_.IsInitialized() ||
180 least_unacked > peer_least_packet_awaiting_ack_) {
181 peer_least_packet_awaiting_ack_ = least_unacked;
182 bool packets_updated = ack_frame_.packets.RemoveUpTo(least_unacked);
183 if (packets_updated) {
184 // Ack frame gets updated because packets set is updated because of stop
185 // waiting frame.
186 ack_frame_updated_ = true;
187 }
188 }
189 DCHECK(ack_frame_.packets.Empty() ||
190 !peer_least_packet_awaiting_ack_.IsInitialized() ||
191 ack_frame_.packets.Min() >= peer_least_packet_awaiting_ack_);
192}
193
haoyuewange7415a52020-07-27 17:12:26 -0700194QuicTime::Delta QuicReceivedPacketManager::GetMaxAckDelay(
195 QuicPacketNumber last_received_packet_number,
196 const RttStats& rtt_stats) const {
haoyuewang2d2fdd12020-09-16 11:26:56 -0700197 if (AckFrequencyFrameReceived() ||
198 last_received_packet_number < PeerFirstSendingPacketNumber() +
199 min_received_before_ack_decimation_) {
haoyuewange7415a52020-07-27 17:12:26 -0700200 return local_max_ack_delay_;
201 }
202
203 // Wait for the minimum of the ack decimation delay or the delayed ack time
204 // before sending an ack.
205 QuicTime::Delta ack_delay = std::min(
206 local_max_ack_delay_, rtt_stats.min_rtt() * ack_decimation_delay_);
207 if (GetQuicReloadableFlag(quic_ack_delay_alarm_granularity)) {
208 QUIC_RELOADABLE_FLAG_COUNT(quic_ack_delay_alarm_granularity);
209 ack_delay = std::max(ack_delay, kAlarmGranularity);
210 }
211 return ack_delay;
212}
213
214void QuicReceivedPacketManager::MaybeUpdateAckFrequency(
215 QuicPacketNumber last_received_packet_number) {
haoyuewang2d2fdd12020-09-16 11:26:56 -0700216 if (AckFrequencyFrameReceived()) {
217 // Skip Ack Decimation below after receiving an AckFrequencyFrame from the
218 // other end point.
219 return;
220 }
haoyuewange7415a52020-07-27 17:12:26 -0700221 if (last_received_packet_number <
222 PeerFirstSendingPacketNumber() + min_received_before_ack_decimation_) {
223 return;
224 }
225 ack_frequency_ = unlimited_ack_decimation_
226 ? std::numeric_limits<size_t>::max()
227 : kMaxRetransmittablePacketsBeforeAck;
228}
229
QUICHE teama6ef0a62019-03-07 20:34:33 -0500230void QuicReceivedPacketManager::MaybeUpdateAckTimeout(
231 bool should_last_packet_instigate_acks,
232 QuicPacketNumber last_received_packet_number,
QUICHE teama6ef0a62019-03-07 20:34:33 -0500233 QuicTime now,
ianswett309987e2019-08-02 13:16:26 -0700234 const RttStats* rtt_stats) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500235 if (!ack_frame_updated_) {
236 // ACK frame has not been updated, nothing to do.
237 return;
238 }
239
haoyuewang2d2fdd12020-09-16 11:26:56 -0700240 if (!ignore_order_ && was_last_packet_missing_ &&
241 last_sent_largest_acked_.IsInitialized() &&
QUICHE teama6ef0a62019-03-07 20:34:33 -0500242 last_received_packet_number < last_sent_largest_acked_) {
243 // Only ack immediately if an ACK frame was sent with a larger largest acked
244 // than the newly received packet number.
245 ack_timeout_ = now;
246 return;
247 }
248
249 if (!should_last_packet_instigate_acks) {
250 return;
251 }
252
253 ++num_retransmittable_packets_received_since_last_ack_sent_;
haoyuewange7415a52020-07-27 17:12:26 -0700254
haoyuewang0cc998a2020-09-08 15:02:22 -0700255 MaybeUpdateAckFrequency(last_received_packet_number);
256 if (num_retransmittable_packets_received_since_last_ack_sent_ >=
257 ack_frequency_) {
258 ack_timeout_ = now;
haoyuewange7415a52020-07-27 17:12:26 -0700259 return;
260 }
261
haoyuewang2d2fdd12020-09-16 11:26:56 -0700262 if (!ignore_order_ && HasNewMissingPackets()) {
haoyuewang0cc998a2020-09-08 15:02:22 -0700263 ack_timeout_ = now;
264 return;
QUICHE teama6ef0a62019-03-07 20:34:33 -0500265 }
266
haoyuewang0cc998a2020-09-08 15:02:22 -0700267 MaybeUpdateAckTimeoutTo(
268 now + GetMaxAckDelay(last_received_packet_number, *rtt_stats));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500269}
270
271void QuicReceivedPacketManager::ResetAckStates() {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500272 ack_frame_updated_ = false;
273 ack_timeout_ = QuicTime::Zero();
274 num_retransmittable_packets_received_since_last_ack_sent_ = 0;
275 last_sent_largest_acked_ = LargestAcked(ack_frame_);
276}
277
278void QuicReceivedPacketManager::MaybeUpdateAckTimeoutTo(QuicTime time) {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500279 if (!ack_timeout_.IsInitialized() || ack_timeout_ > time) {
280 ack_timeout_ = time;
281 }
282}
283
284bool QuicReceivedPacketManager::HasMissingPackets() const {
285 if (ack_frame_.packets.Empty()) {
286 return false;
287 }
288 if (ack_frame_.packets.NumIntervals() > 1) {
289 return true;
290 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500291 return peer_least_packet_awaiting_ack_.IsInitialized() &&
292 ack_frame_.packets.Min() > peer_least_packet_awaiting_ack_;
293}
294
295bool QuicReceivedPacketManager::HasNewMissingPackets() const {
ianswett95cf3832020-01-21 07:58:25 -0800296 if (one_immediate_ack_) {
297 return HasMissingPackets() && ack_frame_.packets.LastIntervalLength() == 1;
298 }
QUICHE teama6ef0a62019-03-07 20:34:33 -0500299 return HasMissingPackets() &&
300 ack_frame_.packets.LastIntervalLength() <= kMaxPacketsAfterNewMissing;
301}
302
303bool QuicReceivedPacketManager::ack_frame_updated() const {
304 return ack_frame_updated_;
305}
306
307QuicPacketNumber QuicReceivedPacketManager::GetLargestObserved() const {
308 return LargestAcked(ack_frame_);
309}
310
311QuicPacketNumber QuicReceivedPacketManager::PeerFirstSendingPacketNumber()
312 const {
QUICHE teama6ef0a62019-03-07 20:34:33 -0500313 if (!least_received_packet_number_.IsInitialized()) {
314 QUIC_BUG << "No packets have been received yet";
315 return QuicPacketNumber(1);
316 }
317 return least_received_packet_number_;
318}
319
fayang5d92c412020-02-19 12:10:31 -0800320bool QuicReceivedPacketManager::IsAckFrameEmpty() const {
321 return ack_frame_.packets.Empty();
322}
323
haoyuewang2d2fdd12020-09-16 11:26:56 -0700324void QuicReceivedPacketManager::OnAckFrequencyFrame(
325 const QuicAckFrequencyFrame& frame) {
326 int64_t new_sequence_number = frame.sequence_number;
327 if (new_sequence_number <= last_ack_frequency_frame_sequence_number_) {
328 // Ignore old ACK_FREQUENCY frames.
329 return;
330 }
331 last_ack_frequency_frame_sequence_number_ = new_sequence_number;
332 ack_frequency_ = frame.packet_tolerance;
333 local_max_ack_delay_ = frame.max_ack_delay;
334 ignore_order_ = frame.ignore_order;
335}
336
QUICHE teama6ef0a62019-03-07 20:34:33 -0500337} // namespace quic