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

Add some MUSTs to congestion control #3978

Merged
merged 17 commits into from
Sep 1, 2020
Merged

Conversation

ianswett
Copy link
Contributor

@ianswett ianswett commented Aug 2, 2020

Fixes #3944

Includes some changes suggested in #3992(see below)

ISSUE:
/When a loss or ECN-CE marking is detected, NewReno halves the
congestion window, sets the slow start threshold to the new congestion
window, and then enters the recovery period./

  • The requirement is that TCP needs to reduce after CE, The RFC series
    does not now say it needs to halve, it could for example follow the
    reduction method specified in RFC8511. e.g. /When a loss or ECN-CE
    marking is detected, the sender must reduce the cwnd. NewReno halves the
    congestion window, sets the slow start threshold to the new congestion
    window, and then enters the recovery period. [RFC8511] specifies an
    alternate cwnd reduction./

ISSUE:
Similar comment in 8.3:
/Though congestion controllers generally treat reports of ECN-CE
markings as equivalent to loss [RFC8311], the exact response for each
controller could be different. /

  • This does not seem correct. Could I suggest:
    /Congestion controllers respond to reports of ECN-CE by reducing their
    rate. Markings can be treated as equivalent to loss [RFC3168], but other
    responses can be specified (e.g. [RFC8511]) [RFC8311]. /

@ianswett ianswett added the design An issue that affects the design of the protocol; resolution requires consensus. label Aug 2, 2020
@ianswett ianswett changed the title Add some MUSTs Add some MUSTs to congestion control Aug 2, 2020
Copy link
Contributor

@janaiyengar janaiyengar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

one nit, but LGTM

Comment on lines 779 to 781
Congestion avoidance uses an Additive Increase Multiplicative Decrease (AIMD)
approach that MUST increase the congestion window by one maximum packet size
per congestion window acknowledged. When a loss or ECN-CE marking is
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
Congestion avoidance uses an Additive Increase Multiplicative Decrease (AIMD)
approach that MUST increase the congestion window by one maximum packet size
per congestion window acknowledged. When a loss or ECN-CE marking is
Congestion avoidance uses an Additive Increase Multiplicative Decrease (AIMD)
approach and MUST increase the congestion window by one maximum packet size
per congestion window acknowledged. When a loss or ECN-CE marking is

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is a weird MUST to add. It just does this.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed, we can just drop this part of the change.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What are we dropping? My suggestion or the MUST increase entirely? Dropping my suggestion is fine, but I would keep the MUST increase -- that's just the definition of Reno.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The removal of the first sentence is fine. (Though we need a definition of congestion avoidance, this isn't it.)

The original text here is fine without a MUST: "Congestion avoidance uses an Additive Increase Multiplicative Decrease (AIMD) approach that increases the congestion window by one maximum packet size per congestion window". You don't need normative language, because it is definitional. If you use "MUST" you do so by identifying an actor and an action. This is saying what "congestion avoidance" is.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's not the reason we stick with Reno -- we have RFC 8312 (Cubic) as well. Reno is simple, which is why we went with it. To be clear, this is not a default requirement for QUIC. It's stated that some congestion controller is necessary, and we specify one, but implementations can use others (Section 7.)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're chartered to use a Standard congestion controller, and RFC 8312 is Informational. But as you say, people are perfectly able to plug in other congestion controllers instead; this is merely "a default scheme," in the language of the charter.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I still don't understand what the problem of referring RFC5681 normatively is?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Early in the QUIC process, the preference of the working group was to have the recovery document be complete enough that one can implement from it, and to only reference TCP RFCs informationally. I think that was the right decision both because there are some differences between QUIC and TCP and because not all the text in TCP RFCs is relevant here. As such, if there are important requirements, they should be specified in this document.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for trying to make that clearer. However, the normative language for reduction is most less strict (MUST reduce) and not specifying a concrete algorithm. I think that would be also the better approach for the increase behaviour. However, it's probably less clear what this minimum requirement is. So I would still prefer to just not use normative language here and just say NewReno does increase by one maximum packet size per congestion window acknowledged.

martinthomson added a commit that referenced this pull request Aug 18, 2020
This will mean that I can ignore those changes when rebasing.  Though
@ianswett probably should review to ensure that I retained the intent.
draft-ietf-quic-recovery.md Outdated Show resolved Hide resolved
draft-ietf-quic-recovery.md Outdated Show resolved Hide resolved
ianswett and others added 3 commits August 18, 2020 18:22
Co-authored-by: Jana Iyengar <jri.ietf@gmail.com>
Co-authored-by: Jana Iyengar <jri.ietf@gmail.com>
Markings can be treated as equivalent to loss ({{?RFC3168}}), but other
responses can be specified, such as ({{?RFC8511}}) or ({{?RFC8311}}). Failure to
correctly respond to information about ECN markings is therefore difficult to
detect.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I actually don't really understand the intention of the last sentence. This is also true for lost base congestion control or even controller which are not based on loss at all.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This text is pre-existing, but I agree it doesn't say anything important and probably could be removed.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yes I think we should remove it because it almost sounds like an incentive to deviate which we don't want to encourage.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

SG, sentence removed.

congestion window, and then enters the recovery period.
Congestion avoidance uses an Additive Increase Multiplicative Decrease (AIMD)
approach that typically increases the congestion window by one maximum datagram
size per congestion window acknowledged, and MUST NOT increase the congestion
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This MUST NOT kind of already says that QUICv1 cannot implement Cubic. Is that what we want?

Copy link
Contributor

@janaiyengar janaiyengar Aug 21, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It does not, since this document allows an endpoint to implement a different controller than the one specified here. See Section 7:

If an endpoint uses a different controller than that specified in this document,
the chosen controller MUST conform to the congestion control guidelines
specified in Section 3.1 of [RFC8085].

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then I don't see why this need to be a normative requirement.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Similar as we don't require normatively in the next part that the congestion needs be halved on loss/CE mark.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't have a strong opinion on this, but I see @mirjak point. If we're going to keep this, I think we should be clear that this MUST NOT only applies to NewReno.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Updated to start the sentence with NewReno to make it a bit clearer.

draft-ietf-quic-recovery.md Outdated Show resolved Hide resolved
martinthomson added a commit that referenced this pull request Aug 26, 2020
This adds a state machine and makes further changes to the presentation
of the congestion control states in line with that presentation.  This
rolls in the normative changes from #3978.

Closes #4045.
* set the slow start threshold to half the value of the congestion window at the
moment that loss is detected, and

* set the congestion window to the new value of the slow start
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This still say that you have to set the cwnd to ssthresh when entering recovery. Saying that you have to do this when entering recovery and then saying that you may do it it later seems confusing.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point - fixed

Copy link
Contributor Author

@ianswett ianswett left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for updating this while I was gone, looks like a good resolution.

Removes a MAY and a MUST that are no longer necessary.
@janaiyengar janaiyengar merged commit ad3605b into master Sep 1, 2020
@janaiyengar janaiyengar deleted the ianswett-must-new-reno branch September 1, 2020 19:47
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
-recovery design An issue that affects the design of the protocol; resolution requires consensus.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Reno does not require window reduction on loss
6 participants