<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.0.40 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>

<?rfc toc="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc docmapping="yes"?>

<rfc ipr="trust200902" docName="draft-ietf-quic-recovery-01" category="std">

  <front>
    <title abbrev="QUIC Loss Detection">QUIC Loss Detection and Congestion Control</title>

    <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
      <organization>Google</organization>
      <address>
        <email>jri@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>

    <date />

    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    

    <abstract>


<t>QUIC is a new multiplexed and secure transport atop UDP.  QUIC builds on decades
of transport and security experience, and implements mechanisms that make it
attractive as a modern general-purpose transport.  QUIC implements the spirit of
known TCP loss detection mechanisms, described in RFCs, various Internet-drafts,
and also those prevalent in the Linux TCP implementation.  This document
describes QUIC loss detection and congestion control, and attributes the TCP
equivalent in RFCs, Internet-drafts, academic papers, and TCP implementations.</t>



    </abstract>


    <note title="Note to Readers">


<t>Discussion of this draft takes place on the QUIC working group mailing list
(quic@ietf.org), which is archived at
<eref target="https://mailarchive.ietf.org/arch/search/?email_list=quic">https://mailarchive.ietf.org/arch/search/?email_list=quic</eref>.</t>

<t>Working Group information can be found at <eref target="https://github.com/quicwg">https://github.com/quicwg</eref>; source
code and issues list for this draft can be found at
<eref target="https://github.com/quicwg/base-drafts/labels/recovery">https://github.com/quicwg/base-drafts/labels/recovery</eref>.</t>


    </note>


  </front>

  <middle>


<section anchor="introduction" title="Introduction">

<t>QUIC is a new multiplexed and secure transport atop UDP.  QUIC builds on decades
of transport and security experience, and implements mechanisms that make it
attractive as a modern general-purpose transport.  The QUIC protocol is
described in <xref target="QUIC-TRANSPORT"/>.</t>

<t>QUIC implements the spirit of known 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.</t>

<t>This document first describes pre-requisite parts of the QUIC transmission
machinery, then discusses QUIC’s default congestion control and loss detection
mechanisms, and finally lists the various TCP mechanisms that QUIC loss
detection implements (in spirit.)</t>

<section anchor="notational-conventions" title="Notational Conventions">

<t>The words “MUST”, “MUST NOT”, “SHOULD”, and “MAY” are used in this document.
It’s not shouting; when they are capitalized, they have the special meaning
defined in <xref target="RFC2119"/>.</t>

</section>
</section>
<section anchor="design-of-the-quic-transmission-machinery" title="Design of the QUIC Transmission Machinery">

<t>All transmissions in QUIC are sent with a packet-level header, which includes a
packet sequence number (referred to below as a packet number).  These packet
numbers never repeat in the lifetime of a connection, and are monotonically
increasing, which makes duplicate detection trivial.  This fundamental design
decision obviates the need for disambiguating between transmissions and
retransmissions and eliminates significant complexity from QUIC’s interpretation
of TCP loss detection mechanisms.</t>

<t>Every packet may contain several frames.  We outline the frames that are
important to the loss detection and congestion control machinery below.</t>

<t><list style="symbols">
  <t>Retransmittable frames are frames requiring reliable delivery.  The most
common are STREAM frames, which typically contain application data.</t>
  <t>Crypto handshake data is also sent as STREAM data, and uses the reliability
machinery of QUIC underneath.</t>
  <t>ACK frames contain acknowledgment information.  QUIC uses a SACK-based
scheme, where acks express up to 256 ranges.  The ACK frame also includes a
receive timestamp for each packet newly acked.</t>
</list></t>

<section anchor="relevant-differences-between-quic-and-tcp" title="Relevant Differences Between QUIC and TCP">

<t>There are some notable differences between QUIC and TCP which are important for
reasoning about the differences between the loss recovery mechanisms employed by
the two protocols.  We briefly describe these differences below.</t>

