<?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-01" 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="February" day="26"/>

    <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="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[
if (c4_state == initial):
    margin = 0
else:
    margin = min(nominal_max_rtt/4, 15_milliseconds)

pacing_rate = alpha_current * nominal_rate
cwnd = max ((pacing_rate+margin) * nominal_max_rtt, 2*MTU)
]]></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>&#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>

<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.</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 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.</t>

<t>The coefficient <spanx style="verb">alpha_current</spanx> depend on whether the
previous
pushing attempt was successful (see <xref target="c4-recovery"/>),
and also of the current value of <spanx style="verb">ecn_alpha</spanx>
(see <xref target="process-ecn"/>):</t>

<figure><artwork><![CDATA[
   if not previous_attempt_successful:
       alpha_current = 17/16
   else:
       alpha_current = 17/16 +
          17/16 * (1 - ecn_alpha / ecn_threshold)
]]></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 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="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 '1/4':</t>

<figure><artwork><![CDATA[
    beta = min(1/4, (ecn_alpha - ecn_threshold)/ ecn_threshold))
]]></artwork></figure>

</section>
</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 658?>

<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-00"><name>Changes since draft-huitema-ccwg-c4-spec-00</name>

<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:
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
AAA=

-->

</rfc>

