<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.39 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-nishida-ccwg-standard-cc-analysis-02" category="info" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.17.4 -->
  <front>
    <title abbrev="standard-cc-analysis">Analysis for the Differences Between Standard Congestion Control Schemes</title>
    <seriesInfo name="Internet-Draft" value="draft-nishida-ccwg-standard-cc-analysis-02"/>
    <author initials="Y." surname="Nishida" fullname="Yoshifumi Nishida">
      <organization abbrev="Apple">Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino</city>
          <region>CA</region>
          <code>95014</code>
          <country>USA</country>
        </postal>
        <email>nsd.ietf@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="22"/>
    <area>TSV</area>
    <workgroup>Congestion Control Working Group</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 77?>

<t>The IETF currently has three Standards Track specifications of loss-based congestion control:
Reno-based congestion control for TCP (RFC 5681), its counterpart for QUIC (RFC 9002), and CUBIC
(RFC 9438), which updates RFC 5681. They are intended to follow the same congestion control
principles, but they differ in their mechanisms, parameters, and normative requirements, and these
differences have not been reconciled with each other. This document identifies such differences,
summarizes whether and how each of them is documented in the specifications, and asks the IETF
to determine for each difference whether to work toward convergence or accept it as is.</t>
    </abstract>
  </front>
  <middle>
    <?line 87?>

<section anchor="introduction">
      <name>Introduction</name>
      <t><xref target="RFC5681"/> specifies Reno-based congestion control and it has been referred as
the standard document from IETF that outlines congestion control principle of
the Internet. Since then, IETF has published two more Standards Track congestion control
specifications; <xref target="RFC9002"/> as Reno-based congestion control for QUIC <xref target="RFC9000"/>
and <xref target="RFC9438"/> as CUBIC congestion control, which updates RFC5681.
We believe all transport protocols should share the same congestion control principle
so that they can share network resources mostly fairly. In our study, these specifications
mostly follow the principles described in <xref target="RFC5681"/>, however, there are certain
differences in their schemes, constant values, and normative requirements.</t>
      <t>This document focuses on the congestion control schemes specified in Standards Track RFCs.
Other schemes, such as BBR <xref target="I-D.ietf-ccwg-bbr"/>, which is still under discussion
in the IETF and is intended for Experimental status, are out of scope.</t>
      <t>RFC9438 notes that "it is not obvious" whether CUBIC's differences from previous Standards
Track congestion control go beyond the general principles in <xref target="RFC2914"/>. This
illustrates that there is currently no concrete reference for where the standard congestion
control schemes agree or differ. Some differences are documented in the specifications together
with their rationale, while others are not acknowledged in any of them, such as the differences
in the response to ECN signals and in the normative strength of the same safeguard between
RFC9002 and RFC9438. We believe these differences should
be understood and, where appropriate, resolved, as they affect the consistency of congestion
control across transport protocols and the evaluation of new congestion control algorithms
against the standard ones.</t>
      <t>This document does not provide evaluations of the performance impacts of these differences.
Some differences described in the document might be proved to be negligible in further analysis,
while others may need to be updated to avoid conflicts between the standards.</t>
      <t>This document asks the working group to review the differences summarized in
<xref target="summary-of-differences"/>, and to determine for each of them whether the
specifications should work toward convergence or accept it as is, and if convergence is needed,
in which documents.</t>
    </section>
    <section anchor="analysis-for-differences-between-rfc9002-and-rfc5681">
      <name>Analysis for differences between RFC9002 and RFC5681</name>
      <t>We think there are the following differences between RFC9002 and RFC5681.</t>
      <section anchor="initial-window">
        <name>Initial Window</name>
        <t>RFC5681 specifies the upper bound of Initial Window (IW) in segments, depending on SMSS:
4 segments if SMSS is at most 1095 bytes, 3 segments if SMSS is larger than 1095 bytes and
at most 2190 bytes, and 2 segments otherwise. This is based on <xref target="RFC3390"/>,
which specifies the upper bound as min(4*MSS, max(2*MSS, 4380 bytes)); for the common SMSS of
1460 bytes, both give 3 segments (4380 bytes).</t>
        <t>RFC9002 recommends an IW of 10 times max_datagram_size, limited to the larger of
14720 bytes or twice max_datagram_size, following <xref target="RFC6928"/>. The 14720-byte limit
only takes effect when max_datagram_size exceeds 1472 bytes, so on typical paths the IW is
simply 10 datagrams (e.g., 12000 bytes for 1200-byte datagrams).</t>
        <t><xref target="RFC6928"/> allows TCP to use a similar IW of min(10*MSS, max(2*MSS, 14600 bytes)),
but it is an Experimental specification and is not reflected in RFC5681.</t>
      </section>
      <section anchor="loss-window">
        <name>Loss Window</name>
        <t>RFC5681 specifies Loss Window Size to be 1 segment while RFC9002 uses 2 segments for it.
As Section 4.8 in RFC9002 describes, using 2 segments for Loss Window can reduce the
chance of waiting for a PTO and avoid additional delays caused by delayed ack algorithm. However, this could mean
when an RFC5681 connection and an RFC9002 connection experience a timeout at the same time
(RTO in TCP, persistent congestion in QUIC), the RFC9002
connection can recover congestion window size more than 2 times faster than the RFC5681 connection.
RFC9438 follows RFC5681 in this respect, as it reduces the congestion window in the same way
as RFC5681 upon a timeout (Section 4.8 of RFC9438).</t>
      </section>
      <section anchor="slowstart-threshold-after-packet-loss">
        <name>SlowStart Threshold After Packet loss</name>
        <t>RFC5681 and RFC9438 base the slow-start threshold after packet loss on FlightSize, while
RFC9002 bases it on congestion window.</t>
        <t>In RFC5681, a sender sets the slow-start threshold based on FlightSize, as it requires the
slow-start threshold to be set to no more than max(FlightSize / 2, 2*SMSS) (Section 3.1 of RFC5681).
RFC5681 also states:</t>
        <ul empty="true">
          <li>
            <t>"
 Implementation Note: An easy mistake to make is to simply use cwnd,
 rather than FlightSize, which in some implementations may
 incidentally increase well beyond rwnd.
"</t>
          </li>
        </ul>
        <t>We presume this note stemmed from the fact that there were some implementations
which increment congestion window on every acknowledgment even though receiver's window was
fully subscribed in the past.</t>
        <t>In contrast, RFC9002 requires a sender to set the slow-start threshold to the half value of
the congestion window when packet loss is detected (Section 7.3.2 of RFC9002). RFC9438 sets the
slow-start threshold to FlightSize multiplied by <contact fullname="β" asciiFullname=""/> (0.7) by default, but also allows
to use congestion window instead of FlightSize (Section 4.6 of RFC9438).</t>
        <t>For a sender that fully utilizes its congestion window, FlightSize and congestion window are
nearly equal, and the two give similar results. For a rate-limited sender, however, FlightSize can
be much smaller than congestion window, and RFC9002 sets a higher slow-start threshold than RFC5681.
The safeguard described below prevents congestion window from growing while it is underutilized,
but it does not reduce it. RFC5681 recommends reducing congestion window to the restart window
when the sender has not sent data for longer than the retransmission timeout (Section 4.1 of
RFC5681), while RFC9002 has no such mechanism, so an RFC9002 sender may calculate the slow-start
threshold from a congestion window that was validated long before.</t>
        <t>When congestion window is used as the base, both RFC9002 and RFC9438 rely on a safeguard that
prevents congestion window from growing while it is underutilized, so that the slow-start threshold
is not calculated from a congestion window that has grown larger than the amount of data the
network has actually carried. However, the two specifications describe this safeguard differently:</t>
        <ul spacing="normal">
          <li>Normative strength: RFC9002 recommends not to increase congestion window when it is
underutilized (Section 7.8 of RFC9002), while RFC9438 requires implementations that use congestion
window to prevent it from growing, and requires the same for a QUIC sender using CUBIC
(Section 4.6 of RFC9438).</li>
          <li>Pacing: RFC9002 does not consider congestion window underutilized when sending is pacing
limited (Section 7.8 of RFC9002). RFC9438 has no such exception. Read literally, it would prevent a
paced sender that uses congestion window from growing its congestion window whenever pacing keeps
bytes in flight below congestion window, although this is unlikely to be intended.</li>
          <li>Mechanism: RFC9002 specifies not to increase congestion window, while RFC9438 only specifies
the outcome and leaves the mechanism to implementations. Both allow to use <xref target="RFC7661"/>
as an alternative.</li>
        </ul>
        <t>RFC9438 uses FlightSize by default for QUIC as well as TCP, which shows that QUIC does not
require congestion window here. RFC9002 does not mention that its choice differs from RFC5681.</t>
      </section>
      <section anchor="window-growth-in-slow-start-period">
        <name>Window Growth in Slow Start Period</name>
        <t>In RFC9002, when a sender is in slow start, the congestion window increases by the number
of bytes acknowledged on each acknowledgment segment arrival. On the other hand, RFC5681
increases congestion window by at most 1 full segment. RFC5681 mentions RFC3465 <xref target="RFC3465"/>
which uses similar method to RFC9002, however RFC5681 does not recommend to use it.
In addition, RFC3465 defines the limited factor: L which controls the aggressiveness of
the algorithm. RFC3465 recommends to use L=2. This means it can allow to increase congestion window
by at most 2 full segments. This logic in RFC5681 is overridden by <xref target="RFC9406"/> when hystart++ is activated
in the connection. When hystart++ is enabled, as long as some packet pacing mechanisms are used in the connection,
congestion window can be increased by the amount of acknowledged data in an ACK packet like RFC9002.
However, the increase of congestion window per ACK is limited to 8 SMSS if there is no pacing.
The performance differences in this logic will be more visible in the presence of stretch ACKs.</t>
      </section>
      <section anchor="loss-recovery-algorithm">
        <name>Loss Recovery Algorithm</name>
        <t>The gist of the loss recovery algorithm in RFC5681 is to retransmit all lost segments found