<section anchor="monotonically-increasing-packet-numbers" title="Monotonically Increasing Packet Numbers">

<t>TCP conflates transmission sequence number at the sender with delivery sequence
number at the receiver, which results in retransmissions of the same data
carrying the same sequence number, and consequently to problems caused by
“retransmission ambiguity”.  QUIC separates the two: QUIC uses a packet sequence
number (referred to as the “packet number”) for transmissions, and any data that
is to be delivered to the receiving application(s) is sent in one or more
streams, with stream offsets encoded within STREAM frames inside of packets that
determine delivery order.</t>

<t>QUIC’s packet number is strictly increasing, and directly encodes transmission
order.  A higher QUIC packet number signifies that the packet was sent later,
and a lower QUIC packet number signifies that the packet was sent earlier.  When
a packet containing frames is deemed lost, QUIC rebundles necessary frames in a
new packet with a new packet number, removing ambiguity about which packet is
acknowledged when an ACK is received.  Consequently, more accurate RTT
measurements can be made, spurious retransmissions are trivially detected, and
mechanisms such as Fast Retransmit can be applied universally, based only on
packet number.</t>

<t>This design point significantly simplifies loss detection mechanisms for QUIC.
Most TCP mechanisms implicitly attempt to infer transmission ordering based on
TCP sequence numbers - a non-trivial task, especially when TCP timestamps are
not available.</t>

</section>
<section anchor="no-reneging" title="No Reneging">

<t>QUIC ACKs contain information that is equivalent to TCP SACK, but QUIC does not
allow any acked packet to be reneged, greatly simplifying implementations on
both sides and reducing memory pressure on the sender.</t>

</section>
<section anchor="more-ack-ranges" title="More ACK Ranges">

<t>QUIC supports up to 256 ACK ranges, opposed to TCP’s 3 SACK ranges.  In high
loss environments, this speeds recovery.</t>

</section>
<section anchor="explicit-correction-for-delayed-acks" title="Explicit Correction For Delayed Acks">

<t>QUIC ACKs explicitly encode the delay incurred at the receiver between when a
packet is received and when the corresponding ACK is sent.  This allows the
receiver of the ACK to adjust for receiver delays, specifically the delayed ack
timer, when estimating the path RTT.  This mechanism also allows a receiver to
measure and report the delay from when a packet was received by the OS kernel,
which is useful in receivers which may incur delays such as context-switch
latency before a userspace QUIC receiver processes a received packet.</t>

</section>
</section>
</section>
<section anchor="loss-detection" title="Loss Detection">

<t>We now describe QUIC’s loss detection as functions that should be called on
packet transmission, when a packet is acked, and timer expiration events.</t>

<section anchor="constants-of-interest" title="Constants of interest">

<t>Constants used in loss recovery and congestion control are based on a
combination of RFCs, papers, and common practice.  Some may need to be changed
or negotiated in order to better suit a variety of environments.</t>

<t><list style="symbols">
  <t>kMaxTLPs: 2
Maximum number of tail loss probes before an RTO fires.</t>
  <t>kReorderingThreshold: 3
Maximum reordering in packet number space before FACK style loss detection
considers a packet lost.</t>
  <t>kTimeReorderingThreshold: 1/8
Maximum reordering in time sapce before time based loss detection considers
a packet lost.  In fraction of an RTT.</t>
  <t>kMinTLPTimeout: 10ms
 Minimum time in the future a tail loss probe alarm may be set for.</t>
  <t>kMinRTOTimeout: 200ms
Minimum time in the future an RTO alarm may be set for.</t>
  <t>kDelayedAckTimeout: 25ms
The length of the peer’s delayed ack timer.</t>
</list></t>

</section>
<section anchor="variables-of-interest" title="Variables of interest">

<t>We first describe the variables required to implement the loss detection
mechanisms described in this section.</t>

<t><list style="symbols">
  <t>loss_detection_alarm: Multi-modal alarm used for loss detection.</t>
  <t>alarm_mode: QUIC maintains a single loss detection alarm, which switches
between various modes.  This mode is used to determine the duration of the
alarm.</t>
  <t>handshake_count: The number of times the handshake packets have been
retransmitted without receiving an ack.</t>
  <t>tlp_count: The number of times a tail loss probe has been sent without
receiving an ack.</t>
  <t>rto_count: The number of times an rto has been sent without receiving an ack.</t>
  <t>smoothed_rtt: The smoothed RTT of the connection, computed as described in
<xref target="RFC6298"/></t>
  <t>rttvar: The RTT variance.</t>
  <t>reordering_threshold: The largest delta between the largest acked
retransmittable packet and a packet containing retransmittable frames before
it’s declared lost.</t>
  <t>use_time_loss: When true, loss detection operates solely based on reordering
threshold in time, rather than in packet number gaps.</t>
  <t>sent_packets: An association of packet numbers to information about them.</t>
</list></t>

</section>
<section anchor="initialization" title="Initialization">

<t>At the beginning of the connection, initialize the loss detection variables as
follows:</t>

<figure><artwork><![CDATA[
   loss_detection_alarm.reset();
   handshake_count = 0;
   tlp_count = 0;
   rto_count = 0;
   reordering_threshold = kReorderingThreshold;
   use_time_loss = false;
   smoothed_rtt = 0;
   rttvar = 0;
]]></artwork></figure>

</section>
<section anchor="setting-the-loss-detection-alarm" title="Setting the Loss Detection Alarm">

<t>QUIC loss detection uses a single alarm for all timer-based loss detection.  The
duration of the alarm is based on the alarm’s mode, which is set in the packet
and timer events further below.  The function SetLossDetectionAlarm defined
below shows how the single timer is set based on the alarm mode.</t>

<t>Pseudocode for SetLossDetectionAlarm follows:</t>

<figure><artwork><![CDATA[
 SetLossDetectionAlarm():
    if (retransmittable packets are not outstanding):
      loss_detection_alarm.cancel();
      return;

    if (handshake packets are outstanding):
      // Handshake retransmission alarm.
      alarm_duration = max(1.5 * smoothed_rtt, kMinTLPTimeout) << handshake_count;
      handshake_count++;
    else if (largest sent packet is acked):
      // Early retransmit alarm.
      alarm_duration = 0.25 x smoothed_rtt;
    else if (tlp_count < kMaxTLPs):
      // Tail Loss Probe alarm.
      if (retransmittable_packets_outstanding = 1):
        alarm_duration = max(1.5 x smoothed_rtt + kDelayedAckTimeout,
                             2 x smoothed_rtt);
      else:
        alarm_duration = max (kMinTLPTimeout, 2 x smoothed_rtt);
      tlp_count++;
    else:
      // RTO alarm.
      if (rto_count = 0):
        alarm_duration = max(kMinRTOTimeout, smoothed_rtt + 4 x rttvar);
      else:
        alarm_duration = loss_detection_alarm.get_delay() << 1;
      rto_count++;

    loss_detection_alarm.set(now + alarm_duration);
]]></artwork></figure>

</section>
<section anchor="on-sending-a-packet" title="On Sending a Packet">

<t>After any packet is sent, be it a new transmission or a rebundled transmission,
the following OnPacketSent function is called.  The parameters to OnPacketSent
are as follows:</t>

<t><list style="symbols">
  <t>packet_number: The packet number of the sent packet.</t>
  <t>is_retransmittble: A boolean that indicates whether the packet contains at
least one frame requiring reliable deliver.  The retransmittability of various
QUIC frames is described in <xref target="QUIC-TRANSPORT"/>.  If false, it is still
acceptable for an ack to be received for this packet.  However, a caller MUST
NOT set is_retransmittable to true if an ack is not expected.</t>
</list></t>

