<?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 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">
]>


<rfc ipr="trust200902" docName="draft-huitema-ccwg-c4-spec-00" 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="2025" month="October" day="19"/>

    <area>Web and Internet Transport</area>
    
    <keyword>C4</keyword> <keyword>Congestion Control</keyword> <keyword>Realtime Communication</keyword> <keyword>Media over QUIC</keyword>

    <abstract>


<?line 44?>

<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 57?>

<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, Recovery in which a flow is
stabilized after the Initial or Pushing phase, Cruising during which
a flow uses the nominal rate, and Pushing during which the flow
tries to discover if more resource is available -- 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>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>number of successful pushes,</t>
  <t>current state of the algorithm, which can be Initial, Recovery,
Cruising or Pushing.</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>"Initial": 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>"Recovery": the connection enters that state after
"Initial", "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 if it detects high
jitter and the previous initial was not run
in these conditions (see ). It 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>"Pushing": the connection is using a rate and CWND 25%
larger than "nominal_rate" and "nominal_CWND".
It remains in that state
for one round trip, i.e., until the first packet
send while "pushing" is acknowledged. At that point,
it enters the "recovery" state.</t>
</list></t>

<t>These transitions are summarized in the following state
diagram.</t>

<figure><artwork><![CDATA[
                    Start
                      |
                      v
                      +<-----------------------+
                      |                        |
                      v                        |
                 +----------+                  |
                 | Initial  |                  |
                 +----|-----+                  |
                      |                        |
                      v                        |
                 +------------+                |
  +--+---------->|  Recovery  |                |
  ^  ^           +----|---|---+                |
  |  |                |   |  First High Jitter |
  |  |                |   |  or Rapid Increase |
  |  |                |   +------------------->+
  |  |                |
  |  |                v
  |  |           +----------+
  |  |           | Cruising |
  |  |           +-|--|-----+
  |  | Congestion  |  |
  |  +-------------+  |
  |                   |
  |                   v
  |              +----------+
  |              | Pushing  |
  |              +----|-----+
  |                   |
  +<------------------+

]]></artwork></figure>

<section anchor="setting-pacing-rate-congestion-window-and-quantum"><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
cwnd = max (pacing_rate * nominal_max_rtt, 2*MTU)
quantum = max ( min (cwnd / 4, 64KB), 2*MTU)
]]></artwork></figure>

<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>&#160;</c>
      <c>Recovery</c>
      <c>15/16</c>
      <c>&#160;</c>
      <c>Cruising</c>
      <c>1</c>
      <c>&#160;</c>
      <c>Pushing</c>
      <c>5/4 or 17/16</c>
      <c>see <xref target="c4-pushing"/> for rules on choosing 5/4 or 17/16</c>
</texttable>

</section>
<section anchor="c4-initial"><name>Initial state</name>

<t>When the flow is 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 and CWND to be set default
initial values. The nominal max RTT will be set to the
first assessed RTT value, but is not otherwise changed
during the initial phase. The nominal rate is updated
after receiving acknowledgements, see {#nominal-rate}.</t>

<t>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>C4 exit the Initial if receiving a congestion signal and the
following conditions are true:</t>

<t>1- If the signal is due to "delay", 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 is meant to prevent spurious exit
due to delay jitter. The restriction on loss signals is meant
to ensure that enough packets have been received to properly
assess the loss rate.</t>

</section>
<section anchor="c4-recovery"><name>Recovery state</name>

<t>The recovery state is entered from the Initial 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 when acknowledgements received during recovery
reflect a successful "push" during the Pushing phase. The prior "Pushing"
is considered successful if it did not trigger any congestion event,
and if the data rate increases sufficiently
between the end of previous Recovery and the end of this one, with
sufficiently being defined as:</t>

<t><list style="symbols">
  <t>Any increase if the prior pushing rate (alpha_prior) was 17/16 or
less,</t>
  <t>An increase of at least 1/4th of the expected increase otherwise,
for example an increase of 1/16th if <spanx style="verb">alpha_previous</spanx> was 5/4.</t>
</list></t>

<t>C4 re-enters "Initial" at the end of the recovery period if the evaluation
shows 3 successive rate increases without congestion, or if
high jitter requires restarting the Initial phase (see
<xref target="restart-high-jitter"/>. Otherwise, C4 enters cruising.</t>

<t>Reception 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 doing so would prevent exiting Initial on high delay
detection. 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 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:</t>

<figure><artwork><![CDATA[
running_min_rtt < nominal_max_rtt*2/5
]]></artwork></figure>

<t>This will be done at most once per flow.</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 normally transition from Cruising state to Pushing state
after 4 eras. It will transition to Recovery before that if
a congestion signal is received.</t>

</section>
<section anchor="c4-pushing"><name>Pushing state</name>

<t>The Pushing state is entered from the Cruising state. 
The coefficient <spanx style="verb">alpha_current</spanx> is set to 5/4 if the previous
pushing attempt was successful (see <xref target="c4-recovery"/>),
or 17/16 if it was not.</t>

<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 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 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 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="detecting-excessive-ce-marks"><name>Detecting Excessive CE Marks</name>

<t>TBD. The plan is to mimic the L4S specification.</t>

</section>
<section anchor="rate-reduction-on-congestion"><name>Rate Reduction on Congestion</name>

<t>On entering recovery, 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_threshod))
]]></artwork></figure>

<t>If the signal is an ECN/CE rate, this is still TBD. We could
use a proportional reduction coefficient in line with
<xref target="RFC9331"/>, but we should use the sensitivity coefficient to
modulate that signal.</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">

&RFC9000;
&I-D.ietf-moq-transport;
&RFC9331;


    </references>

</references>


<?line 582?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
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
/wL1p+W1zlAAAA==

-->

</rfc>

