Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Should we add a DELAY_ACK frame? #65

Closed
ianswett opened this issue Sep 8, 2021 · 14 comments
Closed

Should we add a DELAY_ACK frame? #65

ianswett opened this issue Sep 8, 2021 · 14 comments
Labels

Comments

@ianswett
Copy link
Collaborator

ianswett commented Sep 8, 2021

As a natural opposite to #34 adding an IMMEDIATE_ACK frame, I want to know if the WG thinks there's sufficient interest in this. I know there are use cases like WebRTC where fine control over the ACKs is desirable.

@nibanks may be interested in this, since a similar topic came up on quicwg/datagram#42

@nibanks
Copy link
Member

nibanks commented Sep 10, 2021

I would be fine with using this mechanism to solve the issues described in quicwg/datagram#42.

@mjoras
Copy link
Contributor

mjoras commented Sep 10, 2021

I think this would be very useful to have. Specifically we have seen interest similar to what @nibanks has mentioned -- existing applications that have their own "application layer" (partial) reliability and congestion control but want to leverage QUIC as a connection-oriented way to send encrypted datagrams. Having more explicit control over not-ACKing would certainly help some of these usecases.

While I would rather people design protocols around QUIC application data semantics in full (streams and DATAGRAMs and some as-yet-undesigned partial reliability feature) rather than just plumbing an existing protocol over QUIC DATAGRAMs, I think that having a facility to get more applications running over QUIC is very useful.

ianswett added a commit that referenced this issue Sep 11, 2021
@huitema
Copy link

huitema commented Sep 13, 2021

Just say NO! Really, this kind of experiment goes in the way of progressing the delayed ACK proper. We have tons of experience with delayed acks, and we understand exactly what it does. Why would we create this additional mechanism, with unproven effects?

@gorryfair
Copy link
Contributor

So, I think this naturally leads to the question of how long an ACK delay is actually acceptable for coexistence with other Internet use. Delayed ACKs our tens of packets are likely OK. I'll argue that "infinite" delay (No ACK) it is not a great place to dig into. I suggest we should instead be restricting this to a few RTTs... (10's? 100s of packets). I'd argue that for some form of reactive congestion control, feedback at least every few RTTs is necessary - this could even be a form of slower-reacting circuit-breaker, with the upper layers formally providing the responsive control to incipient ingestion.

@nibanks
Copy link
Member

nibanks commented Sep 13, 2021

I'm in agreement with @mjoras that a change like this would better be aligned with the application data semantics, unreliable datagrams in this case. As I indicated in quicwg/datagram#42 (comment), there are several reasons an application protocol would want a reduction in (not complete elimination of) generated ACKs when using unreliable datagrams. There might be additional uses, generally, for delaying ACKs, but the reasoning around it is more complicated for reliable data. For the unreliable support, I can write that up in a new extension draft (if that is the general WG consensus).

@ianswett
Copy link
Collaborator Author

The idea of this extending the ACK timeout, but not removing it completely is interesting.

An alternative design would be a DELAY_ACK frame which ensured a packet doesn't elicit an immediate ACK, but would still arm the timer for the delayed ACK alarm.

@LPardue
Copy link
Member

LPardue commented Sep 13, 2021

Given the swathe of needs and possible options, I currently think there's going to need to be some more exploration of this space with some more substantial write ups.

@ianswett
Copy link
Collaborator Author

ianswett commented Sep 13, 2021

Just say NO! Really, this kind of experiment goes in the way of progressing the delayed ACK proper. We have tons of experience with delayed acks, and we understand exactly what it does. Why would we create this additional mechanism, with unproven effects?

We already have this ACK issue with PADDING only packets, which count towards bytes in flight, but are not ack-eliciting. That design choice always terrified me. I would have been much more comfortable with something like the DELAY_ACK design I proposed just above, which would ensure you eventually get an ACK for in-flight packets.

@janaiyengar
Copy link
Collaborator

As a mechanism, we should not use a frame to signal how a different frame should be interpreted. QUIC's design generally assumes that a sender does not control how frames are packetized, and this runs afoul of that unstated assumption.

Specifying the mechanism is easy, but I don't think this is quite as straightforward to reason about, at least in the context of the ack frequency draft. Broadly, this is not about controlling ack frequency, it's about disabling acks, or partially disabling acks, which makes it harder to reason about.

Let's not do this here; as @LPardue notes, this has to become a larger conversation.

@ianswett ianswett changed the title Should we add a NO_ACK frame? Should we add a DELAY_ACK frame? Sep 13, 2021
@ianswett
Copy link
Collaborator Author

Given the pushback against my initial attempt, I'm pivoting to the DELAY_ACK frame.

I'd actually like the negotiation of this extension to indicate the delayed ack behavior applies to PADDING only and PADDING+ACK packets as well, since I think those can be a bit of a footgun, but I'd like to see what people think of the DELAY_ACK frame before writing that text.

@kazuho
Copy link
Member

kazuho commented Sep 14, 2021

@janaiyengar

As a mechanism, we should not use a frame to signal how a different frame should be interpreted. QUIC's design generally assumes that a sender does not control how frames are packetized, and this runs afoul of that unstated assumption.

I'm not sure if I agree. Yes, I agree with the statement that a frame should not affect how other frames are interpreted.

But we can think of DELAY_ACK frame as a frame that affects how a packet is processed. Assuming that we adopt IMMEDIATE_ACK, we'd have a precedent for having such a thing. Essentially, IMMEDIATE_ACK is a flag of a packet that happens to be sent as a frame. If we think that way, defining a DELAY_ACK frame (or a THIS_PACKET_IS_NOT_ACK_ELICITING frame) as makes perfect sense IMO.

@huitema
Copy link

huitema commented Sep 14, 2021

@ianswett I really think this belongs in a separate draft, and mostly a separate negotiation. It should be possible to negotiate delayed acks without also negotiating ack suppression.

@ianswett
Copy link
Collaborator Author

Thanks, I've been convinced this belongs in a separate draft, and that there may be more that goes into that draft to enable the various related use cases.

I'll leave this open for now, but likely close it and the PR in the not so distant future.

@ianswett
Copy link
Collaborator Author

Closing with no action, I think this is the wrong draft.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants