Skip to content

Commit

Permalink
Merge branch 'master' into pr4473
Browse files Browse the repository at this point in the history
  • Loading branch information
martinthomson committed Jan 12, 2021
2 parents 73be063 + 05ea410 commit bcf28d9
Show file tree
Hide file tree
Showing 5 changed files with 430 additions and 369 deletions.
2 changes: 1 addition & 1 deletion .lint.py
Expand Up @@ -7,7 +7,7 @@
parser = argparse.ArgumentParser(description="Lint markdown drafts.")
parser.add_argument("files", metavar="file", nargs="+", help="Files to lint")
parser.add_argument("-l", dest="maxLineLength", default=80)
parser.add_argument("-f", dest="maxFigureLineLength", default=65)
parser.add_argument("-f", dest="maxFigureLineLength", default=66)

args = parser.parse_args()

Expand Down
39 changes: 19 additions & 20 deletions draft-ietf-quic-invariants.md
Expand Up @@ -58,8 +58,7 @@ informative:
--- abstract

This document defines the properties of the QUIC transport protocol that are
expected to remain unchanged over time as new versions of the protocol are
developed.
common to all versions of the protocol.


--- note_Note_to_Readers
Expand Down Expand Up @@ -102,9 +101,9 @@ minimal amount of information that is made available to entities other than
endpoints. Unless specifically prohibited in this document, any aspect of the
protocol can change between different versions.

{{bad-assumptions}} is a non-exhaustive list of some incorrect assumptions that
might be made based on knowledge of QUIC version 1; these do not apply to every
version of QUIC.
{{bad-assumptions}} contains a non-exhaustive list of some incorrect assumptions
that might be made based on knowledge of QUIC version 1; these do not apply to
every version of QUIC.


# Conventions and Definitions
Expand All @@ -119,8 +118,8 @@ This document uses terms and notational conventions from {{QUIC-TRANSPORT}}.

# Notational Conventions

Packet diagrams in this document use a format defined in {{QUIC-TRANSPORT}} to
illustrate the order and size of fields.
The format of packets is described using the notation defined in this section.
This notation is the same as that used in {{QUIC-TRANSPORT}}.

Complex fields are named and then followed by a list of fields surrounded by a
pair of matching braces. Each field in this list is separated by commas.
Expand All @@ -137,12 +136,12 @@ x (A..B):
a minimum of zero bits and B can be omitted to indicate no set upper limit;
values in this format always end on an byte boundary

x (?) = C:
: Indicates that x has a fixed value of C
x (L) = C:
: Indicates that x, with a length described by L, has a fixed value of C

x (E) ...:
x (L) ...:
: Indicates that x is repeated zero or more times (and that each instance is
length E)
length L)

This document uses network byte order (that is, big endian) values. Fields
are placed starting from the high-order bits of each byte.
Expand Down Expand Up @@ -316,8 +315,8 @@ packet it receives in the Destination Connection ID field. The value for Source
Connection ID MUST be copied from the Destination Connection ID of the received
packet, which is initially randomly selected by a client. Echoing both
connection IDs gives clients some assurance that the server received the packet
and that the Version Negotiation packet was not generated by an off-path
attacker.
and that the Version Negotiation packet was not generated by an attacker that is
unable to observe packets.

An endpoint that receives a Version Negotiation packet might change the version
that it decides to use for subsequent packets. The conditions under which an
Expand All @@ -343,9 +342,9 @@ reliably extracting information from a flow based on version-specific traits
requires that middleboxes retain state for every connection ID they see.

The Version Negotiation packet described in this document is not
integrity-protected; it only has modest protection against insertion by off-path
attackers. An endpoint MUST authenticate the semantic content of a Version Negotiation
packet if it attempts a different QUIC version as a result.
integrity-protected; it only has modest protection against insertion by
attackers. An endpoint MUST authenticate the semantic content of a Version
Negotiation packet if it attempts a different QUIC version as a result.


# IANA Considerations
Expand All @@ -361,10 +360,10 @@ There are several traits of QUIC version 1 {{QUIC-TRANSPORT}} that are not
protected from observation, but are nonetheless considered to be changeable when
a new version is deployed.

This section lists a sampling of incorrect assumptions that might be made based
on knowledge of QUIC version 1. Some of these statements are not even true for
QUIC version 1. This is not an exhaustive list; it is intended to be
illustrative only.
This section lists a sampling of incorrect assumptions that might be made about
QUIC based on knowledge of QUIC version 1. Some of these statements are not
even true for QUIC version 1. This is not an exhaustive list; it is intended to
be illustrative only.

