<?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 RFC2119 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC6582 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6582.xml">
<!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 RFC9331 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9331.xml">
<!ENTITY RFC9406 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9406.xml">
<!ENTITY RFC9959 SYSTEM "https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9959.xml">
]>


<rfc ipr="trust200902" docName="draft-huitema-ccwg-c4-spec-05" category="exp" consensus="true" submissionType="IETF">
  <front>
    <title abbrev="C4 Specification">Specification 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 47?>

<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. The design emphasizes simplicity and
avoids making too many assumptions about the "model" of
the network.</t>



    </abstract>



  </front>

  <middle>


<?line 60?>

<section anchor="introduction"><name>Introduction</name>

<t>Christian's Congestion Control Code (C4) is a 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"/>.</t>

<t>The two main variables describing the state of a flow are the
"nominal rate" (see <xref target="nominal-rate"/>) and the
"nominal max RTT" (see <xref target="nominal-max-rtt"/>).
C4 organizes the management of the flow through a series of
states: Initial, during which the first assessment of nominal-rate
and nominal max RTT are obtained, Resuming for the implementation
of careful resume <xref target="RFC9959"/>, Recovery in which a flow is
stabilized after the Initial, Probing or Pushing phase, Cruising during which
a flow uses the nominal rate, Probing during which the flow
tries to discover whether more resource mighht be available and Pushing during which the flow
tries to otain more resource  -- see <xref target="c4-states"/>.</t>

<t>C4 divides the duration of the connection in a set of "eras",
each corresponding to a packet round trip. Transitions between protocol
states typically happen at the end of an era, except if the
transition is forced by a congestion event.</t>

<t>C4 assumes that the transport stack is
capable of signaling 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 (see <xref target="congestion-response"/>).</t>

<t>C4 introduces the concept of "sensitivity" (see <xref target="sensitivity"/>)
to ensure that flows using a large amount of bandwidth are more
"sensitive" to congestion signals than flows using fewer bandwidth,
and thus that multiple flows sharing a common bottleneck are driven
to share the resource evenly.</t>

</section>
<section anchor="key-words"><name>Key Words</name>

<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED",
"MAY", and "OPTIONAL" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>

</section>
<section anchor="c4-variables"><name>C4 variables</name>

<t>In addition to the nomnal rate and the nominal max RTT,
C4 maintains a set a variables per flow (see <xref target="global-variables"/>)
and per era (see <xref target="era-variables"/>).</t>

<section anchor="nominal-rate"><name>Nominal rate</name>

<t>The nominal rate is an estimate of the bandwidth available to the flow.
On initialization, the nominal rate is set to zero, and default values
are used when setting the pacing rate and CWND for the flow.</t>

<t>C4 evaluates the nominal rate after acknowledgements are received
using the number of bytes acknowledged since the packet was sent
(<spanx style="verb">bytes_acknowledged</spanx>) and the time delay it took to process these packets.</t>

<t>That delay is normally set to the difference between the time
at which the acknowledged packet was sent (<spanx style="verb">time_sent</spanx>),
and the current time (<spanx style="verb">current_time</spanx>). However, that difference
may sometimes be severely underestimated because of delay jitter
and ACK compression. We also compute a "send delay" as the difference
between the send time of the acknowledged packet and the send time
of the oldest "delivered" packet.</t>

<figure><artwork><![CDATA[
delay_estimate = max (current_time - time_sent, send_delay)
rate_estimate = bytes_acknowledged /delay_estimate
]]></artwork></figure>

<t>If we are not in a congestion situation, we update the
nominal rate:</t>

<figure><artwork><![CDATA[
if not congested and nominal_rate > rate_estimate:
    nominal_rate = rate_estimate
]]></artwork></figure>

<t>The data rate measurements can only cause increases in
the nominal rate. The nominal rate is reduced following
congestion events, as specified in <xref target="congestion-response"/>.</t>

<t>The "congested" condition is defined as being in the
recovery state and having either entered that state due
to a congestion event, or having received a congestion
event after entering recovery.</t>

<t>Updating the nominal rate
in these conditions would cause a congestion bounce: the
nominal rate is reduced because of a congestion event,
C4 enters recovery, but then packets sent at the previous
rate are received during recovery, generating a new estimate
and resetting the nominal rate to a value close to the one
that caused congestion.</t>

</section>
<section anchor="nominal-max-rtt"><name>Nominal max RTT</name>

<t>The nominal max RTT is an estimate of the maximum RTT
that can occur on the path in the absence of queues.
The RTT samples observed for the flow are the sum of four
components:</t>

<t><list style="symbols">
  <t>the latency of the path</t>
  <t>the jitter introduced by processes like link layer contention
or link layer retransmission</t>
  <t>queuing delays caused by competing applications</t>
  <t>queuing delays introduced by C4 itself.</t>
</list></t>