<t>Pseudocode for OnPacketSent follows:</t>

<figure><artwork><![CDATA[
 OnPacketSent(packet_number, is_retransmittable):
   # TODO: Clarify the data in sent_packets.
   sent_packets[packet_number] = {now}
   if is_retransmittable:
     SetLossDetectionAlarm()
]]></artwork></figure>

</section>
<section anchor="on-ack-receipt" title="On Ack Receipt">

<t>When an ack is received, it may acknowledge 0 or more packets.</t>

<t>Pseudocode for OnAckReceived and UpdateRtt follow:</t>

<figure><artwork><![CDATA[
   OnAckReceived(ack):
     // If the largest acked is newly acked, update the RTT.
     if (sent_packets[ack.largest_acked]):
       rtt_sample = now - sent_packets[ack.largest_acked]
       if (rtt_sample > ack.ack_delay):
         rtt_sample -= ack.delay;
       UpdateRtt(rtt_sample)
     // Find all newly acked packets.
     for acked_packet in DetermineNewlyAckedPackets():
       OnPacketAcked(acked_packet)

     DetectLostPackets(ack.largest_acked_packet);
     SetLossDetectionAlarm();


   UpdateRtt(rtt_sample):
     if (smoothed_rtt == 0):
       smoothed_rtt = rtt_sample
       rttvar = rtt_sample / 2
     else:
       rttvar = 3/4 * rttvar + 1/4 * (smoothed_rtt - rtt_sample)
       smoothed_rtt = 7/8 * smoothed_rtt + 1/8 * rtt_sample
]]></artwork></figure>

</section>
<section anchor="on-packet-acknowledgment" title="On Packet Acknowledgment">

<t>When a packet is acked for the first time, the following OnPacketAcked function
is called.  Note that a single ACK frame may newly acknowledge several packets.
OnPacketAcked must be called once for each of these newly acked packets.</t>

<t>OnPacketAcked takes one parameter, acked_packet, which is the packet number of
the newly acked packet, and returns a list of packet numbers that are detected
as lost.</t>

<t>Pseudocode for OnPacketAcked follows:</t>

<figure><artwork><![CDATA[
   OnPacketAcked(acked_packet):
     handshake_count = 0;
     tlp_count = 0;
     rto_count = 0;
     # TODO: Don't remove packets immediately, since they can be used for
     # detecting spurous retransmits.
     sent_packets.remove(acked_packet);
]]></artwork></figure>

</section>
<section anchor="on-alarm-firing" title="On Alarm Firing">

<t>QUIC uses one loss recovery alarm, which when set, can be in one of several
modes.  When the alarm fires, the mode determines the action to be performed.
OnAlarm returns a list of packet numbers that are detected as lost.</t>

<t>Pseudocode for OnAlarm follows:</t>

<figure><artwork><![CDATA[
   OnAlarm(acked_packet):
     lost_packets = DetectLostPackets(acked_packet);
     MaybeRetransmitLostPackets();
     SetLossDetectionAlarm();
]]></artwork></figure>

</section>
<section anchor="detecting-lost-packets" title="Detecting Lost Packets">

<t>Packets in QUIC are only considered lost once a larger packet number is
acknowledged.  DetectLostPackets is called every time there is a new largest
packet or if the loss detection alarm fires the previous largest acked packet is
supplied.</t>

<t>DetectLostPackets takes one parameter, acked_packet, which is the packet number
of the largest acked packet, and returns a list of packet numbers detected as
lost.</t>

<t>Pseudocode for DetectLostPackets follows:</t>

<figure><artwork><![CDATA[
   DetectLostPackets(acked_packet):
     lost_packets = {};
     foreach (unacked_packet less than acked_packet):
         if (unacked_packet.time_sent <
             acked_packet.time_sent - kTimeReorderThreshold * smoothed_rtt):
           lost_packets.insert(unacked_packet.packet_number);
       else if (unacked_packet.packet_number <
                acked_packet.packet_number - reordering_threshold)
         lost_packets.insert(unacked_packet.packet_number);
     return lost_packets;
]]></artwork></figure>