in the previous round trip and once all of them have been acknowledged, it migrates to
Congestion Avoidance from Recovery period. The detailed algorithms are specified in
<xref target="RFC6582"/> and <xref target="RFC6675"/>.</t>
        <t>On the other hand, RFC9002 specifies the ends of Recovery period as when one of any packets
sent during the Recovery period is acknowledged. This means RFC9002 can end Recovery period
even not all lost segments in the previous round trip has been successfully retransmitted.
Moreover, it can end Recovery period even if some segments have been lost during Recovery
period as long as one or more packets have been acknowledged.</t>
        <t>As Section 4.3 of RFC9002 describes, this difference makes RFC9002 respond to repeated losses
more often than RFC5681. Because both reduce their congestion windows only once per recovery
period, RFC9002 reduces its congestion window once for every round trip that experiences loss,
while RFC5681 may reduce it only once across multiple round trips, for example when a segment
is lost multiple times in a row. RFC9002 attributes this difference to the protocol differences
between QUIC and TCP (Section 4.3 of RFC9002).</t>
        <t>Another aspect of the loss recovery in RFC9002 is persistent congestion that
is equivalent to TCP's RTO.
In RFC9002, data sender establishes persistent congestion only when all sent packets
are lost for a long enough duration. This period is equivalent to the duration for
an RTO and two TLPs<xref target="RFC8985"/> in TCP. This will mean RFC9002 reduces congestion window to
minimal value only when there is a extreme severe congestion. On the other hand, RFC5681 has more
chances for RTOs as it gets RTOs when fast retransmission/fast recovery scheme
doesn't work due to insufficient number of acknowledgments.</t>
      </section>
      <section anchor="loss-detection-schemes">
        <name>Loss Detection Schemes</name>
        <t>In RFC9002, in addition to acknowledgment-based loss detection scheme which is also
defined in RFC5681, it specifies another loss detection scheme similar to RACK-TLP<xref target="RFC8985"/>.
Although RACK-TCP is a standard document, RFC5681 has no description for it.</t>
      </section>
      <section anchor="minimal-rto-values">
        <name>Minimal RTO Values</name>
        <t>RFC9002 follows most of the parts of <xref target="RFC6298"/> which defines the standard algorithm of retransmission timer computations and managements for TCP.
However, it does not follow 1 sec for minimal RTO values in RFC6298 as it does not specify minimal RTO. This might not be a major problem because it is known that various TCP implementations already adopt lower values for minimal RTO. In addition, QUIC has more explicit mechanism to identify spurious RTOs than TCP, hence we believe there is no risk for large-scale network issues in this.
However, the impacts for not having minimum RTO is still an important research topic for the performance and efficiency of transport protocols.</t>
      </section>
      <section anchor="ecn-response">
        <name>Response to ECN Congestion Experienced (CE) Signals</name>
        <t>RFC5681 does not itself specify a response to Explicit Congestion Notification; it defers entirely
to <xref target="RFC3168"/>, which requires a TCP sender that receives an ECN-Echo (ECE) ACK to treat it
just as a packet drop, halving cwnd and reducing ssthresh in the same way as on loss. RFC9002 instead
specifies its own response to a CE increase in Section 7.1, and treats it identically to loss throughout
its congestion control state machine: a CE increase causes a sender to exit slow start and enter a
recovery period in the same way as a lost packet (Sections 7.3.1 and 7.3.2 of RFC9002, Figure 1).</t>
        <t>Both RFC3168 and RFC9002 intend that a sender reduce its congestion window at most once per round
trip in response to CE, to avoid reacting multiple times to congestion signals from a single window of
data. However, they specify this intent very differently. RFC9002 makes it part of its normative state
machine: once a recovery period starts, whether from loss or from a CE increase, it suppresses further
reduction from either cause until a packet sent during the recovery period is acknowledged (Section 7.3.2
of RFC9002), and Appendix B of RFC9002 gives this as executable pseudocode. RFC3168 states the same
once-per-window intent only in lower case: "TCP should not react to congestion indications more than once
every window of data" (Section 6.1.2 of RFC3168). RFC9438 relies on this RFC3168 text for CUBIC's response
to ECE and does not restate the rule in its own normative language.</t>
        <t>RFC9438 explicitly requires a CUBIC sender to keep reducing cwnd on each ECE-indicated congestion
