<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent">
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<?rfc strict="yes" ?>
<?rfc toc="yes"?>
<?rfc tocdepth="4"?>
<?rfc symrefs="yes"?>
<?rfc sortrefs="yes" ?>
<?rfc compact="yes" ?>
<?rfc subcompact="no" ?>

<rfc
    xmlns:xi="http://www.w3.org/2001/XInclude"
    category="std"
    docName="draft-fairhurst-tsvwg-cc-06"
    ipr="trust200902"
    updates=""
    obsoletes=""
    consensus="true"
    submissionType="IETF"
    tocInclude="true"
    tocDepth="4"
    symRefs="true"
    sortRefs="true"
    version="3">
    
<front>
        
<title abbrev="CC Guidelines">Guidelines for Internet Congestion Control at Endpoints</title>
<seriesInfo name="Internet-Draft" value="draft-fairhurst-tsvwg-cc-06"/>

        <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>
                <phone/>
                <email>gorry@erg.abdn.ac.uk</email>
            </address>
        </author>
        
        <date day="" month="" year="" />
        
    

<abstract>
      <t>This document will provide guidance on
      the design of methods to avoid congestion collapse and to react to
      incipient congestion. 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>
      <t>
      The current recommendations and requirements
      on this topic are
      distributed across many documents in the RFC series. This document 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>This revision updates the source to a modern XML format, and is for discussion
          by tsvwg.</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="RFC9000"></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 9293 <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>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 for 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>
        
        <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>

        <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>Paths through the Internet can experience congestion (loss or delay) that is a result of excess load at a bottleneck(s) along the path.
                    Incipient congestion is a consequential side effect of the
                    statistical multiplexing of packet flows.
                    There will be time where packets need to be buffered or dropped at the bottleneck(s) on the path,
                    and flows need to react when they encounter this congestion to reduce their
                    contribution to the load. </t>
                
                <t> Persistent congestion occurs when the pattern of arriving traffic results
                    in over consumption of the path resources. Typically this results in
                    packet loss. The effects of persistent congestion might impact the flow
                    that induces congestion, but could also impact other flows,
                    e.g., starving them of resources; or further reducing the efficiency
                    of the path (e.g., congestion collapse).  </t>
                
                <t>  The IETF has produced specifications and BCP for transports to
                    address congestion. TCP has evolved to solve both aspects of congestion
                    and also to provide efficient loss recovery. (Loss recovery is not
                    itself a congestion control mechanism, but the cause of loss might be
                    congestion, so the two become coupled.)  </t>
                
                <t> There are several reasons to think that things may have changed:
                    At one time, it was common that the serialisation delay of a packet at the bottleneck
                    formed a large proportion of the round time of a path, motivating a need for
                    conservative loss recovery . This is not often the case for today's
                    higher capacity links.
                    This increase in link speed often means that for many users, current traffic often does not
                    normally experience persistent congestion .</t>
                
            <section title="Current Challenges">
            <t>What are current the challenges?</t>
            <ul>
                <li>How do operators understand that traffic is behaving reasonably?</li>
                <li>How can the IETF developers to safe and efficient congestion control?</li>
            </ul>
            <t> There are multiple ways to structure a document or documents.
                One possibility is to separate the BCP guidance for avoiding persistent congestion
                (e.g., starvation, congestion collapse) from the design of the protocol mechanisms
                that seek to react to incipient congestion.
                Such a split seems possible, in the same way that loss recovery
                can be distanced from congestion reaction, but might be hard to achieve. The present version of this document covers both aspects of congestion control.</t>
        </section>
</section>
<!-- End of Into -->

<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>
<!--- end of Terminology -->


<section title="Author's Note on Additional Material">

    <t>This section captures plans for work in progress. Topics not yet considered:</t>
    <ul>
        <li>Experience in TCPM developing a spec for Cubic.</li>
        <li>Updated thinking related to Hystart.</li>
        <li>Updated thinking related to the challenges and merits of management with encryption.</li>
        <li>Update for latest TCPM developments.</li>
        <li>Update for latest QUIC/TSVAREA discussions relating to CC.</li>
        <li>Updated published references to modern methods.</li>
    </ul>
    <t> This section will be removed in a future version. It will not be a part of the final document.</t>
