Thanks everyone. I filed #321. <https://github.com/quicwg/ack-frequency/issues/321>
On Mon, May 19, 2025 at 12:06 AM Kazuho Oku <kazuho...@gmail.com> wrote: > Nice find, Martin! > > I second Ian that this problem deserves a GitHub issue. > > Regarding how we proceed, I think we can simply remove the statement: > “When an ack-eliciting packet is received with a packet number less than > Largest Acked, this still triggers an immediate acknowledgement in an > effort to avoid the packet being spuriously declared lost.” > > Consider Packet-number-based loss detection: > > When a sender advertises an ack_frequency.reordering_threshold of N, the > assumption is that the sender will not declare a packet lost until the gap > between the packet number (PN) of an outstanding packet and the largest PN > acknowledged becomes greater than N. > > This, in turn, means that the receiver does not need to acknowledge such > packets immediately *if the PN of the out-of-order packet falls within > the gap defined by ack_frequency.reordering_threshold*. > > Otherwise, the packet must be acknowledged immediately, but in fact > Section 6.2 already states: “An endpoint that receives an ACK_FREQUENCY > frame with a non-zero Reordering Threshold value SHOULD send an immediate > ACK when the gap between the smallest Unreported Missing packet and the > Largest Unacked is greater than or equal to the Reordering Threshold value.” > > Consider Time-based loss detection: > > The idea behind time-based loss detection is that *any* packet can be > acknowledged within a certain timeframe. It is reasonable to argue that > this timeframe equals the one-way delay in each direction plus the > max_ack_delay value. Under that interpretation, it is safe to delay ACKs > for out-of-order packets that fall within the threshold advertised in the > ACK_FREQUENCY frame. > Thoughts? It has been a while since I last thought about Ack Frequency, so > I could be missing something. > > 2025年5月16日(金) 3:40 Martin Duke <martin.h.d...@gmail.com>: > >> Ack-Eliciting Threshold: >>> A variable-length integer representing the maximum number of >>> ack-eliciting packets the recipient of this frame receives before sending >>> an acknowledgment. >> >> >> ack-eliciting-threshold has no reference to packet gaps. The plain >> meaning of this definition is that, absent any other rules about gap >> fillers, every (ack_eliciting_threshold + 1) packets would be acked >> regardless of their relationship to largest_acked. >> >> On Thu, May 15, 2025 at 11:35 AM Mirja Kuehlewind < >> mirja.kuehlew...@ericsson.com> wrote: >> >>> The ack_eliciting_threshold is only defined in relation to packet gaps >>> and not when a gap gets filled. You could only relay on the normal ack >>> delay for that but that might be quite high. >>> >>> >>> >>> >>> >>> >>> >>> *From: *Martin Duke <martin.h.d...@gmail.com> >>> *Date: *Thursday, 15. May 2025 at 19:43 >>> *To: *Mirja Kuehlewind <mirja.kuehlew...@ericsson.com> >>> *Cc: *Ian Swett <ianswett=40google....@dmarc.ietf.org>, IETF QUIC WG < >>> quic@ietf.org> >>> *Subject: *Re: Old packets in draft-ietf-quic-ack-frequency-11 >>> >>> >>> >>> Compared to acking packets occasionally in accordance with >>> ack_eliciting_threshold. >>> >>> >>> >>> On Thu, May 15, 2025 at 10:27 AM Mirja Kuehlewind < >>> mirja.kuehlew...@ericsson.com> wrote: >>> >>> „accomplishes very little“ compared to what? Not acking is not an >>> option and as such we simply apply the rule that is already in RFC9000 >>> without further optimization. In other words we simply didn’t consider >>> changing/optimizating the “gap filling” logic in the draft. I guess you >>> could so something like only sending an ACK for the first packet in a gap >>> and if the gap is filled completely but that sounds all complicated. >>> >>> >>> >>> >>> >>> *From: *Martin Duke <martin.h.d...@gmail.com> >>> *Date: *Thursday, 15. May 2025 at 18:06 >>> *To: *Mirja Kuehlewind <mirja.kuehlew...@ericsson.com> >>> *Cc: *Ian Swett <ianswett=40google....@dmarc.ietf.org>, IETF QUIC WG < >>> quic@ietf.org> >>> *Subject: *Re: Old packets in draft-ietf-quic-ack-frequency-11 >>> >>> >>> >>> I agree that not sending acks at all would be a problem. >>> >>> >>> >>> I don't have any data. But my contention is that the current rule >>> accomplishes very little while making this "not super likely" case >>> considerably worse. >>> >>> >>> >>> On Thu, May 15, 2025 at 9:01 AM Mirja Kuehlewind < >>> mirja.kuehlew...@ericsson.com> wrote: >>> >>> Note that issue #306 was also related to this: >>> https://github.com/quicwg/ack-frequency/issues/306 >>> >>> >>> >>> As I said there, you could probably further optimize this but it would >>> be a mistake if you don’t send ACK for packets that arrive late at all >>> (which wasn’t clearly explicitly covered in the draft before). >>> >>> >>> >>> However, I think your example below is also not the super likely case. >>> In your examples it’s basically that packets 10 and 11 arrive earlier, >>> while a whole range of packets would get delayed. So not sure how important >>> it is to optimize for that case. I would expect it is more likely to see >>> single packets re-ordered. Do you happen to have any data on re-ordering >>> patterns? >>> >>> >>> >>> Mirja >>> >>> >>> >>> >>> >>> >>> >>> *From: *Ian Swett <ianswett=40google....@dmarc.ietf.org> >>> *Date: *Thursday, 15. May 2025 at 17:34 >>> *To: *Martin Duke <martin.h.d...@gmail.com> >>> *Cc: *IETF QUIC WG <quic@ietf.org>, Ian Swett <ianswett= >>> 40google....@dmarc.ietf.org> >>> *Subject: *Re: Old packets in draft-ietf-quic-ack-frequency-11 >>> >>> >>> >>> These are some excellent observations and please file an issue. I'm not >>> sure we want to make substantial changes, but we might want to at least >>> call this out. >>> >>> >>> >>> If the peer is accurately communicating their packet threshold in the >>> ACK_FREQUENCY frame, then I believe you're correct that this requirement to >>> immediately send an ACK is useless, at least for the purposes of packet >>> threshold loss detection. Time threshold is much more difficult to >>> reason about, particularly because transmission delays are variable and >>> timers aren't perfect. Currently the peer's ack delay is included in PTO >>> timer, but not time threshold loss detection, because this immediate ACK >>> behavior is assumed. >>> >>> >>> >>> There are some potential interactions with congestion control, >>> particularly when first entering recovery when the CWND might have >>> decreased substantially and/or you're doing packet conservation. You might >>> be able to declare a number of packets lost, but only send one or two, so >>> getting an ACK earlier could prevent some spurious retransmissions. Or it >>> might not because the ACKs you're getting might be exactly the packets >>> you've already spuriously retransmitted. >>> >>> >>> >>> Thanks, Ian >>> >>> >>> >>> On Thu, May 15, 2025 at 10:37 AM Martin Duke <martin.h.d...@gmail.com> >>> wrote: >>> >>> I'm finally turning my attention to updating our ack-frequency >>> implementation from draft-iyengar-quic-delayed-ack-01 (!!!) to the current >>> draft. >>> >>> >>> >>> *TL;DR **The ack-frequency draft defers to RFC 9000 by saying that any >>> packet < largest_acked is acked immediately regardless of any of the >>> ACK_FREQUENCY frame fields. Maybe that's suboptimal?* >>> >>> I stumbled across issue 304 >>> <https://github.com/quicwg/ack-frequency/issues/304>, which clarifies >>> that RFC 9000 rules about ACKing packets < largest_acked still apply: >>> >>> When an ack-eliciting packet is received with a packet number less than >>> Largest Acked, this still triggers an immediate acknowledgement in an >>> effort to avoid the packet being spuriously declared lost. >>> >>> >>> >>> To be clear: this totally works, and in no case makes things worse than >>> the baseline. In the "normal" case when packet gaps are loss, not >>> reordering, it has no effect at all. >>> >>> >>> >>> However, I wonder if this rule is far less than optimal in cases with a >>> lot of reordering, and may add little to no value in more common cases. >>> Loss and reordering both manifest as a sudden jump in sequence number; if a >>> reordering case, the gap packets will arrive later. The reordering_thresh >>> field can suppress the ack of this first jump, but not the followon packets >>> with lower numbers. >>> >>> >>> >>> For example, Say that ack_eliciting_threshold is 1 (the default) but >>> reordering_threshold is zero (meaning, ignore reordering). If the pattern >>> of packet arrival is 10, 11, 1, 2, 3, 4, 5, 6, 7, 8, 9, then there will be >>> 10 ACKs: one for 11, as the second packet to arrive, and then one for each >>> of 1:9 because they are all less than largest_acked. In this case, network >>> reordering has caused the ack rate to be roughly double what the receiver >>> requested. Without the text in question, one would expect an ack for 11, 2, >>> 4, 6, and 8. >>> >>> >>> >>> In the issue, the stipulation is that acking these packets will prevent >>> spurious retransmits. If true, that would be valuable. However: >>> >>> >>> >>> - If the sender is using RFC 9002 time-based recovery, the important >>> thing is that the ack arrives before the timeout. IIUC, this is best >>> ensured via requested_max_ack_delay rather than through this mechanism. >>> >>> >>> >>> - If the sender is using packet-based recovery, the additional acks >>> don't really help. If ack_eliciting_threshold is set correctly, there won't >>> be a retransmission until another ACK arrives. If the ACK is delayed till >>> another packet arrives, the sender's state for the early packet won't >>> change in the meantime. >>> >>> >>> >>> I find this hard to reason about, and am happy to be told I'm holding it >>> wrong. There are second-order considerations about lost acks, etc. But if >>> others think the text is suboptimal, I'm happy to file an issue. >>> >>> >>> >>> Martin >>> >>> > > -- > Kazuho Oku >