<?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-rfc2629 version 1.5.12 -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-quic-ack-frequency-01" category="std" consensus="true" obsoletes="" updates="" submissionType="IETF" xml:lang="en" version="3">
  <!-- xml2rfc v2v3 conversion 3.10.0 -->
  <front>
    <title>QUIC Acknowledgement Frequency</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-quic-ack-frequency-01"/>
    <author initials="J." surname="Iyengar" fullname="Jana Iyengar">
      <organization>Fastly</organization>
      <address>
        <email>jri.ietf@gmail.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett">
      <organization>Google</organization>
      <address>
        <email>ian.swett@google.com</email>
      </address>
    </author>
    <date/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <abstract>
      <t>This document describes a QUIC extension for an endpoint to control its peer's
delaying of acknowledgements.</t>
    </abstract>
    <note>
      <name>Note to Readers</name>
      <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"/>. Source
code and issues list for this draft can be found at
<eref target="https://github.com/quicwg/ack-frequency"/>.</t>
      <t>Working Group information can be found at <eref target="https://github.com/quicwg"/>.</t>
    </note>
  </front>
  <middle>
    <section anchor="introduction" numbered="true" toc="default">
      <name>Introduction</name>
      <t>This document describes a QUIC extension for an endpoint to control its peer's
delaying of acknowledgements.</t>
      <section anchor="terms-and-definitions" numbered="true" toc="default">
        <name>Terms and Definitions</name>
        <t>The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD",
"SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in BCP 14 <xref target="RFC2119" format="default"/> <xref target="RFC8174" format="default"/>
when, and only when, they appear in all capitals, as shown here.</t>
        <t>In the rest of this document, "sender" refers to a QUIC data sender (and
acknowledgement receiver). Similarly, "receiver" refers to a QUIC data receiver
(and acknowledgement sender).</t>
        <t>An "acknowledgement packet" refers to a QUIC packet that contains only an ACK
frame.</t>
        <t>This document uses terms, definitions, and notational conventions described in
Section <xref target="QUIC-TRANSPORT" section="1.2" sectionFormat="bare" format="default"/> and Section <xref target="QUIC-TRANSPORT" section="1.3" sectionFormat="bare" format="default"/> of <xref target="QUIC-TRANSPORT" format="default"/>.</t>
      </section>
    </section>
    <section anchor="motivation" numbered="true" toc="default">
      <name>Motivation</name>
      <t>A receiver acknowledges received packets, but it can delay sending these
acknowledgements. The delaying of acknowledgements can impact connection
throughput, loss detection and congestion controller performance at a data
sender, and CPU utilization at both a data sender and a data receiver.</t>
      <t>Reducing the frequency of acknowledgement packets can improve connection and
endpoint performance in the following ways:</t>
      <ul spacing="normal">
        <li>Sending UDP packets can be noticeably CPU intensive on some
platforms. Reducing the number of packets that only contain acknowledgements
can therefore reduce the amount of CPU consumed at a data receiver. Experience
shows that this cost reduction can be significant for high bandwidth
connections.</li>
        <li>Similarly, receiving and processing UDP packets can also be CPU intensive, and
reducing acknowledgement frequency reduces this cost at a data sender.</li>
        <li>Severely asymmetric link technologies, such as DOCSIS, LTE, and satellite
links, connection throughput in the data direction becomes constrained when
the reverse bandwidth is filled by acknowledgment packets. When traversing
such links, reducing the number of acknowledgments allows connection
throughput to scale much further.</li>
      </ul>
      <t>As discussed in <xref target="implementation" format="default"/> however, there can be undesirable consequences
to congestion control and loss recovery if a receiver uniltaerally reduces the
acknowledgment frequency. A sender's constraints on the acknowledgement
frequency need to be taken into account to maximize congestion controller and
loss recovery performance.</t>
      <t><xref target="QUIC-TRANSPORT" format="default"/> currently specifies a simple delayed acknowledgement
mechanism that a receiver can use: send an acknowledgement for every other
packet, and for every packet that is received out of order (Section
13.2.1 of <xref target="QUIC-TRANSPORT" format="default"/>). This
simple mechanism does not allow a sender to signal its constraints. This
extension provides a mechanism to solve this problem.</t>
    </section>
    <section anchor="negotiating-extension-use" numbered="true" toc="default">
      <name>Negotiating Extension Use</name>
      <t>Endpoints advertise their support of the extension described in this document by
sending the following transport parameter (<xref section="7.2" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>):</t>
      <dl>
        <dt>
min_ack_delay (0xff03de1a):  </dt>
        <dd>
          <t>A variable-length integer representing the minimum amount of time in
microseconds by which the endpoint can delay an acknowledgement. This limit
could be based on the receiver's clock or timer granularity.</t>
        </dd>
      </dl>
      <t>An endpoint's min_ack_delay MUST NOT be greater than its max_ack_delay.
Endpoints that support this extension MUST treat receipt of a min_ack_delay that
is greater than the received max_ack_delay as a connection error of type
TRANSPORT_PARAMETER_ERROR. Note that while the endpoint's max_ack_delay
transport parameter is in milliseconds (<xref section="18.2" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>),
min_ack_delay is specified in microseconds.</t>
      <t>The min_ack_delay transport parameter is a unilateral indication of support for
receiving ACK_FREQUENCY frames.  If an endpoint sends the transport parameter,
the peer is allowed to send ACK_FREQUENCY frames independent of whether it also
sends the min_ack_delay transport parameter or not.</t>
      <t>Receiving a min_ack_delay transport parameter indicates that the peer might send
ACK_FREQUENCY frames in the future. Until an ACK_FREQUENCY frame is received,
receiving this transport parameter does not cause the endpoint to
change its acknowledgement behavior.</t>
      <t>Endpoints MUST NOT remember the value of the min_ack_delay transport parameter
they received. Consequently, ACK_FREQUENCY frames cannot be sent in 0-RTT
packets, as per <xref section="7.4.1" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>.</t>
      <t>This Transport Parameter is encoded as per <xref section="18" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>.</t>
    </section>
    <section anchor="ackfrequency-frame" numbered="true" toc="default">
      <name>ACK_FREQUENCY Frame</name>
      <t>Delaying acknowledgements as much as possible reduces both work done by the
endpoints and network load. An endpoint's loss detection and congestion control
mechanisms however need to be tolerant of this delay at the peer. An endpoint
signals the frequency it wants to receive ACK frames to its peer using an
ACK_FREQUENCY frame, shown below:</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
ACK_FREQUENCY Frame {
  Type (i) = 0xaf,
  Sequence Number (i),
  Ack-Eliciting Threshold (i),
  Request Max Ack Delay (i),
  Reserved (6),
  Ignore CE (1),
  Ignore Order (1)
}
]]></artwork>
      <t>Following the common frame format described in <xref section="12.4" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>, ACK_FREQUENCY frames have a type of 0xaf, and contain the
following fields:</t>
      <dl>
        <dt>
Sequence Number:  </dt>
        <dd>
          <t>A variable-length integer representing the sequence number assigned to the
ACK_FREQUENCY frame by the sender to allow receivers to ignore obsolete
frames, see <xref target="multiple-frames" format="default"/>.</t>
        </dd>
        <dt>
Ack-Eliciting Threshold:  </dt>
        <dd>
          <t>A variable-length integer representing the maximum number of ack-eliciting
packets the recipient of this frame can receive without sending an
acknowledgment. In other words, an acknowledgement is sent when more than this
number of ack-eliciting packets have been received. Since this is a maximum
value, a receiver can send an acknowledgement earlier. A value of 0 results in
a receiver immediately acknowledging every ack-eliciting packet.</t>
        </dd>
        <dt>
Request Max Ack Delay:  </dt>
        <dd>
          <t>A variable-length integer representing the value to which the endpoint
requests the peer update its <tt>max_ack_delay</tt>
(<xref section="18.2" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>). The value of this field is in
microseconds, unlike the 'max_ack_delay' transport parameter, which is in
milliseconds. Sending a value smaller than the <tt>min_ack_delay</tt> advertised
by the peer is invalid. Receipt of an invalid value MUST be treated as a
connection error of type PROTOCOL_VIOLATION.</t>
        </dd>
        <dt>
Reserved:  </dt>
        <dd>
          <t>This field has no meaning in this version of ACK_FREQUENCY.  The value of this
field MUST be 0x00. Receipt of any other value MUST be treated as a
connection error of type FRAME_ENCODING_ERROR.</t>
        </dd>
        <dt>
Ignore Order:  </dt>
        <dd>
          <t>A 1-bit field representing a boolean truth value. This field is