<t>C4's goal is to obtain a estimate of the combination of path latency
and maximum jitter. This is done by only taking measurements
when C4 is sending data at a rate not higher than the nominal transmission rate,
as happens for example in the recovery and cruising states. These measurements
will happen during the following era. C4 captures them
by recording the max RTT for packets sent in that era.
C4 will also progressively reduce the value of the
nominal max RTT over time, to account for changes in network
conditions.</t>

<figure><artwork><![CDATA[
# on end of era

if alpha_previous <= 1.0:
    if era_min_rtt < running_min_rtt:
        running_min_rtt = era_min_rtt
    else:
        running_min_rtt =
           (7*running_min_rtt + era_min_rtt)/8

    if era_max_rtt > running_min_rtt + MAX_JITTER:
        # cap RTT increases to MAX_JITTER, i.e., 250ms
        era_max_rtt = running_min_rtt + MAX_JITTER
    if era_max_rtt > nominal_max_rtt:
        nominal_max_rtt = era_max_rtt
    else:
        nominal_max_rtt =
          (7*nominal_max_rtt + era_max_rtt)/8
]]></artwork></figure>

<t>The decrease over time is tuned so that jitter
events will be remembered for several of the
cruising-pushing-recovery cycles, which is enough time for the
next jitter event to happen, at least on Wi-Fi networks.</t>

</section>
<section anchor="global-variables"><name>Global variables</name>

<t>In addition to the nominal rate and nominal MAX RTT,
C4 maintains a set of variables tracking the evolution of the flow:</t>

<t><list style="symbols">
  <t>current state of the algorithm, which can be Initial, Resuming, Recovery,
Cruising, Probing or Pushing.</t>
  <t>running min RTT, an approximation of the min RTT for the flow,</t>
  <t>number of eras without increase (see <xref target="c4-initial"/>),</t>
  <t>the number of successive congestion events and the recent maximum rate,
used to detect and manage persistent congestion (see <xref target="persistent-congestion"/>),</t>
  <t>the estimate of the backlog, as a fraction between 0 and 1 (see <xref target="draining"/>).</t>
</list></t>

</section>
<section anchor="era-variables"><name>Per era variables</name>

<t>C4 keeps variables per era:</t>

<figure><artwork><![CDATA[
era_sequence; /* sequence number of first packet sent in this era */
alpha_current; /* coefficient alpha used in the current state */
alpha_previous; /* coefficient alpha used in the previous era */
era_max_rtt; /* max RTT observed during this era */
era_min_rtt; /* min RTT observed during this era */
]]></artwork></figure>

<t>These variables are initialized at the beginning of the era.</t>

</section>
</section>
<section anchor="c4-states"><name>States and Transition</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.25%
larger than "nominal_rate" and "nominal_CWND", or 3.125%
if the local gateway is ECN capable. 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>

<section anchor="set_pace"><name>Setting pacing rate, congestion window and quantum</name>

<t>If the nominal rate or the nominal max RTT are not yet
assessed, C4 sets pacing rate, congestion window and
pacing quantum to initial values:</t>

<t><list style="symbols">
  <t>pacing rate: set to the data rate of the outgoing interface,</t>
  <t>congestion window: set to the equivalent of 10 packets,</t>
  <t>congestion quantum: set to zero.</t>
</list></t>

<t>If the nominal rate or the nominal max RTT are both
assessed, C4 sets pacing rate, and congestion window 
to values that depends on these variables
and on a coefficient <spanx style="verb">alpha_current</spanx>:</t>

<figure><artwork><![CDATA[
pacing_rate = alpha_current * nominal_rate

if (c4_state == initial):
    margin = 0
else:
    margin = min(nominal_max_rtt/4, 15_milliseconds)

cwnd = max ((pacing_rate+margin) * nominal_max_rtt, 2*MTU)
]]></artwork></figure>

<t>During the initial phase, the pacing rate is set to a minimum
of 1,048,576 bps (128 KB/s) to avoid starting at too low a rate.
In these conditions, the transmission is expected to be limited
by the value of CWND.</t>

<figure><artwork><![CDATA[
if (c4_state == initial and pacing_rate < 1,048,576 bps):
    pacing_rate = 1,048,576 bps
]]></artwork></figure>

<t>The "margin" coefficient accounts for errors on the
estimate of the nominal max rtt, which could cause C4
to be stuck operating at a too low data rate. It is only
applied outside of the initial phase.</t>

<t>The coefficient <spanx style="verb">alpha</spanx> for the different states is:</t>

<texttable>
      <ttcol align='left'>state</ttcol>
      <ttcol align='left'>alpha</ttcol>
      <ttcol align='left'>comments</ttcol>
      <c>Initial</c>
      <c>2</c>
      <c>See <xref target="c4-initial"/> for the setting of CWND</c>
      <c>Resuming</c>
      <c>variable</c>
      <c>pacing and CWND are set from remembered values</c>
      <c>Recovery</c>
      <c>15/16, 7/8 or 3/4</c>
      <c>(see <xref target="draining"/>)</c>
      <c>Cruising</c>
      <c>1</c>
      <c>&#160;</c>
      <c>Probing</c>
      <c>33/32 or 17/16</c>
      <c>see <xref target="c4-probing"/> for rules on choosing 33/32 or 17/16</c>
      <c>Pushing</c>
      <c>5/4</c>
      <c>&#160;</c>
