<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.20 (Ruby 3.3.5) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

<!ENTITY RFC9000 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY I-D.ietf-moq-transport SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-moq-transport.xml">
<!ENTITY RFC9438 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9438.xml">
<!ENTITY I-D.ietf-ccwg-bbr SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-ccwg-bbr.xml">
<!ENTITY RFC6817 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
<!ENTITY RFC6582 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6582.xml">
<!ENTITY RFC3649 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3649.xml">
<!ENTITY I-D.irtf-iccrg-ledbat-plus-plus SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.irtf-iccrg-ledbat-plus-plus.xml">
<!ENTITY RFC9330 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
<!ENTITY RFC9331 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9331.xml">
<!ENTITY RFC9959 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9959.xml">
<!ENTITY I-D.briscoe-iccrg-prague-congestion-control SYSTEM "https://bib.ietf.org/public/rfc/bibxml3/reference.I-D.briscoe-iccrg-prague-congestion-control.xml">
]>


<rfc ipr="trust200902" docName="draft-huitema-ccwg-c4-design-05" category="info" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="C4 Design">Design of Christian's Congestion Control Code (C4)</title>

    <author initials="C." surname="Huitema" fullname="Christian Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>

    <date year="2026" month="October" day="30"/>

    <area>Web and Internet Transport</area>
    
    <keyword>C4</keyword> <keyword>Congestion Control</keyword> <keyword>Realtime Communication</keyword> <keyword>Media over QUIC</keyword>

    <abstract>


<?line 109?>

<t>Christian's Congestion Control Code is a new congestion control
algorithm designed to support Real-Time applications such as
Media over QUIC. It is designed to drive towards low delays,
with good support for the "application limited" behavior
frequently found when using variable rate encoding, and
with fast reaction to congestion to avoid the "priority
inversion" happening when congestion control overestimates
the available capacity. It pays special attention to the
high jitter conditions encountered in Wi-Fi networks.
The design emphasizes simplicity and
avoids making too many assumption about the "model" of
the network. The main control variables are the estimate
of the data rate and of the maximum path delay in the
absence of queues.</t>



    </abstract>



  </front>

  <middle>


<?line 126?>

<section anchor="introduction"><name>Introduction</name>

<t>Christian's Congestion Control Code (C4) is a new congestion control
algorithm designed to support Real-Time multimedia applications, specifically
multimedia applications using QUIC <xref target="RFC9000"/> and the Media
over QUIC transport <xref target="I-D.ietf-moq-transport"/>. These applications
require low delays, and often exhibit a variable data rate as they
alternate high bandwidth requirements when sending reference frames
and lower bandwith requirements when sending differential frames.
We translate that into 3 main goals:</t>

<t><list style="symbols">
  <t>Drive towards low delays (see <xref target="react-to-delays"/>),</t>
  <t>Support "application limited" behavior (see <xref target="limited"/>),</t>
  <t>React quickly to changing network conditions (see <xref target="congestion"/>).</t>
</list></t>

<t>The design of C4 is inspired by our experience using different
congestion control algorithms for QUIC,
notably Cubic <xref target="RFC9438"/>, Hystart <xref target="HyStart"/>, and BBR <xref target="I-D.ietf-ccwg-bbr"/>,
as well as the study
of delay-oriented algorithms such as TCP Vegas <xref target="TCP-Vegas"/>
and LEDBAT <xref target="RFC6817"/>. In addition, we wanted to keep the algorithm
simple and easy to implement.</t>

<t>C4 assumes that the transport stack is
capable of signaling to the congestion algorithms events such
as acknowledgements, RTT measurements, ECN signals or the detection
of packet losses. It also assumes that the congestion algorithm
controls the transport stack by setting the congestion window
(CWND) and the pacing rate.</t>

<t>C4 tracks the state of the network by keeping a small set of
variables, the main ones being 
the "nominal rate", the "nominal max RTT",
and the current state of the algorithm. The details on using and
tracking the min RTT are discussed in <xref target="react-to-delays"/>.</t>

<t>The nominal rate is the pacing rate corresponding to the most recent
estimate of the bandwidth available to the connection.
The nominal max RTT is the best estimate of the maximum RTT
that can occur on the network in the absence of queues. When we
do not observe delay jitter, this coincides with the min RTT.
In the presence of jitter, it should be the sum of the
min RTT and the maximum jitter. C4 will compute a pacing
rate as the nominal rate multiplied by a coefficient that
depends on the state of the protocol, and set the CWND for
the path to the product of that pacing rate by the max RTT.
The design of these mechanisms is
discussed in <xref target="congestion"/>.</t>

<t>Over time, we updated C4 to:</t>

<t><list style="symbols">
  <t>Focus on the pacing rate as the control variable, and use an estimation of
the largest path RTT to set the CWND, as explained in <xref target="simplify"/></t>
  <t>Improve the handling of congestion response, growth cascade and
careful resume, as explained in <xref target="revision-after-second-design"/></t>
</list></t>

</section>
<section anchor="react-to-delays"><name>Studying the reaction to delays</name>

<t>The current design of C4 is the result of a series of experiments.
Our initial design was to monitor delays and react to
dellay increases in much the same way as
congestion control algorithms like TCP Vegas or LEDBAT:</t>

<t><list style="symbols">
  <t>monitor the current RTT and the min RTT</t>
  <t>if the current RTT sample exceed the min RTT by more than a preset
margin, treat that as a congestion signal.</t>
</list></t>

<t>The "preset margin" is set by default to 10 ms in TCP Vegas and LEDBAT.
That was adequate when these algorithms were designed, but it can be
considered excessive in high speed low latency networks.
For the initial C4 design, we set it to the lowest of 1/8th of the min RTT and 25ms.</t>

<t>The min RTT itself is measured over time. The detection of congestion by comparing
delays to min RTT plus margin works well, except in two conditions:</t>

<t><list style="symbols">
  <t>if the C4 connection is competing with a another connection that
does not react to delay variations, such as a connection using Cubic,</t>
  <t>if the network exhibits a lot of latency jitter, as happens on
some Wi-Fi networks.</t>
</list></t>

<t>We also know that if several connection using delay-based algorithms
compete, the competition is only fair if they all have the same
estimate of the min RTT. We handle that by using a "periodic slow down"
mechanism.</t>

<section anchor="vegas-struggle"><name>Managing Competition with Loss Based Algorithms</name>

<t>Competition between Cubic and a delay based algorithm leads to Cubic
consuming all the bandwidth and the delay based connection starving.
This phenomenon force TCP Vegas to only be deployed in controlled
environments, in which it does not have to compete with
TCP Reno <xref target="RFC6582"/> or Cubic.</t>

<t>We handled this competition issue by using a simple detection algorithm.
If C4 detected competition with a loss based algorithm, it switched
to a "pig war" mode and stopped reacting to changes in delays -- it would
instead only react to packet losses and ECN signals. In that mode,
we used another algorithm to detect when the competition has ceased,
and switch back to the delay responsive mode.</t>

<t>In our initial deployments, we detected competition when delay based
congestion notifications leads to CWND and rate
reduction for more than 3
consecutive RTT. The assumption is that if the competition reacted to delays
variations, it would have reacted to the delay increases before
3 RTT. However, that simple test caused many "false positive"
detections.</t>

<t>We refined this test to start the pig war
if we observed 4 consecutive delay-based rate reductions
and the nominal CWND was less than half the max nominal CWND
observed since the last "initial" phase, or if we observed
at least 5 reductions and the nominal CWND is less than 4/5th of
the max nominal CWND.</t>

<t>We validated this test by comparing the
ratio <spanx style="verb">CWND/MAX_CWND</spanx> for "valid" decisions, when we are simulating
a competition scenario, and "spurious" decisions, when the
"more than 3 consecutive reductions" test fires but we are
not simulating any competition:</t>

<texttable>
      <ttcol align='left'>Ratio CWND/Max</ttcol>
      <ttcol align='left'>valid</ttcol>
      <ttcol align='left'>spurious</ttcol>
      <c>Average</c>
      <c>30%</c>
      <c>75%</c>
      <c>Max</c>
      <c>49%</c>
      <c>100%</c>
      <c>Top 25%</c>
      <c>37%</c>
      <c>91%</c>
      <c>Media</c>
      <c>35%</c>
      <c>83%</c>
      <c>Bottom 25%</c>
      <c>20%</c>
      <c>52%</c>
      <c>Min</c>
      <c>12%</c>
      <c>25%</c>
      <c>&lt;50%</c>
      <c>100%</c>
      <c>20%</c>
</texttable>

<t>Note that this validation was based on simulations, and that we cannot
claim that our simulations perfectly reflect the real world. We will
discuss in <xref target="simplify"/> how this imperfections lead us to use change
our overall design.</t>

<t>Our initial exit competition algorithm was simple. C4 will exit the
"pig war" mode if the available bandwidth increases.</t>

</section>
<section anchor="handling-chaotic-delays"><name>Handling Chaotic Delays</name>

<t>Some Wi-Fi networks exhibit spikes in latency. These spikes are
probably what caused the delay jitter discussed in
<xref target="Cubic-QUIC-Blog"/>. We discussed them in more details in
<xref target="Wi-Fi-Suspension-Blog"/>. We are not sure about the
mechanism behind these spikes, but we have noticed that they
mostly happen when several adjacent Wi-Fi networks are configured
to use the same frequencies and channels. In these configurations,
we expect the hidden node problem to result in some collisions.
The Wi-Fi layer 2 retransmission algorithm takes care of these
losses, but apparently uses an exponential back off algorithm
to space retransmission delays in case of repeated collisions.
When repeated collisions occur, the exponential backoff mechanism
can cause large delays. The Wi-Fi layer 2 algorithm will also
try to maintain delivery order, and subsequent packets will
be queued behind the packet that caused the collisions.</t>

<t>In our initial design, we detected the advent of such "chaotic delay jitter" by computing
a running estimate of the max RTT. We measured the max RTT observed
in each round trip, to obtain the "era max RTT". We then computed
an exponentially averaged "nominal max RTT":</t>

<figure><artwork><![CDATA[
nominal_max_rtt = (7 * nominal_max_rtt + era_max_rtt) / 8;
]]></artwork></figure>

<t>If the nominal max RTT was more than twice the min RTT, we set the
"chaotic jitter" condition. When that condition was set, we stopped
considering excess delay as an indication of congestion,
and we changed
the way we computed the "current CWND" used for the controlled
path. Instead of simply setting it to "nominal CWND", we set it
to a larger value:</t>

<figure><artwork><![CDATA[
target_cwnd = alpha*nominal_cwnd +
              (max_bytes_acked - nominal_cwnd) / 2;
]]></artwork></figure>
<t>In this formula, <spanx style="verb">alpha</spanx> is the amplification coefficient corresponding
to the current state, such as for example 1 if "cruising" or 1.25
if "pushing" (see <xref target="congestion"/>), and <spanx style="verb">max_bytes_acked</spanx> is the largest
amount of bytes in flight that was succesfully acknowledged since
the last initial phase.</t>

<t>The increased <spanx style="verb">target_cwnd</spanx> enabled C4 to keep sending data through
most jitter events. There is of course a risk that this increased
value will cause congestion. We limit that risk by only using half
the value of <spanx style="verb">max_bytes_ack</spanx>, and by the setting a
conservative pacing rate:</t>

<figure><artwork><![CDATA[
target_rate = alpha*nominal_rate;
]]></artwork></figure>
<t>Using the pacing rate that way prevents the larger window to
cause big spikes in traffic.</t>