event until it reaches a floor of 1 SMSS, and to then fall back on a retransmission timer with exponential
backoff (Section 4.6 of RFC9438). RFC3168 reaches the same floor by a different route: its general rule
reduces cwnd by half at most once per window of data in response to CE (Section 6.1.2 of RFC3168), which
drives cwnd toward 1 MSS under sustained marking, and RFC3168 separately specifies the timer-reset behavior
once cwnd has reached that floor. RFC9002 has no equivalent handoff to a backoff timer: its minimum
congestion window is 2 * max_datagram_size regardless of whether a reduction was caused by loss or a CE
increase, a CE increase by itself never triggers persistent congestion (Section 7.6 of RFC9002), and a
CE-marked ACK is still a received acknowledgment, so it does not arm or back off the probe timeout
described in Section 6.2 of RFC9002 either. Consequently, a sustained CE signal without any packet loss
holds an RFC9002 sender's congestion window at 2 * max_datagram_size indefinitely, with no mechanism to
reduce the sending rate further. RFC9002 also cites <xref target="RFC8311"/>, which permits congestion
responses other than the one specified in RFC3168, so this is not by itself a departure from RFC3168;
however, no document currently reconciles the resulting difference in behavior between RFC9438 and RFC9002
under persistent CE marking without loss.</t>
        <t>None of RFC5681, RFC9002, or RFC9438 discusses how its own response to CE compares with the
other two.</t>
      </section>
    </section>
    <section anchor="analysis-for-differences-between-cubic-and-rfc5681">
      <name>Analysis for differences between CUBIC and RFC5681</name>
      <t>We think the following points in the CUBIC specification can cause differences behavior from RFC5681.</t>
      <section anchor="multiplicative-window-decrease-factor">
        <name>Multiplicative Window Decrease Factor</name>
        <t>The CUBIC specification <xref target="RFC9438"/> uses 0.7 for Multiplicative
Window Decrease factor while RFC5681 uses 0.5.
We think the rationale for using 0.5 in RFC5681 is derived from the following sentences
in <xref target="Jac88"/>, hence we presume using 0.7 instead will not be too aggressive to lead to a
congestion collapse. However, it can still be more aggressive than RFC5681 which may
cause unfair resource sharing.</t>
        <ul empty="true">
          <li>
            <t>"
We usually run our nets with <contact fullname="ρ" asciiFullname=""/> ≤ 0.5 so it’s probable that there are now
exactly two conversations sharing the bandwidth. I.e., you should reduce your window by
half because the bandwidth available to you has been reduced by half. And, if there are
more than two conversations sharing the bandwidth, halving your window is conservative
"</t>
          </li>
        </ul>
        <t>In order to compensate the aggressiveness by using the aggressive decrease factor, CUBIC uses
"Reno-friendly model" which employs slower window growth rate in low BDP environments.
We will discuss the validity of the model in the following section, however, even if
the model is valid, CUBIC can be more aggressive than RFC5681 in some situations.
For example, when there are a congestion that can last several round trips, CUBIC reduces
congestion window by 30% every round trip while RFC5681 reduces it by half.
In this situation, the window decrease rate for CUBIC will be mostly the half of RFC5681's.
In addition, during Recovery period, CUBIC transmits data with 70% of the previous congestion
window size while RFC5681 uses 50% of it.</t>
        <t>Another example is that congestion window size can be much larger than network capacity
during slow start and CUBIC's high decrease factor may have more impacts than RFC5681.
For example, let's say network capacity is 100Mbps and a TCP sender's congestion window
size at a certain round trip allows to transfer data at 99Mbps, which is lower than the
capacity. If this sender is in slow-start, the congestion window size may glow to transfer
data at 198Mbps in the next round trip and can cause many packet losses.
In case of RFC5681, congestion window will be reduced by half in the following round trip
and transfer rate will be 99Mbps. However, in case of CUBIC, the transfer rate will be 138.6Mbps which
still exceeds the network capacity. This would mean CUBIC can saturate network for
two round trips in this example while RFC5681 does only for one round trip. However,
this might be a pathological example since many recent transport stacks support pacing
mechanism and <xref target="HyStart"/> or <xref target="RFC9406"/> to mitigate the overshooting
during slow-start.</t>
      </section>
      <section anchor="reno-friendly-model">
        <name>Reno-friendly Model</name>
        <t>CUBIC employs Reno-friendly model which is designed to be fair to RFC5681 in low
BDP environments. The model in CUBIC is derived from <xref target="FHP00"/> and it is based on
AIMD congestion control as same as RFC5681, but adopts different increase
factor <contact fullname="α" asciiFullname=""/> and multiplicative factor <contact fullname="β" asciiFullname=""/>.
In RFC5681, <contact fullname="α" asciiFullname=""/> is 1.0 and <contact fullname="β" asciiFullname=""/> is 0.5. This means RFC5681 increases
congestion window by about 1 segment per round-trip time when a transport protocol is in
congestion avoidance and reduces congestion window by half when packet losses
are detected. In the meantime, in <xref target="RFC9438"/>, <contact fullname="α" asciiFullname=""/> is around 0.529
and <contact fullname="β" asciiFullname=""/> is 0.7. Hence, CUBIC reduces congestion window less than RFC5681 at
packet loss, but at the same time, it reduces the window growth rate so that
the performance of CUBIC and RFC5681 will be mostly the same.</t>
        <t>We explain the rationale behind the values for <contact fullname="α" asciiFullname=""/> and <contact fullname="β" asciiFullname=""/> for CUBIC