set to <tt>true</tt> by an endpoint that does not wish to receive an immediate
acknowledgement when the peer receives a packet out of order
(<xref target="out-of-order" format="default"/>). 0 represents 'false' and 1 represents 'true'.</t>
        </dd>
        <dt>
Ignore CE:  </dt>
        <dd>
          <t>A 1-bit field representing a boolean truth value. This field is
set to <tt>true</tt> by an endpoint that does not wish to receive an immediate
acknowledgement when the peer receives CE-marked packets (<xref target="out-of-order" format="default"/>).
0 represents 'false' and 1 represents 'true'.</t>
        </dd>
      </dl>
      <t>ACK_FREQUENCY frames are ack-eliciting. However, their loss does not require
retransmission if an ACK_FREQUENCY frame with a larger Sequence Number value
has been sent.</t>
      <t>An endpoint MAY send ACK_FREQUENCY frames multiple times during a connection and
with different values.</t>
      <t>An endpoint will have committed a <tt>max_ack_delay</tt> value to the peer, which
specifies the maximum amount of time by which the endpoint will delay sending
acknowledgments. When the endpoint receives an ACK_FREQUENCY frame, it MUST
update this maximum time to the value proposed by the peer in the Request Max
Ack Delay field.</t>
    </section>
    <section anchor="multiple-frames" numbered="true" toc="default">
      <name>Multiple ACK_FREQUENCY Frames</name>
      <t>An endpoint can send multiple ACK_FREQUENCY frames, and each one of them can
have different values in all fields. An endpoint MUST use a sequence number of 0
for the first ACK_FREQUENCY frame it constructs and sends, and a strictly
increasing value thereafter.</t>
      <t>An endpoint MUST allow reordered ACK_FREQUENCY frames to be received and
processed, see <xref section="13.3" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>.</t>
      <t>On the first received ACK_FREQUENCY frame in a connection, an endpoint MUST
immediately record all values from the frame. The sequence number of the frame
is recorded as the largest seen sequence number. The new Ack-Eliciting Threshold
and Request Max Ack Delay values MUST be immediately used for delaying
acknowledgements; see <xref target="sending" format="default"/>.</t>
      <t>On a subsequently received ACK_FREQUENCY frame, the endpoint MUST check if this
frame is more recent than any previous ones, as follows:</t>
      <ul spacing="normal">
        <li>If the frame's sequence number is not greater than the largest one seen so
far, the endpoint MUST ignore this frame.</li>
        <li>If the frame's sequence number is greater than the largest one seen so far,
the endpoint MUST immediately replace old recorded state with values received
in this frame. The endpoint MUST start using the new values immediately for
delaying acknowledgements; see <xref target="sending" format="default"/>. The endpoint MUST also replace the
recorded sequence number.</li>
      </ul>
    </section>
    <section anchor="immediateack-frame" numbered="true" toc="default">
      <name>IMMEDIATE_ACK Frame</name>
      <t>A sender can use an ACK_FREQUENCY frame to reduce the number of acknowledgements
sent by a receiver, but doing so increases the chances that time-sensitive
feedback is delayed as well. For example, as described in <xref target="loss" format="default"/>, delaying
acknowledgements can increase the time it takes for a sender to detect packet
loss. The IMMEDIATE_ACK frame helps mitigate this problem.</t>
      <t>An IMMEDIATE_ACK frame can be useful in other situations as well. For example,
it can be used with a PING frame (Section 19.2 of <xref target="QUIC-TRANSPORT" format="default"/>) if a
sender wants an immediate RTT measurement or if a sender wants to establish
receiver liveness as quickly as possible.</t>
      <t>An endpoint SHOULD send a packet containing an ACK frame immediately upon
receiving an IMMEDIATE_ACK frame. An endpoint MAY delay sending an ACK frame
despite receiving an IMMEDIATE_ACK frame. For example, an endpoint might do this
if a large number of received packets contain an IMMEDIATE_ACK or if the
endpoint is under heavy load.</t>
      <artwork name="" type="" align="left" alt=""><![CDATA[
IMMEDIATE_ACK Frame {
  Type (i) = 0xac,
}
]]></artwork>
    </section>
    <section anchor="sending" numbered="true" toc="default">
      <name>Sending Acknowledgments</name>
      <t>Prior to receiving an ACK_FREQUENCY frame, endpoints send acknowledgements as
specified in <xref section="13.2.1" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>.</t>
      <t>On receiving an ACK_FREQUENCY frame and updating its recorded <tt>max_ack_delay</tt>
