Skip to content

Commit

Permalink
Merge branch 'master' into ianswett-fix-loss-detection
Browse files Browse the repository at this point in the history
  • Loading branch information
ianswett committed Jul 21, 2019
2 parents f079e9d + 0d68417 commit 08ea0f5
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 17 deletions.
32 changes: 17 additions & 15 deletions draft-ietf-quic-recovery.md
Expand Up @@ -514,11 +514,11 @@ and larger thresholds increase loss detection delay.

## Probe Timeout {#pto}

A Probe Timeout (PTO) triggers sending one or two probe packets when
A Probe Timeout (PTO) triggers sending one or two probe datagrams when
ack-eliciting packets are not acknowledged within the expected period of
time or the handshake has not been completed. A PTO enables a connection to
recover from loss of tail packets or acks. The PTO algorithm used in QUIC
implements the reliability functions of Tail Loss Probe
recover from loss of tail packets or acknowledgements. The PTO algorithm used
in QUIC implements the reliability functions of Tail Loss Probe
{{?TLP=I-D.dukkipati-tcpm-tcp-loss-probe}} {{?RACK}}, RTO {{?RFC5681}} and
F-RTO algorithms for TCP {{?RFC5682}}, and the timeout computation is based on
TCP's retransmission timeout period {{?RFC6298}}.
Expand Down Expand Up @@ -583,23 +583,25 @@ data has been received from the client.
Because the server could be blocked until more packets are received, the client
MUST ensure that the retransmission timer is set if the client has not received
an ACK in a Handshake packet or does not yet have 1-RTT keys. If the probe
timer expires and the client does not have any crypto data to retransmit it
MUST send a packet, containing only PADDING frames if necessary, to allow the
server to continue sending data. If Handshake keys are available to the client,
timer expires before the client has 1-RTT keys, it is possible that the client
may not have any crypto data to retransmit. However, the client MUST send a new
packet to allow the server to continue sending data. At this stage in the
connection, when few to none RTT samples have been generated, it is possible
that the probe timer expiration is due to an incorrect RTT estimate at the
client. To allow the client to improve its RTT estimate, the new packet that
it sends MUST be ack-eliciting. If Handshake 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.

Because Initial packets containing only PADDING do not elicit an
acknowledgement, they may never be acknowledged, but they are removed from
bytes in flight when the client gets Handshake keys and the Initial keys are
discarded.
Initial packets and Handshake packets may never be acknowledged, but they are
removed from bytes in flight when the Initial and Handshake keys are discarded.

### Sending Probe Packets

When a PTO timer expires, a sender MUST send at least one ack-eliciting packet
as a probe, unless there is no data available to send. An endpoint MAY send up
to two ack-eliciting packets, to avoid an expensive consecutive PTO expiration
due to a single packet loss.
to two full-sized datagrams containing ack-eliciting packets, to avoid an
expensive consecutive PTO expiration due to a single lost datagram.

It is possible that the sender has no new or previously-sent data to send. As
an example, consider the following sequence of events: new application data is
Expand Down Expand Up @@ -1233,13 +1235,13 @@ OnLossDetectionTimeout():
// to earn more anti-amplification credit,
// a Handshake packet proves address ownership.
if (has Handshake keys):
SendOneHandshakePacket()
SendOneAckElicitingHandshakePacket()
else:
SendOnePaddedInitialPacket()
SendOneAckElicitingPaddedInitialPacket()
else:
// PTO. Send new data if available, else retransmit old data.
// If neither is available, send a single PING frame.
SendOneOrTwoPackets()
SendOneOrTwoAckElicitingPackets()

pto_count++
SetLossDetectionTimer()
Expand Down
4 changes: 2 additions & 2 deletions draft-ietf-quic-transport.md
Expand Up @@ -2015,7 +2015,7 @@ estimation for the new path.

On confirming a peer's ownership of its new address, an endpoint SHOULD
immediately reset the congestion controller and round-trip time estimator for
the new path.
the new path to initial values (see Sections A.3 and B.3 in {{QUIC-RECOVERY}}).

An endpoint MUST NOT return to the send rate used for the previous path unless
it is reasonably sure that the previous send rate is valid for the new path.
Expand Down Expand Up @@ -5779,7 +5779,7 @@ Issue and pull request numbers are listed with a leading octothorp.
- Allow reuse of stateless reset tokens (#2732, #2733)
- Allow, but not require, enforcing non-duplicate transport parameters (#2689,
#2691)
- Added a active_connection_id_limit transport parameter (#1994, #1998)
- Added an active_connection_id_limit transport parameter (#1994, #1998)
- max_ack_delay transport parameter defaults to 0 (#2638, #2646)
- When sending 0-RTT, only remembered transport parameters apply (#2458, #2360,
#2466, #2461)
Expand Down

0 comments on commit 08ea0f5

Please sign in to comment.