in <xref target="Appendix"/>, but the important point for using these values is that it is based on
the following two presumptions.</t>
        <ul spacing="normal">
          <li>CUBIC connection(s) and Reno connection(s) are sharing the same network resource</li>
          <li>When packet losses happen, both CUBIC connection and Reno connection lost packets at the same time.</li>
        </ul>
        <t>Although the first presumption can be considered as a common situation, the second
presumption will not be a common one as there should be various patterns in packet losses.
Moreover, in this model, CUBIC increases congestion window by 0.529 segments per round-trip time,
which means CUBIC adds one segment to its flight roughly every two round trips while RFC5681
does so every round trip, because a transport protocol usually does not send a segment until
it has at least one full segment space available in congestion window. This makes harder to establish
the second presumption even more.</t>
        <t>This might be a relatively minor point that do not have significant impacts on
overall performance of the model, however, more detailed analysis with realistic
packet dynamics will be desirable.
A recent report on this point shows that the model in CUBIC looks
mostly fair to RFC5681 in low BDP environments <xref target="AIMD-friendliness"/>.</t>
      </section>
    </section>
    <section anchor="summary-of-differences">
      <name>Summary of Differences</name>
      <t><xref target="summary-table"/> summarizes the differences described in this document,
together with where the specifications document them. We ask the working group to determine
for each difference whether the specifications should work toward convergence or accept it as
is. Differences that are not documented in any of the specifications may be unintentional, and
we believe they should be discussed first.</t>
      <table anchor="summary-table">
        <name>Summary of Differences</name>
        <thead>
          <tr>
            <th>#</th>
            <th>Difference</th>
            <th>Section</th>
            <th>Summary</th>
            <th>Documented in</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td>1</td>
            <td>Initial window</td>
            <td><xref target="initial-window" format="counter"/></td>
            <td>2-4 segments (RFC5681) vs 10 datagrams (RFC9002)</td>
            <td>RFC9002, Sec. 7.2, following RFC6928</td>
          </tr>
          <tr>
            <td>2</td>
            <td>Minimum window after timeout</td>
            <td><xref target="loss-window" format="counter"/></td>
            <td>1 segment (RFC5681, RFC9438) vs 2 datagrams (RFC9002)</td>
            <td>RFC9002, Sec. 4.8</td>
          </tr>
          <tr>
            <td>3</td>
            <td>Basis of ssthresh after loss</td>
            <td><xref target="slowstart-threshold-after-packet-loss" format="counter"/></td>
            <td>FlightSize (RFC5681, RFC9438) vs cwnd (RFC9002)</td>
            <td>Not documented</td>
          </tr>
          <tr>
            <td>4</td>
            <td>Safeguard for underutilized cwnd</td>
            <td><xref target="slowstart-threshold-after-packet-loss" format="counter"/></td>
            <td>Recommended (RFC9002) vs required (RFC9438); pacing exception only in RFC9002</td>
            <td>Not documented</td>
          </tr>
          <tr>
            <td>5</td>
            <td>cwnd after an idle period</td>
            <td><xref target="slowstart-threshold-after-packet-loss" format="counter"/></td>
            <td>Restart window (RFC5681) vs no mechanism (RFC9002)</td>
            <td>Not documented</td>
          </tr>
          <tr>
            <td>6</td>
            <td>Slow-start increase per ACK</td>
            <td><xref target="window-growth-in-slow-start-period" format="counter"/></td>
            <td>At most SMSS (RFC5681) vs bytes acknowledged (RFC9002)</td>
            <td>Not documented</td>
          </tr>
          <tr>
            <td>7</td>
            <td>End of recovery period</td>
            <td><xref target="loss-recovery-algorithm" format="counter"/></td>
            <td>Lost segment acknowledged (RFC5681) vs packet sent in recovery acknowledged (RFC9002)</td>
            <td>RFC9002, Sec. 4.3 and 7.3.2</td>
          </tr>
          <tr>
            <td>8</td>
            <td>Congestion window collapse on timeout</td>
            <td><xref target="loss-recovery-algorithm" format="counter"/></td>
            <td>On RTO (RFC5681) vs on persistent congestion (RFC9002)</td>
            <td>RFC9002, Sec. 4.7</td>
          </tr>
          <tr>
            <td>9</td>
            <td>Time-based loss detection</td>
            <td><xref target="loss-detection-schemes" format="counter"/></td>
            <td>Not in RFC5681 (RFC8985 for TCP); threshold 9/8 (RFC9002) vs 5/4 (RFC8985)</td>
            <td>RFC9002, Sec. 6.1 and 6.1.2</td>
          </tr>
          <tr>
            <td>10</td>
            <td>Minimum timeout</td>
            <td><xref target="minimal-rto-values" format="counter"/></td>
            <td>1 second (RFC6298) vs peer's max_ack_delay (RFC9002)</td>
            <td>RFC9002, Sec. 4.7</td>
          </tr>
          <tr>
            <td>11</td>
            <td>Response to ECN-CE</td>
            <td><xref target="ecn-response" format="counter"/></td>
            <td>Once-per-RTT rule informal (RFC3168) vs normative (RFC9002); 1 SMSS then timer backoff (RFC9438) vs 2 datagrams (RFC9002)</td>
            <td>Not documented</td>
          </tr>
          <tr>
            <td>12</td>
            <td>Multiplicative decrease factor</td>
            <td><xref target="multiplicative-window-decrease-factor" format="counter"/></td>
            <td>0.5 (RFC5681) vs 0.7 (RFC9438)</td>
            <td>RFC9438, Sec. 3.4 and 4.6</td>
          </tr>
          <tr>
            <td>13</td>
            <td>Reno-friendly increase factor</td>
            <td><xref target="reno-friendly-model" format="counter"/></td>
            <td>1 (RFC5681) vs about 0.529 (RFC9438)</td>
            <td>RFC9438, Sec. 4.3</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document does not specify any protocol or mechanism. Security considerations will be