and <tt>Ack-Eliciting Threshold</tt> values (<xref target="multiple-frames" format="default"/>), the endpoint MUST send an
acknowledgement when one of the following conditions are met:</t>
      <ul spacing="normal">
        <li>Since the last acknowledgement was sent, the number of received ack-eliciting
packets is greater than or equal to the recorded <tt>Ack-Eliciting Threshold</tt>.</li>
        <li>Since the last acknowledgement was sent, <tt>max_ack_delay</tt> amount of time has
passed.</li>
      </ul>
      <t><xref target="out-of-order" format="default"/>, <xref target="congestion" format="default"/>, and <xref target="batch" format="default"/> describe exceptions to this
strategy.</t>
      <t>An endpoint is expected to bundle acknowledgements when possible. Every time an
acknowledgement is sent, bundled or otherwise, all counters and timers related
to delaying of acknowledgments are reset.</t>
      <t>The receiver of an ACK_FREQUENCY frame can continue to process multiple available
packets before determining whether to send an ACK frame in response, as stated in
<xref section="13.2.2" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>.</t>
      <section anchor="out-of-order" numbered="true" toc="default">
        <name>Response to Out-of-Order Packets</name>
        <t>As specified in <xref section="13.2.1" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>, endpoints are expected to
send an acknowledgement immediately on receiving a reordered ack-eliciting
packet. This extension modifies this behavior.</t>
        <t>If the endpoint has not yet received an ACK_FREQUENCY frame, or if the most
recent frame received from the peer has an <tt>Ignore Order</tt> value of <tt>false</tt>
(0x00), the endpoint MUST immediately acknowledge any subsequent packets that
are received out of order.</t>
        <t>If the most recent ACK_FREQUENCY frame received from the peer has an <tt>Ignore
Order</tt> value of <tt>true</tt> (0x01), the endpoint does not make this exception. That
is, the endpoint MUST NOT send an immediate acknowledgement in response to
packets received out of order, and instead continues to use the peer's
<tt>Ack-Eliciting Threshold</tt> and <tt>max_ack_delay</tt> thresholds for sending
acknowledgements.</t>
      </section>
      <section anchor="congestion" numbered="true" toc="default">
        <name>Expediting Congestion Signals</name>
        <t>An endpoint SHOULD send an immediate acknowledgement when a packet marked
with the ECN Congestion Experienced (CE) codepoint in the IP header is
received and the previously received packet was not marked CE.</t>
        <t>Doing this maintains the peer's response time to congestion events, while also
reducing the ACK rate compared to <xref section="13.2.1" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/> during
extreme congestion or when peers are using DCTCP <xref target="RFC8257" format="default"/> or other
congestion controllers that mark more frequently than classic ECN <xref target="RFC3168" format="default"/>.</t>
      </section>
      <section anchor="batch" numbered="true" toc="default">
        <name>Batch Processing of Packets</name>
        <t>For performance reasons, an endpoint can receive incoming packets from the
underlying platform in a batch of multiple packets. This batch can contain
enough packets to cause multiple acknowledgements to be sent.</t>
        <t>To avoid sending multiple acknowledgements in rapid succession, an endpoint MAY
process all packets in a batch before determining whether a threshold has been
met and an acknowledgement is to be sent in response.</t>
      </section>
    </section>
    <section anchor="computation-of-probe-timeout-period" numbered="true" toc="default">
      <name>Computation of Probe Timeout Period</name>
      <t>On sending an update to the peer's <tt>max_ack_delay</tt>, an endpoint can use this new
value in later computations of its Probe Timeout (PTO) period; see <xref section="5.2.1" sectionFormat="of" target="QUIC-RECOVERY" format="default"/>. The endpoint MUST however wait until the ACK_FREQUENCY
frame that carries this new value is acknowledged by the peer.</t>
      <t>Until the frame is acknowledged, the endpoint MUST use the greater of the
current <tt>max_ack_delay</tt> and the value that is in flight when computing the PTO
period. Doing so avoids spurious PTOs that can be caused by an update that
increases the peer's <tt>max_ack_delay</tt>.</t>
      <t>While it is expected that endpoints will have only one ACK_FREQUENCY frame in
flight at any given time, this extension does not prohibit having more than one
in flight. Generally, when using <tt>max_ack_delay</tt> for PTO computations, endpoints
MUST use the maximum of the current value and all those in flight.</t>
      <t>When the number of in-flight ack-eliciting packets is larger than the