<t>The network conditions can evolve over time. C4 will keep monitoring
the nominal max RTT, and will reset the "chaotic jitter" condition
if nominal max RTT decreases below a threshold of 1.5 times the
min RTT.</t>

</section>
<section anchor="slowdown"><name>Monitor min RTT</name>

<t>Delay based algorithm rely on a correct estimate of the
min RTT. They will naturally discover a reduction in the min
RTT, but detecting an increase in the max RTT is difficult.
There are known failure modes when multiple delay based
algorithms compete, in particular the "late comer advantage".</t>

<t>In our initial design, the connections ensured that their min RTT is valid by
occasionally entering a "slowdown" period, during which they set
CWND to half the nominal value. This is similar to
the "Probe RTT" mechanism implemented in BBR, or the
"initial and periodic slowdown" proposed as extension
to LEDBAT in <xref target="I-D.irtf-iccrg-ledbat-plus-plus"/>. In our
implementation, the slowdown occurs if more than 5
seconds have elapsed since the previous slowdown, or
since the last time the min RTT was set.</t>

<t>The measurement of min RTT in the period
that follows the slowdown is considered a "clean"
measurement. If two consecutive slowdown periods were
followed by clean measurements larger than the current
min RTT, we detect an RTT change and reset the
connection. If the measurement results in the same
value as the previous min RTT, C4 continue normal
operation.</t>

<t>Some applications exhibit periods of natural slow down. This
is the case for example of multimedia applications, when
they only send differentially encoded frames. Natural
slowdown was detected if an application sent less than
half the nominal CWND during a period, and more than 4 seconds
had elapsed since the previous slowdown or the previous
min RTT update. The measurement that follows a natural
slowdown was also considered a clean measurement.</t>

<t>A slowdown period corresponds to a reduction in offered
traffic. If multiple connections are competing for the same
bottleneck, each of these connections may experience cleaner
RTT measurements, leading to equalization of the min RTT
observed by these connections.</t>

</section>
</section>
<section anchor="simplify"><name>Simplifying the initial design</name>

<t>After extensive testing of our initial design, we felt we had
drifted away from our initial "simplicity" tenet. The algorithms
used to detect "pig war" and "chaotic jitter" were difficult
to tune, and despite our efforts they resulted in many
false positive or false negative. The "slowdown" algorithm
made C4 less friendly to "real time" applications that
prefer using stable estimated rates. These algorithms
interacted with each other in ways that were sometimes
hard to predict.</t>

<section anchor="chaotic-jitter-and-rate-control"><name>Chaotic jitter and rate control</name>

<t>As we observed the chaotic jitter behavior, we came to the
conclusion that only controlling the CWND did not work well.
we had a dilemma: either use a small CWND to guarantee that
RTTs remain small, or use a large CWND so that transmission
would not stall during peaks in jitter. But if we use a large
CWND, we need some form of pacing to prevent senders from
sending a large amount of packets too quickly. And then we
realized that if we do have to set a pacing rate, we can simplify
the algorithm.</t>

<t>Suppose that we compute a pacing rate that matches the network
capacity, just like BBR does. Then, in first approximation, the
setting the CWND too high does not matter too much. 
The number of bytes in flight will be limited by the product
of the pacing rate by the actual RTT. We are thus free to
set the CWND to a large value.</t>

</section>
<section anchor="monitoring-max-rtt"><name>Monitoring the nominal max RTT</name>

<t>The observation on chaotic jitter leads to the idea of monitoring
the maximum RTT. There is some difficulty here, because the
observed RTT has three components:</t>

<t><list style="symbols">
  <t>The minimum RTT in the absence of jitter</t>
  <t>The jitter caused by access networks such as Wi-Fi</t>
  <t>The delays caused by queues in the network</t>
</list></t>

<t>We cannot merely use the maximum value of the observed RTT,
because of the queing delay component. In pushing periods, we
are going to use data rate slightly higher than the measured
value. This will create a bit of queuing, pushing the queing
delay component ever higher -- and eventually resulting in
"buffer bloat".</t>

<t>To avoid that, we can have periodic periods in which the
endpoint sends data at deliberately slower than the
rate estimate. This would enable a "clean" measurement
of the Max RTT.</t>

<t>However, tests showed that only measuring
the Max RTT during recovery periods is not reactive enough.
For example, if the underlying RTT changes, we would need to wait
up to 6 RTT before registering the change. In practice, we can
measure the Max RTT in both the "recovery" and "cruising"
periods, i.e., all the periods in which data is sent at most
at the "nominal data rate".</t>

<t>If we are dealing with jitter, the clean Max RTT measurements
will include whatever jitter was happening at the time of the
measurement. It is not sufficient to measure the Max RTT once,
we must keep the maximum value of a long enough series of measurement
to capture the maximum jitter than the network can cause. But
we are also aware that jitter conditions change over time, so
we have to make sure that if the jitter diminished, the
Max RTT also diminishes.</t>

<t>We solved that by measuring the Max RTT during the "recovery"
periods that follow every "push". These periods occur about every 6 RTT,
giving us reasonably frequent measurements. During these periods, we
try to ensure clean measurements by
setting the pacing rate a bit lower than the nominal rate -- 6.25%
slower in our initial trials. We apply the following algorithm:</t>

<t><list style="symbols">
  <t>compute the <spanx style="verb">max_rtt_sample</spanx> as the maximum RTT observed for
packets sent during the recovery period.</t>
  <t>if the <spanx style="verb">max_rtt_sample</spanx> is more than <spanx style="verb">max_jitter</spanx> above
<spanx style="verb">running_min_rtt</spanx>, reset it to <spanx style="verb">running_min_rtt + max_jitter</spanx>
(by default, <spanx style="verb">max_jitter</spanx> is set to 250ms).</t>
  <t>if <spanx style="verb">max_rtt_sample</spanx> is larger than <spanx style="verb">nominal_max_rtt</spanx>, set
<spanx style="verb">nominal_max_rtt</spanx> to that value.</t>
  <t>else, set <spanx style="verb">nominal_max_rtt</spanx> to:</t>
</list></t>

<figure><artwork><![CDATA[
   nominal_max_rtt = gamma*max_rtt_sample + 
                     (1-gamma)*nominal_max_rtt
]]></artwork></figure>

<t>The <spanx style="verb">gamma</spanx> coefficient is set to <spanx style="verb">1/8</spanx> in our initial trials.</t>

<section anchor="preventing-runaway-max-RTT"><name>Preventing Runaway Max RTT</name>

<t>Computing Max RTT the way we do bears the risk of "run away increase"
of Max RTT:</t>

<t><list style="symbols">
  <t>C4 notices high jitter, increases Nominal Max RTT accordingly, set CWND to the
product of the increased Nominal Max RTT and Nominal Rate</t>
  <t>If Nominal rate is above the actual link rate, C4 will fill the pipe, and create a queue.</t>
  <t>On the next measurement, C4 finds that the max RTT has increased because of the queue,
interprets that as "more jitter", increases Max RTT and fills the queue some more.</t>
  <t>Repeat until the queue become so large that packets are dropped and cause a
congestion event.</t>
</list></t>

<t>Our proposed algorithm limits the Max RTT to at most <spanx style="verb">running_min_rtt + max_jitter</spanx>,
but that is still risky. If congestion causes queues, the running measurements of <spanx style="verb">min RTT</spanx>
will increase, causing the algorithm to allow for corresponding increases in <spanx style="verb">max RTT</spanx>.
This would not happen as fast as without the capping to <spanx style="verb">running_min_rtt + max_jitter</spanx>,
but it would still increase.</t>

</section>
<section anchor="initial-and-max-rtt"><name>Initial Phase and Max RTT</name>

<t>During the initial phase, the nominal max RTT and the running min RTT are
set to the first RTT value that is measured. This is not great in presence
of high jitter, which causes C4 to exit the Initial phase early, leaving
the nominal rate way too low. If C4 is competing on the Wi-Fi link
against another connection, it might remain stalled at this low data rate.</t>

<t>We considered updating the Max RTT during the Initial phase, but that
prevents any detection of delay based congestion. The Initial phase
would continue until path buffers are full, a classic case of buffer
bloat. Instead, we adopted a simple workaround:</t>

<t><list style="symbols">
  <t>Maintain a flag "initial_after_jitter", initialized to 0.</t>
  <t>Get a measure of the max RTT after exit from initial.</t>
  <t>If C4 detects a "high jitter" condition and the
"initial_after_jitter" flag is still 0, set the
flag to 1 and re-enter the "initial" state.</t>
</list></t>

<t>Empirically, we detect high jitter in that case if the "running min RTT"
is less that 2/5th of the "nominal max RTT".</t>

</section>
</section>
<section anchor="monitor-rate"><name>Monitoring the nominal rate</name>

<t>The nominal rate is measured on each acknowledgement by dividing
the number of bytes acknowledged since the packet was sent
by the RTT measured with the acknowledgement of the packet,
protecting against delay jitter as explained in
<xref target="rate-measurement"/>, without additional filtering
as discussed in <xref target="not-filtering"/>.</t>

<t>We only use the measurements to increase the nominal rate,
replacing the current value if we observe a greater filtered measurement.
This is a deliberate choice, as decreases in measurement are ambiguous.
They can result from the application being rate limited, or from
measurement noises. Following those causes random decrease over time,
which can be detrimental for rate limited applications.
If the network conditions have changed, the rate will
be reduced if congestion signals are received, as explained
in <xref target="congestion"/>.</t>

<section anchor="rate-measurement"><name>Rate measurement</name>

<t>The simple algorithm protects from underestimation of the
delay by observing that
delivery rates cannot be larger than the rate at which the
packets were sent, thus keeping the lower of the estimated
receive rate and the send rate.</t>

<t>The algorithm uses four input variables:</t>

<t><list style="symbols">
  <t><spanx style="verb">current_time</spanx>: the time when the acknowledment is received.</t>
  <t><spanx style="verb">send_time</spanx>: the time at which the highest acknowledged
packet was sent.</t>
  <t><spanx style="verb">bytes_acknowledged</spanx>: the number of bytes acknowledged
 by the receiver between <spanx style="verb">send_time</spanx> and <spanx style="verb">current_time</spanx></t>
  <t><spanx style="verb">first_sent</spanx>: the time at which the packet containing
the first acknowledged bytes was sent.</t>
</list></t>

<t>The computation goes as follow:</t>

<figure><artwork><![CDATA[
ack_delay = current_time - send_time
send_delay = send_time - first_sent
measured_rate = bytes_acknowledged /
                max(ack_delay, send_delay)
]]></artwork></figure>

<t>This is in line with the specification of rate measurement
in <xref target="I-D.ietf-ccwg-bbr"/>.</t>

<t>We use the data rate measurement to update the
nominal rate, but only if not congested (see <xref target="congestion-bounce"/>)</t>

<figure><artwork><![CDATA[
if measured_rate > nominal_rate and not congested:
    nominal_rate = measured_rate
]]></artwork></figure>

</section>
<section anchor="congestion-bounce"><name>Avoiding Congestion Bounce</name>

<t>In our early experiments, we observed a "congestion bounce"
that happened as follow:</t>

<t><list style="symbols">
  <t>congestion is detected, the nominal rate is reduced, and
C4 enters recovery.</t>
  <t>packets sent at the data rate that caused the congestion
continue to be acknowledged during recovery.</t>
  <t>if enough packets are acknowledged, they will cause
a rate measurement close to the previous nominal rate.</t>
  <t>if C4 accepts this new nominal rate, the flow will
bounce back to the previous transmission rate, erasing
the effects of the congestion signal.</t>
</list></t>