discussed in a future version of this document, based on feedback from the working group.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references>
      <name>References</name>
      <references>
        <name>Normative References</name>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="RFC5681">
          <front>
            <title>TCP Congestion Control</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <date month="September" year="2009"/>
            <abstract>
              <t>This document defines TCP's four intertwined congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. In addition, the document specifies how TCP should begin transmission after a relatively long idle period, as well as discussing various acknowledgment generation methods. This document obsoletes RFC 2581. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5681"/>
          <seriesInfo name="DOI" value="10.17487/RFC5681"/>
        </reference>
        <reference anchor="RFC9438">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
      </references>
      <references>
        <name>Informative References</name>
        <reference anchor="RFC2914">
          <front>
            <title>Congestion Control Principles</title>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <date month="September" year="2000"/>
          </front>
          <seriesInfo name="BCP" value="41"/>
          <seriesInfo name="RFC" value="2914"/>
          <seriesInfo name="DOI" value="10.17487/RFC2914"/>
        </reference>
        <reference anchor="I-D.ietf-ccwg-bbr">
          <front>
            <title>BBR Congestion Control</title>
            <author fullname="N. Cardwell" initials="N." role="editor" surname="Cardwell"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <author fullname="J. Beshay" initials="J." role="editor" surname="Beshay"/>
            <date day="6" month="July" year="2026"/>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-ccwg-bbr-06"/>
        </reference>
        <reference anchor="RFC3168">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC8311">
          <front>
            <title>Relaxing Restrictions on Explicit Congestion Notification (ECN) Experimentation</title>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="January" year="2018"/>
          </front>
          <seriesInfo name="RFC" value="8311"/>
          <seriesInfo name="DOI" value="10.17487/RFC8311"/>
        </reference>
        <reference anchor="RFC3390">
          <front>
            <title>Increasing TCP's Initial Window</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="C. Partridge" initials="C." surname="Partridge"/>
            <date month="October" year="2002"/>
          </front>
          <seriesInfo name="RFC" value="3390"/>
          <seriesInfo name="DOI" value="10.17487/RFC3390"/>
        </reference>
        <reference anchor="RFC6928">
          <front>
            <title>Increasing TCP's Initial Window</title>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="M. Mathis" initials="M." surname="Mathis"/>
            <date month="April" year="2013"/>
            <abstract>
              <t>This document proposes an experiment to increase the permitted TCP initial window (IW) from between 2 and 4 segments, as specified in RFC 3390, to 10 segments with a fallback to the existing recommendation when performance issues are detected. It discusses the motivation behind the increase, the advantages and disadvantages of the higher initial window, and presents results from several large-scale experiments showing that the higher initial window improves the overall performance of many web services without resulting in a congestion collapse. The document closes with a discussion of usage and deployment for further experimental purposes recommended by the IETF TCP Maintenance and Minor Extensions (TCPM) working group.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6928"/>
          <seriesInfo name="DOI" value="10.17487/RFC6928"/>
        </reference>
        <reference anchor="RFC3465">
          <front>
            <title>TCP Congestion Control with Appropriate Byte Counting (ABC)</title>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <date month="February" year="2003"/>
            <abstract>
              <t>This document proposes a small modification to the way TCP increases its congestion window. Rather than the traditional method of increasing the congestion window by a constant amount for each arriving acknowledgment, the document suggests basing the increase on the number of previously unacknowledged bytes each ACK covers. This change improves the performance of TCP, as well as closes a security hole TCP receivers can use to induce the sender into increasing the sending rate too rapidly. This memo defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3465"/>
          <seriesInfo name="DOI" value="10.17487/RFC3465"/>
        </reference>
        <reference anchor="RFC6298">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6582">
          <front>
            <title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
            <author fullname="T. Henderson" initials="T." surname="Henderson"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Gurtov" initials="A." surname="Gurtov"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to "partial acknowledgments" (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK. This document describes a specific algorithm for responding to partial acknowledgments, referred to as "NewReno". This response to partial acknowledgments was first proposed by Janey Hoe. This document obsoletes RFC 3782. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6582"/>
          <seriesInfo name="DOI" value="10.17487/RFC6582"/>
        </reference>
        <reference anchor="RFC6675">
          <front>
            <title>A Conservative Loss Recovery Algorithm Based on Selective Acknowledgment (SACK) for TCP</title>
            <author fullname="E. Blanton" initials="E." surname="Blanton"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="L. Wang" initials="L." surname="Wang"/>
            <author fullname="I. Jarvinen" initials="I." surname="Jarvinen"/>
            <author fullname="M. Kojo" initials="M." surname="Kojo"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="August" year="2012"/>
            <abstract>
              <t>This document presents a conservative loss recovery algorithm for TCP that is based on the use of the selective acknowledgment (SACK) TCP option. The algorithm presented in this document conforms to the spirit of the current congestion control specification (RFC 5681), but allows TCP senders to recover more effectively when multiple segments are lost from a single flight of data. This document obsoletes RFC 3517 and describes changes from it. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6675"/>
          <seriesInfo name="DOI" value="10.17487/RFC6675"/>
        </reference>
        <reference anchor="RFC8985">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9406">
          <front>
            <title>HyStart++: Modified Slow Start for TCP</title>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="Y. Huang" initials="Y." surname="Huang"/>
            <author fullname="M. Olson" initials="M." surname="Olson"/>
            <date month="May" year="2023"/>
            <abstract>
              <t>This document describes HyStart++, a simple modification to the slow start phase of congestion control algorithms. Slow start can overshoot the ideal send rate in many cases, causing high packet loss and poor performance. HyStart++ uses increase in round-trip delay as a heuristic to find an exit point before possible overshoot. It also adds a mitigation to prevent jitter from causing premature slow start exit.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9406"/>
          <seriesInfo name="DOI" value="10.17487/RFC9406"/>
        </reference>
        <reference anchor="RFC7661">
          <front>
            <title>Updating TCP to Support Rate-Limited Traffic</title>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <author fullname="A. Sathiaseelan" initials="A." surname="Sathiaseelan"/>
            <author fullname="R. Secchi" initials="R." surname="Secchi"/>
            <date month="October" year="2015"/>
            <abstract>
              <t>This document provides a mechanism to address issues that arise when TCP is used for traffic that exhibits periods where the sending rate is limited by the application rather than the congestion window. It provides an experimental update to TCP that allows a TCP sender to restart quickly following a rate-limited interval. This method is expected to benefit applications that send rate-limited traffic using TCP while also providing an appropriate response if congestion is experienced.</t>
              <t>This document also evaluates the Experimental specification of TCP Congestion Window Validation (CWV) defined in RFC 2861 and concludes that RFC 2861 sought to address important issues but failed to deliver a widely used solution. This document therefore reclassifies the status of RFC 2861 from Experimental to Historic. This document obsoletes RFC 2861.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7661"/>
          <seriesInfo name="DOI" value="10.17487/RFC7661"/>
        </reference>
        <reference anchor="HyStart">
          <front>
            <title>Hybrid Slow Start for High-Bandwidth and Long-Distance Networks</title>
            <author initials="S." surname="Ha">
              <organization/>
            </author>
            <author initials="I." surname="Rhee">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <seriesInfo name="DOI 10.1145/1851182.1851192, International Workshop on Protocols for Fast Long-Distance Networks" value=""/>
        </reference>
        <reference anchor="Jac88" target="https://doi.org/10.1145/52324.52356">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="Computer Communication Review, vol. 18, no. 4, pp. 314-329" value=""/>
          <seriesInfo name="DOI" value="10.1145/52324.52356"/>
        </reference>
        <reference anchor="FHP00" target="https://www.icir.org/tfrc/aimd.pdf">
          <front>
            <title>A Comparison of Equation-Based and AIMD Congestion Control</title>
            <author initials="S." surname="Floyd">
              <organization/>
            </author>
            <author initials="M." surname="Handley">
              <organization/>
            </author>
            <author initials="J." surname="Padhye">
              <organization/>
            </author>
            <date year="2000" month="May"/>
          </front>
        </reference>
        <reference anchor="AIMD-friendliness" target="https://arxiv.org/abs/2305.10581">
          <front>
            <title>Friendliness between AIMD Algorithms</title>
            <author initials="B." surname="Briscoe">
              <organization/>
            </author>
            <author initials="O." surname="Albisser">
              <organization/>
            </author>
            <date year="2023" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.48550/arXiv.2305.10581"/>
        </reference>
      </references>
    </references>
    <?line 319?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>The author would like to thank the members of the CCWG and TCPM working groups for their
