<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.34 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-receive-ts-02" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="QUIC Receive Timestamps">QUIC Extended Acknowledgement for Reporting Packet Receive Timestamps</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-receive-ts-02"/>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google LLC</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <author initials="J." surname="Beshay" fullname="Joseph Beshay" role="editor">
      <organization>Meta Platforms, Inc.</organization>
      <address>
        <email>jbeshay@meta.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="16"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 45?>

<t>This document defines an extension to the QUIC transport protocol which supports
reporting multiple packet receive timestamps for post-handshake packets.</t>
    </abstract>
  </front>
  <middle>
    <?line 51?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>The QUIC Transport Protocol <xref target="RFC9000"/> provides a secure, multiplexed
connection for transmitting reliable streams of application data.</t>
      <t>This document defines an extension to the QUIC transport protocol which supports
reporting multiple packet receive timestamps.</t>
    </section>
    <section anchor="motivation">
      <name>Motivation</name>
      <t>QUIC congestion control (<xref target="RFC9002"/>) supports sampling round-trip time (RTT)
by measuring the time from when a packet was sent to when it is acknowledged.
However, more precise delay signals measured via packet receive timestamps have
the potential to improve the accuracy of network bandwidth measurements and the
effectiveness of congestion control, especially for latency-critical
applications such as real-time video conferencing or game streaming.</t>
      <t>Numerous existing algorithms and techniques leverage receive timestamps
to improve transport performance. Examples include:</t>
      <ul spacing="normal">
        <li>
          <t>The WebRTC congestion control algorithm described in <xref target="I-D.ietf-rmcat-gcc"/>
uses the difference between packet inter-departure and packet inter-arrival
times as the input to its delay-based controller.</t>
        </li>
        <li>
          <t>The pathChirp (<xref target="RRBNC"/>) technique estimates available bandwidth by measuring
inter-arrival time of multiple packets.</t>
        </li>
      </ul>
      <t>Notably, these techniques require receive timestamps for more than one packet
per round-trip in order to best measure the network.</t>
      <t>Additionally, receive timestamps can provide valuable network telemetry, even
if they are not used by the congestion controller.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="frame">
      <name>New ACK_RECEIVE_TIMESTAMPS Frame Wire Format</name>
      <t>Once the receive timestamps extension is negotiated (see <xref target="negotiation"/>), an
endpoint <bcp14>MAY</bcp14> use the ACK_RECEIVE_TIMESTAMPS frame defined below to report
receive timestamps to its peer. An endpoint <bcp14>MAY</bcp14> continue to use the existing
ACK frames as specified in <xref section="19.3" sectionFormat="of" target="RFC9000"/> if it does not have any
receive timestamps or does not want to report them.</t>
      <t>Endpoints send ACK_RECEIVE_TIMESTAMPS frames in 1-RTT packets, with 0
or more receive timestamps following the Ack Ranges and optional ECN Counts.
Similar to to the ACK frame types (x02..0x03), the ACK_RECEIVE_TIMESTAMPS
frame defines two frame types (0x03178307..0x03178308) to indicate whether the frame
includes ECN counts.
ACK frames are never sent in 0-RTT packets, so the same applies to
ACK_RECEIVE_TIMESTAMPS frames.</t>
      <figure anchor="fig-frame">
        <name>ACK Frame Format</name>
        <artwork><![CDATA[
ACK_RECEIVE_TIMESTAMPS Frame {
  Type (i) = 0x03178307..0x03178308,
  Largest Acknowledged (i),
  ACK Delay (i),
  ACK Range Count (i),
  First ACK Range (i),
  ACK Range (..) ...,
  [ECN Counts (..)],       // included iff Type == 0x03178308
  Receive Timestamps (..)  // see {{ts-ranges}}
}
]]></artwork>
      </figure>
      <t>The fields Largest Acknowledged, ACK Delay, ACK Range Count, First ACK Range,
ACK Range and ECN Counts are the same as for ACK (type=0x02..0x03) frames
specified in <xref section="19.3" sectionFormat="of" target="RFC9000"/>.</t>
      <t>The format of the Receive Timestamps field is shown in