</texttable>

<t>Setting the pacing quantum is a tradeoff between two requirements.
Using a large quantum enables applications to send large batches of
packets in a single transaction, which improves performance. But
sending large batches of packets creates "instant queues" and
causes some Active Queue Management mechanisms to mark packets as
ECN/CE, or drop them. As a compromise, we set the quantum to
4 milliseconds worth of transmission, while capping it to 64KB.</t>

<figure><artwork><![CDATA[
quantum = max ( min (pacing_rate*4_milliseconds, 64KB), 2*MTU)
]]></artwork></figure>

</section>
<section anchor="c4-initial"><name>Initial state</name>

<t>When the flow is first initialized, it enters the Initial state,
during which it does a first assessment of the
"nominal rate" and "nominal max RTT".
The coefficient <spanx style="verb">alpha_current</spanx> is set to 2. The
"nominal rate" and "nominal max RTT" are initialized to zero,
which will cause pacing rate to be set to a default
initial value. The nominal max RTT will be set to the
first assessed RTT value, but is not otherwise changed
before the end of the initial phase.</t>

<t>During the initial state, the nominal rate is updated
after receiving acknowledgements, see <xref target="nominal-rate"/>.
The pacing rate is set to the maximum of the nominal rate
and a minimum of 1,048,576 bps (128 KB/s) to avoid starting
at too low a rate.
C4 will exit the Initial state and enter Recovery if the 
nominal rate does not increase for 3 consecutive eras,
omitting the eras for which the transmission was
"application limited".</t>

<t>During the initial state, C4 maintains an "initial_cwnd" variable,
which is initialized to the value of CWND at the beginning of the
initial state, and is incremented aftre each acknowledgement
using the formula:</t>

<t>initial_cwnd += nb_bytes_acknowledged &gt;&gt; (3 * nb_eras_no_increase)</t>

<t>As long as the <spanx style="verb">nominal_rate</spanx> increases, the <spanx style="verb">nb_eras_no_increase</spanx>
will be zero, and the increment of <spanx style="verb">initial_cwnd</spanx> will mimic those
of TCP Reno <xref target="RFC6582"/>. When the <spanx style="verb">nominal_rate</spanx> stops increasing, the increment
will get progressively slower, similar to the reduced increment
of Hystart++ <xref target="RFC9406"/>.</t>

<t>The CWND variable will be set to the maximum of the initial_cwnd
and the product of the nominal rate times the nominal max RTT times
<spanx style="verb">alpha_current</spanx>.</t>

<t>C4 exit the Initial when receiving a congestion signal if the
following conditions are true:</t>

<t>1- If the signal is due to "delay" or "ECN", C4 will only exit the
   initial state if the <spanx style="verb">nominal_rate</spanx> did not increase
   in the last 2 eras.</t>

<t>2- If the signal is due to "loss", C4 will only exit the
   initial state if more than 20 packets have been received.</t>

<t>The restriction on delay signals and ECN is meant to prevent spurious exit
due to delay jitter or competing connections. The restriction on loss
signals is meant to ensure that enough packets have been received to properly
assess the loss rate.</t>

<t>On exiting the Initial state, C4 computes an estimate of the nominal
max RTT as the quotient of the half the last CWND divided by the last
nominal rate, and updates the "nominal max RTT" accordingly.</t>

<section anchor="reentering-the-initial-state"><name>Reentering the initial state</name>

<t>When reentering the initial state, C4 already has an estimate of the
current nominal rate and nominal max RTT. CWND is set to the product of
nominal rate and nominal max RTT. The initial state then operates as
specified in <xref target="c4-initial"/>.</t>

</section>
</section>
<section anchor="resuming-state"><name>Resuming state</name>

<t>The resuming state is entered if the application remembers the CWND and RTT
of a previous connection between the same endpoints. The resuming state lasts for 2 eras,
during which the CWND and pacing rate are pegged to the remembered values.
The first of these eras can be extended if the connection is "application limited",
to avoid exiting too early. After 2 eras, or if a congestion signal is received before
that, C4 enters recovery.</t>

</section>
<section anchor="c4-recovery"><name>Recovery state</name>

<t>The recovery state is entered from the Initial, Resuming, Probing or Pushing state,
or from the Cruising state in case of congestion. 
The coefficient <spanx style="verb">alpha_current</spanx> is set to 15/16. Because the multiplier
is lower than 1, the new value of CWND may well be lower
than the current number of bytes in transit. C4 will wait
until acknowledgements are received and the number of bytes
in transit is lower than CWND to send new packets.</t>