</section>
<!--- end of section on Additional Material -->

    
<section title="Requirements from the RFC Series">
    
    <section anchor="response" title="The need to React to  Congestion">
        <t>This includes:</t>
            <ul>
            <li>Endpoints MUST perform congestion control <xref
                target="RFC1122"></xref> and SHOULD leverage existing congestion
            control techniques <xref target="RFC8085"></xref>.</li>
            
            <li>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>.</li>
            
            <li>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>).</li>
            
            <li>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>.</li>
        </ul>
    </section>
    <section anchor="pathchar"  title="Tolerance to a Diversity of Path Characteristics">
<ul>
        <li> 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.
            
            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>.</li>
</ul>
    </section>
   
        <section anchor="Protect" title="Robustness: 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>The following guidance is porovidng on protection from attack:</t>
            <ul>
                <li> 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.</li>
                
                <li>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="RFC9000"></xref>).</li>
                
                <li>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>.</li>

            </ul>
        </section>    <!-- ================================================================== -->
        
        <section title="Current IETF Guidelines on Evaluation of Congestion Control">
            <t>The IETF has provided guidance <xref target="RFC5033"></xref> for
                considering and evaluating alternate congestion control algorithms.</t>
            
            <t>There have been changes in the way that protocol mechanisms are deployed
                in Internet endpoints. </t>
            
            <t>On the one hand, techniques have evolved that now allow incremental deployment
                and testing of new methods. This can enable more rapid development of
                methods to detect and react to incipient congestion. This allows new mechanisms
                can be tested to ensure that 95%, 99%, etc of users see benefit in the networks
                they use. there has been considerable progress in developing new loss
                recovery and congestion responses that have been evaluated in this way. </t>
            
            <t>On the other hand, the Internet continues to be heterogenous, some people experience
                very different network path characteristics and some people have very
                different patterns of traffic. The IETF seeks to avoid congestion collapse,
                and also avoid prejudicing the performance experienced when the Internet is shared.
                Different approaches are needed when analysing the collateral damage resulting from using a new mechanism.
                An analysis of the suitability of a new mechanism needs to consider the
                impact on the outliers in performance, the last 5%, 1%, etc and specifically
                needs to understand how changes impact other flows sharing a bottleneck.
                This impact is often not visible in the performance data
                collected for the new flow - it may not be obvious that a new method starves
                some other application of capacity, or patterns of packets disrupt the
                timing needed for a particular application. </t>

            <t>The IRTF has 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>
</section>
    <!-- end of requirements -->

<section title="Principles of Congestion Control">
        <t>This section summarises the principles for providing congestion
            control. The section seeks to differentiate mechanisms associated with preventing persistent congestion; reacting to incipient congestion and utilising additional path information.</t>

    <section title="Preventing Persistent Congestion">

        <ul>
        <li> 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 RTT,
            and then exponentially backs off the time between single packet
            transmissions if the congestion continues to persist
            <xref target="RFC2914"></xref>. </li>
        </ul>
        <section title="Avoiding Congestion Collapse and Flow Starvation">
            <t>Principles include:</t>
            
            <ul>
                <li>Transports MUST avoid inducing flow starvation to other flows
                    that share resources along the path they use.</li>
                
                <li>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).</li>
                
                <li>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>).</li>
                
                <li>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>).</li>
                
                <li>A transport MUST employ exponential backoff each time
                    persistent congestion is detected <xref target="RFC1122"></xref>,
                    until the path characteristics can again be confirmed.</li>
                
                <li>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-conforment and malicious flows
                    <xref target="RFC7567"></xref>). These mechanisms complement, but
                    do not replace, the endpoint congestion avoidance mechanisms.</li>
            </ul>
        </section>
        
        <section anchor="Robust-Timers" title="Robustness: Timers and Retransmission">
            <ul>
            <li> Maintaining the RTO: The RTO SHOULD be set based on
                recent RTT observations (including the RTT variance) <xref
                    target="RFC8085"></xref>.</li>
            
            <li> 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.
                
                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>.</li>
            
            <li>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>.</li>
            
            <li> [[ Author Note: Check RTO-Consider. ]]</li>
        </ul>
</section>

    </section>
    <!-- end section on preventing persistent congestion -->

    <section title="Reacting to Incipient Congestion">

        <section title="Congestion Reaction: 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 to mitigate causing incipient congestion.</t>
            
            <ul>
                <li> 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.</li>
                
                <li> 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).</li>
                
                <li> 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]].
                
                 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.</li>
                
                <li> 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>).</li>
                
                <li> 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]].</li>
                </ul>
        </section>
        
        <section anchor="Path-Capacity" title="Congestion Reaction: 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, reacting to incipient congestion.</t>
            
            <ul>
                <li> 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.</li>
                
                <li> 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).</li>
                
                <li> 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).</li>
                
                <li> 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.</li>
            </ul>
        </section>
        <section anchor="Timers" title="Congestion Reaction: Timers and Retransmission">
            <t>This section describes mechanisms to detect and provide
                retransmission, and to protect the network in the absence of timely
                feedback. These topics are important to avoid persistent congestion.</t>
            
            <ul>
                <li>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="RFC8985"></xref>) or a combination of using a
                    timer and ordering information to trigger retransmission of
                    data.</li>
                
                <li> 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="RFC9002"></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.</li>
                
                <li> 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>).</li>
            </ul>
        </section>
        <section title="Congestion Reaction: Responding to Incipient Congestion">
            <t>The safety and responsiveness of new proposals need to be evaluated
                <xref target="RFC5166"></xref>. In determining an appropriate
                congestion response to incipient congestion, designs could take into consideration the size of
                the packets that experience congestion <xref
                    target="RFC4828"></xref>.</t>
            
            <ul>
                <li> 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>.
                
                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>.</li>
                
                <li> 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 early indication of
                        incipient congestion.
                
                An early detection of incipient congestion
                    allows 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).
                    ABE included this modification the reaction to ECN <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.
                    
                    The L4S architecture
                    <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 that can provide early reaction to incipient congestion
                <xref target="I-D.ietf-tsvwg-aqm-dualq-coupled"></xref>.
                </li>
                
                <li>
                 <xref target="RFC8085"></xref> provides guidelines
                    for a sender that does not, or is unable to, adapt the congestion
                    window.</li>
            </ul>
        </section>
        
        <!-- response -->
        
        <section title="Congestion Reaction: 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). This helps manage incipient congestion.</t>
            
            <ul>
                <li> 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.
                
                    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).</li>
                
                <li> After detecting 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.</li>
                
                <li>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>).</li>
            </ul>
        </section>
        <!-- Using More Capacity -->
    </section>
    <!-- end section on reacting to incipient congestion -->

    <section title="Utilising Additional Path Information">
        <section anchor="Signals" title="Congestion Reaction: Network Signals">
            <t>An endpoint could cache path information that could be used to inform parameter selection for a new or on-going flow.  It might also utilise signals from the network to help determine
                how to regulate the traffic it sends. </t>
            <t>                     Any information used to accelerate the growth of the congestion window 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>
            
            <ul>
                <li> Utilising Cached Path Information: 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 was called TCP Control Block (TCB)
                    sharing <xref target="RFC2140"></xref>, and is described in <xref
                        target="RFC9040"></xref>. The capacity and other
                    information can be used to suggest a faster initial sending
                    rate.
                    </li>
                
                <li> Receiving 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>).</li>
                    
                    <li> Utilising Network Signals: 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="RFC9049"></xref> (e.g., ECN). This
                    can include context-sensitive treatment of "soft" signals provided
                    to the endpoint <xref target="RFC5164"></xref>.</li>
            </ul>

        </section>

    </section>
    <!-- end section on utilising additional path information -->
</section>

<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 has received funding to support this work from the
            European Space Agency.</t>
</section>
<!-- End of Acknowledgements -->
    
<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>
    
<!-- End of IANA Considerations -->
    
<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>
<!-- End of Sev Considerations -->

</middle>