feedback.</t>
    </section>
    <section numbered="false" anchor="Appendix">
      <name>Appendix A: Deriving increase factor for CUBIC from AIMD model</name>
      <t>This appendix derives the increase factor <contact fullname="α" asciiFullname=""/> used in the Reno-friendly model of CUBIC
from a simple AIMD model. RFC9438 gives the value of <contact fullname="α" asciiFullname=""/> using the average window formula in
<xref target="FHP00"/> (Section 4.3 of RFC9438). This appendix derives the same value by comparing
the congestion epochs of the two AIMD models, in order to make the assumptions behind the model
explicit. In particular, equation (2) below requires that the two models have the same congestion
epoch, which corresponds to the second presumption discussed in <xref target="reno-friendly-model"/>:
both connections lose packets at the same time.</t>
      <t>We define AIMD(<contact fullname="α" asciiFullname=""/>, <contact fullname="β" asciiFullname=""/>) as AIMD congestion control
that uses an increase parameter <contact fullname="α" asciiFullname=""/> and a decrease parameter <contact fullname="β" asciiFullname=""/>.
Hence, AIMD(1, 0.5) represents congestion control described in RFC5681 while CUBIC
can be expressed as AIMD(<contact fullname="α" asciiFullname=""/>, <contact fullname="β" asciiFullname=""/>) where <contact fullname="β" asciiFullname=""/>=0.7.
We also define Wmax as the congestion window size that can fully utilize network capacity.</t>
      <t>At first, it is clear that <contact fullname="β" asciiFullname=""/>=0.7 is more aggressive than <contact fullname="β" asciiFullname=""/>=0.5