ACK-Eliciting Threshold, an endpoint can expect that the peer will not need to
wait for its <tt>max_ack_delay</tt> period before sending an acknowledgement. In such
cases, the endpoint MAY therefore exclude the peer's 'max_ack_delay' from its PTO
calculation. Note that this optimization requires some care in implementation, since
it can cause premature PTOs under packet loss when <tt>ignore_order</tt> is enabled.</t>
    </section>
    <section anchor="implementation" numbered="true" toc="default">
      <name>Implementation Considerations</name>
      <t>There are tradeoffs inherent in a sender sending an ACK_FREQUENCY frame to the
receiver.  As such it is recommended that implementers experiment with different
strategies and find those which best suit their applications and congestion
controllers.  There are, however, noteworthy considerations when devising
strategies for sending ACK_FREQUENCY frames.</t>
      <section anchor="loss" numbered="true" toc="default">
        <name>Loss Detection</name>
        <t>A sender relies on receipt of acknowledgements to determine the amount of data
in flight and to detect losses, e.g. when packets experience reordering, see
<xref target="QUIC-RECOVERY" format="default"/>.  Consequently, how often a receiver sends acknowledgments
determines how long it takes for losses to be detected at the sender.</t>
      </section>
      <section anchor="new-connections" numbered="true" toc="default">
        <name>New Connections</name>
        <t>Many congestion control algorithms have a startup mechanism during the beginning
phases of a connection.  It is typical that in this period the congestion
controller will quickly increase the amount of data in the network until it is
signalled to stop.  While the mechanism used to achieve this increase varies,
acknowledgments by the peer are generally critical during this phase to drive
the congestion controller's machinery.  A sender can send ACK_FREQUENCY frames
while its congestion controller is in this state, ensuring that the receiver
will send acknowledgments at a rate which is optimal for the the sender's
congestion controller.</t>
      </section>
      <section anchor="window" numbered="true" toc="default">
        <name>Window-based Congestion Controllers</name>
        <t>Congestion controllers that are purely window-based and strictly adherent to
packet conservation, such as the one defined in <xref target="QUIC-RECOVERY" format="default"/>, rely on
receipt of acknowledgments to move the congestion window forward and send
additional data into the network.  Such controllers will suffer degraded
performance if acknowledgments are delayed excessively.  Similarly, if these
controllers rely on the timing of peer acknowledgments (an "ACK clock"),
delaying acknowledgments will cause undesirable bursts of data into the network.</t>
      </section>
      <section anchor="migration" numbered="true" toc="default">
        <name>Connection Migration</name>
        <t>To avoid additional delays to connection migration confirmation when using this
extension, a client can bundle an IMMEDIATE_ACK frame with the first non-probing
frame (<xref section="9.2" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>) it sends or it can simply send an
IMMEDIATE_ACK frame, which is a non-probing frame.</t>
        <t>An endpoint's congestion controller and RTT estimator are reset upon
confirmation of migration (<xref section="9.4" sectionFormat="of" target="QUIC-TRANSPORT" format="default"/>), which can
impact the number of acknowledgements received after migration. An
endpoint that has sent an ACK_FREQUENCY frame earlier in the connection SHOULD
update and send a new ACK_FREQUENCY frame immediately upon confirmation of
connection migration.</t>
      </section>
      <section anchor="path-mtu-discovery" numbered="true" toc="default">
        <name>Path MTU Discovery</name>
        <t>A sender might use timers to detect loss of PMTUD probe packets. A sender