<t>The Recovery ends when the first packet sent during that state
is acknowledged. That means that acknowledgement and congestion
signals received during recovery are the consequence of packets
sent before. C4 assumes that whatever corrective action is required
by these events will be taken prior to entering recovery, and that
events arriving during recovery are duplicate of the prior events
and can be ignored.</t>

<t>Rate increases are detected if the previous state was Probing, 
and if acknowledgements received during recovery
reflect a successful "probe" during the Probing phase, that is if the
probing did not trigger any congestion event
and if the data rate did increase.</t>

<t>If a succesful probing was detected, C4 immediately enters the Pushing state.</t>

<t>C4 re-enters "Initial" at the end of the recovery period if 
high jitter requires restarting the Initial phase (see
<xref target="restart-high-jitter"/>). Otherwise, C4 enters cruising.</t>

<t>Receiving of a congestion signal during the Initial phase does not
cause a change in the <spanx style="verb">nominal_rate</spanx> or <spanx style="verb">nominal_max_RTT</spanx>.</t>

<section anchor="restart-high-jitter"><name>Restarting Initial if High Jitter</name>

<t>The "nominal max RTT" is not updated during the Initial phase,
because excessive queues can happen, and incorporating these queues
in the nominal max RTT would create an undesirable feedback loop.
This can lead to underestimation of the "nominal
rate" if the flow is operating on a path with high jitter.</t>

<t>C4 will reenter the "initial" phase if
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:</t>

<figure><artwork><![CDATA[
running_min_rtt < nominal_max_rtt*2/5
]]></artwork></figure>

<t>To avoid spurious r-entry, 
this re-entry of the initial phase should only happen if
at least 1 second has elapsed since the end of the recovery phase
that followed the previous initial phase.</t>

