Skip to content

Commit

Permalink
Merge branch 'master' of github.com:quicwg/base-drafts into limit-cwnd
Browse files Browse the repository at this point in the history
  • Loading branch information
vidhigoel-apple committed Nov 26, 2019
2 parents 105de29 + d7dd049 commit 78c27a7
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 60 deletions.
8 changes: 3 additions & 5 deletions CONTRIBUTING.md
Expand Up @@ -86,11 +86,6 @@ When a new draft is published, the design issues that have been closed since the

When a design issue is `closed`, it implies that the issue has a proposed resolution that is reflected in the drafts; if a `closed` design issue is labeled with `has-consensus`, it means that the incorporated resolution has Working Group consensus.

The drafts currently in the early stage are:

* HTTP/3
* QPACK
* Recovery


### Late-Stage Process
Expand All @@ -106,6 +101,9 @@ The drafts currently in the late stage are:
* Invariants
* Transport
* TLS
* HTTP/3
* QPACK
* Recovery

![diagram of the late stage workflow](workflow.png "Late Stage Workflow")

Expand Down
49 changes: 21 additions & 28 deletions draft-ietf-quic-recovery.md
Expand Up @@ -95,11 +95,11 @@ of transport and security experience, and implements mechanisms that make it
attractive as a modern general-purpose transport. The QUIC protocol is
described in {{QUIC-TRANSPORT}}.

QUIC implements the spirit of existing TCP loss recovery mechanisms, described
in RFCs, various Internet-drafts, and also those prevalent in the Linux TCP
implementation. This document describes QUIC congestion control and loss
recovery, and where applicable, attributes the TCP equivalent in RFCs,
Internet-drafts, academic papers, and/or TCP implementations.
QUIC implements the spirit of existing TCP congestion control and loss recovery
mechanisms, described in RFCs, various Internet-drafts, and also those prevalent
in the Linux TCP implementation. This document describes QUIC congestion
control and loss recovery, and where applicable, attributes the TCP equivalent
in RFCs, Internet-drafts, academic papers, and/or TCP implementations.


# Conventions and Definitions
Expand Down Expand Up @@ -131,11 +131,6 @@ Ack-eliciting Packets:
: Packets that contain ack-eliciting frames elicit an ACK from the receiver
within the maximum ack delay and are called ack-eliciting packets.

Crypto Packets:

: Packets containing CRYPTO data sent in Initial or Handshake
packets.

Out-of-order Packets:

: Packets that do not increase the largest received packet number for its
Expand Down Expand Up @@ -277,7 +272,7 @@ largest acknowledged packet in an ACK frame. While the reported ACK delay is
not used by the RTT sample measurement, it is used to adjust the RTT sample in
subsequent computations of smoothed_rtt and rttvar {{smoothed-rtt}}.

To avoid generating multiple RTT samples using the same packet, an ACK frame
To avoid generating multiple RTT samples for a single packet, an ACK frame
SHOULD NOT be used to update RTT estimates if it does not newly acknowledge the
largest acknowledged packet.

Expand Down Expand Up @@ -359,8 +354,9 @@ rttvar = 3/4 * rttvar + 1/4 * rttvar_sample

# Loss Detection {#loss-detection}

QUIC senders use both ack information and timeouts to detect lost packets, and
this section provides a description of these algorithms.
QUIC senders use acknowledgements to detect lost packets, and a probe
time out {{pto}} to ensure acknowledgements are received. This section
provides a description of these algorithms.

If a packet is lost, the QUIC transport needs to recover from that loss, such
as by retransmitting the data, sending an updated frame, or abandoning the
Expand Down Expand Up @@ -405,11 +401,10 @@ as TCP-NCR {{?RFC4653}}, to improve QUIC's reordering resilience.

### Time Threshold {#time-threshold}

Once a later packet packet within the same packet number space has been
acknowledged, an endpoint SHOULD declare an earlier packet lost if it was sent
a threshold amount of time in the past. To avoid declaring packets as lost too
early, this time threshold MUST be set to at least kGranularity. The time
threshold is:
Once a later packet within the same packet number space has been acknowledged,
an endpoint SHOULD declare an earlier packet lost if it was sent a threshold
amount of time in the past. To avoid declaring packets as lost too early, this
time threshold MUST be set to at least kGranularity. The time threshold is:

~~~
max(kTimeThreshold * max(smoothed_rtt, latest_rtt), kGranularity)
Expand Down Expand Up @@ -483,12 +478,12 @@ a 1-RTT packet.

When a PTO timer expires, the PTO period MUST be set to twice its current
value. This exponential reduction in the sender's rate is important because
the PTOs might be caused by loss of packets or acknowledgements due to severe
congestion. Even when there are ack-eliciting packets in-flight in multiple
packet number spaces, the exponential increase in probe timeout occurs across
all spaces to prevent excess load on the network. For example, a timeout in
the Initial packet number space doubles the length of the timeout in the
Handshake packet number space.
consecutive PTOs might be caused by loss of packets or acknowledgements due to
severe congestion. Even when there are ack-eliciting packets in-flight in
multiple packet number spaces, the exponential increase in probe timeout
occurs across all spaces to prevent excess load on the network. For example,
a timeout in the Initial packet number space doubles the length of the timeout
in the Handshake packet number space.

The life of a connection that is experiencing consecutive PTOs is limited by
the endpoint's idle timeout.
Expand Down Expand Up @@ -533,7 +528,7 @@ keys are available to the client, it MUST send a Handshake packet, and
otherwise it MUST send an Initial packet in a UDP datagram of at least 1200
bytes.

