-
Notifications
You must be signed in to change notification settings - Fork 204
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
ACK of ACK are useful #2546
Comments
I'd argue that ACK+PING isn't a hack, but instead a simple way for the sender, whose state we're trying to limit, to balance the amount of state it stores vs the extra ACKs being received. Getting the peer to implement the correct ACK behavior by sending a single extra byte is much simpler and more robust in my experience than relying on the receiver to implement an "ACK every 10/20/etc ACKs" policy in a way that every sender is happy with. This could likely use more text and there's still an outstanding editorial issue to move most of the ACK sending text that's in recovery into transport, so it's all in one place, since I believe there are currently a few subtle inconsistencies. |
Completely agree. Ian hits on the key point here. In the case of an
endpoint that would like to limit the amount of state it stores, it's
highly desirable for THAT endpoint to be in control. ACK+PING, satisfies
that. Relying on ACKs of ACKs from the peer does not, sadly.
…On Sat, Mar 23, 2019 at 4:45 PM ianswett ***@***.***> wrote:
I'd argue that ACK+PING isn't a hack, but instead a simple way for the
sender, whose state we're trying to limit, to balance the amount of state
it stores vs the extra ACKs being received.
Getting the peer to implement the correct ACK behavior by sending a single
extra byte is much simpler and more robust in my experience than relying on
the receiver to implement an "ACK every 10/20/etc ACKs" policy in a way
that every sender is happy with.
This could likely use more text and there's still an outstanding editorial
issue to move most of the ACK sending text that's in recovery into
transport, so it's all in one place, since I believe there are currently a
few subtle inconsistencies.
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#2546 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/ASp6ylBWKH5j6-TBeb21ZPBIzGuBNMnZks5vZryJgaJpZM4cE7-W>
.
|
Agreed with @ianswett. Irrespective of what we recommend here, note that a sender of ACKs cannot assume what the peer will do -- when the peer will send an ACK for ACKs, I mean -- so, it will end up having to send a periodic PING anyways. Piggybacking a PING periodically (once an RTT, for example) is useful for RTT measurement as well, since ACK of ACKs do not get used for RTT (see #2568 for more discussion on this point). |
An alternative would be allowing sending ACKs-of-ACKs, if you are sending non-(ACK|PADDING) frames. So, maybe: "An endpoint MUST NOT send a packet containing only ACK or PADDING frames in response to a packet containing only ACK or PADDING frames, if the previous packet it sent contained only ACK or PADDING frames." |
As discussed in London, @ianswett to write a PR with some advisory text |
Fixes #2546 If there's anything else discussed in London that I missed, please tell me.
The transport spec says in section 13.1.1: "An endpoint MUST NOT send a packet containing only an ACK frame in response to a packet containing only ACK or PADDING frames, even if there are packet gaps which precede the received packet. This prevents an indefinite feedback loop of ACKs."
I argue that this MUST NOT should be changed to SHOULD NOT. Fist, the infinite feedback can be prevented if, for example, an implementation only sends an ACK for N packets received, so there is really no need to be that strict. Second, ACK of ACK are generally useful. They enable trimming the grow of ACK lists in a controlled way.
In fact, I found that problem in interop tests. Some implementations would send thousands of data packets without sending a single ACK of ACK. That means the sender is stuck with a large ACK dashboard. Yes, it could be trimmed with timers, but that's hardly a controlled process. I fixed this by sending an ACK + PING packet whenever there the unacked ACK list is too long, but that's a hack.
The text was updated successfully, but these errors were encountered: