<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>

<rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" docName="draft-ietf-tsvwg-careful-resume-24" number="9959" updates="" obsoletes="" ipr="trust200902" consensus="true" submissionType="IETF" tocInclude="true" tocDepth="4" symRefs="true" sortRefs="true" version="3" xml:lang="en">

<!-- [rfced] We note that this document's abbreviated title and draft string
contain the phrase "Careful Resume", but the document's full title (see below)
does not. Would you like to add "Careful Resume" to the title, or update
the abbreviated title at all?

Title:
  Convergence of Congestion Control from Retained State

Abbreviated title (which appears in the running header of the PDF):
  Careful Resume
-->

  <front>
    <title abbrev="Careful Resume">Convergence of Congestion Control from Retained State</title>
    <seriesInfo name="RFC" value="9959"/>
    <author fullname="Nicolas Kuhn" initials="N" surname="Kuhn">
      <organization>Thales Alenia Space</organization>
      <address>
        <email>nicolas.kuhn.ietf@gmail.com</email>
      </address>
    </author>
    <author fullname="Emile Stephan" initials="E" surname="Stephan">
      <organization>Orange</organization>
      <address>
        <email>emile.stephan@orange.com</email>
      </address>
    </author>
    <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>
          <code>AB24 3UE</code>
          <country>United Kingdom</country>
        </postal>
        <email>gorry@erg.abdn.ac.uk</email>
      </address>
    </author>
    <author fullname="Raffaello Secchi" initials="R" surname="Secchi">
      <organization>University of Aberdeen</organization>
      <address>
        <postal>
          <street>School of Engineering</street>
          <street>Fraser Noble Building</street>
          <city>Aberdeen</city>
          <code>AB24 3UE</code>
          <country>United Kingdom</country>
        </postal>
        <email>r.secchi@abdn.ac.uk</email>
      </address>
    </author>
    <author fullname="Christian Huitema" initials="C" surname="Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>
    <date year="2026" month="April"/>

    <area>WIT</area>
    <workgroup>tsvwg</workgroup>

    <keyword>Transport</keyword>
    <keyword>Congestion Control</keyword>
    <keyword>QUIC</keyword>

    <abstract>
      <t>This document specifies a cautious method for Internet transports that
        enables fast startup of congestion control for a wide
        range of connections, known as "Careful Resume".
        It reuses a set of computed congestion control parameters that
        are based on previously observed path characteristics between
        the same pair of transport endpoints. These parameters
        are saved, allowing them to be later used to modify the
        congestion control behaviour of a subsequent connection.</t>
      <t>This document describes the assumptions and defines the requirements for how a
        sender utilises these parameters to provide opportunities for a
        connection to more rapidly get up to speed and utilise available
        capacity. It discusses how the use of this method impacts the capacity at a
        shared network bottleneck and the safe response that is needed after any
        indication that the new rate is inappropriate.</t>
    </abstract>
  </front>
  <middle>
    <section anchor="sec-introduction">
      <name>Introduction</name>
      <t>All Internet transports are required to either use a Congestion
      Control (CC) algorithm or to constrain their rate of transmission <xref
      target="RFC2914"/> <xref target="RFC8085"/>. In 2010, a survey of
      alternative CC algorithms <xref target="RFC5783"/> noted that there are
      challenges when a CC algorithm operates across an Internet path with a
      high and/or varying Bandwidth-Delay Product (BDP). The specified method
      targets a solution for these challenges.</t>
      <t>A CC algorithm typically takes time to ramp up the sending rate. This is
    called the "Slow-Start Phase" and is informally known as the time to "get up
    to speed". This defines a time during which a sender
    intentionally uses less capacity than might be available, with the
    intention to avoid or limit overshoot of the available capacity for the path.
    In the context of CC, a path is associated with the end-to-end communication between
    a pair of transport endpoints, each identified by a source IP address
    and a unicast or anycast destination IP address. (This document does not define
    support for broadcast or multicast destination addresses.) A path can
    also be associated with a specific Differentiated Services Code Point (DSCP).
    Below the transport layer, a specific path could be realised in various ways, but this
    is not normally evident to the transport endpoints. (When known, additional
    path information could potentially provide an explicit signal to the CC algorithm
    to allow it to detect a change in the path.)</t>
      <t>Any overshoot of the bottleneck rate can have a
    detrimental effect on other flows that share a common bottleneck.
    A sender can also use a method that observes the rate of acknowledged data
    to seek to avoid an overshoot of this bottleneck capacity (e.g., Hystart++
    <xref target="RFC9406"/>).</t>
      <t>In the extreme case, an overshoot can result in persistent congestion
    with unwanted starvation of
    other flows that share a common capacity bottleneck
    (i.e., preventing other flows
    from successfully sharing the capacity at a common bottleneck <xref target="RFC2914"/>).</t>
      <t>A separate instance of a CC algorithm typically executes over a transport path.
    This seeks to avoid an increase in the queuing (latency or jitter) and/or
    congestion packet loss for the flow.
    In the case of a multipath
    transport, there can be more than one path with a separate CC 
     context for each path.</t>
<!-- [rfced] How may we adjust the sentence below to make it a complete
sentence? Specifically, what does "That is" refer to?
(The preceding sentence is included for context.)

Original:
   This document specifies Careful Resume, a method that seeks to reduce
   the time to complete a transfer when the sending rate is limited by
   the congestion controller using the congestion window (CWND).  That
   is, when a transfer seeks to send significantly more data than
   allowed by the Initial congestion Window (IW) and where the BDP of
   the path is also significantly more than the product of the IW and
   path Round Trip Time, RTT.

Perhaps:
   This document specifies Careful Resume, a method that seeks to reduce
   the time to complete a transfer when the sending rate is limited by
   the congestion controller using the congestion window (CWND).  Specifically,
   this is when a transfer seeks to send significantly more data than
   allowed by the Initial congestion Window (IW) and where the BDP of
   the path is also significantly more than the product of the IW and
   path Round Trip Time (RTT).
-->

      <t>This document specifies Careful Resume,
    a method that seeks to reduce the time to complete
    a transfer when the sending rate is limited by the congestion controller
    using the congestion window (CWND).
    That is, when a transfer seeks to send significantly more data than
    allowed by the initial congestion window (IW) and where the BDP of the
    path is also significantly more than the product of the IW and path
    Round Trip Time (RTT).</t>
      <t>Careful Resume introduces an alternative method to select initial CC parameters that
    seeks to more rapidly and safely grow the sending rate controlled by
    the CWND.</t>
      <t>Careful Resume is based on temporal sharing (sometimes known as
    "caching") of a saved set of CC parameters that relate to previous observations
    of the same path. The
    parameters are saved and used to modify the CC
    behaviour of a subsequent connection between the
    same endpoints.</t>
      <t>CC algorithms that are rate based can make
    similar adjustments to their target sending rate.
    When saving the observed capacity,
    some CC algorithms might save a different parameter
    that is equivalent to the saved_cwnd.
    For example, a rate-based CC algorithm
    such as Bottleneck Bandwidth and Round-trip propagation time (BBR) <xref target="I-D.ietf-ccwg-bbr"/> can retain the
    value of the bottleneck bandwidth required to reach the capacity available to
    the flow (e.g., BBR.max_bw).
      </t>
      <!-- In some ways the para below is true that one could use TCB-based methods, but
     the RFC defining TCB does not say how this would be safely done, this is better not said: -->
     <!-- <t>When used with the QUIC transport, this provides transport services that resemble
    those that could be implemented in TCP, using methods such as TCP Control Block (TCB)
    Interdependence <xref target="RFC9040"></xref> caching.</t> -->

    <section anchor="sec-CC-params">
        <name>Use of Saved CC Parameters by a Sender</name>
        <t>CC parameters are used by Careful Resume for three functions:
        </t>
        <ol spacing="normal" type="1"><li>
            <t>Information to confirm whether a saved path corresponds to
            the current path.</t>
          </li>
          <li>
            <t>Information about the utilised path capacity and observed RTT to
            set CC parameters for the current connection.</t>
          </li>
          <li>
            <t>Information to check the CC parameters are not too old.</t>
          </li>
        </ol>
        <t>CC algorithms need to be cautious when using saved CC parameters on a new path
            (see <xref target="RFC9000"/> and <xref target="RFC9040"/>).
            Care is therefore needed
            to assure safe use and to be robust to changes
            in traffic patterns, network routing, and link/node conditions.
            There are cases where using the saved parameters of a previous
            connection is not appropriate (see <xref target="guidance"/>).</t>
      </section>
          
    <section anchor="rec-choice">
        <name>Receiver Preference</name>
        <t>Whilst the sender could take optimisation decisions without
        considering the receiver's preference, there are cases where a
        receiver could have information that is not available at the sender or
        might benefit from understanding that Careful Resume might be used.
        In these cases, a receiver could use a transport mechanism to
        explicitly ask to either enable or inhibit Careful Resume when an
        application initiates a new connection.</t>

<!-- [rfced] For readability, may we update the introductory text and the
third item in the list below?

Original:
   Examples where a receiver might request to inhibit using Careful
   Resume include:

   1.  a receiver that can predict the pattern of traffic (e.g., insight
       into the volume of data to be sent, the expected length of a
       connection, or the requested maximum transfer rate);

   2.  a receiver with a local indication that a path/local interface
       has changed since the CC parameters were saved;

   3.  knowledge of the current hardware limitations at a receiver;

   4.  a receiver that can predict additional capacity will be needed
       for other concurrent or later flows (i.e., it prefers to activate
       Careful Resume for a different connection).

Perhaps:
   Receivers might request the ability to inhibit the use of Careful Resume in
   situations like the following:

   1.  when a receiver can predict the pattern of traffic (e.g., insight
       into the volume of data to be sent, the expected length of a
       connection, or the requested maximum transfer rate);

   2.  when a receiver with a local indication that a path/local interface
       has changed since the CC parameters were saved;

   3.  when a receiver has knowledge of the current hardware limitations;

   4.  when a receiver can predict additional capacity will be needed
       for other concurrent or later flows (i.e., it prefers to activate
       Careful Resume for a different connection).
-->


        <t>Examples where a receiver might request to inhibit using Careful
   Resume include:</t>
        <ol spacing="normal" type="1"><li>
            <t>a receiver that can predict the pattern of traffic
                (e.g., insight into the volume of data to be sent,
                the expected length of a connection, or the requested maximum transfer rate);</t>
          </li>
          <li>
            <t>a receiver with a local indication that a path/local
                interface has changed since the CC parameters were saved;</t>
          </li>
          <li>
            <t>knowledge of the current hardware limitations at a receiver;</t>
          </li>
          <li>
            <t>a receiver that can predict additional capacity will be needed
                for other concurrent or later flows
                (i.e., it prefers to activate Careful Resume for a different connection).</t>
          </li>
        </ol>
      </section>

    <section anchor="sec-transport-design">
        <name>Transport Protocol Interaction</name>
<!-- [rfced] May we update "flow credit" to "flow control credit" in the text
below for consistency with RFC 9000?

Original:
   These include the sender pacing rate and the receiver-advertised
   window [RFC9293] or flow credit [RFC9000], see Section 4.7.

Perhaps:
   These include the sender pacing rate and the receiver-advertised
   window [RFC9293] or flow control credit [RFC9000]; see Section 4.7.
-->
        <t>The CWND is one factor that limits the
        sending rate of a transport protocol. Other mechanisms also constrain
        the maximum sending rate. These include the sender pacing rate and the
        receiver-advertised window <xref target="RFC9293"/> or flow credit <xref target="RFC9000"/>; see <xref target="flow-control"/>.</t>
      </section>
    
    <section anchor="sec-use_case">
        <name>Examples of Scenarios of Interest</name>
        <t>This section provides a set of examples where Careful Resume is expected
        to improve performance.
        Either endpoint can assume the role of a
        sender or a receiver. Careful Resume can also be independently used 
        for each direction of a bidirectional connection.</t>
        <t>For example, consider an application that uses a series of connections over a path:
        Without a new method,
        each connection would need to individually
        discover appropriate CC parameters, whereas Careful Resume allows the flow
        to use a rate based on the previously observed CC parameters.</t>
        <t>Another example considers an application that connects after a disruption
        had temporarily reduced the path
        capacity: When this endpoint
        returns to use the path using Careful Resume, the
        sending rate can be based on the previously observed CC parameters.</t>
        <t>There is a particular benefit for
        any path with an RTT that is much larger than for typical
        Internet paths.
        In a specific example, an application connected via a geo-stationary satellite access network
        <xref target="IJSCN"/>
        could take 9 seconds to complete a 5.3 MB transfer
        using standard CC, whereas a sender using Careful Resume
        could reduce this transfer time to 4 seconds. The time to complete a 1 MB transfer could
        similarly be reduced by 62 % <xref target="MAPRG111"/>. This benefit is also
        expected for other sizes of transfer and for different path
        characteristics when a path has a large BDP. 
        <xref target="CR25"/> provides further discussion of the method defined
        in this document and includes analysis over various types of paths.</t>
      </section>

    <section anchor="sec-principle">
        <name>Design Principles</name>
        <t>Resuming a connection with CC parameters that were observed
            during a previous connection
            is inherently a tradeoff between the potential performance
            gains for the new connection and the risks of degraded performance
            for other connections that share
            a common bottleneck. The specified method is designed to obtain good performance when resuming is appropriate,
            while seeking to minimise the impact on other connections when it is
            not appropriate.</t>
        <t>The following precautions mitigate the risk of
            a sender adding excessive congestion to a path:</t>
        <ol spacing="normal">
<!-- [rfced] For clarity, how may we add an additional verb to the text below?
Does "allows" convey the intended meaning?

Original:
    This provides some protection against aggravating severe congestion and
    to establish the minimum RTT.

Perhaps:
    This provides some protection against aggravating severe congestion and
    allows establishing the minimum RTT.
-->
          <li>
            <t>The first precaution is to recognise whether the conditions
            have changed so much that the saved values are no longer valid. We
            describe that as the "Reconnaissance Phase". During that phase,
            the sender will not send more data than allowed for any new
            connection, e.g., using the recommended maximum IW for the first
            RTT of transmitting data <xref target="RFC6928"/> <xref
            target="RFC9002"/>. The sender will only proceed with the resume
            process if the reconnaissance succeeds.  If it fails (for example,
            if previous packets in a connection experience congestion or the
            RTT is significantly different), the sender will follow the
            standard process for a new connection.  This provides some
            protection against aggravating severe congestion and to establish
            the minimum RTT.</t>
          </li>
          <li>
            <t>The second precaution is to cautiously use the saved parameters
                when resuming. This is called the "Unvalidated Phase".
                For example,
                the jump in the size of CWND/rate is restricted to a fraction (1/2) of the saved_cwnd,
                to avoid starving other flows that may have started or increased
                their capacity after the last capacity measurement.
                The same principle applies for CC algorithms that use different parameters to classic
                TCP CC: i.e., a sender must not send faster than allowed by a fraction
                of the saved CC parameters. For example, a connection using a rate-based CC algorithm
                (e.g., BBR) will set the
                pacing rate to half the remembered value of the "bottleneck bandwidth".
                The sender also needs to pace all unvalidated packets,
                to ensure the rate does not exceed the previously used rate.
                This is intended to avoid a sudden influx of
                packets that could result in building a bottleneck queue and disrupting existing flows.
                Successful validation can allow further increases of the CWND,
                after first validating that the used rate did not result in congestion.</t>
          </li>
          <li>


<t>The third precaution is to enter a "Safe Retreat Phase" if the validation fails,
                for example, if congestion is detected during validation. The risk here is that the
                trial use of the saved CC parameters could have disrupted existing connections.
                For example, consider a connection using Reno CC:
                When exiting "slow start" mode due to loss,
                Reno would normally update the CWND to a
                "slow start threshold" set to half the volume of data in flight.
                However, during this validation,
                the CWND is restored from the saved CC parameters. The resultant sending rate
                could be much larger than the value that would have been reached by a
                "standard" slow start process, resulting in an overload of the path that potentially
                could cause significant congestion to other flows.
                Instead of continuing with that "too large" value, the retreat process resets the
                congestion window (rate) to a value no greater than what a standard process would have
                discovered. For other CC algorithms,
                such as Cubic <xref target="RFC9438"/> or BBR, the implementation
                details may differ, but the principle remains: Trying and failing should not
                unduly disadvantage existing connections that
                share a common bottleneck (e.g., resulting in starving these connections).</t>
          </li>
        </ol>
      </section>
    </section>
    
    <section anchor="notation">
      <name>Language, Notation, and Terms</name>
      <t>This section provides a brief summary of key terms and the
    requirements language.</t>
      <section anchor="sec_req_language">
        <name>Requirements Language</name>
        <t>
    The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>",
    "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14>",
    "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>",
    "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
    "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be
    interpreted as described in BCP&nbsp;14 <xref target="RFC2119"/> <xref
    target="RFC8174"/> when, and only when, they appear in all capitals, as
    shown here.
        </t>
      </section>
      <section anchor="endpoint">
        <name>The Remote Endpoint</name>
        <t> The Remote Endpoint is an implementation-dependent value that identifies the sender's
        view of the network path being used. This is used
        to match the current path with a set of CC parameters associated with a previously observed path.
        It includes:
        
        </t>
        <ul spacing="normal">
          <li>
            <t>an identifier representing the sending interface (e.g., a globally
            assigned address/prefix or other local identifier);</t>
          </li>
          <li>
            <t> an identifier representing the destination (e.g., a unicast or anycast
            IP address).</t>
          </li>
        </ul>
        <t>The Remote Endpoint could also include information such as the DSCP.
        If included, such information needs to be set consistently for a resumed connection
        to the same endpoint.
        Although additional information could improve the path
        differentiation, it could reduce the reusability of saved parameters.</t>
        <t>The saved CC parameters can only be used to modify the startup when
        the Remote Endpoint is not known to have changed (see <xref target="sec-phase-rec-phase"/>).</t>
      </section>

    <section anchor="sec-QLOG">
        <name>Logging Support</name>
        <t>This document defines triggers to support logging key events. For example,
        <xref target="I-D.custura-tsvwg-careful-resume-qlog"/> provides definitions that enable a
        Careful Resume implementation
        to generate qlog events when using QUIC.</t>
      </section>

    <section anchor="sec-terms_def">
        <name>Notation and Terms</name>

<!-- [rfced] Section 2.4: FYI, we have made slight adjustments to the
terminology list for readability and consistency with other list items.
-->

        <t> The document uses language drawn from a range of RFCs.  The
        following terms are defined:</t>

        <dl spacing="normal" newline="false">
          <dt>ACK:</dt><dd>The indication at the transport layer that the
          Remote Endpoint has correctly received the acknowledged data. In a
          CC algorithm, an ACK also confirms that the acknowledged data is no
          longer in flight.</dd>
          <dt>Beta:</dt><dd>A scaling factor between 0.5 and 1; the default
          value is 0.5.</dd>
          <dt>Careful Resume (CR):</dt><dd>The method specified in this
          document to select initial CC parameters and to more rapidly and
          safely increase the initial sending rate.</dd>
          <dt>Congestion Control (CC) parameters:</dt><dd>A set of saved CC
          parameters from observing the capacity of an established connection
          (see <xref target="sec-CC-params"/>).</dd>
          <dt>congestion window (CWND):</dt><dd>The congestion window or equivalent CC variable
          limiting the maximum sending rate (see <xref
          target="RFC5681"/>).</dd>
          <dt>current Round Trip Time (RTT):</dt><dd>A sample measurement of the current RTT measured using the most recent ACK.</dd>
          <dt>flight_size:</dt><dd>The current volume of unacknowledged data (see <xref target="RFC5681"/>).</dd>
          <dt>jump_cwnd:</dt><dd>The resumed CWND, used in the Unvalidated Phase.</dd>
          <dt>Lifetime:</dt><dd>The configured time after which a set of saved CC parameters can no longer be safely reused.</dd>
          <dt>max_jump:</dt><dd>The configured maximum jump_cwnd.</dd>
          <dt>PipeSize:</dt><dd>A measure of the validated available capacity based on the acknowledged data.</dd>
          <dt>Remote Endpoint:</dt><dd>The endpoint corresponding to a connection; see <xref target="endpoint"/>.</dd>
          <dt>saved_cwnd:</dt><dd>A CC parameter with the preserved capacity
          derived from observation of a previous connection (see <xref
          target="req-observe"/>).</dd>
          <dt>saved_remote_endpoint:</dt><dd>The Remote Endpoint that was associated with a set of saved CC parameters.</dd>
          <dt>saved_rtt:</dt><dd>A CC parameter with the preserved minimum RTT (see <xref target="req-observe"/>).</dd>
          <dt>unvalidated packet:</dt><dd>A packet sent when the CWND has been
          increased beyond the size normally permitted by the CC algorithm; if
          such a packet is acknowledged by an ACK, it contributes to the
          PipeSize, but if congestion is detected, it triggers entry to the
          Safe Retreat Phase.</dd>
        </dl>
      </section>
    </section>

    <section anchor="sec-phase">
      <name>The Phases of CC Using Careful Resume</name>
      <t>This section defines a series of phases that the
    congestion controller moves through as a connection
    uses Careful Resume. Each rule is prefixed by the
    name of the relevant phase.</t>
<!-- [rfced] Figure 1: There are minor discrepancies between the SVG and
ASCII art as follows. Should the SVG be updated to match the ASCII art? 
If so, please provide the updated SVG; or, if the updates are only to the 
text elements in the SVG, we can update it.

SVG vs. ascii-art:

  Observing  vs.  Normal CC
  (Normal)   vs. (Observing)

   Normal    vs.  Normal CC

Please see
https://www.rfc-editor.org/authors/rfc9959.html#figure-1 vs.
https://www.rfc-editor.org/authors/rfc9959.txt  (Figure 1)
-->

      <figure anchor="fig1">
        <name>Key Transitions Between Phases in Careful Resume</name>
	<artset>
	  <artwork type="svg" name="" alt="" src="">
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="192" width="560" viewBox="0 0 560 192" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
<path d="M 208,48 L 208,64" fill="none" stroke="black"/>
<path d="M 208,96 L 208,160" fill="none" stroke="black"/>
<path d="M 264,96 L 264,112" fill="none" stroke="black"/>
<path d="M 336,128 L 336,160" fill="none" stroke="black"/>
<path d="M 504,48 L 504,160" fill="none" stroke="black"/>
<path d="M 336,32 L 496,32" fill="none" stroke="black"/>
<path d="M 296,80 L 504,80" fill="none" stroke="black"/>
<path d="M 264,112 L 288,112" fill="none" stroke="black"/>
<path d="M 392,112 L 504,112" fill="none" stroke="black"/>
<path d="M 208,160 L 360,160" fill="none" stroke="black"/>
<path d="M 480,160 L 504,160" fill="none" stroke="black"/>
<polygon class="arrowhead" points="512,48 500,42.4 500,53.6" fill="black" transform="rotate(270,504,48)"/>
<polygon class="arrowhead" points="504,32 492,26.4 492,37.6" fill="black" transform="rotate(0,496,32)"/>
<polygon class="arrowhead" points="368,160 356,154.4 356,165.6" fill="black" transform="rotate(0,360,160)"/>
<polygon class="arrowhead" points="296,112 284,106.4 284,117.6" fill="black" transform="rotate(0,288,112)"/>
<polygon class="arrowhead" points="216,64 204,58.4 204,69.6" fill="black" transform="rotate(90,208,64)"/>
<g class="text">
<text x="164" y="36">Observing ...&gt; Connect -&gt; Reconnaissance</text>
<text x="532" y="36">Normal</text>
<text x="36" y="52">(Normal)</text>
<text x="240" y="84">Unvalidated</text>
<text x="340" y="116">Validating</text>
<text x="420" y="164">Safe Retreat</text>
</g>
</svg>
	  </artwork>
        <artwork name="" type="ascii-art" alt="" src=""><![CDATA[
Normal CC...> Connect -> Reconnaissance --------------------> Normal CC
(Observing)               |                                    ^
                          v                                    |
                         Unvalidated --------------------------+
                          |      |                             |
                          |      +--> Validating --------------+
                          |               |                    |
                          |               |                    |
                          +---------------+--> Safe Retreat ---+]]></artwork>
	</artset>
      </figure>
      <t>
    The key phases of Careful Resume are illustrated in <xref target="fig1"/>.
    Examples of transitions between these phases
    are provided in Appendices <xref target="Notes" format="counter"/> and <xref target="Examples" format="counter"/>.</t>
    
    <section>
        <name>Observing</name>
        <t>An established connection can save a set of CC parameters for the specific path
        to the current endpoint. A set of CC parameters includes a
        Lifetime (e.g., as a timestamp after which the parameters must not be used)
        and corresponds to one saved_remote_endpoint.</t>
        <t>The following rules apply to observing a connection:</t>
        <ul spacing="normal">
          <li>
            <t>Observing (saved_cwnd):
        The currently utilised capacity for the connection is
        measured as the volume of bytes sent during an RTT and is recorded in the
        saved_cwnd. This could be computed
        by measuring the volume of data acknowledged in one RTT.
        If the measured CWND is less than four times the IW,
        the sender can choose to not save the CC parameters, because the additional actions associated with
        performing Careful Resume for a small CWND would not justify its use.</t>
          </li>
          <li>
            <t>Observing (saved_rtt): The minimum RTT at the time of observation is saved as the saved_rrt.</t>
          </li>
          <li>
            <t>Observing (updating saved CC parameters): A sender <bcp14>MUST NOT</bcp14> retain more than one
        set of CC parameters for a Remote Endpoint,
        but the set of CC parameters <bcp14>SHOULD</bcp14> be updated (or replaced)
        after a later observation of a path to the same Remote Endpoint.</t>
          </li>
        </ul>
        <t>Implementation notes are provided in <xref target="req-observe"/>.</t>
      </section>
          
    <section anchor="sec-phase-rec-phase">
        <name>Reconnaissance Phase</name>
        <t>During this phase, the sender attempts to retrieve CC
        parameters that were previously saved, then determine whether the path is
        consistent with a previously observed path (i.e, match the
        saved_remote_endpoint in a set of saved CC parameters).</t>
        <t> The sender enters the Reconnaissance Phase after connection setup (using normal CC).
        In this phase, the CWND is initialised to the IW, and the sender transmits any initial data.</t>

        <t> In the Reconnaissance Phase, the sender performs the following
        action:</t>
        <ul spacing="normal">
          <li>
            <t>Reconnaissance Phase (received acknowledgment):
         The CWND is increased using normal CC as each ACK
         confirms delivery of previously unacknowledged data
          (i.e., the base congestion control algorithm continues to operate normally).</t>
          </li>
        </ul>
        <t>The sender exits the Reconnaissance Phase and stops using Careful Resume
     when one of the following events occurs:</t>
        <ul spacing="normal">
          <li>
            <t>Reconnaissance Phase (detected congestion): If the sender detects
         congestion (e.g., packet loss or ECN-CE marking),
         this indicates that
         use of the saved CC parameters is inappropriate.
         The sender stops using Careful Resume and <bcp14>MUST</bcp14> continue using normal CC to
         react to the detected congestion. </t>
          </li>
          <li>
            <t>Reconnaissance Phase (using saved_cwnd):
        Only one connection can use a specific set of saved CC parameters.
        If another connection has already started to use the saved_cwnd, the sender
        <bcp14>MUST</bcp14> exit Careful Resume and return to use normal CC.</t>
          </li>
          <li>
            <t>Reconnaissance Phase (path change): If the Remote Endpoint is not
      the same as any saved_remote_endpoint, or the sender receives a
      signal from the local stack indicating that the path is now
      different to the observed path, the sender <bcp14>MUST</bcp14> stop using
      Careful Resume and returns to use normal CC.</t>
          </li>
<!-- [rfced] In the text below, how may we clarify what must stop using
careful resume (is it the sender)?

In addition, may we update "returns to use" to "return to using" (to be
parallel with the verb "using")? We note this language appears
elsewhere in this document, so please let us know if we may update those
instances as well.

Original:
   If the Lifetime of the observed CC parameters is exceeded, this set of CC
   parameters are not used, the saved CC parameters are deleted and MUST stop
   using Careful Resume and returns to use normal CC.

Perhaps:
   If the Lifetime of the observed CC parameters is exceeded, this set of CC
   parameters is not used.  The saved CC parameters are deleted, and 
   the sender MUST stop using Careful Resume and return to using normal CC.
-->
          <li>
            <t>Reconnaissance Phase (lifetime of saved CC parameters): The CC
      parameters are temporal.  If the Lifetime of the observed CC
      parameters is exceeded, this set of CC parameters is not used;
      the saved CC parameters are deleted and <bcp14>MUST</bcp14> stop using
      Careful Resume and returns to use normal CC.</t>
          </li>
          <li>
            <t>Reconnaissance Phase (minimum RTT too small): If the minimum
      RTT recorded in the Reconnaissance Phase is less than or equal to
      (saved_rtt / 2) (see <xref target="sec-confirm-rtt"/>), the sender <bcp14>MUST</bcp14> stop
      using Careful Resume 
      (e.g., logged as rtt_not_validated in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>) and returns to use normal CC.  
      This is because the
      calculation of a sending rate from a saved_cwnd is directly
      impacted by the RTT; therefore, a significant change in the RTT is
      a strong indication that the previously observed CC parameters are
      not valid for the current path.</t>
          </li>
        </ul>
        <t>Note: When a path is not confirmed, Careful Resume does not modify the CWND
     before it exits to use normal CC.</t>
        <t>The sender is permitted to enter the Unvalidated Phase as described below:</t>
        <ul spacing="normal">
          <li>
            <t>Reconnaissance Phase (path confirmed):
        When the sender has
        received an ACK that acknowledges all the initial data (usually the IW)
        without reported congestion, it <bcp14>MAY</bcp14> then enter the Unvalidated Phase.
        Although a sender can immediately transition to the Unvalidated Phase,
        this transition <bcp14>MAY</bcp14> be deferred to the time at which more data is sent
       than would have been normally permitted by the CC algorithm.</t>
          </li>
        </ul>
        <t>Implementation notes are provided in <xref target="req-recon"/>.</t>
      </section>
     
    <section anchor="sec-phase-unv-phase">
        <name>Unvalidated Phase</name>
        <t>The Unvalidated Phase is designed to enable the CWND
        to more rapidly get up to speed by using paced transmission of a tentatively increased CWND.</t>

          <t>On entry to the Unvalidated Phase, the following actions are performed:</t>
        <ul spacing="normal">
          <li>
            <t>Unvalidated Phase (initialising PipeSize):
               The variable PipeSize is initialised to the flight_size on
               entry to the Unvalidated Phase. This records the used portion of the
               CWND before a jump is applied.</t>
          </li>
          <li>
            <t>Unvalidated Phase (setting the jump_cwnd):
               To avoid starving other flows that could have either started
               or increased their use of capacity since observing the capacity of a path,
               the jump_cwnd <bcp14>MUST</bcp14> be no more than half of the saved_cwnd.
               Hence, jump_cwnd is less than  or equal to Min(max_jump,(saved_cwnd/2)).
               CWND = jump_cwnd. </t>
          </li>
        </ul>
          <t>
          In the Unvalidated Phase, the sender performs the following actions:</t>
        <ul spacing="normal">
          <li>
            <t>Unvalidated Phase (pacing transmission): All packets sent in the
               Unvalidated Phase <bcp14>MUST</bcp14> use pacing based on the current RTT.</t>
          </li>
          <li>
            <t>Unvalidated Phase (tracking PipeSize):
               The variable PipeSize is increased by the volume of data that is newly acknowledged
               by each received ACK. (This indicates a previously unvalidated packet has been
               successfully sent over the path.)</t>
          </li>
        </ul>

        <t>The sender exits the Unvalidated Phase and enters the Safe Retreat Phase 
        when one of the following events occurs:</t>
        <ul spacing="normal">
          <li>

<!-- [rfced] We were unable to find the term "path_changed" mentioned in the
reference [LOG]. Should this reference be changed below?

Original:
   *  Unvalidated Phase (Confirming the path during transmission): If
      the sender determines that it is not valid to use the previous CC
      parameters due to a detected path change (e.g., a change in the
      RTT or an explicit signal indicating a path change), the Safe
      Retreat Phase MUST be entered (e.g., logged as path_changed in
      [LOG]).
-->
            <t>Unvalidated Phase (confirming the path during transmission):
               If the sender determines that it is not valid to use the previous CC parameters
               due to a detected path change (e.g., a change in the RTT 
               or an explicit signal indicating a path change),
               the Safe Retreat Phase <bcp14>MUST</bcp14> be entered (e.g., logged as
               path_changed in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).</t>
          </li>
          <li>
            <t>Unvalidated Phase (detected congestion): If the sender detects
               congestion (e.g., packet loss or ECN-CE marking),
               the Safe Retreat Phase <bcp14>MUST</bcp14> be entered
               (e.g., logged as either packet_loss or ECN_CE in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).
               (Note that insufficient time has passed in the Unvalidated Phase for a
               sender to receive any feedback validating the jump in the CWND.
               Therefore, any detected congestion must have resulted from packets
               sent before the Unvalidated Phase.)</t>
          </li>
        </ul>

        <t>The sender exits the Unvalidated Phase and evaluates whether to enter the
       Validating Phase when one of the following events occurs:</t>
        <ul spacing="normal">
          <li>
            <t>Unvalidated Phase (completed sending all unvalidated packets):
               The sender enters the Validating Phase when the flight_size equals the CWND
               (e.g., logged as last_unvalidated_packet_sent in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>). For an	
		 	implementation that measures the CWND in bytes, this condition is	
		 	also true when the remaining unused CWND is less than one maximum-sized packet.</t>
          </li>
          <li>
            <t>Unvalidated Phase (receiving acknowledgment for an unvalidated packet):
               The sender enters the Validating Phase when an ACK is
               received that acknowledges the first packet number (or higher)
                that was sent in the Unvalidated Phase
               (e.g., logged as first_unvalidated_packet_acknowledged in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).</t>
          </li>
          <li>
            <t>Unvalidated Phase (limiting time in the Unvalidated Phase): The sender enters the
               Validating Phase if more than one RTT has elapsed while in the Unvalidated Phase
               (e.g., logged as rtt_exceeded in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).</t>
          </li>
        </ul>
<!-- [rfced] For readability, how may we update the sentence below to reduce the
amount of text in parentheses?

Original:
  Unvalidated Phase (Check flight_size): Upon any of these events (and
   after processing any Acknowledgments that update the PipeSize and
   flight_size), the sender checks if (flight_size is less than IW) or
   (flight_size is less than or equal to the PipeSize) then the CWND is
   reset to the PipeSize (e.g., logged as rate_limited in [LOG]) and the
   sender stops using Careful Resume and returns to use normal CC.

Perhaps:
  Unvalidated Phase (check flight_size): Upon any of these events (and
   after processing any Acknowledgments that update the PipeSize and
   flight_size), the sender checks the following: If flight_size is less than the IW or
   if flight_size is less than or equal to the PipeSize, then the CWND is
   reset to the PipeSize (e.g., logged as rate_limited in [LOG]) and the
   sender stops using Careful Resume and returns to use normal CC.
-->


          <t>Unvalidated Phase (check flight_size):
          Upon any of these events (and
          after processing any Acknowledgments that update the PipeSize and
          flight_size), the sender checks if (flight_size is less than the IW) or
          (flight_size is less than or equal to the PipeSize) then the CWND is
          reset to the PipeSize (e.g., logged as rate_limited in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>) and the
          sender stops using Careful Resume and returns to use normal CC.  In
          the absence of detected congestion, the CWND is not reduced below the IW.
          (The PipeSize does not include the
          part of the jump_cwnd that was not utilised.) Otherwise, the CWND <bcp14>MUST</bcp14> be set to
          the flight_size and the sender progresses to the Validating Phase.</t>
        <t>Implementation notes are provided in <xref target="req-unvalid"/>. </t>
        <t>Notes for BBR are
          provided in <xref target="sec-phase-unval-bbr"/>.</t>
      </section>

    <section anchor="sec-phase-val-phase">
        <name>Validating Phase</name>
        <t>The Validating Phase checks whether all packets
          sent in the Unvalidated Phase were received without inducing congestion.
          The CWND remains unvalidated and the sender typically remains in this phase for one RTT.</t>
        <t>In the Validating Phase, the sender performs the following actions:</t>
        <ul spacing="normal">
          <li>
            <t>Validating Phase (tracking PipeSize):
            The PipeSize is increased by the volume of acknowledged data for each
            received ACK that indicates a packet was
            successfully sent over the path.</t>
          </li>
          <li>
            <t>Validating Phase (updating the CWND): The CWND is updated using the
            normal rules for the current congestion controller.
            This typically will use "slow start", which
            allows the CWND to be increased for each received ACK that
            indicates a packet has been successfully sent across the path.</t>
          </li>
        </ul>

        <t>The sender exits the Validating Phase when one of the following events
        occurs:</t>
        <ul spacing="normal">
          <li>
            <t>Validating Phase (detected congestion):
            If the sender determines that congestion was detected
            (e.g., packet loss or ECN-CE marking), Careful Resume
            enters the Safe Retreat Phase
            (e.g., logged as either packet_loss or ECN_CE in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).</t>
          </li>
          <li>
            <t>Validating Phase (receiving acknowledgment of the unvalidated packets):
            The sender stops using Careful Resume when an ACK is
            received that acknowledges the last packet number (or higher)
            that was sent in the Unvalidated Phase
            (e.g., logged as last_unvalidated_packet_acknowledged in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).
            This means that the packets sent in the Unvalidated Phase were acknowledged
            without congestion.</t>
          </li>
        </ul>
    
        <t>Notes for BBR are
        provided in <xref target="sec-phase-val-bbr"/>.</t>
      </section>

    <section anchor="sec-phase-ret-phase">
        <name>Safe Retreat Phase</name>
        <t>This phase is entered when congestion is
        detected for an unvalidated packet.
        It drains the path of other unvalidated packets.</t>
        <t>On entry to the Safe Retreat Phase, the following actions are performed:</t>
        <ul spacing="normal">
          <li>
            <t>Safe Retreat Phase (removing saved information):
            The set of saved CC parameters for
            the path are deleted, to prevent these
            from being used again by later flows.</t>
          </li>
          <li>
            <t>Safe Retreat Phase (re-initializing the CWND):
            The CWND <bcp14>MUST</bcp14> be reduced to
            no more than (PipeSize/2).
            This avoids persistent starvation by allowing capacity for other flows to regain
            their share of the total capacity.
            (Note: The minimum CWND in QUIC is 2 packets; see <xref target="RFC9002" sectionFormat="comma" section="4.8"/>).</t>
          </li>
          <li>
            <t>Safe Retreat Phase (loss recovery):
            Loss recovery commences using the newly reduced CWND
            that was set on entry to the Safe Retreat Phase.
            When the CWND is reduced,
            a QUIC sender can immediately send a single packet prior to the reduction
            <xref target="RFC9002"/> to speed up loss
            recovery. A
            similar method for TCP is described in <xref target="RFC6675" section="5"/>.
            The loss recovery continues
            until acknowledgment of the last packet number (or a later packet) sent in the
            Unvalidated or Validating Phase.
            (Note: If the last unvalidated packet is not cumulatively acknowledged, then
            additional packets might also need to be retransmitted.)</t>
          </li>
        </ul>
        <t>In the Safe Retreat Phase, the sender performs the following actions:</t>
        <ul spacing="normal">
          <li>
            <t>Safe Retreat Phase (tracking PipeSize):
            The sender continues to update
            the PipeSize after processing each ACK.
            (The PipeSize will be used to update the ssthresh when
           leaving this phase, but it does not affect the CWND.)</t>
          </li>
          <li>
            <t>Safe Retreat Phase (maintaining the CWND):
            The CWND <bcp14>MUST NOT</bcp14> be increased in the Safe Retreat Phase.</t>
          </li>
          <li>
            <t>Safe Retreat Phase (acknowledgment of unvalidated packets):
            When the last packet (or a later packet) sent during the
            Unvalidated Phase has been acknowledged,
            the sender stops using Careful Resume and returns to use normal CC.</t>
          </li>
        </ul>

        <t>On leaving
            the Safe Retreat Phase, the ssthresh <bcp14>MUST</bcp14> be set to no larger than
            the most recently measured PipeSize * Beta, where Beta
            is a scaling factor between 0.5 and 1. The default value
            is 0.5, chosen to reduce the probability of inducing
            a second round of congestion. Cubic defines a
           Beta__cubic of 0.7 <xref target="RFC9438"/>
            (e.g., logged as exit_recovery in <xref target="I-D.custura-tsvwg-careful-resume-qlog"/>).</t>
        <t>Implementation notes are provided in <xref target="req-retreat"/>.</t>
        <t>Notes for BBR are described in <xref target="sec-BBR-SR"/>.</t>
      </section>

    <section>
        <name>Detecting Persistent Congestion While Using Careful Resume</name>
        <t>A sender that experiences persistent congestion (e.g., a
        Retransmission Time Out (RTO) or expiry in TCP) ceases to use Careful
        Resume.  The sender stops using Careful Resume and returns to use
        normal CC. If using BBR, the normal processing of packet losses will
        cause it to enter the Drain state while the "carefully-resuming" flag
        is set to True; see <xref target="sec-BBR-SR"/>.</t>
        <t> As in loss recovery, data sent in the
        Unvalidated Phase could be later acknowledged after an RTO event.</t>
      </section>
    
    <section anchor="Normal_Phase">
        <name>Returning to Use Normal CC</name>
        <t>After exiting Careful Resume, the sender returns to using
            the normal CC algorithm (e.g., in congestion avoidance when the CWND is more than ssthresh, or slow start when
            less than or equal to ssthresh).</t>
        <t>Implementation notes are provided in <xref target="req-normal"/>.</t>
      </section>
        
    </section>
    
    <section anchor="guidance">
      <name>Implementation Notes and Guidelines</name>
      <t>This section provides guidance for implementation and use.</t>
      <section anchor="req-observe">
        <name>Observing the Path Capacity</name>
        <t>There are various approaches to measuring the capacity used by a connection.
        Congestion controllers, such as such as Reno <xref target="RFC5681"/>  or Cubic <xref target="RFC9438"/>, could estimate the
        capacity based on the
        CWND, flight_size, acknowledged rate, etc. A different approach could
        estimate the same parameters for a rate-based congestion
        controller, such as BBR <xref target="I-D.ietf-ccwg-bbr"/>,
        or by observing the rate at which data is acknowledged by the Remote Endpoint.</t>
        <t>Implementations are required to calculate a saved_rtt, measuring
        the minimum RTT while observing the capacity. For example, this could be the minimum
        of a set RTT of measurements measured over the previous 5 minutes.</t>
        <ul spacing="normal">

            <li>
            <t>There are cases where the current CWND does not reflect the
            path capacity. At the end of slow start, the CWND can be
            significantly larger than needed to fully utilise the path (i.e.,
            a CWND overshoot). It is inappropriate to use an overshoot in the
            CWND as a basis for estimating the capacity. In most cases, the
            CWND will converge to a stable value after several more RTTs.  One
            mitigation when a connection is in Slow Start could be to set the
            saved_cwnd based on the validated pipe size (i.e., CWND / 2).</t>
          </li>
          <li>
            <t>When the sender
            is rate limited or in the RTT following a burst of
            transmission, a sender typically transmits
            less data than allowed by the CWND. Such observations could be discounted when
            estimating the saved_cwnd (e.g., when a previous
            observation recorded a higher value).</t>
          </li>
        </ul>
      </section>

    <section anchor="req-recon">
        <name>Confirming the Path in the Reconnaissance Phase</name>
        <t>In the Reconnaissance Phase, the sender initiates a connection
        and starts sending initial data, while measuring the current RTT.
        The CC is not modified.
        A sender therefore needs to limit the initial data,
        sent in the first RTT of transmitted data,
        to no more than the IW <xref target="RFC9002"/>.
        This transmission using the IW is
        assumed to be a safe starting point for any path to avoid
        adding excessive load to a potentially congested path.</t>
        <t>Careful Resume does not permit multiple concurrent reuse of
        the saved CC parameters. When multiple new concurrent connections
        are made to a server, each can have a valid saved_remote_endpoint,
        but the saved_cwnd can only be used by one connection at a time.
        This is to prevent the sender from performing multiple jumps in the CWND,
        each individually based on the same saved_cwnd, and hence creating an
        excessive aggregate load at the bottleneck.</t>

<!-- [rfced] May we break up the sentence below for readability?
Also note that we have removed the two closing parentheses at the end of this
text; please review.

Original:
   For example, if a simple sender receives multiple connections from a Remote
   Endpoint, then the sender process could use a hash table to manage the CC
   parameters, whereas when using some types of load balancing, a distributed
   system might be needed to ensure this invariant when the load balancing hashes
   connections by 4-tuple and hence multiple connections from the same client
   device are served by different server processes, see also Section 4.2.))

Perhaps:
   For example, if a simple sender receives multiple connections from a Remote
   Endpoint, then the sender process could use a hash table to manage the CC
   parameters, whereas when using some types of load balancing, a distributed
   system might be needed to ensure this invariant when the load balancing hashes
   connections by 4-tuple. Hence, multiple connections from the same client
   device are served by different server processes; see also Section 4.2.
-->


<t>The method that is used to prevent reuse of the saved CC parameters
        will depend upon the design of the server.
        For example, 
        if a simple sender receives multiple connections from a Remote Endpoint, 
        then the sender process could use a hash table to manage the CC parameters,
        whereas when using some types of load
        balancing, a distributed system might be needed to ensure this
        invariant when the load balancing hashes
        connections by 4-tuple and hence multiple connections from the same
        client device are served by different server processes;
        see also <xref target="req-recon"/>.</t>
        <t>A sender that is rate limited <xref target="RFC7661"/> sends
        insufficient data to be able to validate transmission at a higher
        rate.  Such a sender is allowed to remain in the Reconnaissance Phase
        and to not transition to the Unvalidated Phase until there is more
        data in the transmission buffer than would normally be permitted by
        the CC algorithm.
        </t>
        <section anchor="sec-confirm-rtt">
          <name>Confirming the Path</name>
          <t>Path characteristics can change over time for many reasons.
            This can result in the previously observed CC parameters
            becoming irrelevant. To help confirm the path, the sender compares the
            saved_rrt with each current RTT sample.</t>
          <t>If the current RTT sample is less than a half of the
            saved_rrt, this is regarded as too small. This is an indicator of a path change.
            This factor of two arises because the jump_cwnd is calculated as half the
            measured saved_cwnd and the sending rate ought not to exceed the observed rate when
            the saved_cwnd was measured.</t>
          <t>If the current RTT is larger than the saved_rtt,
            this would result
            in a proportionally lower rate for the unvalidated packets, because the transmission
            is paced based on the current RTT. Hence, this rate is still safe.
            If the current RTT has been incorrectly measured as larger
            than the actual path RTT, the sender will receive an ACK for an
            unvalidated packet before it has completed the Unvalidated Phase. This
            ACK resets the CWND to reflect the flight_size,
            and the sender then enters the Validating Phase.
            The flight_size reflects the amount of outstanding data
            in the network rather than the
            maximum that is permitted by the CWND.</t>
          <t>A current RTT that is more than ten times the
            saved_rrt is indicative of a path change.
            The value of ten accommodates both increases in latency from buffering
            on a path and any variation between RTT samples.</t>
          <t>Note 1: In the Reconnaissance Phase, the sender calculates a minimum RTT over the phase
            and checks this on entry to the Unvalidated Phase.
            This avoids a need to check after each current RTT sample.</t>
          <t> Note 2: During the Unvalidated Phase, the
            minimum RTT cannot increase, and hence the minimum RTT can never be larger
            than (saved_rtt x 10) during the Unvalidated Phase.</t>
<!-- [rfced] Please clarify "revert to stop using" in the text below.

Original:
   Designs need to consider if such an indication is a suitable trigger to
   revert to stop using Careful Resume.

Perhaps:
   Designs need to consider if such an indication is a suitable trigger to
   revert and stop using Careful Resume.

Or: 
   Designs need to consider if such an indication is a suitable trigger to
   revert to not using Careful Resume.
-->

          <t>The sender also verifies that the initial data was acknowledged.
            Any loss could be indicative of persistent congestion.
            If a sender in the Reconnaissance Phase detects congestion, it stops using Careful Resume 
            and returns to using normal CC.
            Some transport protocols implement CC mechanisms that infer potential congestion
            from an increase in the current RTT. Designs need to consider if such an indication is
            a suitable trigger to revert to stop using Careful Resume.</t>
        </section>
        
    </section>

    <section anchor="req-unvalid">
        <name>Safety in the Unvalidated Phase</name>
        <t>This section considers the safety
        for using saved CC parameters to tentatively update the CWND.
        This seeks to avoid starving other flows that could have either started
        or increased their use of capacity since observing the capacity of a path.</t>
        <t>To avoid inducing significant congestion to any connections that
        have started to use a shared bottleneck, a sender must not directly use the previous
        saved_cwnd to directly initialise a new flow causing it to resume sending at the same
        rate. The jump_cwnd is therefore limited to half the previously saved_cwnd.</t>
        <section anchor="req-lifetime">
          <name>Lifetime of CC Parameters</name>
          <t>The long-term use of the previously observed parameters is not appropriate;
            a Lifetime defines the duration during
            which a set of saved CC parameters can be safely reused.
            The maximum Lifetime is a configurable parameter for a sender. 
            An implementation also needs to provide a method to flush the set of saved CC parameters
            following a configuration change.</t>
          <t><xref target="RFC9040"/> provides guidance on the implementation of
            TCP Control Block Interdependence, but it does not specify how long a saved
            parameter can safely be reused.
            <xref target="RFC7661"/> specifies a method for managing an
            unvalidated CWND. It states:</t>
            <blockquote>After a fixed period of time (the non-validated period (NVP)), the sender
            adjusts the CWND (Section 4.4.3). The NVP <bcp14>SHOULD NOT</bcp14> exceed five minutes.</blockquote>
            <t><xref target="RFC7661" section="5"/> discusses the rationale for
            choosing that period.
            However, <xref target="RFC7661"/> targets rate-limited connections using normal
            CC. Careful Resume includes additional
            mechanisms to avoid and mitigate the effects of overshoot, and therefore
            a longer period can be justified when using a saved_cwnd with
            Careful Resume.</t>
          <t>When the path characteristics are known to be dynamic, or the path varies,
            a small Lifetime is desirable (e.g., measured in minutes). For stable paths,
            and where the sender does not expect the path to be shared by many senders,
            a longer Lifetime (e.g., measured in hours) could be used.
            A bottleneck that is shared
            by a large number of senders brings greater risk that CR connections could
            contribute congestion that leads to prolonged overload with starvation. This can
            be mitigated by setting a small Lifetime.</t>
        </section>
            
        <section anchor="req-pace">
          <name>Pacing in the Unvalidated Phase</name>
          <t>A sender needs to avoid any step increase in the CWND resulting in a burst of 
            packets that is greater than the size of the CC algorithm's IW.
            This is consistent with <xref target="RFC8085"/> and
            <xref target="RFC9000"/>.</t>
          <t>Pacing packets as a function of
            the current RTT, rather than the saved_rrt, provides additional safety during the
            Unvalidated Phase, because it avoids a smaller saved_rrt inflating the sending rate.
            The lower bound to the minimum acceptable current RTT
            avoids sending unvalidated packets at a rate that would be higher than was previously observed.</t>
          <t>The following example provides a relevant pacing rhythm:
            An Inter-packet Transmission Time (ITT) is determined
            by using the current Maximum Packet Size (MPS), including headers,
            the saved_cwnd, and the current RTT. A safety
            margin can be configured to avoid sending more than a maximum
            (max_jump):
          </t>
          <artwork>
      jump_cwnd = Min(max_jump,saved_cwnd/2)

      ITT = (current RTT x MPS)/jump_cwnd
          </artwork>
          <t>This follows the idea presented in <xref target="RFC4782"/>,
            <xref target="I-D.irtf-iccrg-sallantin-initial-spreading"/>, and
            <xref target="CONEXT15"/>.
            Other sender mitigations have also been suggested to
            avoid line-rate bursts (e.g., <xref target="I-D.hughes-restart"/>).</t>
        </section>
        
        <section>
          <name>Exit from the Unvalidated Phase Because of Variable Network Conditions</name>
          <ul spacing="normal">
            <li>
              <t>Careful Resume has been designed to be robust to
               changes in network conditions
               due to variations in the forwarding path (see <xref target="sec-principle"/>), such as reconfiguration of
               equipment or changes in the link conditions. This is mitigated
               by path confirmation.</t>
            </li>
            <li>
              <t>Careful Resume has been designed to be robust to changes
                in network traffic, including the
                arrival of new flows that compete for capacity at a shared bottleneck.
                This is mitigated by jumping to no more than a half of
                the saved_cwnd and by pacing.</t>
            </li>
            <li>
              <t>Careful Resume has been designed to avoid unduly suppressing flows
                that have used the capacity since the capacity was observed. This is further
                mitigated by bounding the duration of the Unvalidated Phase and the following
                Validating Phase, and the conservative design of the Safe Retreat Phase.</t>
            </li>
          </ul>
        </section>
      </section>

    <section anchor="req-val">
        <name>The Validating Phase</name>
        <t>The purpose of the Validating Phase is to trigger an
        entry to the Safe Retreat Phase if the capacity is not validated.</t>
        <t>When the sender completes the Unvalidated Phase, either by sending a jump_cwnd of data
        or after one RTT or an acknowledgment for an unvalidated packet,
        it ceases to use the unvalidated CWND.</t>
        <t>If the flight_size was less than or equal to the PipeSize, the
        sender resets the CWND to the PipeSize and stops using Careful Resume. Otherwise, if the CWND is larger than the flight_size,
        the CWND is reset to the flight_size.
        The sender then awaits reception of ACKs to validate the
        use of this capacity.</t>
        <t>New packets are sent when previously
        sent data is newly acknowledged.
        The CWND is increased during the Validating Phase,
        based on received ACKs. This allows new data to be sent,
        but this does not have any final impact on the CWND
        if congestion is subsequently detected.</t>
      </section>

    <section anchor="req-retreat">
        <name>Safety in the Safe Retreat Phase</name>
        <t>This section considers the safety
        after congestion has been detected for unvalidated packets.</t>
        <t>The Safe Retreat Phase sets a safe CWND value to drain any unvalidated packets
        from the path after a packet loss has been detected or when ACKs that indicate the sent
        packets were marked as ECN-CE. The CC parameters that were used are invalid
        and are removed.</t>
        <t>The Safe Retreat reaction differs from a traditional
        reaction to detected congestion, because
        a jump_cwnd can result in a significantly higher rate than would be allowed by
        Slow-Start. Such a jump could aggressively feed a congested bottleneck,
        resulting in overshoot where a disproportionate number of packets
        from existing flows are displaced from the buffer at the congested bottleneck.
        For this reason, a sender in the Safe Retreat Phase needs to react to detected congestion by
        reducing the CWND significantly below the saved_cwnd.</t>
        <t>During loss recovery, a receiver can cumulatively acknowledge data
        that was previously sent in the Unvalidated Phase in addition to
        acknowledging the successful retransmission of data.  <xref
        target="RFC3465"/> describes how to appropriately account for such
        ACKs.  The sender tracks received ACKs that acknowledge the reception
        of the unvalidated packets to measure the maximum available capacity,
        called the "PipeSize".  (The first unvalidated packet can be
        determined by recording the sequence number of the first packet sent
        in the Unvalidated Phase.)  This calculated PipeSize is later used to
        reset the ssthresh.  However, note that this is not a safe measure of
        the currently available share of the capacity whenever there was also
        a significant overshoot at the bottleneck, and it must not be used to
        reinitialise the CWND.</t>
        <t>Proportional Rate Reduction (PRR) <xref target="RFC9937"/>
        assumes that it is safe to reduce
        the rate gradually when in congestion avoidance.
        PRR is therefore not appropriate
        when there might be significant overshoot in the use of the capacity, which can
        be the case when the Safe Retreat Phase is entered.</t>
        <t>The recovery from loss depends on the design of a transport protocol.
        A TCP or SCTP sender is required to retransmit
        all lost data <xref target="RFC5681"/>.
        For some transports (e.g., QUIC and DCCP), the need for loss recovery
        depends on the sender policy for retransmission.
        On entry to the Safe Retreat Phase, the CWND can be
        significantly reduced. When there were multiple losses,
        a sender recovering all lost data could then take multiple RTTs to complete.</t>
      </section>

    <section anchor="req-normal">
        <name>Returning to Normal Congestion Control</name>
        <t>After using Careful Resume, the CC controller returns to using normal CC.</t>
        <t>The CWND at entry to the phase will have been
        increased when a sender has passed through the Unvalidated Phase,
        unless the sender was rate limited, which causes the CWND to be
        reset based on the used capacity.
        The CWND is not reduced below the IW, unless congestion was
        detected.
        However, note that in some cases the value of the CWND
        could be significantly lower than the
        jump_cwnd (e.g., when a sender did not utilise
        the entire CWND in the Unvalidated Phase). The implementation details for different CC algorithms depend on the
        design of the algorithm.</t>
        <!---<list>
            <t>For NewReno and CUBIC, it is recommended to exit Slow-Start
            and enter the congestion avoidance phase of the CC algorithm.</t>

            <t>For BBR CC, it is recommended to enter the "Drain"
            state <xref target="bbr"</xref>.</t>
        </list></t>-->

        <t>Once a sender is no longer using Careful Resume, the sender is permitted to start
        observing the capacity of the path.</t>
      </section>
    
    <section anchor="flow-control">
        <name>Limitations from Transport Protocols</name>
        <t>The CWND is one factor that limits the
        sending rate of the sender. Other mechanisms can also constrain
        the maximum sending rate of a transport protocol.
        A transport protocol might need to update these mechanisms
        to fully utilise the CWND made available by Careful Resume:
        </t>
        <ul spacing="normal">
          <li>
            <t>A TCP sender is limited by the receiver window (rwnd).
            Unless configured at a receiver, the rwnd constrains the rate
            of increase for a connection and reduces the benefit of Careful Resume.</t>
          </li>
          <li>
            <t>QUIC includes flow control mechanisms and mechanisms to prevent amplification
            attacks. In particular, a QUIC receiver might need to issue proactive
            MAX_DATA frames to increase the flow control limits of a connection
            that is started when using Careful Resume to gain the expected benefit.</t>
          </li>
        </ul>
      </section>
</section>

<section anchor="ops">
      <name>Operational Considerations</name>
      <t>This section provides some operational considerations for network
    providers. As noted above, using CC parameters that were observed
    during a previous connection is inherently a tradeoff between the
    potential performance gains for the new connection and the risks of
    degraded performance for other connections that share a common
    bottleneck.
    A transport endpoint often has no visibility of changes in the level of
    network traffic, nor the forwarding path over which the transport path
    is supported.
    Careful Resume is therefore a sender-side transport change that
    has been designed so that any potential "harm" to
    other flows is constrained. It seeks to detect whether the transport
    path has changed since the observation of that capacity.
    Importantly, whenever a sender detects
    that assumptions about the capacity are not valid, the sender
    safely responds to reduce the impact on other flows (see <xref target="sec-principle"/>).</t>
      <t>There are three ways that the use of Careful Resume can be constrained:
      </t>
      <ul spacing="normal">
        <li>
          <t>The maximum configured jump window (max_jump) (see <xref target="sec-phase-unv-phase"/>),</t>
        </li>
        <li>
          <t>The Remote Endpoint identifying the client and the server that are permitted to use a specific set of saved CC parameters (see <xref target="endpoint"/>),</t>
        </li>
        <li>
          <t>The configured Lifetime for a set of saved CC parameters (see <xref target="req-lifetime"/>).</t>
        </li>
      </ul>
      <t>Network methods such
    as Equal Cost Multipath Routing, Anycast Routing, and Network Address Translation
    can result in changes to the forwarding path. The impact of these
    methods on Careful Resume can be minimised when the network is configured
    so that the alternative paths are
    provisioned to support equivalent capacity (i.e., a change to
    the forwarding path does not introduce a significant reduction in the capacity
    of the smallest bottleneck on the end-to-end path).</t>
      <t>For many network paths, the smallest bottleneck is located in the access
    part of the end-to-end path.
    As an example, consider a typical client on an access network
    could connect to a remote server with a capacity bottleneck located in the
    access part of this path. When the client
    connects to a server using an anycast destination address, the anycast
    routing would be configured to distribute connections to a
    corresponding server. A client would then be unaware of whether
    different instances of the client's
    connections (with the same address pair) would terminate at the same or
    different servers, or at servers located at different "server farms".
    Hence, if a server is configured to
    send using Careful Resume, there is an onus to appropriately manage the
    use of saved CC parameters (see <xref target="req-recon"/>).</t>
      <t>The way in which this is realised will depend upon the design choices in
    configuring the network and the servers.
    On the one hand, if all the servers responding to a
    given IP address share the same location (e.g., are in the same data center),
    then a method could be provided to coordinate their sharing of the CC parameters
    that are used to send data using Careful Resume.
    On the other hand, if the service configuration is such that subsquent use of the
    IP anycast address might
    result in a very different path to a server (e.g., at a different
    location where the path would be unable to support the same capacity),
    a sender should not use Careful Resume based on saved CC parameters.</t>
    </section>
    <section anchor="sec-IANA">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
    <section anchor="sec-security">
      <name>Security Considerations</name>
      <t>The security considerations are the same as for other
     sender-based congestion control methods. Such methods
     rely on the receiver appropriately acknowledging receipt
     of data. The ability of an on-path or off-path attacker
     to influence congestion control depends upon the security
     properties of the transport protocol being used.</t>
      <!-- Security considerations for the
    interactions with the receiver are discussed in
    <xref target="I-D.kuhn-quic-bdpframe-extension"></xref>.-->
</section>

  </middle>

  <back>
    <displayreference target="I-D.custura-tsvwg-careful-resume-qlog" to="LOG"/>
    <displayreference target="I-D.hughes-restart" to="TCP-SSR"/>
    <displayreference target="I-D.ietf-ccwg-bbr" to="BBR-CC"/>
    <displayreference target="I-D.irtf-iccrg-sallantin-initial-spreading" to="INIT-SPREADING"/>
<!-- References:

x) [I-D.irtf-iccrg-sallantin-initial-spreading-00]:

We note that this reference has been replaced by
draft-sallantin-iccrg-initial-spreading. 
Would you like to update this reference to point to this newest draft?

x) [LOG]
We note that this reference (draft-custura-tsvwg-careful-resume-qlog-02) has
been replaced by draft-ietf-tsvwg-careful-resume-qlog.  Would you like to
update this reference to point to this newest draft?

x)
-->
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2914.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8085.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml"/>
      </references>
      <references>
        <name>Informative References</name>
	<xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9937.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-iccrg-sallantin-initial-spreading.xml"/>

<!-- [I-D.ietf-ccwg-bbr]
draft-ietf-ccwg-bbr-04
IESG State: I-D Exists as of 12/01/25
-->
<reference anchor="I-D.ietf-ccwg-bbr" target="https://datatracker.ietf.org/doc/html/draft-ietf-ccwg-bbr-04">
   <front>
      <title>BBR Congestion Control</title>
      <author initials="N." surname="Cardwell" fullname="Neal Cardwell" role="editor">
         <organization>Google</organization>
      </author>
      <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
         <organization>Google</organization>
      </author>
      <author initials="J." surname="Beshay" fullname="Joseph Beshay" role="editor">
         <organization>Meta</organization>
      </author>
      <date month="October" day="20" year="2025" />
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-04" />
   
</reference>
<!-- [LOG]
draft-custura-tsvwg-careful-resume-qlog-02 
Replaced by draft-ietf-tsvwg-careful-resume-qlog -->

        <xi:include href="https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.custura-tsvwg-careful-resume-qlog.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3465.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4782.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5681.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9438.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5783.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6675.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6928.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9293.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7661.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9002.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9040.xml"/>
        <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9406.xml"/>
        <!--- A manual format reference to over-ride broken ID Archive reference (missing authors, noted by J.Touch). -->
<!-- [I-D.hughes-restart]
draft-hughes-restart-00
IESG State: Expired as of 12/01/25
-->
        <reference anchor="I-D.hughes-restart" target="https://datatracker.ietf.org/doc/html/draft-hughes-restart-00">
          <front>
            <title>Issues in TCP Slow-Start Restart After Idle</title>
            <author initials="A" surname="Hughes" fullname="Amy S Hughes">
              <organization>ISI</organization>
            </author>
            <author initials="J" surname="Touch" fullname="Joe Touch">
              <organization>ISI</organization>
            </author>
            <author initials="J" surname="Heidemann" fullname="John Heidemann">
              <organization>ISI</organization>
            </author>
            <date month="December" year="2001"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-hughes-restart-00"/>
        </reference>
        <reference anchor="MAPRG111" target="https://www.ietf.org/proceedings/111/slides/slides-111-maprg-feedback-from-using-quics-0-rtt-bdp-extension-over-satcom-public-access-00.pdf">
          <front>
            <title>Feedback from using QUIC's 0-RTT-BDP extension over SATCOM
          public access</title>
            <author initials="N" surname="Kuhn"/>
            <author initials="E" surname="Stephan"/>
            <author initials="G" surname="Fairhurst"/>
            <author initials="T" surname="Jones"/>
            <author initials="C" surname="Huitema"/>
            <date month="July" year="2021"/>
          </front>
          <refcontent>IETF 111 Proceedings</refcontent>
        </reference>
        <reference anchor="IJSCN">
          <front>
            <title>Google QUIC performance over a public SATCOM access</title>
            <author initials="L" surname="Thomas"/>
            <author initials="E" surname="Dubois"/>
            <author initials="N" surname="Kuhn"/>
            <author initials="E" surname="Lochin"/>
            <date year="2019"/>
          </front>
          <refcontent>International Journal of Satellite Communications and Networking, vol. 37, no. 6, pp. 601-611</refcontent>
          <seriesInfo name="DOI" value="10.1002/sat.1301"/>
        </reference>
        <reference anchor="CONEXT15">
          <front>
            <title>Halfback: Running Short Flows Quickly and Safely</title>
            <author initials="Q" surname="Li"/>
            <author initials="M" surname="Dong"/>
            <author initials="P. B" surname="Godfrey"/>
            <date year="2015"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/2716281.2836107"/>
          <refcontent>CoNEXT '15: Proceedings of the 11th ACM Conference on Emerging Networking Experiments and Technologies</refcontent>
        </reference>

        <reference anchor="CR25" target="https://www.sciencedirect.com/science/article/abs/pii/S1389128625009156">
          <front>
            <title>Analysis of Careful Resumption of Internet Congestion Control from Retained Path State</title>
            <author initials="M" surname="Yanev"/>
            <author initials="A" surname="Custura"/>
            <author initials="R" surname="Secchi"/>
            <author initials="G" surname="Fairhurst"/>
            <date year="2026"/>
          </front>
          <seriesInfo name="DOI" value="10.1016/j.comnet.2025.111950"/>
          <refcontent>Computer Networks, vol. 276</refcontent>
        </reference>
      </references>
    </references>
    <section anchor="Notes">
      <name>Notes on the Careful Resume Phases</name>
      <t> The table below is provided to illustrate the operation of Careful Resume.
    This table is informative; please refer to the body of the document
    for the normative specification. The description is based on a normal
    CC that uses Reno. The PipeSize tracks the validated CWND.</t>

<!-- [rfced] Regarding Table 1 (previously Figure 2):

a) In "PS+=ACked", should "ACked" be "ACKed" (capital K)?

b) FYI, we updated "ECNCE" to "ECN-CE" to match other usage in this
document and other RFCs.

c) In the opening text, would you like to add a sentence such as 
'The phases in Table 1 correspond to Sections 3.2 through 3.5.' or similar?