Initial packets and Handshake packets could never be acknowledged, but they are
Initial packets and Handshake packets could be never acknowledged, but they are
removed from bytes in flight when the Initial and Handshake keys are discarded.

### Sending Probe Packets
Expand All @@ -549,9 +544,7 @@ expired, the sender SHOULD send ack-eliciting packets from other packet
number spaces with in-flight data, coalescing packets if possible.

When the PTO timer expires, and there is new or previously sent unacknowledged
data, it MUST be sent. Data that was previously sent with Initial encryption
MUST be sent before Handshake data and data previously sent at Handshake
encryption MUST be sent before any ApplicationData data.
data, it MUST be sent.

It is possible the sender has no new or previously-sent data to send.
As an example, consider the following sequence of events: new application data
Expand Down
12 changes: 6 additions & 6 deletions draft-ietf-quic-tls.md
Expand Up @@ -1696,13 +1696,13 @@ secrets.
This document does not create any new IANA registries, but it registers the
values in the following registries:

* TLS ExtensionsType Registry {{!TLS-REGISTRIES=RFC8447}} - IANA is to register
the quic_transport_parameters extension found in {{quic_parameters}}. The
Recommended column is to be marked Yes. The TLS 1.3 Column is to include CH
and EE.
* TLS ExtensionType Values Registry {{!TLS-REGISTRIES=RFC8447}} - IANA is to
register the quic_transport_parameters extension found in {{quic_parameters}}.
The Recommended column is to be marked Yes. The TLS 1.3 Column is to include
CH and EE.

* QUIC Error Codes Registry {{QUIC-TRANSPORT}} - IANA is to register the
KEY_UPDATE_ERROR (0xE), as described in {{key-update-error}}.
* QUIC Transport Error Codes Registry {{QUIC-TRANSPORT}} - IANA is to register
the KEY_UPDATE_ERROR (0xE), as described in {{key-update-error}}.


--- back
Expand Down
42 changes: 21 additions & 21 deletions draft-ietf-quic-transport.md
Expand Up @@ -210,6 +210,11 @@ Server:

: The endpoint accepting incoming QUIC connections.

Address:

: When used without qualification, the tuple of IP version, IP address, UDP
protocol, and UDP port number that represents one end of a network path.

Connection ID:

: An opaque identifier that is used to identify a QUIC connection at an
Expand All @@ -223,7 +228,7 @@ Stream:

Application:

: An entity that uses QUIC to send and receive data.
: An entity that uses QUIC to send and receive data.


## Notational Conventions
Expand Down Expand Up @@ -1053,13 +1058,13 @@ Incoming packets are classified on receipt. Packets can either be associated
with an existing connection, or - for servers - potentially create a new
connection.

Hosts try to associate a packet with an existing connection. If the packet has a
non-zero-length Destination Connection ID corresponding to an existing
Endpoints try to associate a packet with an existing connection. If the packet
has a non-zero-length Destination Connection ID corresponding to an existing
connection, QUIC processes that packet accordingly. Note that more than one
connection ID can be associated with a connection; see {{connection-id}}.

If the Destination Connection ID is zero length and the packet matches the
local address and port of a connection where the host used zero-length
local address and port of a connection where the endpoint used zero-length
connection IDs, QUIC processes the packet as part of that connection.

Endpoints can send a Stateless Reset ({{stateless-reset}}) for any packets that
Expand Down Expand Up @@ -3410,27 +3415,22 @@ later time in the connection.
The QUIC packet size includes the QUIC header and protected payload, but not the
UDP or IP header.

Clients MUST ensure they send the first Initial packet in a single IP packet.
Similarly, the first Initial packet sent after receiving a Retry packet MUST be
sent in a single IP packet.

The payload of a UDP datagram carrying the first Initial packet MUST be expanded
to at least 1200 bytes, by adding PADDING frames to the Initial packet and/or by
A client MUST expand the payload of all UDP datagrams carrying Initial packets
to at least 1200 bytes, by adding PADDING frames to the Initial packet or by
coalescing the Initial packet (see {{packet-coalesce}}). Sending a UDP datagram
of this size ensures that the network path supports a reasonable Maximum
Transmission Unit (MTU), and helps reduce the amplitude of amplification attacks
caused by server responses toward an unverified client address; see
{{address-validation}}.
of this size ensures that the network path from the client to the server
supports a reasonable Maximum Transmission Unit (MTU). Padding datagrams also
helps reduce the amplitude of amplification attacks caused by server responses
toward an unverified client address; see {{address-validation}}.

The datagram containing the first Initial packet from a client MAY exceed 1200
bytes if the client believes that the Path Maximum Transmission Unit (PMTU)
supports the size that it chooses.
Datagrams containing Initial packets MAY exceed 1200 bytes if the client
believes that the Path Maximum Transmission Unit (PMTU) supports the size that
it chooses.

A server MAY send a CONNECTION_CLOSE frame with error code PROTOCOL_VIOLATION in
response to the first Initial packet it receives from a client if the UDP
datagram is smaller than 1200 bytes. It MUST NOT send any other frame type in
response, or otherwise behave as if any part of the offending packet was
processed as valid.
response to an Initial packet it receives from a client if the UDP datagram is
smaller than 1200 bytes. It MUST NOT send any other frame type in response, or
otherwise behave as if any part of the offending packet was processed as valid.

The server MUST also limit the number of bytes it sends before validating the
address of the client; see {{address-validation}}.
Expand Down

0 comments on commit 78c27a7

Please sign in to comment.