<xref target="fig-receive-timestamps"/>.</t>
      <figure anchor="fig-receive-timestamps">
        <name>Receive Timestamps Fields</name>
        <artwork><![CDATA[
Receive Timestamps {
  Timestamp Range Count (i),
  Timestamp Range (..) ...
}
]]></artwork>
      </figure>
      <dl>
        <dt>Timestamp Range Count:</dt>
        <dd>
          <t>A variable-length integer specifying the number of Timestamp Range fields in
the frame.</t>
        </dd>
        <dt>Timestamp Ranges:</dt>
        <dd>
          <t>Ranges of receive timestamps for contiguous packets in descending packet
number order; see <xref target="ts-ranges"/>.</t>
        </dd>
      </dl>
      <section anchor="ts-ranges">
        <name>Timestamp Ranges</name>
        <t>Each Timestamp Range describes a series of contiguous packet receive timestamps
in descending sequential packet number (and descending timestamp) order.
Timestamp Ranges consist of a Delta Largest Acknowledged indicating the
largest packet number in the range, followed by a list of Timestamp Deltas
describing the relative receive timestamps for each contiguous packet in the
Timestamp Range (descending). Packets within a range are in descending
packet number and timestamp order. Ranges are in descending timestamp order
but do not have to be in descending packet number order.</t>
        <t>Each packet in a range <bcp14>MUST</bcp14> be an acknowledged packet,
i.e., the packet number <bcp14>MUST</bcp14> have been included in an ACK Range
in the current or a previously sent ACK, ACK_RECEIVE_TIMESTAMPS, PATH_ACK,
or PATH_ACK_RECEIVE_TIMESTAMPS frame.</t>
        <t>Timestamp Ranges are structured as shown in <xref target="fig-ts-range"/>.</t>
        <figure anchor="fig-ts-range">
          <name>Timestamp Range Format</name>
          <artwork><![CDATA[
Timestamp Range {
  Delta Largest Acknowledged (i),
  Timestamp Delta Count (i),
  Timestamp Delta (i) ...,
}
]]></artwork>
        </figure>
        <t>The fields that form each Timestamp Range are:</t>
        <dl>
          <dt>Delta Largest Acknowledged:</dt>
          <dd>
            <t>A variable-length integer indicating the largest packet number in the
Timestamp Range as a delta to subtract from the Largest Acknowledged in the
ACK frame. For example, 0 indicates the range starts with the
Largest Acknowledged.</t>
          </dd>
          <dt>Timestamp Delta Count:</dt>
          <dd>
            <t>A variable-length integer indicating the number of Timestamp Deltas in the
current Timestamp Range.</t>
            <t>The sum of Timestamp Delta Counts for all Timestamp Ranges in the frame <bcp14>MUST
NOT</bcp14> exceed max_receive_timestamps_per_ack as specified in <xref target="negotiation"/>.</t>
          </dd>
          <dt>Timestamp Deltas:</dt>
          <dd>
            <t>Variable-length integers encoding the receive timestamp for contiguous packets
in the Timestamp Range in descending packet number order as follows:</t>
            <t>For the first Timestamp Delta of the first Timestamp Range in the frame: the
value is the difference between (a) the receive timestamp of the largest
packet in the Timestamp Range (indicated by Gap) and (b) the session
receive_timestamp_basis (see <xref target="ts-basis"/>), decoded as described below.</t>
            <t>For all other Timestamp Deltas: the value is the difference between (a) the
receive timestamp specified by the previous Timestamp Delta and (b) the
receive timestamp of the current packet in the Timestamp Range, decoded as
described below.</t>
            <t>All Timestamp Delta values are decoded by mulitplying the value in the field
by 2 to the power of the receive_timestamps_exponent transport parameter
received by the sender of the frame (see <xref target="negotiation"/>):</t>
          </dd>
        </dl>
        <t>When the receiver receives packets out-of-order, it <bcp14>SHOULD</bcp14> report them with
other packets in a single ACK_RECEIVE_TIMESTAMPS or PATH_ACK_RECEIVE_TIMESTAMPS
frame, starting with the most recently received packet regardless of the packet
number order. See <xref target="examples"/> for examples of reporting timestamps of
out-of-order packets.</t>
      </section>
    </section>
    <section anchor="mp-frame">
      <name>PATH_ACK_RECEIVE_TIMESTAMPS Frame Wire Format</name>
      <t>When both the receive timestamps extension and the multipath extension