<t>Since we do not want that to happen, we specify that the
nominal rate cannot be updated during congested periods,
defined as:</t>

<t><list style="symbols">
  <t>C4 is in "recovery" state,</t>
  <t>The recovery state was entered following a congestion signal,
or a congestion signal was received since the beginning
of the recovery era.</t>
</list></t>

</section>
<section anchor="not-filtering"><name>Not filtering the measurements</name>

<t>There is some noise in the measurements of the data rate, and we
protect against that noise by retaining the maximum of the
<spanx style="verb">ack_delay</spanx> and the <spanx style="verb">send_delay</spanx>. During early experiments,
we considered smoothing the measurements for eliminating that
noise.</t>

<t>The best filter that we could defined operated by
smoothing the inverse of the data rate, the "time per byte sent".
This works better because the data rate measurements are the
quotient of the number of bytes received by the delay.
The number of bytes received is
easy to assert, but the measurement of the delays are very noisy.
Instead of trying to average the data rates, we can average
their inverse, i.e., the quotients of the delay by the
bytes received, the times per byte. Then we can obtain
smoothed data rates as the inverse of these times per byte,
effectively computing an harmonic average of measurements
over time. We could for example 
compute an exponentially weighted moving average
of the time per byte, and use the inverse of that
as a filtered measurement of the data rate.</t>

<t>We do not specify any such filter in C4, because while
filtering will reduce the noise, we will also delay
any observation, resulting into a somewhat sluggish
response to change in network conditions. Experience
shows that the precaution of using the max of the
ack delay and the send delay as a divider is sufficient
for stable operation, and does not cause the response
delays that filtering would.</t>

</section>
</section>
<section anchor="early-congestion-modification"><name>Early Congestion Modification</name>

<t>We want C4 to handle Early Congestion Notification in a manner
compatible with the L4S design. For that, we monitor
the evolving ratio of CE marks that the L4S specification
designates as <spanx style="verb">alpha</spanx>
(we use <spanx style="verb">ecn_alpha</spanx> here to avoid confusion),
and we detect congestion if the ratio grows over a threshold.</t>

<t>We did not find a recommended algorithm for computing <spanx style="verb">ecn_alpha</spanx>
in either <xref target="RFC9330"/> or <xref target="RFC9331"/>, but we could get some
concrete suggestions in <xref target="I-D.briscoe-iccrg-prague-congestion-control"/>.
That draft, now obsolete, suggests updating the ratio once per
RTT, as the exponential weighted average of the fraction of
CE marks per packet:</t>

<figure><artwork><![CDATA[
frac = nb_CE / (nb_CE + nb_ECT1)
ecn_alpha += (frac - ecn_alpha)/16
]]></artwork></figure>

<t>This kind of averaging introduces a reaction delay. The draft suggests mitigating that
delay by preempting the averaging if the fraction is large:</t>

<figure><artwork><![CDATA[
if frac > 0.5:
    ecn_alpha = frac
]]></artwork></figure>

<t>We followed that design, but decided to update the coefficient after
each acknowledgement, instead of after each RTT. This is in line with
our implementation of "delayed acknowledgements" in QUIC, which
results in a small number of acknowledgements per RTT.</t>

<t>The reaction of C4 to an excess of CE marks is similar to the
reaction to excess delays or to packet losses, see <xref target="congestion"/>.</t>

</section>
</section>
<section anchor="competition-with-other-algorithms"><name>Competition with other algorithms</name>

<t>We saw in <xref target="vegas-struggle"/> that delay based algorithms required
a special "escape mode" when facing competition from algorithms
like Cubic. Relying on pacing rate and max RTT instead of CWND
and min RTT makes this problem much simpler. The measured max RTT
will naturally increase as algorithms like Cubic cause buffer
bloat and increased queues. Instead of being shut down,
C4 will just keep increasing its max RTT and thus its running
CWND, automatically matching the other algorithm's values.</t>

<t>We verified that behavior in a number of simulations. We also
verified that when the competition ceases, C4 will progressively
drop its nominal max RTT, returning to situations with very low
queuing delays.</t>

<section anchor="no-need-for-slowdowns"><name>No need for slowdowns</name>

<t>The fairness of delay based algorithm depends on all competing
flows having similar estimates of the min RTT. As discussed
in <xref target="slowdown"/>, this ends up creating variants of the
<spanx style="verb">latecomer advantage</spanx> issue, requiring a periodic slowdown
mechanism to ensure that all competing flow have chance to
update the RTT value.</t>

<t>This problem is caused by the default algorithm of setting
min RTT to the minimum of all RTT sample values since the beginning 
of the connection. Flows that started more recently compute
that minimum over a longer period, and thus discover a larger
min RTT than older flows. This problem does not exist with
max RTT, because all competing flows see the same max RTT
value. The slowdown mechanism is thus not necessary.</t>

<t>Removing the need for a slowdown mechanism allows for a
simpler protocol, better suited to real time communications.</t>

</section>
</section>
<section anchor="congestion"><name>React quickly to changing network conditions</name>

<t>Our focus is on maintaining low delays, and thus reacting
quickly to changes in network conditions. We can detect some of these
changes by monitoring the RTT and the data rate, but
experience with the early version of BBR showed that
completely ignoring packet losses can lead to very unfair
competition with Cubic. The L4S effort is promoting the use
of ECN feedback by network elements (see <xref target="RFC9331"/>),
which could well end up detecting congestion and queues
more precisely than the monitoring of end-to-end delays.
C4 will thus detect changing network conditions by monitoring
3 congestion control signals:</t>

<t><list style="numbers" type="1">
  <t>Excessive increase of measured RTT (above the nominal Max RTT),</t>
  <t>Excessive rate of packet losses (but not mere Probe Time Out, see <xref target="no-pto"/>),</t>
  <t>Excessive rate of ECN/CE marks</t>
</list></t>

<t>If any of these signals is detected, C4 enters a "recovery"
state. On entering recovery, C4 reduces the <spanx style="verb">nominal_rate</spanx>
by a factor "beta":</t>

<figure><artwork><![CDATA[
    # on congestion detected:
    nominal_rate = (1-beta)*nominal_rate
]]></artwork></figure>
<t>The cofficient <spanx style="verb">beta</spanx> differs depending on the nature of the congestion
signal. For packet losses, it is set to <spanx style="verb">1/4</spanx>, similar to the
value used in Cubic. For delay based losses, it is proportional to the
difference between the measured RTT and the target RTT divided by
the acceptable margin, capped to <spanx style="verb">1/4</spanx>. If the signal
is an ECN/CE rate, we may
use a proportional reduction coefficient in line with
<xref target="RFC9331"/>, again capped to <spanx style="verb">1/4</spanx>.</t>

<t>During the recovery period, target CWND and pacing rate are set
to a fraction of the "nominal rate" multiplied by the
"nominal max RTT".
The recovery period ends when the first packet
sent after entering recovery is acknowledged. Congestion
signals are processed when entering recovery; further signals
are ignored until the end of recovery.</t>

<t>Network conditions may change for the better or for the worse. Worsening 
is detected through congestion signals, but increases can only be detected
by trying to send more data and checking whether the network accepts it.
Different algorithms have done two ways: pursuing regular increases of
CWND until congestion finally occurs, like for example the "congestion
avoidance" phase of TCP RENO; or periodically probe the network
by sending at a higher rate, like the Probe Bandwidth mechanism of
BBR. C4 adopt the periodic probing approach, in particular
because it is a better fit for variable rate multimedia applications
(see details in <xref target="limited"/>).</t>

<section anchor="no-pto"><name>Do not react to Probe Time Out</name>

<t>QUIC normally detect losses by observing gaps in the sequences of acknowledged
packet. That's a robust signal. QUIC will also inject "Probe time out"
packets if the PTO timeout elapses before the last sent packet has not been acknowledged.
This is not a robust congestion signal, because delay jitter may also cause
PTO timeouts. When testing in "high jitter" conditions, we realized that we should
not change the state of C4 for losses detected solely based on timer, and
only react to those losses that are detected by gaps in acknowledgements.</t>

</section>
<section anchor="rate-update"><name>Update the Nominal Rate after Pushing</name>

<t>C4 configures the transport with a larger rate and CWND
than the nominal CWND during "pushing" periods.
The peer will acknowledge the data sent during these periods in
the round trip that followed.</t>

<t>When we receive an ACK for a newly acknowledged packet,
we update the nominal rate as explained in <xref target="monitor-rate"/>.</t>

<t>This strategy is effectively a form of "make before break".
The pushing
only increase the rate by a fraction of the nominal values,
and only lasts for one round trip. That limited increase is not
expected to increase the size of queues by more than a small
fraction of the bandwidth*delay product. It might cause a
slight increase of the measured RTT for a short period, or
perhaps cause some ECN signaling, but it should not cause packet
losses -- unless competing connections have caused large queues.
If there was no extra
capacity available, C4 does not increase the nominal CWND and
the connection continues with the previous value.</t>

</section>
</section>
<section anchor="fairness"><name>Driving for fairness</name>

<t>Many protocols enforce fairness by tuning their behavior so
that large flows become less aggressive than smaller ones, either
by trying less hard to increase their bandwidth or by reacting
more to congestion events. We considered adopting a similar
strategy for C4.</t>

<t>The aggressiveness of C4 is driven by several considerations:</t>

<t><list style="symbols">
  <t>the frequency of the "pushing" periods,</t>
  <t>the coefficient <spanx style="verb">alpha</spanx> used during pushing,</t>
  <t>the coefficient <spanx style="verb">beta</spanx> used during response to congestion events,</t>
  <t>the delay threshold above a nominal value to detect congestion,</t>
  <t>the ratio of packet losses considered excessive,</t>
  <t>the ratio of ECN marks considered excessive.</t>
</list></t>

<t>We clearly want to have some or all of these parameters depend
on how much resource the flow is using.
There are know limits to these strategies. For example,
consider TCP Reno, in which the growth rate of CWND during the
"congestion avoidance" phase" is inversely proportional to its size.
This drives very good long term fairness, but in practice
it prevents TCP Reno from operating well on high speed or
high delay connections, as discussed in the "problem description"
section of <xref target="RFC3649"/>. In that RFC, Sally Floyd was proposing
using a growth rate inversely proportional to the
logarithm of the CWND, which would not be so drastic.</t>

<t>In the initial design, we proposed making the frequency of the
pushing periods inversely proportional to the logarithm of the
CWND, but that gets in tension with our estimation of
the max RTT, which requires frequent "recovery" periods.
We would not want the Max RTT estimate to work less well for
high speed connections! We solved the tension in favor of
reliable max RTT estimates, and fixed to 4 the number
of Cruising periods between Recovery and Pushing. The whole
cycle takes about 6 RTT.</t>

<t>We also reduced the default rate increase during Pushing to
6.25%, which means that the default cycle is more on less on
par with the aggressiveness of RENO when
operating at low bandwidth (lower than 34 Mbps).</t>

<section anchor="absence-of-constraints-is-unfair"><name>Absence of constraints is unfair</name>

<t>Once we fixed the push frequency and the default increase rate, we were
left with responses that were mostly proportional to the amount
of resource used by a connection. Such design makes the resource sharing
very dependent on initial conditions. We saw simulations where
after some initial period, one of two competing connections on
a 20 Mbps path might settle at a 15 Mbps rate and the other at 5 Mbps.
Both connections would react to a congestion event by dropping
their bandwidth by 25%, to 15 or 3.75 Mbps. And then once the condition
eased, both would increase their data rate by the same amount. If
everything went well the two connection will share the bandwidth
without exceeding it, and the situation would be very stable --
but also very much unfair.</t>