<back>

    <references>
        <name>Normative References</name>
        
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.1122.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2914.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3390.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5348.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7567.xml"/>
        <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8085.xml"/>

    </references>

    <references>
        <name>Informative References</name>
<!-- avoiding down REFs -->
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3742.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.7661.xml"/>
<!-- Other Info REFs -->
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0768.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0792.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0896.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.0970.xml"/>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2140.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2309.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2525.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2616.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3449.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3819.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.3828.xml"/>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4301.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4340.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4828.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.4960.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5033.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5164.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5783.xml"/>


<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.5166.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6363.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6679.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6773.xml"/>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6928.xml"/>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.6951.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8084.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8087.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8311.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8312.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml"/>

<!--- draft-ietf-tcpm-rack has been published as RFC 8985 -->
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml"/>

<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9002.xml"/>
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9040.xml"/>


<!-- irtf-panrg-what-not-to-do -->
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9049.xml"/>

<!-- ietf-tcpm-rfc793bis = RFC.9293 -->
<xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-rfc793bis.xml"/>
<!-- <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml"/> -->

 <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tcpm-accurate-ecn.xml"/>
 <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tsvwg-l4s-arch.xml"/>
 <xi:include href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-tsvwg-aqm-dualq-coupled.xml"/>

        
      <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 SIGCOMM Computer Communication Review</organization>
          </author>
          <date month="April" year="2007" />
        </front>
      </reference>
      
<!-- <reference anchor="Jacobson88">
          <front>
              <title>Congestion Avoidance and Control.</title>
              
              <author fullname="V Jacobsen" initials="Van " surname="Jacobsen">
                  <organization>ACM SIGCOMM Computer Communication Review</organization>
              </author>
              <date month="XXX" year="1988" />
          </front>
      </reference> -->

      
    </references>
    <section title="Internet Congestion Control">
        
        <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="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="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="Adjusting the Rate">
            <ul>
                <li> 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.</li>
                <li>
                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.</li>
                <li>
                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.</li>
            </ul>
        </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>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.</t>
        
    </section>
    
    <section title="Revision Notes">
        <t>Note to RFC-Editor: please remove this entire section prior to
            publication.</t>
        
        <t>Individual draft -00:</t>
        <ul>
            <li>Comments and corrections are welcome directly to the authors or
                via the IETF TSVWG, working group mailing list.</li>
        </ul>
        <t>Individual draft -01:</t>
        <ul>
            <li>This update is proposed for initial WG comments.</li>
            
            <li>If there is interest in progressing this document, the next
                version will include more complee referencing to citred
                material.</li>
        </ul>
        
        <t>Individual draft -02:</t>
        <ul>
            <li>Correction of typos.</li>
        </ul>
        
        <t>Individual draft -00:</t>
        <ul>
            <li>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).</li>
            
            <li>Edits to consolidate starvation text.</li>
            
            <li>Added text that multicast currently noting that this is out of
                scope.</li>
            
            <li>Revised sender-based CC text after comment from C. Perkins
                (Section 3.1,3.3 and other places).</li>
            
            <li>Added more about FEC after comment from C. Perkins.</li>
            
            <li>Added an explicit reference to RFC 5783 and updated this text
                (after question from M. Scharf).</li>
            
            <li>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."</li>
            
            <li>Upated references.</li>
        </ul>
        
        <t>Individual draft -00:</t>
        <ul>
            <li>Correction of NiTs. Further clarifications.</li>
            
            <li>This draft does not attempt to address further alignment with
                draft-ietf-tcpm-rto-consider. This will form part of a future
                revision.</li>
        </ul>
        <t>Individual draft -05:</t>
        <ul>
            <li>Moved intro to appendix and re-issued as a live draft.</li>
            
            <li>This draft does not attempt to address further alignment with
                draft-ietf-tcpm-rto-consider. This will form part of a future
                revision.</li>
        </ul>
        <t>Individual draft -06:</t>
        <ul>
            <li>Reformat src for modern XML2RFC.</li>
            
            <li>Restrcutured draft around different types of congestion reaction.</li>
        </ul>

    </section>
  </back>
</rfc>

