<?xml version="1.0" encoding="US-ASCII"?>
<!-- This template is for creating an Internet Draft using xml2rfc,
    which is available here: http://xml.resource.org. -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
    There has to be one entity for each item to be referenced.
    An alternate method (rfc include) is described in the references. -->
<!ENTITY RFC768 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0768.xml">
<!ENTITY RFC792 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0792.xml">
<!ENTITY RFC970 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0970.xml">
<!ENTITY RFC896 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0896.xml">
<!ENTITY RFC1122 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1122.xml">
<!ENTITY RFC1123 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1123.xml">
<!ENTITY RFC1812 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1812.xml">
<!ENTITY RFC1191 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1191.xml">
<!ENTITY RFC1981 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1981.xml">
<!ENTITY RFC2119 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC2140 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2140.xml">
<!ENTITY RFC2309 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2309.xml">
<!ENTITY RFC2460 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2460.xml">
<!ENTITY RFC2475 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2475.xml">
<!ENTITY RFC2525 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2525.xml">
<!ENTITY RFC2553 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2553.xml">
<!ENTITY RFC2616 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2616.xml">
<!ENTITY RFC2914 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2914.xml">
<!ENTITY RFC3742 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3742.xml">
<!ENTITY RFC2923 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2923.xml">
<!ENTITY RFC3168 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
<!ENTITY RFC3260 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3260.xml">
<!ENTITY RFC3390 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3390.xml">
<!ENTITY RFC3395 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3395.xml">
<!ENTITY RFC3396 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3396.xml">
<!ENTITY RFC3449 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3449.xml">
<!ENTITY RFC3493 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3493.xml">
<!ENTITY RFC3550 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml">
<!ENTITY RFC3552 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3552.xml">
<!ENTITY RFC3678 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3678.xml">
<!ENTITY RFC3828 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3828.xml">
<!ENTITY RFC3819 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3819.xml">
<!ENTITY RFC4301 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4301.xml">
<!ENTITY RFC4340 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4340.xml">
<!ENTITY RFC4820 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4820.xml">
<!ENTITY RFC4821 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4821.xml">
<!ENTITY RFC4828 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4828.xml">
<!ENTITY RFC4890 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4890.xml">
<!ENTITY RFC4960 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4960.xml">
<!ENTITY RFC5033 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5033.xml">
<!ENTITY RFC5082 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5082.xml">
<!ENTITY RFC5097 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5097.xml">
<!ENTITY RFC5164 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5164.xml">
<!ENTITY RFC5166 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5166.xml">
<!ENTITY RFC5226 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5226.xml">
<!ENTITY RFC5348 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5348.xml">
<!ENTITY RFC5681 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml">
<!ENTITY RFC5783 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5783.xml">
<!ENTITY RFC6363 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6363.xml">
<!ENTITY RFC6679 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml">
<!ENTITY RFC6298 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
<!ENTITY RFC6773 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6773.xml">
<!ENTITY RFC6935 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6935.xml">
<!ENTITY RFC6936 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6936.xml">
<!ENTITY RFC6951 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6951.xml">
<!ENTITY RFC6968 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6968.xml">
<!ENTITY RFC6633 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6633.xml">
<!ENTITY RFC6928 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6928.xml">
<!ENTITY RFC7567 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7567.xml">
<!ENTITY RFC7661 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7661.xml">
<!ENTITY RFC8084 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8084.xml">
<!ENTITY RFC8085 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8085.xml">
<!ENTITY RFC8087 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8087.xml">
<!ENTITY RFC8201 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8201.xml">
<!ENTITY RFC8311 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8311.xml">
<!ENTITY RFC8312 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8312.xml">
<!ENTITY RFC8511 SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
<!ENTITY I-D.ietf-tsvwg-udp-options SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-tsvwg-udp-options-01.xml">
<!ENTITY I-D.ietf-tsvwg-sctp-dtls-encaps SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.draft-ietf-tsvwg-sctp-dtls-encaps-09.xml">
<!ENTITY I-D.ietf-quic-transport SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-quic-transport.xml">
<!ENTITY I-D.ietf-tcpm-rfc793bis SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-rfc793bis.xml">
<!ENTITY I-D.irtf-panrg-what-not-to-do SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-panrg-what-not-to-do.xml">
<!ENTITY I-D.ietf-tcpm-2140bis SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-2140bis.xml">
<!ENTITY I-D.ietf-tcpm-rack SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-rack.xml">
<!ENTITY I-D.ietf-tcpm-accurate-ecn SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-accurate-ecn.xml">
<!ENTITY I-D.ietf-tsvwg-l4s-arch SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tsvwg-l4s-arch.xml">
<!ENTITY I-D.ietf-tsvwg-aqm-dualq-coupled SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tsvwg-aqm-dualq-coupled.xml">
<!ENTITY I-D.ietf-quic-recovery SYSTEM "http://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-quic-recovery.xml">

]>
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?>
<!-- used by XSLT processors -->
<!-- For a complete list and description of processing instructions (PIs),
    please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
    (Here they are set differently than their defaults in xml2rfc v1.32) -->
<?rfc strict="yes" ?>
<!-- give errors regarding ID-nits and DTD validation -->
<!-- control the table of contents (ToC) -->
<?rfc toc="yes"?>
<!-- generate a ToC -->
<?rfc tocdepth="4"?>
<!-- the number of levels of subsections in ToC. default: 3 -->
<!-- control references -->
<?rfc symrefs="yes"?>
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>
<!-- sort the reference entries alphabetically -->
<!-- control vertical white space
    (using these PIs as follows is recommended by the RFC Editor) -->