<t>We also had some simulations in which a first connection will
grab all the available bandwidth, and a late comer connection
would struggle to get any bandwidth at all. The analysis 
showed that the second connection was
exiting the initial phase early, after encountering either
excess delay or excess packet loss. The first
connection was saturating the path, any additional traffic
did cause queuing or losses, and the second connection had
no chance to grow.</t>

<t>This "second comer shut down" effect happened particularly often
on high jitter links. The established connections had tuned their
timers or congestion window to account for the high jitter. The
second connection was basing their timers on their first
measurements, before any of the big jitter events had occured.
This caused an imbalance between the first connection, which
expected large RTT variations, and the second, which did not
expect them yet.</t>

<t>These shutdown effects happened in simulations with the first
connection using either Cubic, BBR or C4. We had to design a response,
and we first turned to making the response to excess delay or
packet loss a function of the data rate of the flow.</t>

</section>
<section anchor="sensitivity-curve"><name>Introducing a sensitivity curve</name>

<t>In our second design, we attempted to fix the unfairness and
shutdowns effect by introducing a sensitivity curve,
computing a "sensitivity" as a function of the flow data
rate. Our first implementation is simple:</t>

<t><list style="symbols">
  <t>set sensitivity to 0 if data rate is lower than 50000B/s</t>
  <t>linear interpolation between 0 and 0.92 for values
between 50,000 and 1,000,000B/s.</t>
  <t>linear interpolation between 0.92 and 1 for values
between 1,000,000 and 10,000,000B/s.</t>
  <t>set sensitivity to 1 if data rate is higher than
10,000,000B/s</t>
</list></t>

<t>The sensitivity index is then used to set the value of delay and
loss thresholds. For the delay threshold, the rule is:</t>

<figure><artwork><![CDATA[
    delay_fraction = 1/16 + (1 - sensitivity)*3/16
    delay_threshold = min(25ms, delay_fraction*nominal_max_rtt)
]]></artwork></figure>

<t>For the loss threshold, the rule is:</t>

<figure><artwork><![CDATA[
loss_threshold = 0.02 + 0.50 * (1-sensitivity);
]]></artwork></figure>

<t>For the CE mark threshold, the rule is:</t>

<figure><artwork><![CDATA[
loss_threshold = 1/32 + 1/32 * (1-sensitivity);
]]></artwork></figure>

<t>This very simple change allowed us to stabilize the results. In our
competition tests we see sharing of resource almost equitably between
C4 connections, and reasonably between C4 and Cubic or C4 and BBR.
We do not observe the shutdown effects that we saw before.</t>

<t>There is no doubt that the current curve will have to be refined. We have
a couple of such tests in our test suite with total capacity higher than
20Mbps, and for those tests the dependency on initial conditions remain.
We will revisit the definition of the curve, probably to have the sensitivity
follow the logarithm of data rate.</t>

</section>
<section anchor="cascade"><name>Cascade of Increases</name>

<t>We sometimes encounter networks in which the available bandwidth changes rapidly.
For example, when a competing connection stops, the available capacity may double.
With low Earth orbit satellite constellations (LEO), it appears
that ground stations constantly check availability of nearby satellites, and
switch to a different satellite every 10 or 15 seconds depending on the
constellation (see <xref target="ICCRG-LEO"/>), with the bandwidth jumping from 10Mbps to
65Mbps.</t>

<t>Because we aim for fairness with RENO or Cubic, the cycle of recovery, cruising
and pushing will only result in slow increases increases, maybe 6.25% after 6 RTT.
This means we would only double the bandwidth after about 68 RTT, or increase
from 10 to 65 Mbps after 185 RTT -- by which time the LEO station might
have connected to a different orbiting satellite. To go faster, we implement
a "cascade": if the previous pushes at 6.25% was successful, the next
pushing will use 25% (see <xref target="variable-pushing"/>), or an intermediate
value if the observed ratio of ECN marks is greater than 0. If three successive pushes
all result in increases of the
nominal rate, C4 will reenter the "startup" mode, during which each RTT
can result in a 100% increase of rate and CWND.</t>

</section>
</section>
<section anchor="limited"><name>Supporting Application Limited Connections</name>

<t>C4 is specially designed to support multimedia applications,
which very often operate in application limited mode.
After testing and simulations of application limited applications,
we incorporated a number of features.</t>

<t>The first feature is the design decision to only lower the nominal
rate if congestion is detected. This is in contrast with the BBR design,
in which the estimate of bottleneck bandwidth is also lowered
if the bandwidth measured after a "probe bandwidth" attempt is
lower than the current estimate while the connection was not
"application limited". We found that detection of the application
limited state was somewhat error prone. Occasional errors end up
with a spurious reduction of the estimate of the bottleneck bandwidth.
These errors can accumulate over time, causing the bandwidth
estimate to "drift down", and the multimedia experience to suffer.
Our strategy of only reducing the nominal values in
reaction to congestion notifications much reduces that risk.</t>

<t>The second feature is the "make before break" nature of the rate
updates discussed in <xref target="rate-update"/>. This reduces the risk
of using rates that are too large and would cause queues or losses,
and thus makes C4 a good choice for multimedia applications.</t>

<t>C4 adds two more features to handle multimedia
applications well: coordinated pushing (see <xref target="coordinated-pushing"/>),
and variable pushing rate (see <xref target="variable-pushing"/>).</t>

<section anchor="coordinated-pushing"><name>Coordinated Pushing</name>

<t>As stated in <xref target="fairness"/>, the connection will remain in "cruising"
state for a specified interval, and then move to "pushing". This works well
when the connection is almost saturating the network path, but not so
well for a media application that uses little bandwidth most of the
time, and only needs more bandwidth when it is refreshing the state
of the media encoders and sending new "reference" frames. If that
happens, pushing will only be effective if the pushing interval
coincides with the sending of these reference frames. If pushing
happens during an application limited period, there will be no data to
push with and thus no chance of increasing the nominal rate and CWND.
If the reference frames are sent outside of a pushing interval, the
rate and CWND will be kept at the nominal value.</t>

<t>To break that issue, one could imagine sending "filler" traffic during
the pushing periods. We tried that in simulations, and the drawback became
obvious. The filler traffic would sometimes cause queues and packet
losses, which degrade the quality of the multimedia experience.
We could reduce this risk of packet losses by sending redundant traffic,
for example creating the additional traffic using a forward error
correction (FEC) algorithm, so that individual packet losses are
immediately corrected. However, this is complicated, and FEC does
not always protect against long batches of losses.</t>

<t>C4 uses a simpler solution. If the time has come to enter pushing, it
will check whether the connection is "application limited", which is
simply defined as testing whether the application send a "nominal CWND"
worth of data during the previous interval. If it is, C4 will remain
in cruising state until the application finally sends more data, and
will only enter the the pushing state when the last period was
not application limited.</t>

</section>
<section anchor="variable-pushing"><name>Variable Pushing Rate</name>

<t>C4 tests for available bandwidth at regular pushing intervals
(see <xref target="fairness"/>), during which the rate and CWND is set at 25% more
than the nominal values. This mimics what BBR
is doing, but may be less than ideal for real time applications.
When in pushing state, the application is allowed to send
more data than the nominal CWND, which causes temporary queues
and degrades the experience somewhat. On the other hand, not pushing
at all would not be a good option, because the connection could
end up stuck using only a fraction of the available
capacity. We thus have to find a compromise between operating at
low capacity and risking building queues.</t>

<t>We manage that compromise by adopting a variable pushing rate:</t>

<t><list style="symbols">
  <t>If pushing at 25% did not result in a significant increase of
the nominal rate, the next pushing will happen at 6.25%</t>
  <t>If pushing at 6.25% did result in some increase of the nominal CWIN,
the next pushing will happen at 25%, otherwise it will
remain at 6.25%</t>
</list></t>

<t>If the observed ratio of ECN-CE marks is greater than zero, we will
use it to modulate the amount of pushing. We leave the pushing rate
at 6.25% if the previous pushing attempt was not successful, but
otherwise we pick a value intermediate between 25% (if 0 ECN marks)
and 6.25% (if the ratio of ECN marks approaches the threshold).</t>

<t>As explained in <xref target="cascade"/>, if three consecutive pushing attempts
result in significant increases, C4 detects that the underlying network
conditions have changed, and will reenter the startup state.</t>

<t>The "significant increase" mentioned above is a matter of debate.
Even if capacity is available,
increasing the send rate by 25% does not always result in a 25%
increase of the acknowledged rate. Delay jitter, for example,
may result in lower measurement. We initially computed the threshold
for detecting "significant" increase as 1/2 of the increase in
the sending rate, but multiple simulation shows that was too high
and caused lower performance. We now set that threshold to 1/4 of the
increase in the sending rate.</t>

</section>
<section anchor="pushing-rate-and-cascades"><name>Pushing rate and Cascades</name>

<t>The choice of a 25% push rate was motivated by discussions of
BBR design. Pushing has two parallel functions: discover the available
capacity, if any; and also, push back against other connections
in case of competition. Consider for example competition with Cubic.
The Cubic connection will only back off if it observes packet losses,
which typically happen when the bottleneck buffers are full. Pushing
at a high rate increases the chance of building queues,
overfilling the buffers, causing losses, and thus causing Cubic to back off.
Pushing at a lower rate like 6.25% would not have that effect, and C4
would keep using a lower share of the network. This is why we will always
pushed at 25% in the "pig war" mode.</t>

<t>The computation of the interval between pushes is tied to the need to
compete nicely, and follows the general idea that
the average growth rate should mimic that of RENO or Cubic in the
same circumstances. If we pick a lower push rate, such as 6.25% or
maybe 12.5%, we might be able to use shorter intervals. This could be
a nice compromise: in normal operation, push frequently, but at a
low rate. This would not create large queues or disturb competing
connections, but it will let C4 discover capacity more quickly. Then,
we could use the "cascade" algorithm to push at a higher rate,
and then maybe switch to startup mode if a lot of capacity is
available. This is something that we intend to test, but have not
implemented yet.</t>

</section>
<section anchor="adaptation-to-ecnl4s"><name>Adaptation to ECN/L4S</name>

<t>Tests with L4S active queue management showed the tension between the
periodic updates and L4S goal to minimize queue sizes. Typical L4S deployment
start marking packets with ECN/CE when the queue size is about 1.5ms, and
increase the mark rate progressively as the queue size increases,
reaching 100% when the queue size is about 2ms. If C4 pushes at 25% every 6 RTT,
and if the bandwidth estimate is accurate,
the queue size will increase by 25% of the RTT during the first roundtrip,
before any correction signal can be applied. The increased marking
rate will affect all connections sharing the bottleneck, which is
not desirable.</t>

<t>L4S is tuned for the "Prague" algorithm, which increases CWIN by one packet every
RTT. In a typical trial with a 20ms RTT and a 100 Mbps data rate, it takes 0.12ms
to send a packet, and thus 12.5 RTT before building a queue of 1.5ms. In the same
conditions, C4 would have increased the rate by 25% after 6 RTT in the
aggressive scenario, thus triggering a high rate of marking.</t>

<t>The cascade process made the problem even worse. If a push at 6.25% does increase
the nominal rate, the next push will be at 25%. If that push and the next one
did increase the nominal rate, C4 will reenter the initial phase, even if some
of the pushes did cause ECN/CE marks. The initial phase will then cause a lot
of packet losses, which will degrade performance.</t>