</section>
</section>
<section anchor="cruising-state-c4-cruising-"><name>Cruising state {#c4-cruising }</name>

<t>The Cruising state is entered from the Recovery state. 
The coefficient <spanx style="verb">alpha_current</spanx> is set to 1.</t>

<t>C4 will transition from Cruising state to Probing state
after 2 eras.</t>

<t>C4 will transition to Recovery before that if
a congestion signal is received before transition to Probing.</t>

</section>
<section anchor="c4-probing"><name>Probing state</name>

<t>The probing state is entered from the Cruising state.</t>

<t>The coefficient <spanx style="verb">alpha_current</spanx> is set to 17/16, unless ECN-CE
marks have been received on the path, in which case it is set to 33/32.
The presence of ECN/CE means that an
on path router is implementing either L4S (<xref target="RFC9331"/>) or another
ECN marking scheme.</t>

<t>C4 exits the probing state after one era, or if a congestion
signal is received before that.</t>

</section>
<section anchor="c4-pushing"><name>Pushing state</name>

<t>The pushing state is entered from the Recovery state if a previous
probing was successful, as stated in <xref target="c4-recovery"/>.</t>

<t>The coefficient <spanx style="verb">alpha-current</spanx> is set to 5/4.</t>

<t>The pushing phase lasts for at least two eras. During the first
era, measurements correspond to data sent during the recovery
phase, which are unlikely to result in detection of rate increases.
After that first phase, C4 assesses whether the new "nominal rate"
has increased sufficiently druing the previous RTT. If it has, C4
will continue in the pushing phase. If it has not, the flow will
transition to recovery.</t>

<t>We define "increased sufficiently" as reaching at least 19/16th of the
nominal rate at the beginning of the era.</t>

<t>C4 also exits the pushing state if a congestion
signal is received. 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 Pushing state.</t>

</section>
</section>
<section anchor="congestion-response"><name>Handling of congestion signals</name>

<t>C4 responds to congestion events by reducing the nominal rate, and
in some condition also reducing the nominal max RTT. C4 monitors
3 types of congestion events:</t>

<t><list style="numbers" type="1">
  <t>Excessive increase of measured 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>C4 monitors successive RTT measurements and compare them to
a reference value, defined as the sum of the "nominal max rtt"
and a "delay threshold". C4 monitors the arrival of packet losses
computes a "smoothed error rate", and compares it to a
"loss threshold". When the path supports ECN, C4 monitors the
arrival of ECN marks and computes a "smoothed CE rate",
and compares it to a "CE threshold". These coefficients
depend on the sensitivity coefficient defined in <xref target="sensitivity"/>.</t>

<section anchor="sensitivity"><name>Variable Sensitivity</name>

<t>The three congestion detection thresholds are
function of the "sensitivity" coefficient,
which increases with the nominal rate of the flow. Flows
operating at a low data rate have a low sensitivity coefficient
and reacts slower to congestion signals than flows operating
at a higher rate. If multiple flows share the same bottleneck,
the flows with higher data rate will detect congestion signals
and back off faster than flow operating at lower rate. This will
drive these flows towards sharing the available resource evenly.</t>

<t>The sensitivity coefficient varies from 0 to 1, according to
a simple curve:</t>

<t><list style="symbols">
  <t>set sensitivity to 0 if data rate is lower than 50000 B/s</t>
  <t>linear interpolation between 0 and 0.92 for values
between 50,000 and 1,000,000 B/s.</t>
  <t>linear interpolation between 0.92 and 1 for values
between 1,000,000 and 10,000,000 B/s.</t>
  <t>set sensitivity to 1 if data rate is higher than
10,000,000 B/s</t>
</list></t>

<t>The sensitivity index is then used to set the value of delay and
loss and CE thresholds.</t>

</section>
<section anchor="detecting-excessive-delays"><name>Detecting Excessive Delays</name>

<t>The delay threshold is function of the nominal max RTT and the
sensitivity coefficient:</t>

<figure><artwork><![CDATA[
    delay_fraction = 1/16 + (1 - sensitivity)*3/16
    delay_threshold = min(25ms, delay_fraction*nominal_max_rtt)
]]></artwork></figure>

<t>A delay congestion signal is detected if:</t>

<figure><artwork><![CDATA[
    rtt_sample > nominal_max_rtt + delay_threshold
]]></artwork></figure>

</section>
<section anchor="detecting-excessive-losses"><name>Detecting Excessive Losses</name>

<t>C4 maintains an average loss rate, updated for every packet
as:</t>

<figure><artwork><![CDATA[
    if packet_is_lost:
        loss = 1
    else:
        loss = 0
    smoothed_loss_rate = (loss + 15*smoothed_loss_rate)/16
]]></artwork></figure>

<t>The loss threshold is computed as:</t>

<figure><artwork><![CDATA[
    loss_threshold = 0.02 + 0.50 * (1-sensitivity);
]]></artwork></figure>

<t>A loss is detected if the smoothed loss rate is larger than the threshold.
In that case, the coefficient <spanx style="verb">beta</spanx> is set to 1/4.</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>
<section anchor="process-ecn"><name>Detecting Excessive CE Marks</name>

<t>The way we handle ECN signals is designed to be compatible with L4S <xref target="RFC9331"/>.
When the path supports ECN marking, C4 monitors the arrival of ECN/CE and
ECN/ECT(1) marks by computing the ratio <spanx style="verb">ecn_alpha</spanx>. Congestion is detected
when that ratio exceeds <spanx style="verb">ecn_threshold</spanx>, which varies depending on the
sensitivity coefficient:</t>

<figure><artwork><![CDATA[
ecn_threshold = (2-sensitivity)*3/32
]]></artwork></figure>

<t>The ratio <spanx style="verb">ecn_alpha</spanx> is
updated each time an acknowledgement is received, as follow:</t>

<figure><artwork><![CDATA[
delta_ce = increase in the reported CE marks
delta_ect1 = increase in the reported ECT(1) marks
frac = delta_ce / (delta_ce + delta_ect1)

if frac >= 0.5:
    ecn_alpha = frac
else:
    ecn_alpha += (frac - ecn_alpha)/16

if ecn_alpha > ecn_threshold:
    report congestion
]]></artwork></figure>

<t>Congestion detection causes C4 to enter recovery. The
ration <spanx style="verb">ecn_alpha</spanx> is set to zero on exit of recovery.</t>

</section>
<section anchor="applying-congestion-signals"><name>Applying congestion signals</name>

<t>On congestion signal, if C4 was not in recovery state, it
will enter recovery.</t>

<t>As stated in <xref target="c4-initial"/> and <xref target="c4-pushing"/>, detecting
a congestion in the Initial or Pushing state does not cause
a change in the <spanx style="verb">nominal_rate</spanx> or <spanx style="verb">nominal_max_RTT</spanx>, because
the pacing rate in these states is larger than the
<spanx style="verb">nominal_rate</spanx>. Rate reduction only happens if recovery
was entered from the Cruising state</t>

<section anchor="rate-reduction"><name>Rate Reduction on Congestion</name>

<t>On entering recovery from the cruising state, C4 reduces the
<spanx style="verb">nominal_rate</spanx> by the factor "beta"
corresponding to the congestion signal:</t>

<figure><artwork><![CDATA[
    nominal_rate = (1-beta)*nominal_rate
]]></artwork></figure>

<t>The coefficient <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.</t>

<t>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>:</t>

<figure><artwork><![CDATA[
    beta = min(1/4,
              (rtt_sample - (nominal_max_rtt + delay_threshold)/
               delay_threshold))
]]></artwork></figure>

<t>If the signal is an ECN/CE rate, the coefficient is proportional
to the difference between <spanx style="verb">ecn_alpha</spanx> and <spanx style="verb">ecn_threshold</spanx>, capped to <spanx style="verb">1/4</spanx>:</t>

<figure><artwork><![CDATA[
    beta = min(1/4, (ecn_alpha - ecn_threshold)/ ecn_threshold)
]]></artwork></figure>

</section>
<section anchor="persistent-congestion"><name>Reaction to persistent congestion</name>

<t>C4 makes a distinction between intermittent congestion, which is handled
by reducing the nominal rate as specified in <xref target="rate-reduction"/>, and
persistent congestion, which is detected if 2 congestion events
appear in rapid succession.</t>

<t>C4 handles two variables to manage the reaction to persistent congestion:
the number of successive congestion events and the "recent maximum rate":</t>

<t><list style="symbols">
  <t>The number of successive congestion events is managed upon exiting
a recovery era. It is reset to zero if no congestion signal was received
upon entering that era or during that era, and is incremented by 1 otherwise.</t>
  <t>The "recent maximum rate" is the maximum rate measurement observed since
the end of the previous recovery period, i.e., the recovery period that
preceded the current one.</t>
</list></t>

<t>If the number of successive congestion events is larger than 1, C4 will
check if at least one rate measurement has been received since the end
of the previous recovery period, i.e, if the "recent maximum rate" is larger
than 0. If so, C4 will reset
the "nominal rate" to the "recent maximum rate".</t>

</section>
</section>
<section anchor="trimming"><name>Trimming an overestimated nominal rate</name>

<t>Despite taking precautions to make the rate estimation reliable, there
are bound to be mistakes, and the nominal rate may be a little too high.
This will cause the slow building of queues, and a slow increase of
the RTT, until the network queues eventually fill up and a congestion
signal is received.</t>

<t>C4 avoids the slow building of queues by "trimming" the nominal RTT
before exiting the recovery phase, if:</t>

<t><list style="symbols">
  <t>The nominal data rate did not grow during the previous cycle,</t>
  <t>No congestion was notified, and,</t>
  <t>The connection was not application limited during the pushing phase.</t>
</list></t>

<t>If those conditions are all verified, the "nominal rate" is set to the
maximum the "maximum rate" for this cycle and for the previous
non-application-limited cycle.</t>

</section>
<section anchor="draining"><name>Draining the standing queues</name>

<t>Queues may build up if C4 has been sending data at a rate higher than the actual path
capacity, and if the number of bytes in transit is higher than the bandwidth
delay product. This can happen during an Initial phase, during a Pushing phase,
or if the path RTT is reduced. C4 manages these events using two variables,
the "backlog" fraction and the "draining needed" flag.</t>

<t>The backlog fraction is initialized to zero. It is set to 1 (100%) upon exit of the
Initial phase, and incremented by 0.25 (25%) upon exit of the Pushing phase.
The "draining needed" flag is set if the RTT is reduced.</t>

<t>Upon entering the recovery phase, the coefficient "alpha" is set
to:</t>

<t><list style="symbols">
  <t>15/16 if the backlog value is lower or equal to 1/16th</t>
  <t>else, 7/8th if the backlog value is lower or equal to 1/8th</t>
  <t>else, 3/4th.</t>
</list></t>

<t>Upon exiting the recovery phase, the backlog fraction is reduced by
(1 - alpha), or set to zero if the backlog is less than (1 - alpha).</t>

</section>
</section>
<section anchor="implementation-considerations"><name>Implementation considerations</name>

<t>Implementing C4 ought to be straightforward, but developers need to pay
attention to measurement of data rates and to pacing issues when the
CPU load is high.</t>

<section anchor="rate-measurement-should-be-conservative"><name>Rate measurement should be conservative</name>

<t>The standard algorithm for rate measurement is to consider the amount
of data acknowledged in an interval of time, and divide that amount
by the duration of the interval. This algorithm can result in
over-estimates of the rate in presence of data jitter. These
excessive estimates could cause C4 to set a nominal rate higher
than the network path bandwidth, resulting in queue build-up and
excessive delays.</t>

<t>There are two known ways to reduce the effect of jitter: filter out
measurements in which the data rate measured through acknowledgements
is larger than the send rate; and, make sure that the measurement
interval are long enough so jitter only has a small influence. Cautious
implementations should use both strategies.</t>

</section>
<section anchor="pacing-and-cpu-load"><name>Pacing and CPU load</name>

<t>C4 relies on pacing during to avoid sending data too fast.
Pacing is often implemented
using a "leaky bucket" algorithm, which refills the bucket at the
pacing rate, allows transmission as long as there are enough tokens
in the bucket, and forces transmission to wait when all tokens are
consumed. The wait time is computed based on the pacing rate
and the number of desired tokens, and is implemented using
operating system commands such as <spanx style="verb">select()</spanx>, <spanx style="verb">poll()</spanx>,
<spanx style="verb">epoll()</spanx> or <spanx style="verb">sleep()</spanx>. In high CPU load conditions, we observe
that these commands often return after more than the specified
wait time, resulting in a lower sending rate than the desired
pacing rate.</t>

<t>This phenomenom is particularly visible in low-latency paths.
The generic solution would probably be to estimate how much slower
the actual pacing is compared to the desired rate, and increase the
programmed pacing rate by a value proportional to these measurements.
This generic solution is not yet specified. In between, implementations
had success with a simple fix: increase the pacing rate 3/64th in
"cruising" state when the RTT is less than 1ms. This definitely
improved performance in low-latency environment, in particular
loopback interfaces.</t>

</section>
<section anchor="nominal-max-rtt-on-low-latency-links"><name>Nominal max RTT on low latency links</name>

<t>When doing tests on low latency links, we observed on some systems
a lot of measurement jitter. The measured RTT is the sum of the
actual RTT and some system wakeup delay, which can vary between a
few microseconds and maybe 1 millisecond. The default algorithm
will adapt the nominal RTT after each roundtrip, which can lead
to excessively low values, causing a slowdown of the transmission.
A solution is to set a "floor" value to the nominal max RTT,
updating it to the maximum of the measured value and the floor.
Setting the floor value to 1ms did improve performance.</t>

</section>
</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 too 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='References' anchor="sec-combined-references">

    <references title='Normative References' anchor="sec-normative-references">

&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References' anchor="sec-informative-references">

&RFC6582;
&RFC9000;
&I-D.ietf-moq-transport;
&RFC9331;
&RFC9406;
&RFC9959;


    </references>

</references>


<?line 879?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>
<section numbered="false" anchor="changes-since-previous-versions"><name>Changes since previous versions</name>

<t>This section should be deleted before publication as an RFC</t>

<section numbered="false" anchor="changes-since-draft-huitema-ccwg-c4-spec-04"><name>Changes since draft-huitema-ccwg-c4-spec-04</name>

<t><list style="symbols">
  <t>trimming of the nominal rate if it does not increase for the cycle</t>
  <t>draining of the network queues and managing backlog</t>
  <t>make sure that C4 does not stall in bad wifi conditions</t>
</list></t>

</section>
<section numbered="false" anchor="changes-since-draft-huitema-ccwg-c4-spec-03"><name>Changes since draft-huitema-ccwg-c4-spec-03</name>

<t>Introduce a minimum pacing rate during the initial phase.</t>

</section>
<section numbered="false" anchor="changes-since-draft-huitema-ccwg-c4-spec-02"><name>Changes since draft-huitema-ccwg-c4-spec-02</name>

<t>Added a "resuming" state for implementing the "careful resume"
algorithm.</t>

<t>Separate "probing" state, which lasts just one RTT before
success is evaluated, and a more aggressive "pushing" state,
which lasts until rate measurements stop growing. This replaces
the use of "probe level" introduced in draft-02.</t>

<t>Added a faster "reaction to persistent congestion".</t>

</section>
<section numbered="false" anchor="changes-since-draft-huitema-ccwg-c4-spec-01"><name>Changes since draft-huitema-ccwg-c4-spec-01</name>

<t>Revised the description of the initial state do derive the CWIN
from a Reno like algorithm, avoiding the need to estimate max RTT
during the initial startup.</t>

<t>Introduces a "probe level" with progressively increasing rates of
probing as previous trials succeed.</t>

<t>Added implementation considerations.</t>

</section>
<section numbered="false" anchor="changes-since-draft-huitema-ccwg-c4-spec-00"><name>Changes since draft-huitema-ccwg-c4-spec-00</name>

<t>Rewrote the description of the Initial state in <xref target="c4-initial"/>
to remove dependency on nominal max RTT.</t>

<t>Added the specification of reaction to ECN in <xref target="process-ecn"/>
and in <xref target="rate-reduction"/>. Update section <xref target="c4-pushing"/> to
modulate pushing rate based on observed rate of ECN/CE marks.</t>

<t>Added the RTT margin consideration in <xref target="set_pace"/>, and 
changed the computation of the "quantum" from:</t>

<figure><artwork><![CDATA[
quantum = max ( min (cwnd / 4, 64KB), 2*MTU)
]]></artwork></figure>

<t>to:</t>

<figure><artwork><![CDATA[
quantum = max ( min (pacing_rate*4_milliseconds, 64KB), 2*MTU)
]]></artwork></figure>

<t>The old formula caused long bursts of packets that would
trigger packet drops or ECN/CE marking by active queue management
algorithms.</t>

</section>
</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA619aXfbyLHo9/4V/ehzTySLpFbPooznxCN77jgZL7E1b+77
ciUQaFKIQICDRbRiOb/91tYbAMl23vXJxDSJ7q6urq69CrPZTLV5W5hTPXm/
MWm+zNOkzatSV0t9dlXnTZsn5Z8afVaVK9PQL/CxrasC/s6M3jk72Z2oZLGo
zQ3McXaio2kmCv42q6q+PdXmw0aprErLZA3LZXWybGdXXd6adTJL0+1qlp7M
Ghg8O3iimm6xzpsGZmhvN/D0yxfnP6uyWy9MfaoymPJUpVXZmLLpmlPd1p1R
+aamT017dHDw/cGRSmqTAEi/m4VOyky/LFtTl6bV53VSNpuqbifq2txuqzo7
VXqmz07o/wf7xG/fmaRo87WB79brrpTN4S+vTJYnuroxtf77by/PlEq69qqq
cUaltc5LAO9srn/hfeJXvH2H2/Cnql6d6rd1fgMb1G/Sttp0DcCdzvFHeCYv
TrVg7C/y9xx2FK71fq5fw26T626d1H65991V0vR+gdWSMv8nbQUAypu0CtZp
Sn74Lyn+ME+rdW9LfzVlmZerJthTVxSmjH54eI1l0S2Xt3/J83yeJkqVVb2G
J2/gcOGZdz+fHR0efm8/f3f47cmpystl/6Fvnnx3ZD9/f3BwQJ9fzp7Pc9Mu
Z+vqj1lrD9w9dnx86D6fHHzjPn//BNZTs9lMJ4sGhqWtUl9yC/JGJ7o0W536
B1Ihn6QA8s/bq7XOTJOvSpPpttJNt0GIiLJm50hayWZTCGE18HN6pZNG9chr
rl+2uFg4Uwb0YuDDNqmzRhfVFn4tkttmqrawql5VVeZWA+Tp9sroSbCYLvI1
kFI20QtzldzkVa2WtfmjM2Vb3MKIDu7O9grOtWvgVPVNUufJojC6RiI1ZVpl
8PUUrxgvuEyaVsPVS2lyADDACfwruanyjIHY1Dli5hZOFTaIl32irwAyg+TD
aw7xScjAr4AKTKNwouQGqIlgSpNNksKMc30O3zOWgNg2QPz5Pw2gNV/jvuEJ
gpdgafQ6ucYF26qCjyX81DTdesMHkSyqrmVw13DSxQQYIy0K9w5Yx/WcyWWd
Z1lhlHqEbKauso52/2XEgyyUKej/g3rWHTEopJaQkKa6sey4KG7VPU/J0SKF
6Y8f5R59+kRsE/dKVKgcFWp3oeDp8Zv26RMgBs8AkARIzUtHN0S8aZ0vCOXw
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
XEJkVF+9hf/DBGOuY2ffQeKulXhKrN+wMbqXq9wm11TJnlc1y7xeuZDVRZPW
Zjkndc2a0Nguso5vsRNbPDMPJaVNuAGgBLaDukAU42MisIk4llU4zsc3AgsS
5SpNNU2KN79PTfdhW9VmWVCurE28xVw7ynIBWzyoc7C31bmHEyI5UfY2tlWC
qFqgUqwwUwPz0/pZvBbGOCaBI+2+5xQosBAhQHZ+3KzPa8NqkTX1A2lRFQ8c
HRFDYVXWJ19MhBlNei0J2pCVgbDLK4JTYc2JVaaEhBrSm8SxHaovhB7yJqqP
H+WZGU4w4wkwCThMdPJc12Y0IRE4/bpfKCZMPDiXeGGXtukK1MgLYdXdnmIM
tHgZhgdAuF46hcZtz64AqPgFMfFXxsTHR2PbE8/4QGUS94g4Lu7dwFTZEjns
C8FZ4OwapKviMvtLIpaq3lS1q91r7KNStzf06bBjnVyPqGFhYW2T12RwLY3J
KFGqqKoNSu+cVyxAJUNWEBbhBqnwdqOKfVd50H0F3fDOXU/xJaqVoiZDAUUx
cRIDEg2RJ84tjfLB5suIDIP8vLiem/Sc4EkVPsnuoi6sdxxRbtmkGbsT1LAj
X0owrF/W8kM/1PT4aP+JREucL8haKzVeRmSoipK0+XLWt6PuMWwngCdHNpdU
YAE+XPrWoWYvKmnOYPlsmqjafPR247xcRsh2qsli3tr3z8GV6GkipAi5HEgh
/L62MqIJxfrU16kuAbEEnVJo6t7K8LTl2Cy2k0A/HJ8GhjjYnNMSuTyg+osU
yd5ksj4jLwKGcWeDJYy5TfTAGOLiHd4buRpF3LcU8enKAi1RMKVnZy8UBg1G
jdegnHTqexCR2sl6lsxK0RxxpmL9rCgqHHyINKJSVSVf/7rq5P66nki5r3z+
9eS93mHf0PHxITaIwjTFkpzKGNSgQAehIL2Csd5H01grL8AhnzjmNtK9HZoE
6oGTBLDl4EJJKgfHX9mDix74PMUzFK5yOZTsXgPhIvSWZIW1MJ3R8QmrtscP
fzZy+E/2T+YxqMxVvPnnOIlNr5/rwL1LSrEiHMbV+K5VErlcUJOJVWbPb5Ro
TdLNCvt1lFgIjKWwlSTd4j59ojzQUR2pgnMlFQDEs1hPl9ZWJzYo0bgWVNZq
iWMrChmkS9wFdFvsARxZ3bnIo2WC5A0ATSzHDPkGV2IvKNYs52Xn1IoIr8EI
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
S8qArWoPXnXk2SzinP78D1bbBkbeigAA

-->

</rfc>