<xref target="MULTIPATH"/> are negotiated, an endpoint <bcp14>MAY</bcp14> use the
PATH_ACK_RECEIVE_TIMESTAMPS frame defined below to report receive timestamps
for packets received on a specific path. An endpoint <bcp14>MAY</bcp14> continue to use the
existing PATH_ACK frames as specified in <xref section="4.1" sectionFormat="of" target="MULTIPATH"/> if it
does not have any receive timestamps or does not want to report them.</t>
      <t>Endpoints send PATH_ACK_RECEIVE_TIMESTAMPS frames in 1-RTT packets, with 0
or more receive timestamps following the Ack Ranges and optional ECN Counts.
Similar to the PATH_ACK frame types (0x3e..0x3f), the
PATH_ACK_RECEIVE_TIMESTAMPS frame defines two frame types (0x03178309..0x0317830a) to
indicate whether the frame includes ECN counts.</t>
      <figure anchor="fig-mp-frame">
        <name>PATH_ACK_RECEIVE_TIMESTAMPS Frame Format</name>
        <artwork><![CDATA[
PATH_ACK_RECEIVE_TIMESTAMPS Frame {
  Type (i) = 0x03178309..0x0317830a,
  Path Identifier (i),
  Largest Acknowledged (i),
  ACK Delay (i),
  ACK Range Count (i),
  First ACK Range (i),
  ACK Range (..) ...,
  [ECN Counts (..)],       // included iff Type == 0x0317830a
  Receive Timestamps (..)  // see {{ts-ranges}}
}
]]></artwork>
      </figure>
      <t>Compared to the ACK_RECEIVE_TIMESTAMPS frame defined in <xref target="frame"/>, the
following field is added:</t>
      <dl>
        <dt>Path Identifier:</dt>
        <dd>
          <t>The path ID associated with the packet number space of the 1-RTT packets
which are acknowledged by this frame, as specified in
<xref section="4.1" sectionFormat="of" target="MULTIPATH"/>.</t>
        </dd>
      </dl>
      <t>All other fields are the same as for the ACK_RECEIVE_TIMESTAMPS frame
(<xref target="frame"/>). The Receive Timestamps field follows the same format described
in <xref target="ts-ranges"/>.</t>
      <t>When truncation is necessary to fit within the max_receive_timestamps_per_ack
limit or reduce the size of the frame, the receiver <bcp14>SHOULD</bcp14> retain timestamps
for the most recently received packets and omit timestamps for older packets.</t>
    </section>
    <section anchor="negotiation">
      <name>Extension Negotiation</name>
      <dl>
        <dt>max_receive_timestamps_per_ack (0x4ac07 temporary value for draft use):</dt>
        <dd>
          <t>A variable-length integer indicating that the maximum number of receive
timestamps the sending endpoint would like to receive in an
ACK_RECEIVE_TIMESTAMPS or PATH_ACK_RECEIVE_TIMESTAMPS frame.</t>
          <t>Each ACK_RECEIVE_TIMESTAMPS or PATH_ACK_RECEIVE_TIMESTAMPS frame sent <bcp14>MUST
NOT</bcp14> contain more than the peer's maximum number of receive timestamps.</t>
        </dd>
        <dt>receive_timestamps_exponent (0x4ac26 temporary value for draft use):</dt>
        <dd>
          <t>A variable-length integer indicating the exponent to be used when encoding and
decoding timestamp delta fields in ACK_RECEIVE_TIMESTAMPS and
PATH_ACK_RECEIVE_TIMESTAMPS frames sent by the
peer (see <xref target="ts-ranges"/>). If this value is absent, a default value of 0 is
assumed (indicating microsecond precision). Values above 20 are invalid.
If the receive_timestamps_exponent transport parameter is present and
max_receive_timestamps_per_ack is not, receive timestamps are not supported
and receive_timestamps_exponent <bcp14>MUST</bcp14> be ignored.</t>
        </dd>
      </dl>
      <section anchor="ts-basis">
        <name>Receive Timestamp Basis</name>
        <t>Endpoints which negotiate the extension need to determine a value,
receive_timestamp_basis, relative to which all receive timestamps for the
session will be reported (see <xref target="ts-ranges"/>).</t>
        <t>The value of receive_timestamp_basis <bcp14>MUST</bcp14> be less than the smallest receive