when there is no other traffic.
As cwnd growth is linear, if there's enough long time for the data
transfer, the average congestion window for <contact fullname="β" asciiFullname=""/> =0.5 will be (1.0 + 0.5)/2 = 0.75 Wmax
and it will be (1.0 + 0.7)/2 = 0.85 Wmax for <contact fullname="β" asciiFullname=""/>=0.7.
Hence, it is obvious that this model does not aim for the cases where there's no other traffic.</t>
      <t>The choice of (<contact fullname="α" asciiFullname=""/>, <contact fullname="β" asciiFullname=""/>) for CUBIC is designed to be fair only when it
competes with AIMD(1.0, 0.5). Here, we define W1 as the max window size for AIMD(1.0, 0.5)
and W2 as the max window size for CUBIC's AIMD(<contact fullname="α" asciiFullname=""/>=X,  <contact fullname="β" asciiFullname=""/> =0.7)
when they compete each other. In this situation, AIMD(1.0, 0.5) model oscillates between
0.5 W1 and 1.0 W1 in a congestion epoch. CUBIC's AIMD (<contact fullname="α" asciiFullname=""/>=X,  <contact fullname="β" asciiFullname=""/> =0.7)
model oscillates between 0.7 W2 and 1.0 W2 in the same congestion epoch.
When these two models have the same loss ratio, it should satisfy the following equation (1).</t>
      <artwork><![CDATA[
(1.0 + 0.5) W1 = (1.0 + 0.7) W2   (1)
]]></artwork>
      <t>Also, in one congestion epoch, (<contact fullname="α" asciiFullname=""/>=1.0,  <contact fullname="β" asciiFullname=""/> =0.5) increases congestion window by
0.5 W1 while (<contact fullname="α" asciiFullname=""/>=X,  <contact fullname="β" asciiFullname=""/> =0.7) increases 0.3 W2. The length of congestion epoch
for AIMD(1.0, 0.5) can be expressed as 0.5 W1/1.0 and
it will be expressed as 0.3 W2 /X for AIMD(<contact fullname="α" asciiFullname=""/>=X,  <contact fullname="β" asciiFullname=""/> =0.7).
Because AIMD(1.0, 0.5) and AIMD(<contact fullname="α" asciiFullname=""/>=X,  <contact fullname="β" asciiFullname=""/> =0.7) should have
the same congestion epoch when they compete equally, it should satisfy the following equation (2).</t>
      <artwork><![CDATA[
 0.5 W1 / 1.0  = 0.3 W2 / X   (2)
]]></artwork>
      <t>From equations (1) and (2), we get X=0.529.</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <t>The contents in this documents are the individual contributions from the authors and do not relate
to the authors' positions at their affiliations.</t>
    </section>
  </back>

</rfc>