<t>To mitigate this issue, we had to add a "very low" pushing mode, setting the
pushing rate to only 3.125% if the previous push resulted in a high rate of ECN/CE marks.
We also replaced the somewhat adhoc "count of successive probes" by the management
of a "probe level", defining 4 levels:</t>

<t><list style="symbols">
  <t>level 0: pushing at 3.125%, spend 1 cycle in cruising before pushing.</t>
  <t>level 1: pushing at 6.25%, spend 4 cycles in cruising before pushing.</t>
  <t>level 2: pushing at 25%, spend at most 1 cycle in cruising before pushing.</t>
  <t>level 3: pushing at 25%, spend at most 1 cycle in cruising before pushing.</t>
</list></t>

<t>The "probe level" is updated after the recovery phase as follow:</t>

<t><list style="symbols">
  <t>if the previous probe was successful and did not result in a high rate of ECN/CE marks,
increase the probe level by 1. If the probe level was already at 3, reenter the startup phase.</t>
  <t>if the previous probe was successful but did result in a high rate of ECN/CE marks,
remain at the same probe level.</t>
  <t>if the previous probe was not successful but did not result in a high rate of ECN/CE marks,
stay at probe level 0 if already at that level, otherwise move back to probe level 1.</t>
  <t>if the previous probe was not successful and did result in a high rate of ECN/CE marks,
move to probe level 0.</t>
</list></t>

<t>This logic treats the CE marking differently from other congestion signals, because
the CE marks are an intentional indication of congestion by the network, and is thus
less ambiguous than delay increases or packet losses, which can be caused by other
factors such as delay jitter or random transmission issues. Simulations show that
this logic allows to quickly discover the available capacity in L4S networks, whithout spuriously
reentering the startup phase and causing packet losses. It is equivalent to the
previous logic when the network does not support L4S.</t>

</section>
</section>
<section anchor="revisiting-the-initial-phase"><name>Revisiting the Initial Phase</name>

<t>Our November 2025 design of C4 included a "rate based"
initial phase, during which C4 will send at twice the "nominal rate",
monitor acknowledgments and increase the nominal rate if measurements
increase, and exit if congestion is detected or if the measurements
do not increase for 3 consecutive RTT. That algorithm works
well in most scenario, but we were observing early exits in
"high delay jitter" scenarios, such as Wi-Fi networks with lots of
packet collisions.</t>

<t>After observing that phenomenon, we realized that the
rate based algorithm was failing in case of high delay jitter
because it was setting the CWND to the product of pacing rate
and the "nominal" max RTT. The nominal Max RTT was set to a fixed
value, observed either before the initial phase or on the first
roundtrip in that phase. It would work if the initial phase
started during a high jitter event and the initial RTT was large
enough, but in many case it was not and became a limiting
factor.</t>

<section anchor="why-not-increasing-max-rtt-during-initial-phase"><name>Why not increasing Max RTT during Initial phase?</name>

<t>In the initial phase, the algorithm tries to discover the bandwidth
and does not yet have a good estimate of delay jitter, which typically
requires a series of measurements. In these conditions, it is
easy to underestimate the max RTT. On the other hand, the flow is
deliberately probing at a high data rate. If the algorithm
allows updates of max RTT during that phase, the risks of
spiraling into buffer boat are very high, but if the CWND
remains too low, the risk of exiting startup with a severely
underestimated data rate is also very high.</t>

<t>We tried to develop simple rules to classify the delay measurements
between caused by jitter, and caused by congestion. If we could do that,
we would be able to increase the max RTT safely, when appropriate.
However, we could not find variables that were both easy to monitor
and well correlated with the actual cause of the delay.</t>

</section>
<section anchor="building-a-robust-initial-estimator"><name>Building a robust initial estimator</name>

<t>The "rate based" initial estimator requires estimating both the
data rate and the max RTT simultaneously. In contrast, the "CWND based"
initial estimator use in algorithms like Reno or Cubic
only requires estimating the CWND, plus a possibly
loose estimate of the data rate. The Reno algorithm is remarkably
simple: just increase the CWND by the number of bytes acknowledged,
without any explicit dependency on the measured latency.</t>

<t>The Reno algorithm terminates when packet losses are observed,
leading to bufferbloat. Hystart improves that by terminating when
the measured delays start increasing, but this can lead to early
exit in case of delay jitter. The rate based algorithm terminate when
the measured bandwidth stops growing, which provides good
results. Our proposal is to combine a Reno like growth of the
CWND with a rate-control like exit condition.</t>

<t>Of course, things are not that simple. The "rate" test only stops the
growth of the CWND after the third "non growing" round. If CWND doubles
after each round it becomes excessive, buffers fill up, and lots
of packets are lost. We dealt with that problem by essentially
freezing the increases of the CWND after the first "non growing" round.
If a larger measurement happens before 3 RTT, the increases
resume, otherwise, C4 exits the initial phase.</t>

<t>When the initial phase completes, we retain as estimate of the
data rate the highest value measured so far.
We also want to obtain a reasonable estimate of the "max RTT".
In the Reno logic, the "ssthresh" is set to half the CWND
value before congestion is detected. C4 will not use the
ssthresh variable after exiting the Initial phase, but it
can set the max RTT to the quotient of ssthresh by the
final rate estimate.</t>

</section>
</section>
<section anchor="revision-after-second-design"><name>Revision after the second design</name>

<t>The first design, presented to the IETF in March 2026, was showing some good
promises, but it needed some extra work. we have been able to develop and test
three significant improvements: better reaction to a drop in path bandwidth,
resolving the issues with the cascade design, and improve the handling
of the "careful resume" scenario in the initial phase.</t>

<section anchor="reaction-to-a-drop-in-path-bandwidth"><name>Reaction to a drop in path bandwidth</name>

<t>In some scenarios, the bandwidth of a path may suddenly drop. 
This will normally cause congestion events such as packet losses or ECN marks,
and C4 will react by reducing the nominal rate by the specified "beta" coefficient.
However, while these reductions in bandwidth are adequate for the small decreases
due to increased competition, they are not sufficient for the large drops.
Such large drops can happen after routing events. In satellite
based network, this happens if the connection switches to a different satellite.</t>

<t>Simulation showed that in the large drop scenario C4 reacted by a series of
small reductions until finally matching the available bandwidth. This means
operating for a long period in conditions of congestion, with large queues
and packet losses. We solved that problem by detecting the persistence of
condition and reacting forcefully to sustained congestion.</t>

<t>We improved C4 by monitoring the number of "recent congestions". If C4
observes more than 2 successive congestion events it will drop the nominal
rate to the value of the "recent maximum rate", which hopefull reflects the
new path bandwidth.</t>

<t>This change resulted in a significant improvement in the performance measured
in simulations of path bandwidth reductions.</t>

</section>
<section anchor="two-steps-cascade-or-continuous-push"><name>Two steps cascade or continuous push</name>

<t>When C4 engages in pushing, we see a clear difference in the amount of
data in flight, between the consecutive cruising, pushing and recovery phase,
as shown on the conceptual figure below:</t>

<figure><artwork><![CDATA[
 ^
B|              :         :
y|              :         *
t|              :        *:*
e|              :       * : *
s|              :      *  :  *
 |              :     *   :   *
i|              :    *    :    *                     
n|              :   *     :     *
 |              :  *      :      *
f|              : *       :       *
l|              :*        :        *
i|    ...********         :         *...
g|              :         :              
h|    cruising  : pushing : recovery
t|              :         :
 +---------------------------------------->
                                      time
]]></artwork></figure>

<t>Before entering the pushing phase, C4 is sending at the nominal rate, and
the bytes in transit are proportional to the product of the nominal rate by
the RTT. The sending rate increases during the pushing phase, until reaching
the product of the pushing rate by the RTT. During the recovery period, the
bytes in transit decrease, and by the end of that period they should
be equal to the nominal rate times the RTT.</t>

<t>The pushing period ends when the first packet sent during "pushing" is
acknowledged. The recovery period ends when the last packet sent during the
pushing period is acknowledged. The rate measurements during the recovery period
correspond to the transmission during the the pushing period.</t>

<section anchor="two-steps-cascade"><name>Two steps cascade</name>

<t>If the highest rate measured during the recovery period is higher than the
nominal rate, C4 assesses that the pushing was successful, which indicates
that the previous nominal rate was smaller than the path capacity, possibly
because the path capacity increased. We use these measurements to tune the
rate at which C4 is pushing.</t>

<t>By default, C4 tries small rate increases during pushes, 6.25% by default
or 3.25% if the path is providing ECN feedback. If the pushing detects
available capacity, C4 may try larger increases, such as 25%, 50%, 100%
or even 200%, inorder to quickly adapt to the new path capacity. However,
trying larger increases has a risk: if the increased rate exceeds the
path capacity, queues will build, and packets may well be lost. C4
attempts to find the right push level by assessing the result of
the previous push at the end of the recovery phase:</t>

<t><list style="symbols">
  <t>if the new rate measurement grew by less than 25% of the rate increase,
C4 will reset the pushing rate to its default value.</t>
  <t>if the rate measurement grew by at least 75% of the rate increase, C4
will start pushing at the next level.</t>
  <t>if the rate measurement is intermediate, C4 might keep the increase
rate unchanged, or might decide to only push at a lower level.</t>
</list></t>

<t>In short, the two step process allows C4 to perform a "cautious cascade",
increasing the push level fast enough to adapt quickly, but backing off
as soon as the path appears saturated.</t>

</section>
<section anchor="finding-out-why-the-cascade-does-not-work"><name>Finding out why the cascade does not work.</name>

<t>We need to program the different levels of the cascade. We know that we
should not set the first level too large, because adopting a large value
causes the queue size and the RTT to periodically increase. Our philosophy
is to use a small increase, like 6.25%, that causes minimal disruption.
This allows C4 to start pushing frequently, and thus reduce the delay
needed to detect a change in bandwidth.</t>

<t>We have also observed that increasing too fast may cause queues and losses.
The whole point of the two step approach is to proceed cautiously and always
test the result of the previous increase before increasing the push rate.
In practice, this means limiting the largest levels to 100% increase, on par
with slow start.</t>

<t>This leaves a choice for the second level of the cascade. We tried two
values: 25%, similar to the BBR push rate; 50%, twice that rate, since we
are twice more cautious. (We could have tried 56.25%, equivalent to 2
BBR rounds at 25%). The following table compares the increments applied
by BBR after each successive RTT and the multiplier from the original
rate. BBR increases by 25% after each RTT, but that C4 only
increases the data rate every other RTT. The cascade helps, and once
C4 starts increasing at 100% per period, it does catch up. However,
BBR will be more aggressive for the first rounds.</t>

<texttable>
      <ttcol align='right'>Nb rounds</ttcol>
      <ttcol align='right'>BBR-INC</ttcol>
      <ttcol align='right'>C4-25-INC</ttcol>
      <ttcol align='right'>C4-50-INC</ttcol>
      <ttcol align='right'>BBR-BW</ttcol>
      <ttcol align='right'>C4-25-BW</ttcol>
      <ttcol align='right'>C4-50-BW</ttcol>
      <c>0</c>
      <c>0</c>
      <c>0</c>
      <c>0</c>
      <c>1</c>
      <c>1</c>
      <c>1</c>
      <c>1</c>
      <c>25%</c>
      <c>6.25%</c>
      <c>6.25%</c>
      <c>1.25</c>
      <c>1.06</c>
      <c>1.06</c>
      <c>2</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>1.56</c>
      <c>1.00</c>
      <c>1</c>
      <c>3</c>
      <c>25%</c>
      <c>25%</c>
      <c>50%</c>
      <c>1.95</c>
      <c>1.33</c>
      <c>1.59</c>
      <c>4</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>2.44</c>
      <c>1.06</c>
      <c>1.06</c>
      <c>5</c>
      <c>25%</c>
      <c>100%</c>
      <c>100%</c>
      <c>3.05</c>
      <c>2.66</c>
      <c>3.19</c>
      <c>6</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>3.81</c>
      <c>1.33</c>
      <c>1.59</c>
      <c>7</c>
      <c>25%</c>
      <c>100%</c>
      <c>100%</c>
      <c>4.77</c>
      <c>5.31</c>
      <c>6.38</c>
      <c>8</c>
      <c>25%</c>
      <c>0%</c>
      <c>0%</c>
      <c>5.96</c>
      <c>2.66</c>
      <c>3.19</c>