timestamp reported, and <bcp14>MUST</bcp14> remain constant for the entire duration of the
session. The receive_timestamp_basis is a local value that is not communicated
to the peer.</t>
        <t>Receive timestamps are reported relative to the basis, rather than in absolute
time to avoid requiring clock synchronization between endpoints and to make
the frame more compact.</t>
      </section>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <section anchor="best-effort-behavior">
        <name>Best-Effort Behavior</name>
        <t>Receive timestamps are sent on a best-effort basis. Endpoints <bcp14>MUST</bcp14> gracefully
handle scenarios where the receiver does not communicate receive timestamps for
acknowledged packets. Examples of such scenarios are:</t>
        <ul spacing="normal">
          <li>
            <t>A packet containing an ACK_RECEIVE_TIMESTAMPS or PATH_ACK_RECEIVE_TIMESTAMPS
frame is lost.</t>
          </li>
          <li>
            <t>The receiver truncates the number of timestamps sent in order to (a) avoid
sending more than max_receive_timestamps_per_ack (<xref target="negotiation"/>); or (b) fit
the ACK_RECEIVE_TIMESTAMPS or PATH_ACK_RECEIVE_TIMESTAMPS frame into a packet.</t>
          </li>
          <li>
            <t>The receiver is unable to measure the arrival timestamp of a packet with
sufficient accuracy, for example due to a scheduling delay in a userspace
implementation, and omits the packet from the Timestamp Ranges while still
acknowledging it in the ACK Ranges.</t>
          </li>
        </ul>
      </section>
      <section anchor="frame-size">
        <name>Frame Size</name>
        <t>The addition of receive timestamps increases the size of ACK frames. Receivers
<bcp14>SHOULD</bcp14> use receive timestamps to fill available space in packets that would
already be sent, rather than sending additional packets solely to report
timestamps. In such cases, the receiver would send fewer timestamps than the
maximum allowed by max_receive_timestamps_per_ack.</t>
      </section>
    </section>
    <section anchor="examples">
      <name>Examples</name>
      <t>To illustrate the usage of the Receive Timestamps fields, consider a peer
that sent 14 packets with numbers 87 to 100.</t>
      <t>Assume the receiver receives packets 87 to 91 and 96 to 100 at the following
timestamps relative to the basis:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Packet Number</th>
            <th align="left">Relative Timestamp</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">87</td>
            <td align="left">300</td>
          </tr>
          <tr>
            <td align="left">88</td>
            <td align="left">305</td>
          </tr>
          <tr>
            <td align="left">89</td>
            <td align="left">310</td>
          </tr>
          <tr>
            <td align="left">90</td>
            <td align="left">320</td>
          </tr>
          <tr>
            <td align="left">91</td>
            <td align="left">330</td>
          </tr>
          <tr>
            <td align="left">96</td>
            <td align="left">350</td>
          </tr>
          <tr>
            <td align="left">97</td>
            <td align="left">355</td>
          </tr>
          <tr>
            <td align="left">98</td>
            <td align="left">360</td>
          </tr>
          <tr>
            <td align="left">99</td>
            <td align="left">370</td>
          </tr>
          <tr>
            <td align="left">100</td>
            <td align="left">380</td>
          </tr>
        </tbody>
      </table>
      <t>When it's time to acknowledge these packets, the receiver will send an
ACK frame with two ranges, as follows:</t>
      <artwork><![CDATA[
Largest Acknowledged: 100
...
Timestamp Ranges Count: 2

Timestamp Range 1:
  Delta Largest Acknowledged: 0 // Starting at packet 100
  Timestamp Delta Count: 5
  Timestamps Deltas: 380, 10, 10, 5, 5

Timestamp Range 2:
  Delta Largest Acknowledged: 9 // Starting at packet 91
  Timestamp Delta Count: 5
  Timestamp Deltas: 20, 10, 10, 5, 5
]]></artwork>
      <t>After that assume that the receiver receives packets 92 to 95 out-of-order at
