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

MUST NOT bundle, etc. #3853

Closed
ekr opened this issue Jul 8, 2020 · 11 comments
Closed

MUST NOT bundle, etc. #3853

ekr opened this issue Jul 8, 2020 · 11 comments
Labels
-transport editorial An issue that does not affect the design of the protocol; does not require consensus.

Comments

@ekr
Copy link
Collaborator

ekr commented Jul 8, 2020

A receiver MUST NOT bundle an ack-eliciting frame with packets that would
otherwise be non-ack-eliciting, to avoid an infinite feedback loop of
acknowledgements.

This text seems weird. Suppose I have an implementation which tries to send out data packets on a specific clock (e.g., one per second). This isn't totally unrealistic for media. Now suppose my ACK delay timer fires and I want to send an ACK. This text would prohibit my from sending the data packet early to save packets. Surely that's not what's intended.

@huitema
Copy link
Contributor

huitema commented Jul 8, 2020

I think this is in reaction to the practice of bundling a ping with an ack to trigger an ack of ack. Yes, if both peers bundle a ping with every ack you would get an infinite ping pong. But you would have to be crazy to do that. Plus, bundling a ping with every Nth ack for N > 1 is actually a good way to trigger ack of ack.

@martinthomson
Copy link
Member

This has always been hard to capture. In short, you can't only send ack-eliciting packets to acknowledge.

An endpoint MUST NOT send packets that are exclusively ack-eliciting as this can result in an infinite feedback loop. It is necessary to send packets that are not ack-eliciting to allow the connection to become idle.

@martinthomson martinthomson added -transport editorial An issue that does not affect the design of the protocol; does not require consensus. labels Jul 8, 2020
@huitema
Copy link
Contributor

huitema commented Jul 8, 2020

@martinthomson I think part of the issue is the double negation in "MUST NOT send packets that are exclusively ack-eliciting", which makes it kinda hard to grasp by non-natives. Something like "end points MUST NOT force all their packets to elicit an acknowledgement" would be easier.

@martinthomson
Copy link
Member

So the above or below is OK?

An endpoint MUST NOT send only ack-eliciting packets as this can result in an infinite feedback loop. It is necessary to send packets that are not ack-eliciting to allow the connection to become idle.

@huitema
Copy link
Contributor

huitema commented Jul 8, 2020

No, I don't think that works. You are speaking of generic ack-eliciting packets, or not, but the problem is much better described and understood if you make a specific statement about ack, ack of ack, and ack loops. You may want to generalize after that to other non ack eliciting frames, but the only such in the main spec are path challenges, so that's not a very high priority.

@ianswett
Copy link
Contributor

ianswett commented Jul 8, 2020

It's not really the bundling that's the issue, but the idea that one shouldn't send extra ack-eliciting frames when sending an ack.

This isn't shorter, but how about:
"A receiver MUST NOT generate and bundle an ack-eliciting frame with packets that would
otherwise be non-ack-eliciting, to avoid an infinite feedback loop of acknowledgements."

@ekr
Copy link
Collaborator Author

ekr commented Jul 8, 2020 via email

@huitema
Copy link
Contributor

huitema commented Jul 9, 2020

Alomost there. I like EKR's text, except for the once per round trip part. Don't do that, because it leads to a loop of round trip period.

@ekr
Copy link
Collaborator Author

ekr commented Jul 9, 2020 via email

@MikeBishop
Copy link
Contributor

I also touched this text in #3805; there was previously an "all" that dramatically changes the meaning of the restriction that got dropped somewhere, so I put it back.

A receiver MUST NOT send an ack-eliciting frame in all packets that would otherwise be non-ack-eliciting, to avoid an infinite feedback loop of acknowledgements.

The point is that it's okay to toss a PING in to your ACK-only packets once in a while so you can clear out old ACK ranges, but you shouldn't do that every time you send an ACK.

@martinthomson
Copy link
Member

For some reason, this text is already in the draft. I note that @huitema's concern about 1-RTT looping remains. I'm going to close this and let those who want to deal with the looping do so (that smells a little design-y, unfortunately).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
-transport editorial An issue that does not affect the design of the protocol; does not require consensus.
Projects
None yet
Development

No branches or pull requests

5 participants