</section>
</section>
<section anchor="congestion-control" title="Congestion Control">

<t>(describe NewReno-style congestion control for QUIC.)</t>

</section>
<section anchor="tcp-mechanisms-in-quic" title="TCP mechanisms in QUIC">

<t>QUIC implements the spirit of a variety of RFCs, Internet drafts, and other
well-known TCP loss recovery mechanisms, though the implementation details
differ from the TCP implementations.</t>

<section anchor="rfc-6298-rto-computation" title="RFC 6298 (RTO computation)">

<t>QUIC calculates SRTT and RTTVAR according to the standard formulas.  An RTT
sample is only taken if the delayed ack correction is smaller than the measured
RTT (otherwise a negative RTT would result), and the ack’s contains a new,
larger largest observed packet number.  min_rtt is only based on the observed
RTT, but SRTT uses the delayed ack correction delta.</t>

<t>As described above, QUIC implements RTO with the standard timeout and CWND
reduction.  However, QUIC retransmits the earliest outstanding packets rather
than the latest, because QUIC doesn’t have retransmission ambiguity.  QUIC uses
the commonly accepted min RTO of 200ms instead of the 1s the RFC specifies.</t>

</section>
<section anchor="fack-loss-recovery-paper" title="FACK Loss Recovery (paper)">

<t>QUIC implements the algorithm for early loss recovery described in the FACK
paper (and implemented in the Linux kernel.)  QUIC uses the packet number to
measure the FACK reordering threshold.  Currently QUIC does not implement an
adaptive threshold as many TCP implementations (i.e., the Linux kernel) do.</t>

</section>
<section anchor="rfc-3782-rfc-6582-newreno-fast-recovery" title="RFC 3782, RFC 6582 (NewReno Fast Recovery)">

<t>QUIC only reduces its CWND once per congestion window, in keeping with the
NewReno RFC.  It tracks the largest outstanding packet at the time the loss is
declared and any losses which occur before that packet number are considered
part of the same loss event.  It’s worth noting that some TCP implementations
may do this on a sequence number basis, and hence consider multiple losses of
the same packet a single loss event.</t>

</section>
<section anchor="tlp-draft" title="TLP (draft)">

<t>QUIC always sends two tail loss probes before RTO is triggered.  QUIC invokes
tail loss probe even when a loss is outstanding, which is different than some
TCP implementations.</t>

</section>
<section anchor="rfc-5827-early-retransmit-with-delay-timer" title="RFC 5827 (Early Retransmit) with Delay Timer">

<t>QUIC implements early retransmit with a timer in order to minimize spurious
retransmits.  The timer is set to 1/4 SRTT after the final outstanding packet is
acked.</t>

</section>
<section anchor="rfc-5827-f-rto" title="RFC 5827 (F-RTO)">

<t>QUIC implements F-RTO by not reducing the CWND and SSThresh until a subsequent
ack is received and it’s sure the RTO was not spurious.  Conceptually this is
similar, but it makes for a much cleaner implementation with fewer edge cases.</t>

</section>
<section anchor="rfc-6937-proportional-rate-reduction" title="RFC 6937 (Proportional Rate Reduction)">

<t>PRR-SSRB is implemented by QUIC in the epoch when recovering from a loss.</t>

</section>
<section anchor="tcp-cubic-draft-with-optional-rfc-5681-reno" title="TCP Cubic (draft) with optional RFC 5681 (Reno)">

<t>TCP Cubic is the default congestion control algorithm in QUIC.  Reno is also an
easily available option which may be requested via connection options and is
fully implemented.</t>

</section>
<section anchor="hybrid-slow-start-paper" title="Hybrid Slow Start (paper)">