SHOULD bundle an IMMEDIATE_ACK frame with any PTMUD probes to avoid triggering
such timers.</t>
      </section>
    </section>
    <section anchor="security-considerations" numbered="true" toc="default">
      <name>Security Considerations</name>
      <t>TBD.</t>
    </section>
    <section anchor="iana" numbered="true" toc="default">
      <name>IANA Considerations</name>
      <t>TBD.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <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>Fastly</organization>
            </author>
            <author initials="M." surname="Thomson" fullname="Martin Thomson" role="editor">
              <organization>Mozilla</organization>
            </author>
            <date year="2021" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="QUIC-RECOVERY">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author initials="J." surname="Iyengar" fullname="Jana Iyengar" role="editor">
              <organization>Fastly</organization>
            </author>
            <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
              <organization>Google</organization>
            </author>
            <date year="2021" month="May"/>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </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">
              <organization/>
            </author>
            <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">
              <organization/>
            </author>
            <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>
        <name>Informative References</name>
        <reference anchor="RFC8257">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley">
              <organization/>
            </author>
            <author fullname="D. Thaler" initials="D." surname="Thaler">
              <organization/>
            </author>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian">
              <organization/>
            </author>
            <author fullname="L. Eggert" initials="L." surname="Eggert">
              <organization/>
            </author>
            <author fullname="G. Judd" initials="G." surname="Judd">
              <organization/>
            </author>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic.  DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred.  DCTCP then scales the TCP congestion window based on this estimate.  This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches.  This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations.  This memo documents DCTCP as currently implemented by several major operating systems.  DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="RFC3168">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan">
              <organization/>
            </author>
            <author fullname="S. Floyd" initials="S." surname="Floyd">
              <organization/>
            </author>
            <author fullname="D. Black" initials="D." surname="Black">
              <organization/>
            </author>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header.  [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
      </references>
    </references>
    <section anchor="change-log" numbered="true" toc="default">
      <name>Change Log</name>
      <ul empty="true">
        <li>
          <t><strong>RFC Editor's Note:</strong> Please remove this section prior to publication of a
final version of this document.</t>
        </li>
      </ul>
    </section>
    <section numbered="false" anchor="acknowledgments" toc="default">
      <name>Acknowledgments</name>
      <t>The following people directly contributed key ideas that shaped this draft:
Bob Briscoe, Kazuho Oku, Marten Seemann.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
HGe1eSdUcFeCgajekdqWS3y9s2Z5UUR7bEcb3GzRMalRBwFJx2IahvnvKiXZ
u5NYVGXu4jus2JIrHZB7+4TgNAUKgZwkfkEAYpH4Ek50XuYRC73ZFZkJPJXh
sMwt0bvmeCMNmgOqgi+4btVj/+qk7czWixXOv5m3SYlPynbUNWpaRrLSsDzj
WEabuMm5PJhodjsF0QuA+XtTNljf0JzI4NCM65xnkVCf2y2ZG8b0rZSmlzXa
Gcu7RLKjqqHVuvAqxCuTz5v5c2alOV0VrTdrR+FclxA5eKc2tkbQI+B3R+yP
QciW7kX62B0e3q5ql1monW55WIlmXlDfVrorV7OtHgNTUYnUb4Ej3bCJnp4T
2J6dn09Pz45n0xtMiLh8ka96+SLQLndM5KStMA/VDV1d2nI1I4q1uFshLXGn
sGSHbM7hYUYoaVOX4F3G2GtqsLVSLLRO5wpV2oaqlpUbnWUT+QbrTh8VFohG
W600j4/IPjBVsdMEuSvArYXzwYbxmRvIqG0pShBwdssxKyrY8aF0pcrCWuls
jfWH2ixbDxqqSgDeQy/5QqjViwYT3i4CAFk0irtNBvcuTB29mnredAnE3w28
32L6DxwfDhTciIi5Fg2XQIs5qLyazTDmsU3FDBQWQAXXzhsgJbBDCIGBzYo2
0s7g/wFjaPnYWnZH5fY2B9nzZq4Bi4N8z/VdBonzFiGd1wXddVlEmWk1KOSe
NweK2O2eiUcXoFFrU3uH+alBu7oYzcAp+LRkRCaJEVpFBtTv7QkdH/3JWOZx
YhYNo6EDWGl1/8CpWU5WDhj7QLIyGfksIeCDj9SPe60Aj888DglxWZmyCpFK
kNm2fwrZYz7M7Xy06NSJOtzj1c4s+kXxp3MTlyL2SiF6HZGCfv4En7zd4fxv
PXLvD+T6Xgy5NJea2uqOo3gtkM+ouotJEuOsu8JKd819Ri4nhs4Ne1f64ynO
wo16YByo3Y5sYd99ot7+1qjMU/ogp10ymXzR8vpRUC+sgfiNFocElDodusHq
CHQilBHwdzyux8e5qpPV01ML+WB7iV6zFGtna9gAUOtlrypMpZaPoHW1KzuA
9WRbzR2WD6xFKDmllCAteeB0jd8tj5aiVAm7IapHPMCOTNw2ppVxA1S5Rp3E
4mYqyLcMNeY5MyHyZin7OItq4S71NaT+6A4QRUzBIacj+SFMUvfYvwxb85Us
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

-->

</rfc>