the following timestamps relative to the basis:</t>
      <table>
        <thead>
          <tr>
            <th align="left">Packet Number</th>
            <th align="left">Relative Timestamp</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">92</td>
            <td align="left">390</td>
          </tr>
          <tr>
            <td align="left">93</td>
            <td align="left">392</td>
          </tr>
          <tr>
            <td align="left">94</td>
            <td align="left">394</td>
          </tr>
          <tr>
            <td align="left">95</td>
            <td align="left">395</td>
          </tr>
        </tbody>
      </table>
      <t>The receiver can send a new ACK frame with all of the timestamps,
as follows:</t>
      <artwork><![CDATA[
Largest Acknowledged: 100
...
Timestamp Ranges Count: 3

Timestamp Range 1:
  Delta Largest Acknowledged: 5 // Starting at packet 95
  Timestamp Delta Count: 4
  Timestamps Deltas: 395, 1, 2, 2

Timestamp Range 2:
  Delta Largest Acknowledged: 0 // Starting at packet 100
  Timestamp Delta Count: 5
  Timestamps Deltas: 10, 10, 10, 5, 5

Timestamp Range 3:
  Delta Largest Acknowledged: 9 // Starting at packet 91
  Timestamp Delta Count: 5
  Timestamp Deltas: 20, 10, 10, 5, 5
]]></artwork>
      <t>In this particular scenario, the receiver can also choose to report the first
timestamp range only since the timestamps for the other two ranges have already
been reported.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document uses temporary values for the transport parameters
max_receive_timestamps_per_ack (0x4ac07) and receive_timestamps_exponent
(0x4ac26), and for the frame types ACK_RECEIVE_TIMESTAMPS
(0x03178307..0x03178308) and PATH_ACK_RECEIVE_TIMESTAMPS
(0x03178309..0x0317830a). Prior to publication, these will be replaced with
permanent registrations in the "QUIC Transport Parameters"
(<xref section="22.3" sectionFormat="of" target="RFC9000"/>) and "QUIC Frame Types"
(<xref section="22.4" sectionFormat="of" target="RFC9000"/>) registries.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MULTIPATH">
          <front>
            <title>Managing multiple paths for a QUIC connection</title>
            <author fullname="Yanmei Liu" initials="Y." surname="Liu">
              <organization>Alibaba Inc.</organization>
            </author>
            <author fullname="Yunfei Ma" initials="Y." surname="Ma">
              <organization>Uber Technologies Inc.</organization>
            </author>
            <author fullname="Quentin De Coninck" initials="Q." surname="De Coninck">
              <organization>University of Mons (UMONS)</organization>
            </author>
            <author fullname="Olivier Bonaventure" initials="O." surname="Bonaventure">
              <organization>UCLouvain and WELRI</organization>
            </author>
            <author fullname="Christian Huitema" initials="C." surname="Huitema">
              <organization>Private Octopus Inc.</organization>
            </author>
            <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
              <organization>Ericsson</organization>
            </author>
            <date day="20" month="February" year="2026"/>
            <abstract>
              <t>   This document specifies a multipath extension for the QUIC protocol
   to enable the simultaneous usage of multiple paths for a single
   connection.  It introduces explicit path identifiers to create,
   delete, and manage multiple paths.  This document does not specify
   address discovery or management, nor how applications using QUIC
   schedule traffic over multiple paths.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-multipath-20"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <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="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RRBNC">
          <front>
            <title>pathChirp: Efficient Available Bandwidth Estimation for Network Paths</title>
            <author initials="R. V. R. R. B. R. N. J. and L." surname="Cottrel" fullname="Ribeiro, V., Riedi, R., Baraniuk, R., Navratil, J., and L. Cottrel">
              <organization/>
            </author>
            <date year="2003"/>
          </front>
        </reference>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="I-D.ietf-rmcat-gcc">
          <front>
            <title>A Google Congestion Control Algorithm for Real-Time Communication</title>
            <author fullname="Stefan Holmer" initials="S." surname="Holmer">
              <organization>Google</organization>
            </author>
            <author fullname="Henrik Lundin" initials="H." surname="Lundin">
              <organization>Google</organization>
            </author>
            <author fullname="Gaetano Carlucci" initials="G." surname="Carlucci">
              <organization>Politecnico di Bari</organization>
            </author>
            <author fullname="Luca De Cicco" initials="L." surname="De Cicco">
              <organization>Politecnico di Bari</organization>
            </author>
            <author fullname="Saverio Mascolo" initials="S." surname="Mascolo">
              <organization>Politecnico di Bari</organization>
            </author>
            <date day="8" month="July" year="2016"/>
            <abstract>
              <t>   This document describes two methods of congestion control when using
   real-time communications on the World Wide Web (RTCWEB); one delay-
   based and one loss-based.

   It is published as an input document to the RMCAT working group on
   congestion control for media streams.  The mailing list of that
   working group is rmcat@ietf.org.


              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-rmcat-gcc-02"/>
        </reference>
      </references>
    </references>
    <?line 441?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The editors would like to thank Connor Smith for writing the initial draft.