<t>QUIC implements hybrid slow start, but disables ack train detection, because it
has shown to falsely trigger when coupled with packet pacing, which is also on
by default in QUIC.  Currently the minimum delay increase is 4ms, the maximum is
16ms, and within that range QUIC exits slow start if the min_rtt within a round
increases by more than one eighth of the connection mi</t>

</section>
<section anchor="rack-draft" title="RACK (draft)">

<t>QUIC’s loss detection is by it’s time-ordered nature, very similar to RACK.
Though QUIC defaults to loss detection based on reordering threshold in packets,
it could just as easily be based on fractions of an rtt, as RACK does.</t>

</section>
</section>
<section anchor="iana-considerations" title="IANA Considerations">

<t>This document has no IANA actions.  Yet.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

<reference anchor="QUIC-TLS" >
  <front>
    <title>Using Transport Layer Security (TLS) to Secure QUIC</title>
    <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
      <organization>Mozilla</organization>
    </author>
    <author initials="S." surname="Turner, Ed" fullname="Sean Turner" role="editor">
      <organization>sn3rd</organization>
    </author>
    <date />
  </front>
</reference>
<reference anchor="QUIC-TRANSPORT" >
  <front>
    <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
      <organization>Google</organization>
    </author>
    <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
      <organization>Mozilla</organization>
    </author>
    <date />
  </front>
</reference>




<reference  anchor='RFC2119' target='http://www.rfc-editor.org/info/rfc2119'>
<front>
<title>Key words for use in RFCs to Indicate Requirement Levels</title>
<author initials='S.' surname='Bradner' fullname='S. Bradner'><organization /></author>
<date year='1997' month='March' />
<abstract><t>In many standards track documents several words are used to signify the requirements in the specification.  These words are often capitalized. This document defines these words as they should be interpreted in IETF documents.  This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t></abstract>
</front>
<seriesInfo name='BCP' value='14'/>
<seriesInfo name='RFC' value='2119'/>
<seriesInfo name='DOI' value='10.17487/RFC2119'/>
</reference>



<reference  anchor='RFC6298' target='http://www.rfc-editor.org/info/rfc6298'>
<front>
<title>Computing TCP's Retransmission Timer</title>
<author initials='V.' surname='Paxson' fullname='V. Paxson'><organization /></author>
<author initials='M.' surname='Allman' fullname='M. Allman'><organization /></author>
<author initials='J.' surname='Chu' fullname='J. Chu'><organization /></author>
<author initials='M.' surname='Sargent' fullname='M. Sargent'><organization /></author>
<date year='2011' month='June' />
<abstract><t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer.  It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST.  This document obsoletes RFC 2988.   [STANDARDS-TRACK]</t></abstract>
</front>
<seriesInfo name='RFC' value='6298'/>
<seriesInfo name='DOI' value='10.17487/RFC6298'/>
</reference>




    </references>



<section anchor="acknowledgments" title="Acknowledgments">

</section>
<section anchor="change-log" title="Change Log">

<t><list style='empty'>
  <t><spanx style="strong">RFC Editor’s Note:</spanx>  Please remove this section prior to publication of a
final version of this document.</t>
</list></t>

<section anchor="since-draft-ietf-quic-recovery-00" title="Since draft-ietf-quic-recovery-00:">

<t><list style="symbols">
  <t>Improved description of constants and ACK behavior</t>
</list></t>

</section>
<section anchor="since-draft-iyengar-quic-loss-recovery-01" title="Since draft-iyengar-quic-loss-recovery-01:">

<t><list style="symbols">
  <t>Adopted as base for draft-ietf-quic-recovery.</t>
  <t>Updated authors/editors list.</t>
  <t>Added table of contents.</t>
</list></t>

</section>
</section>


  </back>

<!-- ##markdown-source:
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
c8z9rCuunTOgraV3X1q5/weKwd0O1EsAAA==

-->

</rfc>