</texttable>

<t>The BBR probe BW or the BBR cascade stop when the measured rate
stops increasing. The main advantage of the two steps approach is
to reduce the amount of queuing when that happens. However,
if the cascade starts using large increments, the benefits over
BBR's continous approach are not obvious. The BBR algorithm is
continuous, and when it stops, the probe bandwidth always
exceed the nominal bandwidth by just 25%. The C4 algorithm is
not continuous. If it stops during the first RTT, the excess bandwidth
will be at most 6.125% of the available bandwidth, but up to 25% if it stops
in the second RTT and up to 100% later. In short, the cautious
approach pays off during the initial "6%" probing stage, grows
slower than BBr after that, and also produces larger queues. In short,
we have a bug.</t>

</section>
<section anchor="addind-a-pushing-state"><name>Addind a Pushing state</name>

<t>We can capture the lessons of the previous analysis by splitting
the "pushing" state in two:</t>

<t><list style="symbols">
  <t>A "probing" state executed frequently, with a low 6.125% probing
margin.</t>
  <t>A "pushing" state similar to the "probe-BW" state of BBR, pushing
at 25%, remaining in the same state until the measurements
stop increasing.</t>
</list></t>

</section>
<section anchor="keeping-probing-and-pushing-as-separate-state"><name>Keeping Probing and Pushing as separate state</name>

<t>The design recomended in this section separates the Probing and Pushing states.
We considered simplifying the design and merging the two states, and tried
that in an experiment: just enter the pushing state and use the 6.125% increase
for the first RTT, and then switch to 25% as soon as a measurement shows an increase
in rate.</t>

<t>The results were mixed. One test out of 22 did improve significantly, i.e.,
competition with a BBR connection that starts after the C4 connection, showing performance
more than 20% better than the previous version. This is probably because the merging
of the two states makes C4 more aggressive. However, several other tests showed regressions,
including the "drop and back" test, which showed a 6% regression. This is probably
due to the reduced agility of the merged state: each cycle of cruising-pushing-recovery
lasts 5 RTT instead of 4, causing the change in bandwidth to be detected later.</t>

<t>The merged state also caused regressions in the testing of competiton between C4 connections,
and in the Wi-Fi scenarios, probably due to the excessive aggressivity of the merged solution.
The separation of Probing and Pushing states appear to be a good compromise between agility 
and aggressivity.</t>

</section>
</section>
<section anchor="support-for-careful-resume"><name>Support for careful resume</name>

<t>The performance measurements of the previous version of C4 showed
worse performance in the "geo stationary satellite" scenario. The typical slow
start algorithm doubles the congestion window after every RTT, which requires
a number of RTT proportional to the logarithm of the bandwidth delay product.
Transmission via geostationary satellite has a 600ms RTT, which means large
bandwith delay product, and a long time to reach the available bandwidth.</t>

<t>The "careful resume" algorithm specified in <xref target="RFC9959"/> was designed to address
that issue, and we had implemented it in C4. However,
the previous implementation of careful resume was inefficient, because it was
too tightly enmeshed with the "slow start" logic. It is simpler to treat "resuming"
as a state by itself, rather than a complication of startup.</t>

<t>The resuming state is entered when the stack sets the seed CWIN, from which we
deduce the the seed rate. During that state, pacing rate and CWIN are pegged
to the seed values. The state lasts for 2 eras, giving enough time for the
rate measurement to stabilize. The eras are expanded if the connection is app
limited, to avoid exiting too early. After two eras, or at any time if congestion
is detected, the state transitions to recovery.</t>

<t>The performance of the satellite test are significantly improved. They are better
than BBR, almost on par with Cubic, and within the 7 second performance target
set for that test:</t>

<texttable>
      <ttcol align='left'>average time for simple tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>c4_pushing</ttcol>
      <ttcol align='right'>this PR</ttcol>
      <c>satellite</c>
      <c>7660817</c>
      <c>7431946</c>
      <c>6704246</c>
      <c>7660783</c>
      <c>6807146</c>
</texttable>

<texttable>
      <ttcol align='left'>top 90% time for simple tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>c4_pushing</ttcol>
      <ttcol align='right'>This PR</ttcol>
      <c>satellite</c>
      <c>7661569</c>
      <c>7432276</c>
      <c>6704247</c>
      <c>7661405</c>
      <c>6807183</c>
</texttable>

<t>It might be possible to improve a bit more by some further tuning, for example
exiting directly to cruising instead of recovery if the nominal rate matches the
seed rate. This might be something for further work.</t>

</section>
</section>
<section anchor="revision-after-third-design"><name>Revision after the third design</name>

<t>After presentation to the IETF during the meeting in Vienna in July 2026 (IETF 126),
we received feedback about a number of potential issue, including the need to
test C4 in presence of buffer bloat, and the need to analyse competition
issues.</t>

<t>To address this feedback, we added "buffer bloat" tests to the list of simulations
used for validating the design, and we also decided to improve the reporting
of tests by also reporting the evolution of the RTT, and, for tests involving
competition, the share of network capacity claimed by the C4 connection.</t>

<t>These tests showed that improvements were needed to avoid persisting
higher-than-capacity pacing rates in some scenarios, and to quickly reduce
network queues if they were built. We discuss these improvements in
<xref target="trimming"/> and <xref target="draining"/>. These improvements had the expected
result, but they also triggered a performance regression in the
"bad WiFi" scenario, which we discuss in <xref target="revisiting-wifi"/>.
With these three modification, we obtain a C4 protocol that meets our
requirement, providing high performance and low delays with
a simple design.</t>

<section anchor="trimming"><name>Trimming excess capacity</name>

<t>The new set of measurements showed that in some scenarios, the "third design" version of
C4 was driving the RTT towards large values.
The large delays that we observe are caused by increased queues, which are caused by
sending data too fast for too long.
The design included precautions to avoid keeping excessive max RTT values
(see <xref target="monitoring-max-rtt"/>). These precautions solve the "too long" part of the
issue, but there are limits because the long nominal max RTTs are necessary in high
jitter situations. In fact, we do see cases where delay jitter causes the data rate
estimate to be slightly higher than the actual available bandwidth.
To reduce the queues, we probably need C4 to send a bit slower.</t>

<t>We tried a simple change: when the data rate does not increase for a whole cycle, and the
transmission in the probing stage was not application limited, reduce the
nominal data rate to track the measurements -- something that C4 only did
before when noticing persistent congestion. We experimented with different rates of decrease,
and found that a 1/2th decrease provided the most interesting results. The change in
specification would be, "if the data rate does not increase for a whole cycle,
and the transmission in the probing stage was not application limited,
reduce the nominal data rate to the average of the previous value and the
highest measurement in the last cycle."</t>

<texttable>
      <ttcol align='left'>top 90% of RTT + standard deviation for network events tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2 rate</ttcol>
      <c>alone</c>
      <c>145798</c>
      <c>107604</c>
      <c>167571</c>
      <c>141307</c>
      <c>alone_200</c>
      <c>88677</c>
      <c>57168</c>
      <c>70772</c>
      <c>88272</c>
      <c>alone_1_5M</c>
      <c>96662</c>
      <c>64683</c>
      <c>90867</c>
      <c>73264</c>
      <c>alone_512k</c>
      <c>105400</c>
      <c>104226</c>
      <c>106116</c>
      <c>90963</c>
      <c>low_and_up</c>
      <c>127913</c>
      <c>134293</c>
      <c>147216</c>
      <c>129420</c>
      <c>drop_and_back</c>
      <c>148289</c>
      <c>150347</c>
      <c>161333</c>
      <c>149161</c>
      <c>blackhole</c>
      <c>479783</c>
      <c>500638</c>
      <c>485330</c>
      <c>432236</c>
      <c>short_long</c>
      <c>230005</c>
      <c>232484</c>
      <c>409884</c>
      <c>229986</c>
      <c>satellite</c>
      <c>602366</c>
      <c>830684</c>
      <c>621278</c>
      <c>602326</c>
</texttable>

<t>The top RTT values are lower in all the
network events tests but two, the "low and up" test, with a difference of
1.4 ms, and the "drop and back" test, with a difference of 1.1 ms.
We see significant improvement in the 1.5 Mbps test, with a difference of 23 ms,
and in the 512 Kbps test, with a difference of 14 ms. We seem to see a
compromise: trimming the nominal rate quickly does reduce the queues in
general, but having a slightly lower nominal rate means that queues will
persist a bit longer after a rate increase. The tables of "time spent" do not
show any preformance decrease in these tests -- some are faster, some are slower, but
the differences are tiny.</t>

<texttable>
      <ttcol align='left'>top 90% of RTT + standard deviation for buffer bloat tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>bbloat</c>
      <c>158066</c>
      <c>95924</c>
      <c>322642</c>
      <c>156178</c>
      <c>bbloat_c4</c>
      <c>361542</c>
      <c>118202</c>
      <c>939834</c>
      <c>345468</c>
      <c>bbloat_bbr</c>
      <c>160655</c>
      <c>159931</c>
      <c>408664</c>
      <c>159903</c>
      <c>bbloat_cubic</c>
      <c>859970</c>
      <c>137306</c>
      <c>1039625</c>
      <c>859395</c>
</texttable>

<texttable>
      <ttcol align='left'>top 90% load for buffer bloat tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>bbloat</c>
      <c>98%</c>
      <c>95%</c>
      <c>98%</c>
      <c>98%</c>
      <c>bbloat_c4</c>
      <c>59%</c>
      <c>58%</c>
      <c>60%</c>
      <c>59%</c>
      <c>bbloat_bbr</c>
      <c>82%</c>
      <c>58%</c>
      <c>86%</c>
      <c>82%</c>
      <c>bbloat_cubic</c>
      <c>60%</c>
      <c>58%</c>
      <c>60%</c>
      <c>60%</c>
</texttable>

<t>Trimming has very little effect on the buffer bloat tests. We do see some small
reductions in the top RTT for some tests, but these are too small to matter.
We also do not see any big change in the fairness of competing under buffer bloat.
One possibility is that, while trimming prevents the queues from increasing
too much, it does not by itself drain them. We will complement
trimming by some explicit form of draining.</t>