**Any and all of the following statements can be false for a given QUIC
version:**
Expand Down
41 changes: 20 additions & 21 deletions draft-ietf-quic-recovery.md
Expand Up @@ -209,9 +209,10 @@ multiple round trips.

## No Reneging

QUIC ACKs contain information that is similar to TCP SACK, but QUIC does not
allow any acknowledged packet to be reneged, greatly simplifying implementations
on both sides and reducing memory pressure on the sender.
QUIC ACK frames contain information similar to that in TCP Selective
Acknowledgements (SACKs, {{?RFC2018}}). However, QUIC does not allow a packet
acknowledgement to be reneged, greatly simplifying implementations on both sides
and reducing memory pressure on the sender.

## More ACK Ranges

Expand All @@ -228,27 +229,25 @@ more accurate round-trip time estimate; see Section 13.2 of {{QUIC-TRANSPORT}}.
## Probe Timeout Replaces RTO and TLP

QUIC uses a probe timeout (PTO; see {{pto}}), with a timer based on TCP's RTO
computation. QUIC's PTO includes the peer's maximum expected acknowledgment
delay instead of using a fixed minimum timeout. QUIC does not collapse the
congestion window until persistent congestion ({{persistent-congestion}}) is
declared, unlike TCP, which collapses the congestion window upon expiry of an
RTO. Instead of collapsing the congestion window and declaring everything
in-flight lost, QUIC allows probe packets to temporarily exceed the congestion
window whenever the timer expires.

In doing this, QUIC avoids unnecessary congestion window reductions, obviating
the need for correcting mechanisms such as F-RTO ({{?RFC5682}}). Since QUIC does
not collapse the congestion window on a PTO expiration, a QUIC sender is not
computation; see {{?RFC6297}}. QUIC's PTO includes the peer's maximum expected
acknowledgment delay instead of using a fixed minimum timeout.

Similar to the RACK-TLP loss detection algorithm for TCP
({{?RACK=I-D.ietf-tcpm-rack}}), QUIC does not collapse the congestion window
when the PTO expires, since a single packet loss at the tail does not indicate
persistent congestion. Instead, QUIC collapses the congestion window when
persistent congestion is declared; see {{persistent-congestion}}. In doing this,
QUIC avoids unnecessary congestion window reductions, obviating the need for
correcting mechanisms such as F-RTO ({{?RFC5682}}). Since QUIC does not
collapse the congestion window on a PTO expiration, a QUIC sender is not
limited from sending more in-flight packets after a PTO expiration if it still
has available congestion window. This occurs when a sender is
application-limited and the PTO timer expires. This is more aggressive than
TCP's RTO mechanism when application-limited, but identical when not
application-limited.

A single packet loss at the tail does not indicate persistent congestion, so
QUIC specifies a time-based definition to ensure one or more packets are sent
prior to a dramatic decrease in congestion window; see
{{persistent-congestion}}.
QUIC allows probe packets to temporarily exceed the congestion window whenever
the timer expires.

## The Minimum Congestion Window is Two Packets

Expand Down Expand Up @@ -467,7 +466,7 @@ path, whereas loss detection also relies upon key availability.

Acknowledgment-based loss detection implements the spirit of TCP's Fast
Retransmit ({{?RFC5681}}), Early Retransmit ({{?RFC5827}}), FACK ({{FACK}}),
SACK loss recovery ({{?RFC6675}}), and RACK ({{?RACK=I-D.ietf-tcpm-rack}}). This
SACK loss recovery ({{?RFC6675}}), and RACK-TLP ({{?RACK}}). This
section provides an overview of how these algorithms are implemented in QUIC.

A packet is declared lost if it meets all the following conditions:
Expand Down Expand Up @@ -535,7 +534,7 @@ multiplier, is 9/8. The RECOMMENDED value of the timer granularity

Note:

: TCP's RACK ({{?RACK=I-D.ietf-tcpm-rack}}) specifies a slightly larger
: TCP's RACK ({{?RACK}}) specifies a slightly larger
threshold, equivalent to 5/4, for a similar purpose. Experience with QUIC shows
that 9/8 works well.

Expand Down Expand Up @@ -830,7 +829,7 @@ an initial value. Endpoints SHOULD use an initial congestion window of 10 times
the maximum datagram size (max_datagram_size), limited to the larger of 14720
bytes or twice the maximum datagram size. This follows the analysis and
recommendations in {{?RFC6928}}, increasing the byte limit to account for the
smaller 8 byte overhead of UDP compared to the 20 byte overhead for TCP.
smaller 8-byte overhead of UDP compared to the 20-byte overhead for TCP.

If the maximum datagram size changes during the connection, the initial
congestion window SHOULD be recalculated with the new size. If the maximum
Expand Down

0 comments on commit bcf28d9

Please sign in to comment.