d) Would you like to add any abbreviations and/or terms to
the legend (e.g., CWND, IW)?
-->

      <t>The table uses the following abbreviations:</t>
      <dl spacing="compact">
	<dt>SS</dt><dd>= Slow-Start</dd>
	<dt>FS</dt><dd>= flight_size</dd>
	<dt>PS</dt><dd>= PipeSize</dd>
	<dt>ACK</dt><dd>= highest acknowledged packet</dd>
      </dl>
      <table>
        <name>Illustration of the Operation of Careful Resume</name>
	<thead>
	  <tr>
	    <th>Phase</th>
	    <th>Normal</th>
	    <th>Recon.</th>
	    <th>Unvalidated</th>
	    <th>Validating</th>
	    <th>Safe Ret.</th>
	  </tr>
	</thead>
	<tbody>
	  <tr>
	    <td></td>
	    <td>Observing CC params</td>
	    <td>Confirm path</td>
	    <td>Send faster using saved_cwnd</td>
	    <td>Validate new CWND; Update PS</td>
	    <td>Drain path; Update PS</td>
	  </tr>
	  <tr>
	    <td>On entry:</td>
	    <td align="center">-</td>
	    <td>CWND=IW</td>
	    <td>PS=FS jump_cwnd =saved_cwnd /2; CWND =jump_cwnd</td>
	    <td>If (FS>PS) {CWND=FS} else {CWND=PS; use Normal CC}</td>
	    <td>CWND=(PS/2)</td>
	  </tr>
	  <tr>
	    <td>CWND:</td>
	    <td>When in observe, measure saved _cwnd</td>
	    <td>CWND increases using SS</td>
	    <td>CWND is not increased</td>
	    <td>CWND can increase using normal CC</td>
	    <td>CWND is not increased</td>
	  </tr>
	  <tr>
	    <td>PS:</td>
	    <td align="center">-</td>
	    <td align="center">-</td>
	    <td colspan="3">PS+=ACked</td>
	  </tr>
	  <tr>
	    <td>RTT:</td>
	    <td>Measure saved_rtt</td>
	    <td>Measure current RTT</td>
	    <td align="center">-</td>
	    <td align="center">-</td>
	    <td align="center">-</td>
	  </tr>
	  <tr>
	    <td>If loss or ECNCE:</td>
	    <td>Normal CC</td>
	    <td>Normal CC; CR is not allowed</td>
	    <td colspan="2">Enter Safe Retreat</td>
	    <td align="center">-</td>
	  </tr>
	  <tr>
	    <td>Next Phase:</td>
	    <td>Observing (as needed)</td>
	    <td>If (CWND, Lifetime, and RTT confirmed), enter Unvalidated; else CWND=Max (PS,IW); and use Normal CC</td>
	    <td>If (FS>CWND or >1 RTT has passed or ACK >= first unvalidated packet), If ((FS>CWND) or (FS&lt;=PS)) cwnd=PS; and use Normal CC else cwnd=FS; enter Validating</td>
	    <td>If (ACK >= last unvalidated packet), use Normal CC</td>
	    <td>If (ACK >= last unvalidated packet), ssthresh = PS x Beta; and use Normal CC</td>
	  </tr>
	</tbody>
      </table>

    </section>
    <section anchor="Examples">
      <name>Examples of the Careful Resume Phases</name>
      <t>The following examples consider an implementation that keeps track of transmitted data in terms of packets and provide informative examples of use.</t>
      <t>In the Unvalidated Phase, the first unvalidated packet corresponds to the
        highest sent packet recorded on entry to this phase.
        In the Validating Phase and Safe Retreat Phase, the sender tracks the last unvalidated packet
        (this is also the highest sent packet number recorded on entry to this phase).
        The PipeSize (PS) tracks the validated portion of the CWND. The PS is set to the CWND
        on entry to the Unvalidated Phase.
        It is updated after receiving an ACK for each additional packet. The default value of Beta is 0.5.</t>
      <t>Note:
    To simplify the description, these examples
    are described using packet numbers (whereas QLOG variables are expressed in bytes).</t>
      <section anchor="Examples-no_loss">
        <name>Example with No Loss</name>
        <t>In the first example of using Careful Resume,
        the sender starts by sending IW packets, assumed to be 10 packets, in the Reconnaissance Phase,
        and then continues in a subsequent RTT to send more packets until the sender
        becomes CWND limited (i.e., flight_size = CWND).</t>
        <t>The sender in the Reconnaissance Phase then
        confirms the RTT and other conditions for using Careful Resume.
        In this example, this is confirmed when the sender has 29 packets in flight.</t>
        <t>The sender then enters the Unvalidated Phase.
        (This path confirmation could have happened earlier if data had been available to send.) The
        sender initialises the PipeSize to the flight_size
        (in this case, 29 packets)
        and then sets the CWND to 150 packets (based upon half of the previously
        observed saved_cwnd of 300 packets).</t>
        <t>The sender now sends 121 unvalidated packets (the unused portion of the current CWND).
        Each time a packet is sent, the sender checks whether 1 RTT has passed since entering the
        Unvalidated Phase (otherwise, the Validating Phase is entered). This check triggers only
        for cases where the sender is rate limited, as shown in the following example: The PipeSize increases after each ACK is received.</t>
        <t>When the first unvalidated packet is acknowledged (packet number 30), the sender
        enters the Validating Phase. (This transition would also occur if the flight_size increased to equal the CWND.)
        During this phase, the CWND can be increased for each ACK that acknowledges an unvalidated packet, because
        this indicates that the packet was validated.</t>
        <t>When an ACK is received that acknowledges the last packet that was sent in the
        Unvalidated Phase, the sender stops using Careful Resume.
        For example, if the CWND is less than ssthresh,
        a Reno or Cubic sender using normal CC is permitted to use Slow-Start to grow the CWND towards
        the ssthresh and will then enter congestion avoidance.</t>
      </section>
      <section anchor="Examples-dl">
        <name>Example with No Loss, Rate Limited</name>
        <t>A rate-limited sender will not fully utilise the available CWND when using Careful Resume,
        and the CWND is therefore reset on entry to the Validating Phase, as described below.</t>
        <t>The sender starts by sending up to IW packets (10) in the Reconnaissance Phase.
        It commences as described in the first example, transitioning to the Unvalidated Phase,
        where the CWND is set to 150 packets, and the PipeSize is set to the flight_size (i.e., 29 packets).</t>
        <t>The sender then becomes rate limited, because the example only sends 50 unvalidated packets.</t>
        <t> After about one RTT (e.g., by comparing the current time with local timestamps for each sent packet
        or by receiving an ACK for the first
        unvalidated packet), the sender will still not have fully used the CWND. It then enters
        the Validating Phase and resets the CWND to the current flight_size (i.e., 50 packets).
        During this phase, the CWND can be increased for each received ACK
        that validates reception of an unvalidated packet.
        The PipeSize also increases with each ACK received, to reflect the discovered capacity.</t>
        <t>The sender completes using Careful Resume
        when a received ACK acknowledges the last packet that was sent in the Unvalidated Phase.
        It then stops using Careful Resume, as in the example with no loss.</t>
      </section>
      <section anchor="Examples-loss-recon">
        <name>Example with Loss Detected in the Reconnaissance Phase</name>
        <t>When a sender detects that a packet was lost in the Reconnaissance Phase, 
        it will stop using Careful Resume
        and recover the loss using the normal loss recovery algorithm and normal CC.
     It is considered that the sender may have discovered a capacity limit and it is not
        allowed to continue to use Careful Resume. In this case, there is no change to
    the CC algorithm and the CWND is the same as if Careful Resume had not been attempted.</t>
      </section>
      <section anchor="Examples-loss-unval">
        <name>Example with Loss Detected in the Validating Phase</name>
        <t>As in the first example, the sender enters the Unvalidated Phase with a CWND of 150 packets
        and with the PipeSize initialised to the flight_size (i.e., 29 packets).</t>
        <t>The sender now sends 121 unvalidated packets (consuming the remaining unused CWND).
        This example considers the case when one of the unvalidated packets is lost. We assume
        in the example that the lost packet is 64 (the 35th packet sent in the Unvalidated Phase).</t>
        <t>The received ACKs acknowledge the reception of the first 34 unvalidated packets.
        The PipeSize at this time is equal to 63 (29 + 34) packets.</t>
        <t>A loss is then detected (by a timer or by receiving three ACKs that
         do not acknowledge packet number 35).
        The sender then enters the Safe Retreat Phase because the CWND was not validated.
        The PipeSize at this point is equal to 63 (29 + 34) packets. Assuming that the IW was 10 packets,
        the CWND is reset to Max(10,PS/2) = Max(10,63/2) = 31 packets.
        This CWND is used during the Safe Retreat Phase, because congestion was detected and the
        sender still does not yet know if the remaining unvalidated packets will be
        successfully acknowledged. This conservative CWND calculation ensures the sender drains
        the path after this potentially severe congestion event.
        There is no further increase in the CWND in this phase.</t>
        <t>The sender continues to receive ACKs that acknowledge the remaining 86 (121-35) unvalidated packets.
        Recall that the 35th unvalidated packet was lost and had packet number 64 (29+35).
        The PipeSize tracks the
        capacity discovered by ACKs that acknowledge the unvalidated packets (i.e., the PipeSize
        is increased for each received ACK that acknowledges new data).
        Although this PipeSize cannot be used to safety initialise the CWND (because it was measured when the sender
        had aggressively created overload), the estimated PipeSize
        (which, in this case, is 121-1 = 120 packets) can be used to set the ssthresh on exit
        from Safe Retreat, since it does indicate a measured upper limit to the current capacity.</t>
        <t>At the point where all the unvalidated packets that were sent in the Unvalidated Phase
        have been either acknowledged
        or have been declared lost, the sender updates the ssthresh to be no larger than the recently
        measured PipeSize multiplied by Beta (the final action of the Safe Retreat Phase), and
        the sender stops using Careful Resume.
        Because the CWND will now be less than ssthresh, a sender using normal CC is permitted to use
        Slow-Start to grow the CWND towards the ssthresh,
        after which it will enter congestion avoidance.</t>
      </section>
    </section>
    <section anchor="bbr">
      <name>Implementation Notes for Using BBR</name>
      <t>Bottleneck Bandwidth and Round-trip propagation time (BBR) uses recent measurements of a transport connection's delivery rate, Round Trip Time (RTT), and packet loss rate to build an explicit model of the network path. BBR then uses this model to control both how fast it sends data and the maximum volume of data it allows in flight in the network at any time <xref target="I-D.ietf-ccwg-bbr"/>.</t>
      <t>When the flow is controlled using BBR <xref target="bbr"/>, Careful Resume is implemented
       by setting the pacing rate from the saved CC parameters,
       with the following precautions:</t>
      <ul spacing="normal">
        <li>
          <t>The flag "carefully-resuming" is added to the BBR state to
          indicate that the sender is allowed to send unvalidated packets.
          This is initialised to False when a BBR flow starts.</t>
        </li>
        <li>
          <t>Prerequisites for using Careful Resume are described in
       <xref target="sec-phase-rec-phase"/>.</t>
        </li>
      </ul>
      <section anchor="sec-phase-unval-bbr">
        <name>Sending Unvalidated Packets Using BBR</name>
        <t>Careful Resume is allowed to transmit unvalidated packets
       only when the BBR flow is in the Startup state.</t>
        <t>The probing rate is configured to 1/2 of the bottleneck
       bandwidth, derived from the CWND calculation specified in the
       saved CC parameters according to the
       requirements in <xref target="sec-phase-unv-phase"/>.</t>
        <t>The sender starts the Unvalidated Phase at the beginning of a BBR round,
       and sets the "carefully-resuming" flags to True.
       When this "carefully-resuming" flag is set, the BBR congestion
       controller sets the BBR pacing rate
       to the larger of the nominal pacing rate (BBR.bw multiplied bytes
       BBRStartupPacingGain) or the calculated probing rate.
       Then, the CWND is set to the larger of BBR.bw
       and the probing rate, multiplied by BBR.rtt_min times
       BBRStartupCwndGain.</t>
        <t>The "carefully-resuming" flag is reset to False two rounds after it
        is set (i.e., after all the packets sent in the first round of
        "carefully resuming" have been received and acknowledged by the peer).
        At that stage (after the capacity has been validated), the measured
        delivery rate is expected to reflect the probing rate.</t>
        <t>If congestion is detected while the "carefully-resuming" flag
           is True, BBR exits the Startup state
               and enters the Drain state (implementing the Safe Retreat Phase).</t>
      </section>
    
      <section anchor="sec-phase-val-bbr">
        <name>Validation for BBR</name>
        <t>When using BBR, the Validation Phase is realised using the
   BBR rules for exiting Startup. Upon exiting Startup, the connection
   estimates that the measured delivery rate will reflect the flow's share of
   the actual bottleneck bandwidth. If congestion is detected
   while using Careful Resume (i.e, the "carefully-resuming" flag is True),
   BBR then exits the Startup state and enters the Drain state.</t>
      </section>

      <section anchor="sec-BBR-SR">
        <name>Safe Retreat for BBR</name>
        <t>When using BBR, the Safe Retreat Phase is entered if the Drain
   state is entered while the "carefully-resuming" flag (see <xref target="bbr"/>) is still
   True (i.e., if less than 2 full rounds have elapsed after
   the sender entered the Unvalidated Phase). The delivery rates measured in
   these conditions are tainted, because packets sent during the attempt
   are still queued at the bottleneck buffer and could have "pushed out" packets belonging to any
   competing flows. Therefore, any delivery rates measured in the Drain state
   <bcp14>MUST</bcp14> be discarded if the "carefully-resuming" flag is set to True.
   This flag is cleared upon exiting the Drain state.</t>
      </section>
    </section>

    <section anchor="sec-acknowledgments" numbered="false">
      <name>Acknowledgments</name>
      <t>The authors would like to thank <contact fullname="John Border"/>,
      <contact fullname="Gabriel Montenegro"/>, <contact fullname="Patrick
      McManus"/>, <contact fullname="Ian Swett"/>, <contact fullname="Igor
      Lubashev"/>, <contact fullname="Robin Marx"/>, <contact fullname="Roland
      Bless"/>, <contact fullname="Franklin Simo"/>, <contact fullname="Kazuho
      Oku"/>, <contact fullname="Tong"/>, <contact fullname="Ana Custura"/>,
      <contact fullname="Neal Cardwell"/>, <contact fullname="Marten
      Seemann"/>, <contact fullname="Matthias Hofstaetter"/>, <contact
      fullname="Nicolai Fischer"/>, <contact fullname="Yi Huang"/>, <contact
      fullname="Mihail Yanev"/>, and <contact fullname="Joerg Deutschmann"/>
      for their fruitful comments in developing this specification. They also
      thank <contact fullname="Mike Bishop"/> for his careful suggestions on
      the structure to describe the phases.  Thanks also to <contact
      fullname="Mohamed Boucadair"/> and to <contact fullname="Dan Harkins"/>
      for his secdir review.</t>
      <t>The authors would like to thank <contact fullname="Tom Jones"/> for
      co-authoring previous draft versions of this document.</t>
    </section>

</back>

<!-- [rfced] Please review whether any of the notes in this document
should be in the <aside> element. It is defined as "a container for 
content that is semantically less important or tangential to the 
content that surrounds it" (https://authors.ietf.org/en/rfcxml-vocabulary#aside).

For example:
   Note: To simplify the description, these examples are described using
   packet numbers (whereas QLOG variables are expressed in bytes).
-->

<!-- [rfced] Some author comments are present in the XML. Please confirm that
no updates related to these comments are outstanding. Note that the comments
will be deleted prior to publication.
-->


<!-- [rfced] Terminology and abbreviations:

a) We note different uses of the terms below. Please review and let us know
if/how to update these terms for consistency.

Slow-Start
Slow Start
slow start
"slow start" mode

qlog
QLOG

b) Would you like to update instances of "Cubic" to "CUBIC" for consistency
with RFC 9438?

c) We note that abbreviations are introduced for the following two terms. However,
this document switches between using their expanded and abbreviated forms
throughout. For consistency, should expansions of "Careful Resume" and
"Congestion Control" be updated to their respective abbreviations "CR" and
"CC" (after their abbreviations are first introduced)?

d) Where do you prefer to expand "ECN-CE" - upon first use in Section 3.1,
or add it to the list in Section 2.4? 

Original (Section 3.1):
   *  Reconnaissance Phase (Detected congestion): If the sender detects            
      congestion (e.g., packet loss or ECN-CE marking), this indicates ...

Perhaps:
   *  Reconnaissance Phase (Detected congestion): If the sender detects            
      congestion (e.g., packet loss or Explicit Congestion Notification-
      Congestion Experienced (ECN-CE) marking), this indicates ...
-->

<!-- [rfced] Please review the "Inclusive Language" portion of the online 
Style Guide <https://www.rfc-editor.org/styleguide/part2/#inclusive_language>
and let us know if any changes are needed.  Updates of this nature typically
result in more precise language, which is helpful for readers.

For example, please consider whether "traditional" should be updated in the
text below for clarity:

The Safe Retreat reaction differs from a traditional reaction to

Note that while the NIST website 
<https://web.archive.org/web/20250214092458/https://www.nist.gov/nist-research-library/nist-technical-series-publications-author-instructions#table1>
indicates that this term is potentially biased, it is also ambiguous.  
"Tradition" is a subjective term, as it is not the same for everyone. -->

</rfc>