<?rfc compact="yes" ?>
<!-- do not start each main section on a new page -->
<?rfc subcompact="no" ?>
<!-- keep one blank line between list items -->
<!-- end of list of popular I-D processing instructions -->
<rfc category="std" docName="draft-fairhurst-tsvwg-cc-05" ipr="trust200902"
     updates="">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: trust200902, noModificationTrust200902, noDerivativesTrust200902,
                 or pre5378Trust200902
    you can add the attributes updates="NNNN" and obsoletes="NNNN"
    they will automatically be output with "(if approved)" -->

  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the
     full title is longer than 39 characters -->

    <title abbrev="CC Guidelines">Guidelines for Internet Congestion Control
    at Endpoints</title>

    <!-- add 'role="editor"' below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->

    <author fullname="Godred Fairhurst" initials="G" surname="Fairhurst">
      <organization>University of Aberdeen</organization>

      <address>
        <postal>
          <street>School of Engineering</street>

          <street>Fraser Noble Building</street>

          <city>Aberdeen</city>

          <region></region>

          <code>AB24 3UE</code>

          <country>UK</country>
        </postal>

        <email>gorry@erg.abdn.ac.uk</email>
      </address>
    </author>

    <date day="17" month="November" year="2020" />

    <!-- Meta-data Declarations -->

    <area>Transport</area>

    <workgroup>Internet Engineering Task Force</workgroup>

    <!-- WG name at the upperleft corner of the doc,
     IETF is fine for individual submissions. If this element is not
     present, the default is "Network Working Group", which is used by the
     RFC Editor as a nod to the history of the IETF. -->

    <keyword>UDP Transport CC Congestion Control Design</keyword>

    <!-- Keywords will be incorporated into HTML output
     files in a meta tag but they have no effect on text or nroff output. If
     you submit your draft to the RFC Editor, the keywords will be used for
     the search engine. -->

    <abstract>
      <t>This document is for discussion by the TSVWG. It provides guidance on
      the design of methods to avoid congestion collapse and to provide
      congestion control. Recommendations and requirements on this topic are
      distributed across many documents in the RFC series. This therefore
      seeks to gather and consolidate these recommendations in an annexe.
      Based on these specifications, and Internet engineering experience, the
      document provides input to the design of new congestion control methods
      in protocols.</t>

      <t>The present document is for discussion and comment by the IETF. If
      published, it plans to update or replace the Best Current Practice in
      BCP 41, which currently includes "Congestion Control Principles"
      provided in RFC2914.</t>
    </abstract>
  </front>

  <middle>
    <section title="Introduction">
      <t>The IETF has specified Internet transports (e.g., TCP <xref
      target="I-D.ietf-tcpm-rfc793bis"></xref>, UDP <xref
      target="RFC0768"></xref>, UDP-Lite <xref target="RFC3828"></xref>, SCTP
      <xref target="RFC4960"></xref>, and DCCP <xref target="RFC4340"></xref>)
      as well as protocols layered on top of these transports (e.g., RTP <xref
      target="RFC3550"></xref>, QUIC <xref
      target="I-D.ietf-quic-transport"></xref>, SCTP/UDP <xref
      target="RFC6951"></xref>, DCCP/UDP <xref target="RFC6773"></xref>) and
      transports that work directly over the IP network layer. These
      transports are implemented in endpoints (either Internet hosts or
      routers acting as endpoints), and are designed to detect and react to
      network congestion. TCP was the first transport to provide this,
      although the TCP specifications found in RFC 793 predates the inclusion
      of congestion control and did not contain any discussion of using or
      managing a congestion window. RFC 793.bis <xref
      target="I-D.ietf-tcpm-rfc793bis"></xref> seek to address this.</t>

      <t>Recommendations and requirements on this topic are distributed across
      many documents in the RFC series. The appendix of this document
      therefore seeks to gather and consolidate these recommendations. This,
      and Internet engineering experience are used as a basis to provide
      overall guidelines as input to the design of congestion control methods
      that are implemented in Internet protocols. The focus of the present
      document is upon unicast point-to-point transports, this includes
      migration from using one path to another path.</t>

      <t>Some recommendations <xref target="RFC5783"></xref> and requirements
      in this document apply to point-to-multipoint transports (e.g.,
      multicast), however this topic extends beyond the current document's
      scope. <xref target="RFC2914"></xref> provides additional guidance on
      the use of multicast.</t>
    </section>

    <section title="Terminology">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119"></xref>.</t>

      <t>The path between endpoints (sometimes called "Internet Hosts" or
      called source and destination nodes in IPv6) consists of the endpoint
      protocol stack at the sender and the receiver (which together implement
      the transport service), and a succession of links and network devices
      (routers or middleboxes) that provide connectivity across the network.
      The set of network devices forming the path is not usually fixed, and it
      should generally be assumed that this set can change over arbitrary
      lengths of time.</t>

      <t><xref target="RFC5783"></xref> defines congestion control as "the
      feedback-based adjustment of the rate at which data is sent into the
      network. Congestion control is an indispensable set of principles and
      mechanisms for maintaining the stability of the Internet." <xref
      target="RFC5783"></xref> also provides an informational snapshot taken
      by the IRTF's Internet Congestion Control Research Group (ICCRG) from
      October 2008.</t>

      <t>The text draws on language used in the specifications of TCP and
      other IETF transports. For example, a protocol timer is generally needed
      to detect persistent congestion, and this document uses the term
      Retransmission Timeout (RTO) to refer to the operation of this timer.
      Similarly, the document refers to a congestion window as the variable
      that controls the rate of transmission by the congestion controller. The
      use of these terms does not imply that endpoints need to implement
      functions in the way that TCP currently does. Each new transport needs
      to make its own design decisions about how to meet the recommendations
      and requirements for congestion control.</t>

      <t>Other terminology is directly copied from the cited RFCs.</t>
    </section>

    <section title="Principles of Congestion Control">
      <t>This section summarises the principles for providing congestion
      control.</t>

      <section anchor="response" title="Internet Requirements">
        <t>Principles include: <list style="symbols">
            <t>Endpoints MUST perform congestion control <xref
            target="RFC1122"></xref> and SHOULD leverage existing congestion
            control techniques <xref target="RFC8085"></xref>.</t>

            <t>If an application or protocol chooses not to use a
            congestion-controlled transport protocol, it SHOULD control the
            rate at which it sends datagrams to a destination host, in order
            to fulfil the requirements of <xref target="RFC2914"></xref>, as
            stated in <xref target="RFC8085"></xref>.</t>

            <t>Transports SHOULD control the aggregate traffic they send on a
            path <xref target="RFC8085"></xref>. They ought not to use
            multiple congestion-controlled flows between the same endpoints to
            gain a performance advantage. An endpoint can become aware of
            congestion by various means (including, delay variation, timeout,
            ECN, packet loss). A signal that indicates congestion on the
            end-to-end network path, SHOULD result in a congestion control
            reaction by the transport that reduces the current rate of the
            sending endpoint<xref target="RFC8087"></xref>).</t>

            <t>Although network devices can be configured to reduce the impact
            of flow multiplexing on other flows, endpoints MUST NOT rely
            solely on the presence and correct configuration of these methods,
            except when constrained to operate in a controlled environment.
            Transports that do not target Internet deployment need to be
            constrained to only operate in a controlled environment (e.g., see
            Section 3.6 of <xref target="RFC8085"></xref>) and provide
            appropriate mechanisms to prevent traffic accidentally leaving the
            controlled environment <xref target="RFC8084"></xref>.</t>
          </list></t>

        <section anchor="pathchar"
                 title="Tolerence to a Diversity of Path Characteristics">
          <t>Principles include:</t>

          <t><list style="symbols">
              <t>A transport design is REQUIRED be robust to a change in the
              set of devices forming the network path. A reconfiguration,
              reset or other event could interrupt this path or trigger a
              change in the set of network devices forming the path.</t>

              <t>Transports are REQUIRED to operate safely over the wide range
              of path characteristics presented by Internet paths.</t>

              <t>Path characteristics can change over relatively short
              intervals of time (i.e., characteristics discovered do not
              necessarily remain valid for multiple Round Trip Times, RTTs).
              In particular, the transport SHOULD measure and adapt to the
              characteristics of the path(s) being used.</t>
            </list></t>
        </section>
      </section>

      <section title="Avoiding Congestion Collapse and Flow Starvation">
        <t>Principles include:</t>

        <t><list style="symbols">
            <t>Transports MUST avoid inducing flow starvation to other flows
            that share resources along the path they use.</t>

            <t>Endpoints MUST treat a loss of all feedback (e.g., expiry of a
            retransmission time out, RTO) as an indication of persistent
            congestion (i.e., an indication of potential congestion
            collapse).</t>

            <t>When an endpoint detects persistent congestion, it MUST reduce
            the maximum rate (e.g., reduce its congestion window). This
            normally involves the use of protocol timers to detect a lack of
            acknowledgment for transmitted data (<xref
            target="Timers"></xref>).</t>

            <t>Protocol timers (e.g., used for retransmission or to detect
            persistent congestion) need to be appropriately initialised. A
            transport SHOULD adapt its protocol timers to follow the measured
            the path Round Trip Rime (RTT) (e.g., Section 3.1.1 of <xref
            target="RFC8085"></xref>).</t>

            <t>A transport MUST employ exponential backoff each time
            persistent congestion is detected <xref target="RFC1122"></xref>,
            until the path characteristics can again be confirmed.</t>

            <t>Network devices MAY provide mechanisms to mitigate the impact
            of congestion collapse by transport flows (e.g., priority
            forwarding of control information, and starvation detection), and
            SHOULD mitigate the impact of non-conformant and malicious flows
            <xref target="RFC7567"></xref>). These mechanisms complement, but
            do not replace, the endpoint congestion avoidance mechanisms.</t>
          </list></t>
      </section>

      <section title="Connection Initialization">
        <t>When a connection or flow to a new destination is established, the
        endpoints have little information about the characteristics of the
        network path they will use. This section describes how a flow starts
        transmission over such a path.</t>

        <t><list style="hanging">
            <t hangText="Flow Start:">A new flow between two endpoints needs
            to initialise a congestion controller for the path it will use. It
            MUST NOT assume that capacity is available at the start of the
            flow, unless it uses a mechanism to explicitly reserve capacity.
            In the absence of a capacity signal, a flow might therefore start
            slowly. The TCP slow-start algorithm is an accepted standard for
            flow startup <xref target="RFC5681"></xref>. TCP uses the notion
            of an Initial Window (IW) <xref target="RFC3390"></xref>, updated
            by <xref target="RFC6928"></xref>) to define the initial volume of
            data that can be sent on a path. This is not the smallest burst,
            or the smallest window, but it is considered a safe starting point
            for a path that is not suffering persistent congestion, and is
            applicable until feedback about the path is received. The initial
            sending rate (e.g., determined by the IW) needs to be viewed as
            tentative until the capacity is confirmed to be available.</t>

            <t hangText="Initial RTO Interval:">When a flow sends the first
            packet(s), it typically has no way to know the actual RTT of the
            path it will use. An initial value needs to be used to initialise
            the principal retransmission timer, which will be used to detect
            lack of responsiveness from the remote endpoint. In TCP, this is
            the starting value of the RTO. The selection of a safe initial
            value is a trade off that has important consequences on the
            overall Internet stability <xref target="RFC6928"></xref> <xref
            target="RFC8085"></xref>. In the absence of any knowledge about
            the latency of a path (including the initial value), the RTO MUST
            be conservatively set to no less than 1 second. Values shorter
            than 1 second can be problematic (see the appendix of <xref
            target="RFC6298"></xref>). (Note: Linux TCP has deployed a smaller
            initial RTO value).</t>

            <t hangText="">[[Author note: It could be useful to discuss cached
            values]].</t>

            <t hangText="Initial RTO Expiry:">If the RTO timer expires while
            awaiting completion of a connection setup, or handshake (e.g., the
            three-way handshake in TCP, the ACK of a SYN segment), and the
            implementation is using an RTO less than 3 seconds, the local
            endpoint can resend the connection setup. [[Author note: It would
            be useful to discuss how the timer is managed to protect from
            multiple handshake failure]].</t>

            <t hangText="">The RTO MUST then be re-initialized to increase it
            to 3 seconds when data transmission begins (i.e., after the
            handshake completes) <xref target="RFC6298"></xref> <xref
            target="RFC8085"></xref>. This conservative increase is necessary
            to avoid congestion collapse when many flows retransmit across a
            shared bottleneck with restricted capacity.</t>

            <t hangText="Initial Measured RTO:">Once an RTT measurement is
            available (e.g., through reception of an acknowledgement), the
            timeout value must be adjusted. This adjustment MUST take into
            account the RTT variance. For the first sample, this variance
            cannot be determined, and a local endpoint MUST therefore
            initialise the variance to RTT/2 (see equation 2.2 of <xref
            target="RFC6928"></xref> and related text for UDP in section 3.1.1
            of <xref target="RFC8085"></xref>).</t>

            <t hangText="Current State:">A congestion controller MAY assume
            that recently used capacity between a pair of endpoints is an
            indication of future capacity available in the next RTT between
            the same endpoints. It MUST react (reduce its rate) if this is not
            (later) confirmed to be true. [[Author note: do we need to bound
            this]].</t>

            <t hangText="Cached State:">A congestion controller that recently
            used a specific path could use additional state that lets a flow
            take-over the capacity that was previously consumed by another
            flow (e.g., in the last RTT) which it understands is using the
            same path and no will longer use the capacity it recently used. In
            TCP, this mechanism is referred to as TCP Control Block (TCB)
            sharing <xref target="RFC2140"></xref> <xref
            target="I-D.ietf-tcpm-2140bis"></xref>. The capacity and other
            information can be used to suggest a faster initial sending
            rate.</t>

            <t>Any information used to accellerate the growth of the cwnd MUST
            be viewed as tentative until the path capacity is confirmed by
            receiving a confirmation that actual traffic has been sent across
            the path. (i.e., the new flow needs to either use or loose the
            capacity that has been tentatively offered to it). A sender MUST
            reduce its rate if this capacity is not confirmed within the
            current RTO interval.</t>
          </list></t>
      </section>

      <section anchor="Path-Capacity" title="Using Path Capacity">
        <t>This section describes how a sender needs to regulate the maximum
        volume of data in flight over the interval of the current RTT, and how
        it manages transmission of the capacity that it perceives is
        available.</t>

        <t><list style="hanging">
            <t hangText="Transient Path:">Unless managed by a resource
            reservation protocol, path capacity information is transient. A
            sender that does not use capacity has no understanding whether
            previously used capacity remains available to use, or whether that
            capacity has disappeared (e.g., a change in the path that causes a
            flow to experience a smaller bottleneck, or when more traffic
            emerges that consumes previously available capacity resulting in a
            new bottleneck). For this reason, a transport that is limited by
            the volume of data available to send MUST NOT continue to grow its
            congestion window when the current congestion window is more than
            twice the volume of data acknowledged in the last RTT.</t>

            <t hangText="Validating the congestion window">Standard TCP states
            that a TCP sender "SHOULD set the congestion window to no more
            than the Restart Window (R)" before beginning transmission, if the
            sender has not sent data in an interval that exceeds the current
            retransmission timeout, i.e., when an application becomes idle
            <xref target="RFC5681"></xref>. An experimental specification
            <xref target="RFC7661"></xref> permits TCP senders to tentatively
            maintain a congestion window larger than the path supported in the
            last RTT when application-limited, provided that they
            appropriately and rapidly collapse the congestion window when
            potential congestion is detected. This mechanism is called
            Congestion Window Validation (CWV).</t>

            <t hangText="Collateral Damage:">Even in the absence of
            congestion, statistical multiplexing of flows can result in
            transient effects for flows sharing common resources. A sender
            therefore SHOULD avoid inducing excessive congestion to other
            flows (collateral damage).</t>

            <t hangText="Burst Mitigation:">While a congestion controller
            ought to limit sending at the granularity of the current RTT, this
            can be insufficient to satisfy the goals of preventing starvation
            and mitigating collateral damage. This requires moderating the
            burst rate of the sender to avoid significant periods where a
            flow(s) consume all buffer capacity at the path bottleneck, which
            would otherwise prevent other flows from gaining a reasonable
            share. Endpoints SHOULD provide mechanisms to regulate the bursts
            of transmission that the application/protocol sends to the network
            (section 3.1.6 of <xref target="RFC8085"></xref>). ACK-Clocking
            <xref target="RFC5681"></xref> can help mitigate bursts for
            protocols that receive continuous feedback of reception (such as
            TCP). Sender pacing can mitigate this <xref
            target="RFC8085"></xref>, (See Section 4.6 of <xref
            target="RFC3449"></xref>), and has been recommended for TCP in
            conditions where ACK-Clocking is not effective, (e.g., <xref
            target="RFC3742"></xref>, <xref target="RFC7661"></xref>). SCTP
            <xref target="RFC4960"></xref> defines a maximum burst length
            (Max.Burst) with a recommended value of 4 segments to limit the
            SCTP burst size.</t>
          </list></t>
      </section>

      <section anchor="Timers" title="Timers and Retransmission">
        <t>This section describes mechanisms to detect and provide
        retransmission, and to protect the network in the absence of timely
        feedback.</t>

        <t><list style="hanging">
            <t hangText="Loss Detection:">Loss detection occurs after a sender
            determines there is no delivery confirmation within an expected
            period of time (e.g., by observing the time-ordering of the
            reception of ACKs, as in TCP DupACK) or by utilising a timer to
            detect loss (e.g., a transmission timer with a period less than
            the RTO, <xref target="RFC8085"></xref> <xref
            target="I-D.ietf-tcpm-rack"></xref>) or a combination of using a
            timer and ordering information to trigger retransmission of
            data.</t>

            <t hangText="Retransmission:">Retransmission of lost packets or
            messages is a common reliability mechanism. When loss is detected,
            the sender can choose to retransmit the lost data, ignore the
            loss, or send other data (e.g., <xref target="RFC8085"></xref>
            <xref target="I-D.ietf-quic-recovery"></xref>), depending on the
            reliability model provided by the transport service. Any
            transmission consumes network capacity, therefore retransmissions
            MUST NOT increase the network load in response to congestion loss
            (which worsens that congestion) <xref target="RFC8085"></xref>.
            Any method that sends additional data following loss is therefore
            responsible for congestion control of the retransmissions (and any
            other packets sent, including FEC information) as well as the
            original traffic.</t>

            <t hangText="Measuring the RTT:">Once an endpoint has started
            communicating with its peer, the RTT be MUST adjusted by measuring
            the actual path RTT. This adjustment MUST include adapting to the
            measured RTT variance (see equation 2.3 of <xref
            target="RFC6928"></xref>).</t>

            <t hangText="Maintaining the RTO:">The RTO SHOULD be set based on
            recent RTT observations (including the RTT variance) <xref
            target="RFC8085"></xref>.</t>

            <t hangText="RTO Expiry:">Persistent lack of feedback (e.g.,
            detected by an RTO timer, or other means) MUST be treated an
            indication of potential congestion collapse. A failure to receive
            any specific response within a RTO interval could potentially be a
            result of a RTT change, change of path, excessive loss, or even
            congestion collapse. If there is no response within the RTO
            interval, TCP collapses the congestion window to one segment <xref
            target="RFC5681"></xref>. Other transports MUST similarly respond
            when they detect loss of feedback.</t>

            <t hangText="">An endpoint needs to exponentially backoff the RTO
            interval <xref target="RFC8085"></xref> each time the RTO expires.
            That is, the RTO interval MUST be set to at least the RTO * 2
            <xref target="RFC6298"></xref> <xref target="RFC8085"></xref>.</t>

            <t hangText="Maximum RTO:">A maximum value MAY be placed on the
            RTO interval. This maximum limit to the RTO interval MUST NOT be
            less than 60 seconds <xref target="RFC6298"></xref>.</t>

            <t hangText="">[[ Author Note: Check RTO-Consider. ]]</t>
          </list></t>
      </section>

      <!-- Timers -->

      <section title="Responding to Potential Congestion">
        <t>The safety and responsiveness of new proposals need to be evaluated
        <xref target="RFC5166"></xref>. In determining an appropriate
        congestion response, designs could take into consideration the size of
        the packets that experience congestion <xref
        target="RFC4828"></xref>.</t>

        <t><list style="hanging">
            <t hangText="Congestion Response:">An endpoint MUST promptly
            reduce the rate of transmission when it receive or detects an
            indication of congestion (e.g., loss) <xref
            target="RFC2914"></xref>.</t>

            <t hangText="">TCP Reno established a method that relies on
            multiplicative-decrease to halve the sending rate while congestion
            is detected. This response to congestion indications is considered
            sufficient for safe Internet operation, but other decrease factors
            have also been published in the RFC Series <xref
            target="RFC8312"></xref>.</t>

            <t hangText="ECN Response:">A congestion control design should
            provide the necessary mechanisms to support Explicit Congestion
            Notification (ECN) <xref target="RFC3168"></xref> <xref
            target="RFC6679"></xref>, as described in section 3.1.7 of <xref
            target="RFC8085"></xref>. This can help determine an appropriate
            congestion window when supported by routers on the path <xref
            target="RFC7567"></xref> to enable rapid early indication of
            incipient congestion.</t>

            <t hangText="">The early detection of incipient congestion
            justifies a different reaction to an explicit congestion signal
            compared to the reaction to detected packet loss <xref
            target="RFC8311"></xref> <xref target="RFC8087"></xref>. Simple
            feedback of received Congestion Experienced (CE) marks <xref
            target="RFC3168"></xref>, relies only on an indication that
            congestion has been experienced within the last RTT. This style of
            response is appropriate when a flow uses ECT(0). The reaction to
            reception of this indication was modified in TCP ABE <xref
            target="RFC8511"></xref>. Further detail about the received
            CE-marking can be obtained by using more accurate receiver
            feedback (e.g., <xref target="I-D.ietf-tcpm-accurate-ecn"></xref>
            and extended RTP feedback). The more detailed feedback provides an
            opportunity for a finer-granularity of congestion response.</t>

            <t hangText="">Current work-in-progress <xref
            target="I-D.ietf-tsvwg-l4s-arch"></xref>defines a reaction for
            packets marked with ECT(1), building on the style of detailed
            feedback provided by <xref
            target="I-D.ietf-tcpm-accurate-ecn"></xref> and a modified marking
            system <xref
            target="I-D.ietf-tsvwg-aqm-dualq-coupled"></xref>.</t>

            <t hangText="Robustness to Path Change:">The detection of
            congestion and the resulting reduction MUST NOT solely depend upon
            reception of a signal from the remote endpoint, because congestion
            indications could themselves be lost under persistent
            congestion.</t>

            <t hangText="">The only way to surely confirm that a sending
            endpoint has successfully communicated with a remote endpoint is
            to utilise a timer (see<xref target="Timers"></xref>) to detect a
            lack of response that could result from a change in the path or
            the path characteristics (usually called the RTO). Congestion
            controllers that are unable to react after one (or at most a few)
            RTTs after receiving a congestion indication should observe the
            guidance in section 3.3 of the UDP Guidelines <xref
            target="RFC8085"></xref>.</t>

            <t hangText="Persistent Congestion:">Persistent congestion can
            result in congestion collapse, which MUST be aggressively avoided
            <xref target="RFC2914"></xref>. Endpoints that experience
            persistent congestion and have already exponentially reduced their
            congestion window to the restart window (e.g., one packet), MUST
            further reduce the rate if the RTO timer continues to expire. For
            example, TFRC <xref target="RFC5348"></xref> continues to reduce
            its sending rate under persistent congestion to one packet per RT,
            and then exponentially backs off the time between single packet
            transmissions if the congestion continues to persist <xref
            target="RFC2914"></xref>.</t>

            <t hangText=""><xref target="RFC8085"></xref> provides guidelines
            for a sender that does not, or is unable to, adapt the congestion
            window.</t>
          </list></t>
      </section>

      <!-- response -->

      <section title="Using More Capacity">
        <t>In the absence of persistent congestion, an endpoint MAY increase
        its congestion window and hence the sending rate. An increase should
        only occur when there is additional data available to send across the
        path (i.e., the sender will utilise the additional capacity in the
        next RTT).</t>

        <t><list style="hanging">
            <t hangText="Increasing Congestion Window:">A sender MUST NOT
            continue to increase its rate for more than an RTT after a
            congestion indication is received. The transport SHOULD stop
            increasing its congestion window as soon as it receives indication
            of congestion.</t>

            <t hangText="">While the sender is increasing the congestion
            window, a sender will transmit faster than the last confirmed safe
            rate. Any increase above the last confirmed rate needs to be
            regarded as tentative and the sender reduce their rate below the
            last confirmed safe rate when congestion is experienced (a
            congestion event).</t>

            <t hangText="Congestion:">An endpoint MUST utilise a method that
            assures the sender will keep the rate below the previously
            confirmed safe rate for multiple RTT periods after an observed
            congestion event. In TCP, this is performed by using a linear
            increase from a slow start threshold that is re-initialised when
            congestion is experienced.</t>

            <t hangText="Avoiding Overshoot:">Overshoot of the congestion
            window beyond the point of congestion can significantly impact
            other flows sharing resources along a path. It is important to
            note that as endpoints experience more paths with a large BDP and
            a wider range of potential path RTT, that variability or changes
            in the path can have very significant constraints on appropriate
            dynamics for increasing the congestion window (see also burst
            mitigation, <xref target="Path-Capacity"></xref>).</t>
          </list></t>
      </section>

      <!-- More -->

      <section anchor="Signals" title="Network Signals">
        <t>An endpoint can utilise signals from the network to help determine
        how to regulate the traffic it sends.</t>

        <t><list style="hanging">
            <t hangText="Network Signals:">Mechanisms MUST NOT solely rely on
            transport messages or specific signalling messages to perform
            safely. (See section 5.2 of <xref target="RFC8085"></xref>
            describing use of ICMP messages). They need to be designed so that
            they safely operate when path characteristics change at any time.
            Transport mechanisms MUST robust to potential black-holing of any
            signals (i.e., need to be robust to loss or modification of
            packets, noting that this can occur even after successful first
            use of a signal by a flow, as occurs when the path changes, see
            <xref target="pathchar"></xref>).</t>

            <t hangText="">A mechanism that utilises signals originating in
            the network (e.g., RSVP, NSIS, Quick-Start, ECN), MUST assume that
            the set of network devices on the path can change. This motivates
            the use of soft-state when designing protocols that interact with
            signals originating from network devices <xref
            target="I-D.irtf-panrg-what-not-to-do"></xref> (e.g., ECN). This
            can include context-sensitive treatment of "soft" signals provided
            to the endpoint <xref target="RFC5164"></xref>.</t>
          </list></t>
      </section>

      <section anchor="Protect" title="Protection of Protocol Mechanisms ">
        <t>An endpoint needs to provide protection from attacks on the traffic
        it generates, or attacks that seek to increase the capacity it
        consumes (impacting other traffic that shared a bottleneck).</t>

        <t hangText="Protection From Attack:"><list style="hanging">
            <t hangText="Off Path Attack: ">A design MUST protect from
            off-path attack to the protocol <xref target="RFC8085"></xref>
            (i.e., one by an attacker that is unable to see the contents of
            packets exchanged across the path). An attack on the congestion
            control can lead to a Denial of Service (DoS) vulnerability for
            the flow being controlled and/or other flows that share network
            resources along the path.</t>

            <t hangText="Validation of Signals:">Network signalling and
            control messages (e.g., ICMP <xref target="RFC0792"></xref>) MUST
            be validated before they are used to protect from malicious abuse.
            This MUST at least include protection from off-path attack <xref
            target="RFC8085"></xref>.</t>

            <t hangText="On Path Attack: ">A protocol can be designed to
            protect from on-path attacks, but this requires more complexity
            and the use of encryption/authentication mechanisms (e.g., IPsec
            <xref target="RFC4301"></xref>, QUIC <xref
            target="I-D.ietf-quic-transport"></xref>).</t>
          </list></t>
      </section>
    </section>

    <!-- ================================================================== -->

    <section title="IETF Guidelines on Evaluation of Congestion Control">
      <t>The IETF has provided guidance <xref target="RFC5033"></xref> for
      considering alternate congestion control algorithms.</t>

      <t>The IRTF has also described a set of metrics and related trade-off
      between metrics that can be used to compare, contrast, and evaluate
      congestion control techniques <xref target="RFC5166"></xref>. <xref
      target="RFC5783"> </xref> provides a snapshot of congestion-control
      research in 2008.</t>
    </section>

    <!-- Eval -->

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>This document owes much to the insight offered by Sally Floyd, both
      at the time of writing of RFC2914 and her help and review in the many
      years that followed this.</t>

      <t>Nicholas Kuhn helped develop the first draft of these guidelines. Tom
      Jones and Ana Custura reviewed the first version of this draft. The
      University of Aberdeen received funding to support this work from the
      European Space Agency.</t>
    </section>

    <!-- ACK -->

    <section anchor="IANA" title="IANA Considerations">
      <t>This memo includes no request to IANA.</t>

      <t>RFC Editor Note: If there are no requirements for IANA, the section
      will be removed during conversion into an RFC by the RFC Editor.</t>
    </section>

    <!-- IANA -->

    <section anchor="Security" title="Security Considerations">
      <t>This document introduces no new security considerations. Each RFC
      listed in this document discusses the security considerations of the
      specification it contains. The security considerations for the use of
      transports are provided in the references section of the cited RFCs.
      Security guidance for applications using UDP is provided in the UDP
      Usage Guidelines <xref target="RFC8085"></xref>.</t>

      <t><xref target="Protect"></xref> describes general requirements
      relating to the design of safe protocols and their protection from on
      and off path attack.</t>

      <t><xref target="Signals"></xref> follows current best practice to
      validate ICMP messages prior to use.</t>
    </section>

    <!-- sec -->
  </middle>

  <back>
    <!-- References split into informative and normative -->

    <references title="Normative References">
      <!--?rfc include="http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119.xml"?-->

      &RFC1122;

      &RFC2119;

      &RFC2914;

      &RFC3168;

      &RFC3390;

      &RFC3742;

      &RFC5348;

      &RFC5681;

      &RFC6298;

      &RFC6928;

      &RFC7661;

      &RFC8085;

      &RFC7567;
    </references>

    <references title="Informative References">
      <!-- Here we use entities that we defined at the beginning. -->

      &RFC768;

      &RFC792;

      &RFC896;

      &RFC970;

      &RFC2309;

      &RFC2140;

      &RFC2525;

      &RFC2616;

      &RFC3449;

      &RFC3550;

      &RFC6363;

      &RFC8311;

      &RFC3828;

      &RFC4301;

      &RFC4340;

      &RFC4960;

      &RFC4828;

      &RFC5164;

      &RFC5033;

      &RFC5783;

      &RFC6679;

      &RFC6773;

      &RFC6951;

      &RFC3819;

      &RFC5166;

      &RFC8084;

      &RFC8087;

      &RFC8511;

      &RFC8312;

      &I-D.ietf-quic-transport;

      &I-D.ietf-tcpm-rfc793bis;

      &I-D.irtf-panrg-what-not-to-do;

      &I-D.ietf-tcpm-2140bis;
      
      &I-D.ietf-tcpm-rack;

      &I-D.ietf-tcpm-accurate-ecn;

      &I-D.ietf-tsvwg-l4s-arch;

      &I-D.ietf-tsvwg-aqm-dualq-coupled;

      &I-D.ietf-quic-recovery;

      <reference anchor="Flow-Rate-Fairness">
        <front>
          <title>Flow Rate Fairness: Dismantling a Religion, ACM Computer
          Communication Review 37(2):63-74</title>

          <author fullname="Bob Briscoe" initials="Bob " surname="Briscoe">
            <organization>ACM CCR</organization>
          </author>

          <date month="April" year="2007" />
        </front>
      </reference>
    </references>

    <section title="Internet Congestion Control">
      <t>Internet transports can reserve capacity at routers or on the links
      being used. This is sometimes used in controlled environments, but most
      uses across the Internet do not rely upon prior reservation of capacity
      along the path they use. In the absence of such a reservation, endpoints
      are unable to determine a safe rate at which to start or continue their
      transmission. The use of an Internet path therefore requires a
      combination of end-to-end transport mechanisms to detect and then
      respond to changes in the capacity that it discovers is available across
      the network path.</t>

      <t>Buffering (an increase in latency) or congestion loss (discard of a
      packet) arises when the traffic arriving at a link or network exceeds
      the resources available. Loss can also occur for other reasons, but it
      is usually not possible for an endpoint to reliably disambiguate the
      cause of packet loss (e.g., loss could be due to link corruption,
      receiver overrun, etc. <xref target="RFC3819"></xref>). A network device
      typically uses a drop-tail policy to drop excess IP packets when its
      queue(s) becomes full. This use of buffers can also be managed using
      Active Queue Management (AQM) <xref target="RFC7567"></xref>, which can
      be combined withb Explicit Congestion Notification signalling.</t>

      <t>Internet transports need to react to avoid congestion that impacts
      other flows sharing a path. <xref target="RFC1122">The Requirements for
      Internet Hosts</xref> formally mandates that endpoints perform
      congestion control. "Because congestion control is critical to the
      stable operation of the Internet, applications and other protocols that
      choose to use UDP as an Internet transport must employ mechanisms to
      prevent congestion collapse and to establish some degree of fairness
      with concurrent traffic <xref target="RFC2914"></xref>.</t>

      <t>The general recommendation in the UDP Guidelines <xref
      target="RFC8085"></xref> is that applications SHOULD leverage existing
      congestion control techniques, such as those defined for TCP <xref
      target="RFC5681"></xref>, TCP-Friendly Rate Control (TFRC) <xref
      target="RFC5348"></xref>, SCTP <xref target="RFC4960"></xref>, and other
      IETF-defined transports. This is because there are many trade offs and
      details that can have a serious impact on the performance of congestion
      control for the application they support and other traffic that seeks to
      share the resources along the path over which they communicate.</t>

      <t>Network devices can be configured to isolate the queuing of packets
      for different flows, or aggregates of flows, and thereby assist in
      reducing the impact of flow multiplexing on other flows. This could
      include methods seeking to equally distribute resources between sharing
      flows, but this is explicitly not a requirement for a network device
      <xref target="Flow-Rate-Fairness"></xref>. Endpoints can not rely on the
      presence and correct configuration of these methods, and therefore even
      when a path is expected to support such methods, also need to employ
      methods that work end-to-end.</t>

      <t>Experience has shown that successful protocols developed in a
      specific context or for a particular application tend to also become
      used in a wider range of contexts. Therefore, IETF specifications by
      default target deployment on the general Internet, or need to be defined
      for use only within a controlled environment.</t>

      <section title="Flow Multiplexing and Congestion">
        <t>When a transport uses a path to send packets (i.e. a flow), this
        impacts any other Internet flows (possibly from or to other endpoints)
        that share the capacity of any common network device or link (i.e.,
        are multiplexed) along the path. As with loss, latency can also be
        incurred for other reasons <xref target="RFC3819"></xref> (Quality of
        Service link scheduling, link radio resource management/bandwidth on
        demand, transient outages, link retransmission, and
        connection/resource setup below the IP layer, etc).</t>

        <t>When choosing an appropriate sending rate, packet loss needs to be
        considered. Although losses are not always due to congestion, endpoint
        congestion control needs to conservatively react to loss as a
        potential signal of reduced available capacity and reduce the sending
        rate. Many designs place the responsibility of rate-adaption at the
        sender (source) endpoint, utilising feedback information provided by
        the remote endpoint (receiver). Congestion control can also be
        implemented by determining an appropriate rate limit at the receiver
        and using this limit to control the maximum transport rate (e.g.,
        using methods such as <xref target="RFC5348"></xref> and <xref
        target="RFC4828"></xref>).</t>

        <t>It is normal to observe some perturbation in latency and/or loss
        when flows shares a common network bottleneck with other traffic. This
        impact needs to be considered and Internet flows ought to implement
        appropriate safeguards to avoid inappropriate impact on other flows
        that share the resources along a path. Congestion control methods
        satisfy this requirement and therefore can help avoid congestion
        collapse.</t>

        <t>"This raises the issue of the appropriate granularity of a "flow",
        where we define a `flow' as the level of granularity appropriate for
        the application of both fairness and congestion control. <xref
        target="RFC2309"></xref> states: "There are a few `natural' answers:
        1) a TCP or UDP connection (source address/port, destination
        address/port); 2) a source/destination host pair; 3) a given source
        host or a given destination host. We would guess that the
        source/destination host pair gives the most appropriate granularity in
        many circumstances. The granularity of flows for congestion management
        is, at least in part, a policy question that needs to be addressed in
        the wider IETF community." <xref target="RFC2914"></xref></t>

        <t>Endpoints can send more than one flow. "The specific issue of a
        browser opening multiple connections to the same destination has been
        addressed by <xref target="RFC2616"></xref>. Section 8.1.4 states that
        "Clients that use persistent connections SHOULD limit the number of
        simultaneous connections that they maintain to a given server. A
        single-user client SHOULD NOT maintain more than 2 connections with
        any server or proxy." <xref target="RFC2140"></xref>.</t>

        <t>This suggests that there are opportunities for transport
        connections between the same endpoints (from the same or differing
        applications) might share some information, including their congestion
        control state, if they are known to share the same path. <xref
        target="RFC8085"></xref> adds "An application that forks multiple
        worker processes or otherwise uses multiple sockets to generate UDP
        datagrams SHOULD perform congestion control over the aggregate
        traffic."</t>

        <t>In the absence of persistent congestion, an endpoint is permitted
        to increase its congestion window and hence the sending rate. An
        increase should only occur when there is additional data available to
        send across the path (i.e., the sender will utilise the additional
        capacity in the next RTT).</t>

        <t>TCP Reno <xref target="RFC5681"></xref> defines an algorithm, known
        as the Additive-Increase/ Multiplicative-Decrease (AIMD) algorithm,
        which allows a sender to exponentially increase the congestion window
        each RTT from the initial window to the first detected congestion
        event. This is designed to allow new flows to rapidly acquire a
        suitable congestion window. Where the bandwidth delay product (BDP) is
        large, it can take many RTT periods to determine a suitable share of
        the path capacity. Such high BDP paths benefit from methods that more
        rapidly increase the congestion window, but in compensation these need
        to be designed to also react rapidly to any detected congestion (e.g.,
        TCP Cubic <xref target="RFC8312"></xref>).</t>
      </section>

      <section title="Avoiding Congestion Collapse and Flow Starvation">
        <t>A significant pathology can arise when a poorly designed transport
        creates congestion. This can result in severe service degradation or
        "Internet meltdown". This phenomenon was first observed during the
        early growth phase of the Internet in the mid 1980s <xref
        target="RFC0896"></xref> <xref target="RFC0970"></xref>. It is
        technically called "Congestion Collapse". <xref
        target="RFC2914"></xref> notes that informally, "congestion collapse
        occurs when an increase in the network load results in a decrease in
        the useful work done by the network."</t>

        <t>Transports need to be specifically designed with measures to avoid
        starving other flows of capacity (e.g., <xref
        target="RFC7567"></xref>). <xref target="RFC2309"></xref> also
        discussed the dangers of congestion-unresponsive flows, and states
        that "all UDP-based streaming applications should incorporate
        effective congestion avoidance mechanisms." <xref
        target="RFC7567"></xref> and <xref target="RFC8085"></xref> both
        reaffirm this, encouraging development of methods to prevent
        starvation.</t>
      </section>

      <section title="Adjusting the Rate">
        <t><list style="hanging">
            <t hangText="Congestion Management:">The capacity available to a
            flow could be expressed as the number of bytes in flight, the
            sending rate or a limit on the number of unacknowledged segments.
            When determining the capacity used, all data sent by a sender
            needs to be accounted, this includes any additional overhead or
            data generated by the transport. A transport performing congestion
            management will usually optimise performance for its application
            by avoiding excessive loss or delay and maintain a congestion
            window. In steady-state this congestion window reflects a safe
            limit to the sending rate that has not resulted in persistent
            congestion. A congestion controller for a flow that uses packet
            Forward Error Correction (FEC) encoding (e.g., <xref
            target="RFC6363"></xref>) needs to consider all additional
            overhead introduced by packet FEC when setting and managing its
            congestion window.</t>

            <t hangText="">One common model views the path between two
            endpoints as a "pipe". New packets enter the pipe at the sending
            endpoint, older ones leave the pipe at the receiving endpoint.
            Congestion and other forms of loss result in "leakage" from this
            pipe. Received data (leaving the network path at the remote
            endpoint) is usually acknowledged to the congestion
            controller.</t>

            <t hangText="">The rate that data leaves the pipe indicates the
            share of the capacity that has been utilised by the flow. If, on
            average (over an RTT), the sending rate equals the receiving rate,
            this indicates the path capacity. This capacity can be safely used
            again in the next RTT. If the average receiving rate is less than
            the sending rate, then the path is either queuing packets, the
            RTT/path has changed, or there is packet loss.</t>
          </list></t>
      </section>
    </section>

    <section title="Best Current Practice in the RFC-Series">
      <t>Like RFC2119, this documents borrows heavily from earlier
      publications addressing the need for end-to-end congestion control, and
      this subsection provides an overview of key topics.</t>

      <t><xref target="RFC2914"></xref> provides a general discussion of the
      principles of congestion control. Section 3 discussed Fairness, stating
      "The equitable sharing of bandwidth among flows depends on the fact that
      all flows are running compatible congestion control algorithms". Section
      3.1 describes preventing congestion collapse.</t>

      <t>Congestion collapse was first reported in the mid 1980s <xref
      target="RFC0896"></xref>, and at that time was largely due to TCP
      connections unnecessarily retransmitting packets that were either in
      transit or had already been received at the receiver. We call the
      congestion collapse that results from the unnecessary retransmission of
      packets classical congestion collapse. Classical congestion collapse is
      a stable condition that can result in throughput that is a small
      fraction of normal <xref target="RFC0896"></xref>. Problems with
      classical congestion collapse have generally been corrected by
      improvements to timer and congestion control mechanisms, implemented in
      modern implementations of TCP [Jacobson88]. This classical congestion
      collapse was a key focus of <xref target="RFC2309"></xref>.</t>

      <t>A second form of congestion collapse occurs due to undelivered
      packets, where Section 5 of <xref target="RFC2914"></xref> notes:
      "Congestion collapse from undelivered packets arises when bandwidth is
      wasted by delivering packets through the network that are dropped before
      reaching their ultimate destination. This is probably the largest
      unresolved danger with respect to congestion collapse in the Internet
      today. Different scenarios can result in different degrees of congestion
      collapse, in terms of the fraction of the congested links' bandwidth
      used for productive work. The danger of congestion collapse from
      undelivered packets is due primarily to the increasing deployment of
      open-loop applications not using end-to-end congestion control. Even
      more destructive would be best-effort applications that *increase* their
      sending rate in response to an increased packet drop rate (e.g.,
      automatically using an increased level of FEC (Forward Error
      Correction))."</t>

      <t>Section 3.3 of <xref target="RFC2914"></xref> notes: "In addition to
      the prevention of congestion collapse and concerns about fairness, a
      third reason for a flow to use end-to-end congestion control can be to
      optimize its own performance regarding throughput, delay, and loss. In
      some circumstances, for example in environments with high statistical
      multiplexing, the delay and loss rate experienced by a flow are largely
      independent of its own sending rate. However, in environments with lower
      levels of statistical multiplexing or with per-flow scheduling, the
      delay and loss rate experienced by a flow is in part a function of the
      flow's own sending rate. Thus, a flow can use end-to-end congestion
      control to limit the delay or loss experienced by its own packets. We
      would note, however, that in an environment like the current best-effort
      Internet, concerns regarding congestion collapse and fairness with
      competing flows limit the range of congestion control behaviors
      available to a flow."</t>

      <t>In addition to the prevention of congestion collapse and concerns
      about fairness, a flow using end-to-end congestion control can optimize
      its own performance regarding throughput, delay, and loss <xref
      target="RFC2914"></xref>.</t>

      <t>The standardization of congestion control in new transports can avoid
      a congestion control "arms race" among competing protocols <xref
      target="RFC2914"></xref>. That is, avoid designs of transports that
      could compete for Internet resource in a way that significantly reduces
      the ability of other flows to use the Internet. The use of standard
      methods is therefore encouraged.</t>

      <t>The popularity of the Internet has led to a proliferation in the
      number of TCP implementations <xref target="RFC2914"></xref>. A variety
      of non-TCP transports have also being deployed. Some transport
      implementations fail to use standardised congestion avoidance mechanisms
      correctly because of poor implementation <xref target="RFC2525"></xref>.
      However, this is not the only reason fro not using standard methods.
      Some transports have chosen mechanisms that are not presently
      standardised, or have adopted approaches to their design that differ
      from present standards. Guidance is needed therefore not only for future
      standardisation, but to ensure safe and appropriate evolution of
      transports that have not presently been submitted for
      standardisation.</t>
    </section>

    <section title="Revision Notes">
      <t>Note to RFC-Editor: please remove this entire section prior to
      publication.</t>

      <t>Individual draft -00: <list style="symbols">
          <t>Comments and corrections are welcome directly to the authors or
          via the IETF TSVWG, working group mailing list.</t>
        </list>IndivRFC896 idual draft -01:</t>

      <t><list style="symbols">
          <t>This update is proposed for initial WG comments.</t>

          <t>If there is interest in progressing this document, the next
          version will include more complee referencing to citred
          material.</t>
        </list></t>

      <t>Individual draft -02: <list style="symbols">
          <t>Correction of typos.</t>
        </list></t>

      <t>Individual draft -03: <list style="symbols">
          <t>Added section 1.1 with text on current BCP status with additional
          alignment and updates to RFC2914 on Congestion Control Principles
          (after question from M. Scharf).</t>

          <t>Edits to consolidate starvation text.</t>

          <t>Added text that multicast currently noting that this is out of
          scope.</t>

          <t>Revised sender-based CC text after comment from C. Perkins
          (Section 3.1,3.3 and other places).</t>

          <t>Added more about FEC after comment from C. Perkins.</t>

          <t>Added an explicit reference to RFC 5783 and updated this text
          (after question from M. Scharf).</t>

          <t>To avoid doubt, added a para about "Each new transport needs to
          make its own design decisions about how to meet the recommendations
          and requirements for congestion control."</t>

          <t>Upated references.</t>
        </list></t>

      <t>Individual draft -04: <list style="symbols">
          <t>Correction of NiTs. Further clarifications.</t>

          <t>This draft does not attempt to address further alignment with
          draft-ietf-tcpm-rto-consider. This will form part of a future
          revision.</t>
        </list>Individual draft -05: </t>

      <t><list style="symbols">
          <t>Moved intro to appendix and re-issued as a live draft.</t>

          <t>This draft does not attempt to address further alignment with
          draft-ietf-tcpm-rto-consider. This will form part of a future
          revision.</t>
        </list></t>
    </section>
  </back>
</rfc>