<texttable>
      <ttcol align='left'>top 90% of RTT + standard deviation for compete tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>vs_bbr</c>
      <c>127906</c>
      <c>156408</c>
      <c>163495</c>
      <c>125994</c>
      <c>vs_c4</c>
      <c>147578</c>
      <c>133587</c>
      <c>154995</c>
      <c>162418</c>
      <c>vs_cubic</c>
      <c>161612</c>
      <c>151990</c>
      <c>165428</c>
      <c>160008</c>
      <c>after_c4</c>
      <c>150671</c>
      <c>129600</c>
      <c>139090</c>
      <c>150557</c>
      <c>before_c4</c>
      <c>109443</c>
      <c>96827</c>
      <c>110039</c>
      <c>108681</c>
      <c>vs_c4_lg</c>
      <c>147437</c>
      <c>112710</c>
      <c>153852</c>
      <c>149633</c>
      <c>vs_c4_lg2</c>
      <c>158254</c>
      <c>154662</c>
      <c>141550</c>
      <c>157719</c>
      <c>vs_bbr_lg</c>
      <c>141010</c>
      <c>160019</c>
      <c>162743</c>
      <c>137970</c>
      <c>vs_bbr_lg2</c>
      <c>147211</c>
      <c>155612</c>
      <c>149919</c>
      <c>154808</c>
      <c>vs_cubic_lg</c>
      <c>151434</c>
      <c>120204</c>
      <c>162934</c>
      <c>150852</c>
      <c>vs_cubic_lg2</c>
      <c>146843</c>
      <c>149529</c>
      <c>159656</c>
      <c>146035</c>
</texttable>

<texttable>
      <ttcol align='left'>top 90% load for compete tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>vs_bbr</c>
      <c>78%</c>
      <c>47%</c>
      <c>79%</c>
      <c>78%</c>
      <c>vs_c4</c>
      <c>52%</c>
      <c>31%</c>
      <c>33%</c>
      <c>54%</c>
      <c>vs_cubic</c>
      <c>66%</c>
      <c>31%</c>
      <c>46%</c>
      <c>69%</c>
      <c>after_c4</c>
      <c>40%</c>
      <c>34%</c>
      <c>32%</c>
      <c>38%</c>
      <c>before_c4</c>
      <c>72%</c>
      <c>50%</c>
      <c>67%</c>
      <c>69%</c>
      <c>vs_c4_lg</c>
      <c>61%</c>
      <c>58%</c>
      <c>58%</c>
      <c>61%</c>
      <c>vs_c4_lg2</c>
      <c>64%</c>
      <c>61%</c>
      <c>60%</c>
      <c>63%</c>
      <c>vs_bbr_lg</c>
      <c>81%</c>
      <c>59%</c>
      <c>81%</c>
      <c>81%</c>
      <c>vs_bbr_lg2</c>
      <c>78%</c>
      <c>69%</c>
      <c>61%</c>
      <c>80%</c>
      <c>vs_cubic_lg</c>
      <c>78%</c>
      <c>58%</c>
      <c>60%</c>
      <c>77%</c>
      <c>vs_cubic_lg2</c>
      <c>76%</c>
      <c>81%</c>
      <c>63%</c>
      <c>75%</c>
</texttable>

<t>Trimming the nominal rate quickly does not seem to improve the fairness of C4 in the compete tests,
but it does improve the top RTT measurements in the competition between C4 and BBR, and between
C4 and Cubic, except for the "vs_bbr_lg2" test, where the top RTT is 7.6 ms higher than before.
We also see a slight degradation in the "internal competition" tests, where C4 competes with itself.</t>

<texttable>
      <ttcol align='left'>top 90% time for wifi tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>wifi_bad</c>
      <c>4841982</c>
      <c>7522796</c>
      <c>4449644</c>
      <c>5249372</c>
      <c>wifi_fade</c>
      <c>5351680</c>
      <c>5649668</c>
      <c>5550500</c>
      <c>5244862</c>
      <c>wifi_suspension</c>
      <c>4574262</c>
      <c>4616911</c>
      <c>4602102</c>
      <c>4572601</c>
      <c>wifi_bad_bbr</c>
      <c>11014365</c>
      <c>10730711</c>
      <c>13129404</c>
      <c>10454091</c>
      <c>wifi_bad_c4</c>
      <c>11665740</c>
      <c>12481659</c>
      <c>12241907</c>
      <c>11615184</c>
      <c>wifi_bad_cubic</c>
      <c>11883994</c>
      <c>12246412</c>
      <c>13881720</c>
      <c>11388974</c>
</texttable>

<texttable>
      <ttcol align='left'>top 90% of RTT + standard deviation for wifi tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>Trimming 1/2</ttcol>
      <c>wifi_bad</c>
      <c>236990</c>
      <c>146354</c>
      <c>149225</c>
      <c>260841</c>
      <c>wifi_fade</c>
      <c>210684</c>
      <c>177334</c>
      <c>187572</c>
      <c>210766</c>
      <c>wifi_suspension</c>
      <c>32878</c>
      <c>34220</c>
      <c>45312</c>
      <c>28783</c>
      <c>wifi_bad_bbr</c>
      <c>335207</c>
      <c>339723</c>
      <c>327846</c>
      <c>332603</c>
      <c>wifi_bad_c4</c>
      <c>331313</c>
      <c>333343</c>
      <c>333270</c>
      <c>331021</c>
      <c>wifi_bad_cubic</c>
      <c>339101</c>
      <c>357546</c>
      <c>327358</c>
      <c>335187</c>
</texttable>

<t>We avoided making similar changes before because of the effect on high jitter situations,
in particular "bad wifi" environments. These are discussed in <xref target="revisiting-wifi"/>.</t>

</section>
<section anchor="draining"><name>Draining the backlog</name>

<t>The results of tests in buffer bloat scenarios show C4 creating shorter queues than
Cubic but longer queues than BBR, even after implementing the "trimming" changes.</t>

<texttable>
      <ttcol align='left'>average RTT for buffer bloat tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>trimming 1/2</ttcol>
      <c>bbloat</c>
      <c>113475</c>
      <c>84750</c>
      <c>229647</c>
      <c>111173</c>
      <c>bbloat_c4</c>
      <c>229418</c>
      <c>92740</c>
      <c>660442</c>
      <c>234925</c>
      <c>bbloat_bbr</c>
      <c>131826</c>
      <c>124558</c>
      <c>266277</c>
      <c>131812</c>
      <c>bbloat_cubic</c>
      <c>551053</c>
      <c>97505</c>
      <c>647602</c>
      <c>551157</c>
</texttable>

<t>We analysed "qlog" traces of the BBR and C4 traces in the "buffer bloat" trace,
and found that most of the difference in average RTT measurements was due to
the more efficient "draining" of the excess queues created in the Initial
phase. BBR enters a "drain" phase after exiting start-up, during which it
operates at a small fraction of the estimated bandwidth, and exits that
phase when the number of bytes in flight is below the bandwidth-delay product
of the path, defined as the product of the estimated bandwidth by the min RTT.</t>

<t>We don't want to copy BBR's algorithm, because its dependency on the
min RTT of the path conflicts with the inherent variation of the RTT in high
delay jitter scenarios. We also want to limit the size of the bandwidth drops
when draining, because such drops would add delays to the transmission
of real time media.</t>

<t>Instead, we first tried a simple change, adding a "draining" option to the
recovery phase. If the draining option is set, the pacing
rate during recovery is set to only 7/8th of the nominal rate, instead
of the default 15/16th. We would set this option on exiting the Initial
or the pushing phase, and perhaps also if some other condition detected
the presence of a backlog. This provided promising initial results, and also
reduced the aggressiveness of C4 during the compete tests, which improved its fairness.
However, we noticed that we could improve the results with a simple change:
instead of maintaing just one flag, maintain an estimate of the backlog.</t>

<t>The estimate of the backlog is set to 1 full RTT of data after the Initial phase,
because during that phase the pacing rate is twice the nominal rate. It is set to
a quarter of the RTT of data after the pushing phase, because during that phase
the pacing rate is 5/4 of the nominal rate.</t>

<t>Upon entering recovery, the pacing rate is set as a function of the backlog:</t>

<t><list style="symbols">
  <t>if the backlog estimate is less than 1/16, set the pacing rate to 15/16th of the nominal rate;</t>
  <t>else if the backlog estimate is less than 1/8, set the pacing rate to 7/8th of the nominal rate;</t>
  <t>else set the pacing rate to 3/4th of the nominal rate.</t>
</list></t>

<t>At the end of the recovery phase, the backlog will be 1/16th, 1/8th, or 1/4th, depending
of the reduction in the pacing rate -- or set to zero if the reduction would result in a negative
value.</t>

<texttable>
      <ttcol align='left'>average RTT for buffer bloat tests</ttcol>
      <ttcol align='right'>c4</ttcol>
      <ttcol align='right'>bbr</ttcol>
      <ttcol align='right'>cubic</ttcol>
      <ttcol align='right'>draft-04</ttcol>
      <c>bbloat</c>
      <c>91540</c>
      <c>84752</c>
      <c>231784</c>
      <c>113442</c>
      <c>bbloat_c4</c>
      <c>181516</c>
      <c>99182</c>
      <c>661710</c>
      <c>232427</c>
      <c>bbloat_bbr</c>
      <c>159868</c>
      <c>124409</c>
      <c>269224</c>
      <c>132447</c>
      <c>bbloat_cubic</c>
      <c>667539</c>
      <c>97432</c>
      <c>647872</c>
      <c>551412</c>
</texttable>

<t>This simple change has a very positive effect on the average RTT for
the buffer bloat test. The average RTT is only 8% larger than what we
get with BBR, but BBR uses the min RTT of the path to determine the
congestion window, while C4 avoids building a dependency on the min RTT.
When competing in the buffer bloat scenario, C4 is more aggressive than BBR,
and the average RTT observed when competing with C4 or with BBR is larger
that what BBR achieves. On the other hand, when competing with Cubic, BBR is
shut down, while C4 keeps competing.</t>

<t>The backlog algorithm is promising, but it may need additional tuning.</t>

</section>
<section anchor="revisiting-wifi"><name>Revisiting support for Wi-Fi</name>

<t>Each of our test runs performs 100 simulations of the "bad Wi-Fi" scenario.
We observe that there is a high variability between the simulations.
Some of that is expected. The simulation of Wi-Fi jitter is a random
process, and we can expect that different simulations will encounter different
patterns of jitter, and thus different performances. The graph of durations shows
that, but it also shows that the worse 20 or so simulations are significantly
worse "after trim and drain" than with the unmodified "draft-04" implementation.</t>

<t>Analysis of the logs of the worst simulation results let us
see an obvious pattern. In the "good" case, we see an event about 1.5 second into
the connection that leads C4 to explore higher RTT and higher data rates, while in the "bad"
case the RTT is constrained into a much narrower band and the pacing rate converges on a
much lower value.</t>

<t>The growth pattern of the "good" connection between 1.5 and 2 seconds after the
starts corresponds to C4 re-entering the Initial state, following the rule
specified in section 4.4.1 of the version 04 of the specification:</t>

<t><list style="symbols">
  <t><em>C4 will reenter the "initial" phase on the first time
high jitter is detected for the flow. The high jitter
is detected after updating the "nominal max RTT" at the
end of the recovery era, if <spanx style="verb">running_min_rtt &lt; nominal_max_rtt*2/5</spanx>.
This will be done at most once per flow.</em></t>
</list></t>

<t>We discovered that in the worst cases, C4 did re-enter the Initial phase,
be reentered it very early. Draining kept the <spanx style="verb">running_min_rtt</spanx> low, and
thus even a limited jitter would trigger the reinitialization. The "only once"
rule was preventing adaptation when the larger jitter event occured later.
The solution was to remember the time the last initial phase completed,
or more precisely the time the recovery that followed the last initial phase
completed. We added to the state a variable <spanx style="verb">last_initial_time</spanx>, initialized
at zero when entering the "initial" state, and set to the current time
if the first exit of the recovery state after that initial state. Then,
we changed the specification to:</t>

<t><list style="symbols">
  <t>C4 will reenter the "initial" phase on the first time