The editors would also like to thank Sharad Jaiswal, Ilango Purushothaman, and
Brandon Schlinker for their contributions to the design of this QUIC extension.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
7hUFOfY6o36LplxqQ4dsR+1u4NRv5f0DS3WCyXr2FCyYQ9rfFcIqhYadiVvf
akuFMJZZ0+X7iUKUDUUxEIO/c0WcaijDYVzTBuFKdxRkRSZVcN2zpmfe+BMF
0BDWEkFjWL4BFZB+TS8tVntX8sIMHvSgKNtsY7E+xo87fuRIYEZddAjzqatY
Z6ZaZDGn9OLwlkJ4i+Uw7iAUsAtkJWWgt8fv9IdFkXMzvmn5KrK4SpcN61Fi
VKo36zkf721/wPi/o95+a9syfGjy0qKuhsV0yJ4zoN6Cbxq1OgWMl8KZRCud
RVoJGWQbuykPR2NXnw8cJJMsAyjLeWFdVppXiP+R/ZiuXqsyzXzLv0k7RCeb
kZcsEB8OYPoumQvNc87cw8FNu2UyFW15tNrC2w9mFn3trPliGDparIZJ4fl7
sK3lDzdkPBZtfkPNFk9RwZBrNYQO2IAPsXp6XeLRjGhTw6uvMuBDQG8CUTMF
24Lz7ITb9p/UDBPxsCSQ+HhH7Mlon5TXlgN3xMRaR6xPzL+4I/ao7P6Ithim
dAXWtLQONXUSDqeuM/bJqn+oPXbUaiARsBdic3tM9rbHOH193Hs2dbA6BFCi
TGf48iylkhQGUob8+f9RY0v9xsZWgJZQAzwu3KYqOCnmiC6grGmvPo4MrhBi
NPvoTKsx4dhbUmnKpcKKfjg5DOd58uwlvNsWiWvbR8zvpnEWX3WA9453QXDu
AJ7Qr1OOcnQEFT6srEAI5j0EInTmFrMeXzP1de0eE5jYiWJC/X/1UDPOZ6jN
Fr6JF5MTwULv9oJcPC/r3N9q4EOQBLFQlUtS6BTx23cbOIg8mOiLDKDCBTfM
ofZnLtb8S3dyi0E3f4jZQaVok25keDR6e4SjbVf6LEW2Gm9PY0w8b9IaxNV2
kiPEI7UMcOyJSvaeyUrPgfMkJpev0Z58kYyi0e4vqexUFWRr5ijPmjLPkxGO
vH1j02dsNDcGxLuihgVk5ka7CORMhBsjDm1+eToVmxtSch/nNyziWi6tspFi
N2m7OeFml9W6/JPdLIfuxZeH8l6npIPPf0cl0UlbyKq5AcaH3nzVJZajMEUu
BkJ1GrN/14yIHeFNsnTzPyFFYHm67J2KPk0xaw3igRdnUwdhscBSE5o64P7I
VCEj9D9ByHv4HYsBS+s5x7mG+7lJysKCLbqTwbd24CpY/ltfzkzoesnBnu8l
YkWT0lW+s19VoBCZ2IRZdAJ5xCMNp1+9txrCBQV/3UnTaoQXD5EUupPmOod1
Uutme3sddOULLoi5a+5q4Xaq5yJKzKW9+QT0ybULlimxO6cTbl8ZDtaN2hXe
g6arzPerOF4hvGxoMZNZ+GIe4I1xE+2z0uZgu2MorrUXTWFT+R9Ew7VSdFs7
BynaxuxeNHYfNnWXHXh6Sdc7+W4IXX+tYhCk4E5lcV06WHYRI7DhQt8musiw
ZVYkSHEdD4ypzi6w03xe567tIUIBrbk/fdFvMVFUbaHTtKAL5ZNUxQ1d+FSR
1ZXjm4aq28Kk/nIPuU8C0m6kXebJrCxy8y/HYGhu6Gg1XKkVMPcbd7XNYSdj
ZEI5VlJxGHtpbFK7Tg2Z5guQPjydTsmJXmgUK6YoN7LGXsXVFV0WGmo3jfka
ycZ+WVPXJXKmaZ1lS0EXNOkmJGIwsLIgA9el7sbxWAe1BL7BQEVP29+2bqJB
93xxrtnP9ZOHAGuf1/kI4lD3V/YLZKgxLIzHVvGaWGTJ50W+4dvEoxY34VA+
XsKiXhUbAJYPYboJc48lF6sdlz8TD9S0Qh7mzxF/SxyGcot4Z3OdXwiizvnm
F5lh6yJZ+5ZbbJY1dz+pmQNu63h/Oty9HLSbJPBt5x7Q6wz5IV87dZc/ufeD
gFpynk6dWppAd65YEIOY5Nl2bh8b+mvtaiAkX9wF9hHiR2ujHU3s6cUizDqQ
d4XNJfJVh4fKX5rbcCyLiqyEjLx1hDS3aTqMQtQorfBJLvUp+i/9TAmmm1uH
rl4xecxyGdE4yxMqw7bpkoDYBfM2HgWTU/HCX1wCKKWzZev6USudkme5c7mE
GFrJ0F1yye2LqabOYycbdVFAhKxNNWemDxu7T8m9y99vx84ahF9IiKOmW+o+
eNaW7rc+ch0BdPNpMHfsGeMFi419dP9JFATXiM6brXz+jCSyv7dHFRvnPo+0
N92Eo322yaPP/Wzpk/hYxbak2x9HgGc/hfdXzh204O8ncOcHN1b9E0YOV/7k
+iN6iJEgsPv3kzwEgasPaeTznpFPe0cerY/c713zaPUpRh70j9xfH3nYP/Lz
9ZFP+0f28P60l6OjHt4/71+zh/dnvSP3V8WMkc97Rrqq21R/sjLmDE1E9PeE
Y/ev64uEE+yKqOyafp1re9wV7lTSXRhtTqyo09N7CksUC7pOs4ag7nhSHqxf
ktkfP3gyPUYh8dln8jI04VU8SaG9NpxYj+XT9k82ng5BfANMdP8/xX/r9Bw8
Rs/RBnqO9j+RnEjNwSoxJFhxPK0c+la+eGpK+s0ocsSHOUdPO6clIE50QET+
YSAC+tZMec213cjDnpGrs93IJz0jV5+5kasuSyN73Fh00pfExz+Af+4uCre9
gw8hXQBppDoQv5OjHP4KR3m6yTB7rC/s82SDnxzBHvcH8mDQ57KPusjv6bL7
j3rs4R/tsWf+Yj+9a2KSmo5BQqmxArdkUiqzhUxmRWF193jHHfG3y11mj+/0
WxPunK/X5r4r3MC1P2JyeZ3gy02hBuUs6ZJeXTPVkl6h4PRGhbcm3r58G3/l
G/Jnx+fH68M6bzG4l3G6jbGGtp6OjP3UnujuY80VERpzuy6lD5u2D4o2FGsb
r1erh0/VxKaDp5F8B31zzdZ6mTK8pdNqm2RIxd3BAr18M1fcJSr1teH8lF9n
8QXF1uo7iVGCW9THD6cFBwert24dF266q0LohGdt1pPVWZ4Ko+MbkxNqw8MO
GofiV9zE/dglvDr9YmsKi9bhPpd7g9eudJAprb8hO8ohocs54Sfp6o5ecvPt
UH53B+UFt1NHPWux33QXvJxBIqn8Whl7p7KBPMtg/4V8V5e1ncErFKTLliFe
QIgpuL5MZqgTb+gQxdmKcXd7SjOpnex9OEw1vUHoEB7WzqKMLbeR+D/0qxxD
YT4AAA==

-->

</rfc>