high jitter is detected for the flow. The high jitter
is detected after updating the "nominal max RTT" at the
end of the recovery era, if <spanx style="verb">running_min_rtt &lt; nominal_max_rtt*2/5</spanx>,
and if the variable <spanx style="verb">last_initial_time</spanx> is not zero and if
<spanx style="verb">current_time &gt; last_initial_time + 1 second</spanx>.</t>
</list></t>

<t>The performance for the Wi-Fi test improved immediately after this fix,
with the average execution time of Wi-Fi tests falling below the
value observe in the previous design, and without causing any significant
regression in the other scenarios.</t>

</section>
<section anchor="revising-the-trimming-pattern"><name>Revising the trimming pattern</name>

<t>In the discussion of trimming (see <xref target="trimming"/>), we recommended
evaluating the maximum bandwidth measurement over a cycle of
cruising, probing and recovery, and trimming the nominal rate
to the midpoint between the nominal rate and that measurement.
Once all the previous changes were made, we reevaluated that
decision and considered three variants:</t>

<t><list style="numbers" type="1">
  <t>Drop to the middle of the nominal rate and the measured rate,</t>
  <t>Drop to the measured rate,</t>
  <t>Drop to the maximum of the current measured rate and the
rate measured in the previous cycle.</t>
</list></t>

<t>The second option was quickly ruled out because the "top 90%" media latency
in the "bad wifi" scenario was 100ms higher than in the "middle" scenario.
When we observe heavy jitter as in the "bad wifi" scenario, rate measurements
become noisy. The "middle" and "max of 2" methods will filter out
that noise, but the immediate drop will not, and the performance can suffer.</t>

<t>The "max of two" option provides performance roughly on par with the "middle"
scenario, generally with lower measured RTT. It does provide significantly
better performance in the ECN scenario, and slghtly more fair results
in competition scenarios. We adopted it in the specification.</t>

</section>
</section>
<section anchor="state-machine"><name>State Machine</name>

<t>The state machine for C4 has the following states:</t>

<t><list style="symbols">
  <t>"startup": the initial state, during which the CWND is
set to twice the "nominal_CWND". The connection
exits startup if the "nominal_cwnd" does not
increase for 3 consecutive round trips. When the
connection exits startup, it enters "recovery".</t>
  <t>"resuming": management of careful resume, during which the CWND and pacing rate are
pegged to the seed values. The state lasts for 2 eras,
giving enough time for the rate measurement to stabilize.
The eras are expanded if the connection is app limited,
to avoid exiting too early. After two eras, or at any time
if congestion is detected, the state transitions to recovery.</t>
  <t>"recovery": the connection enters that state after
"startup", "pushing", or a congestion detection in
a "cruising" state. It remains in that state for
at least one roundtrip, until the first packet sent
in "recovery" is acknowledged. Once that happens,
the connection goes back
to "startup" if the last 3 pushing attemps have resulted
in increases of "nominal rate", or enters "cruising"
otherwise.</t>
  <t>"cruising": the connection is sending using the
"nominal_rate" and "nominal_max_rtt" value. If congestion is detected,
the connection exits cruising and enters
"recovery" after lowering the value of
"nominal_cwnd".
Otherwise, the connection will
remain in "cruising" state until at least 4 RTT and
the connection is not "app limited". At that
point, it enters "pushing".</t>
  <t>"probing": the connection is using a rate and CWND 6.15%
larger than "nominal_rate" and "nominal_CWND". After
1 RTT, it moves back to "recovery" in order to assess
the results. If the data rate appears to have increased,
the connection moves to the "pushing" state.</t>
  <t>"pushing": the connection is using a rate and CWND 25%
larger than "nominal_rate" and "nominal_CWND".
It remains in that state for at least one round trip,
and until the measured rate stops growing. If the
pushing lasts more than 3 RTT, C4 re-enters the
initial state.</t>
</list></t>

<t>These transitions are summarized in the following state
diagram.</t>

<figure><artwork><![CDATA[
                    Start
                      |
                      v
                      +<-----------------------+
                      |                        |
                      v                        |
                 +----------+                  |
                 | Startup  |                  |
                 +-|--|-----+                  |
         +---------+  |                        | 
         |            |                        |
         v            |                        |
   +----------+       |                        |
   | Resuming |       |                        |
   +-----|----+       |                        |
         +---------+  |                        |
                   |  |                        |
                   v  v                        |
                 +------------+                |
  +--+---------->|  Recovery  |                |
  ^  ^           +----|---|---+                |
  |  |                |   | Rate increase      |
  |  |                |   +---------+          |
  |  |                |             |          |
  |  |                v             |          |
  |  |           +----------+       |          |
  |  |           | Cruising |       |          |
  |  |           +-|--|-----+       v          |
  |  | Congestion  |  |        +---------+     |
  |  +-------------+  |        | Pushing |     |
  |                   |        +----|--|-+     |
  |                   v             |  |       |
  |              +----------+       |  +-------+
  |              | Probing  |       |   Rapid
  |              +----|-----+       |   increase
  |                   |             |
  +<------------------+             |
  ^                                 |
  |                                 |
  +---------------------------------+

]]></artwork></figure>

<t>C4 exits the pushing state after one era, or if a congestion
signal is received before that. In an exception to
standard congestion processing, the reduction in <spanx style="verb">nominal_rate</spanx> and
<spanx style="verb">nominal_max_RTT</spanx> are not applied if the congestion signal
is tied to a packet sent during the probing or pushing state.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>We do not believe that C4 introduce new security issues. Or maybe there are,
such as what happen if applications can be fooled in going to fast and
overwhelming the network, or going to slow and underwhelming the application.
Discuss!</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>




    <references title='Informative References' anchor="sec-informative-references">

&RFC9000;
&I-D.ietf-moq-transport;
&RFC9438;
&I-D.ietf-ccwg-bbr;
&RFC6817;
&RFC6582;
&RFC3649;
<reference anchor="TCP-Vegas" target="https://ieeexplore.ieee.org/document/464716">
  <front>
    <title>TCP Vegas: end to end congestion avoidance on a global Internet</title>
    <author initials="L. S." surname="Brakmo">
      <organization></organization>
    </author>
    <author initials="L. L." surname="Peterson">
      <organization></organization>
    </author>
    <date year="1995" month="October"/>
  </front>
  <seriesInfo name="IEEE Journal on Selected Areas in Communications ( Volume: 13, Issue: 8, October 1995)" value=""/>
</reference>
<reference anchor="HyStart" target="https://doi.org/10.1016/j.comnet.2011.01.014">
  <front>
    <title>Taming the elephants: New TCP slow start</title>
    <author initials="S." surname="Ha">
      <organization></organization>
    </author>
    <author initials="I." surname="Rhee">
      <organization></organization>
    </author>
    <date year="2011" month="June"/>
  </front>
  <seriesInfo name="Computer Networks vol. 55, no. 9, pp. 2092-2110" value=""/>
</reference>
<reference anchor="Cubic-QUIC-Blog" target="https://www.privateoctopus.com/2019/11/11/implementing-cubic-congestion-control-in-quic/">
  <front>
    <title>Implementing Cubic congestion control in Quic</title>
    <author initials="C." surname="Huitema">
      <organization></organization>
    </author>
    <date year="2019" month="November"/>
  </front>
  <seriesInfo name="Christian Huitema's blog" value=""/>
</reference>
<reference anchor="Wi-Fi-Suspension-Blog" target="https://www.privateoctopus.com/2023/05/18/the-weird-case-of-wifi-latency-spikes.html">
  <front>
    <title>The weird case of the wifi latency spikes</title>
    <author initials="C." surname="Huitema">
      <organization></organization>
    </author>
    <date year="2023" month="May"/>
  </front>
  <seriesInfo name="Christian Huitema's blog" value=""/>
</reference>
&I-D.irtf-iccrg-ledbat-plus-plus;
&RFC9330;
&RFC9331;
&RFC9959;
&I-D.briscoe-iccrg-prague-congestion-control;
<reference anchor="ICCRG-LEO" target="https://datatracker.ietf.org/meeting/122/materials/slides-122-iccrg-mind-the-misleading-effects-of-leo-mobility-on-end-to-end-congestion-control-00">
  <front>
    <title>Mind the Misleading Effects of LEO Mobility on End-to-End Congestion Control</title>
    <author initials="Z." surname="Lai">
      <organization></organization>
    </author>
    <author initials="Z." surname="Li">
      <organization></organization>
    </author>
    <author initials="Q." surname="Wu">
      <organization></organization>
    </author>
    <author initials="H." surname="Li">
      <organization></organization>
    </author>
    <author initials="Q." surname="Zhang">
      <organization></organization>
    </author>
    <date year="2025" month="March"/>
  </front>
  <seriesInfo name="Slides presented at ICCRG meeting during IETF 122" value=""/>
</reference>


    </references>



<?line 1808?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA+W9a3cbV3I2+n3/in7h5TWWDEC4k9RkcmLLdkbJ+BJZic96
11kRm0CT7BGAxnQ3SHMk5befqqeq9qXRlDWTnPfL0bIlEuje19q16/rUaDRy
bdlui+fZ4JuiKW/2WXWdvbity6Yt8/3vmuxFtb8p6Jdqzz+2dbWlfzdF9sWL
xZOBy6+u6uKOXn6xyOT9gVvnbXFT1Q/Ps3J/XTm3qdb7fEc9bOr8uh3dHsu2
2OWj9fr+ZrRejDZ4bTRZuuZ4tSubhrpqHw70/MtvX3/n9sfdVVE/dxtq9blb
V/um2DfH5nnW1sfClYcaPzXtbDK5mMxcXhc5DeeX4irL95vs5b4t6n3RZq/r
fN8cqroduLfFw31Vb567bJS9WODvkznyp6+KfNuWu4I+2+2O+5LmRU/wN98X
mzLPqruizv7t31++cC4/trdVzS26LKNp0/BejLM/ykz5I1kAv67xV1V98zz7
qS7vaILZj+u2OhwbGvd6zF/SM+X2eaZr9k/675hmFPf18zj7gWabvz3u8jp0
9/PxNm8631Bv+b78K6ZCAyqbdRX10+zl4X9a8xfjdbXrTOlfiv2+3N800ZyO
222xT774eB/X2+P19cM/lWU5XufO7at6R0/e0eYyufhf6IVX3724mEwm+Pnl
6JtxWbTXo131l1Frm+kfW8zP08dAXUSc9sTqfHrmf16ez+zn+Wpx8dzxL69f
/DT6j+Imb/BV1ub1TdHS0rftoXn+7FlZFMWvh21VF2P+cUyTfEaUfdwV+/bZ
YrU4m67kPT1N1FwmzWUFEWJb4Z91oLT8rio3+X5dZPxLdrOtrvKtJ9gBGgPR
Z4P5FIRB5yCbXlws5bumqEs6OrRm9MTLb7/9NvuX6ljvqQ1q7+diW6zbYpN9
Reehoe1LibjJvsj+o9oeeQOn82H2smmO9OP5MOnniXTkiZv/jOQfpYg/jYn0
vq7zt7uq/+s/jbOfCppRQweHv/rjw8+0sK021l3jTVViXaeT8XQyXT37M1Mg
LcZ4NplOxxP+b6Fv2irnO6K6rL0tMprx4Tbft9TvD8U9b2fWbKv7rOEOZSa2
nv9y3BcZt6kfx0tJ63Q40oipkZbYxNsmu6u242y5HGb7apxdDLPDYUwvX8xG
s+l0Ig0kS0QMwlbBH88/5vZd+tXLcfbqtiiwNi+OV+V6xAxl9PW2uuknw/v7
+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

-->

</rfc>

