<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-johansson-ccwg-rfc8298bis-screamv2-04" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-04"/>
    <author initials="I." surname="Johansson" fullname="Ingemar Johansson">
      <organization>Ericsson</organization>
      <address>
        <email>ingemar.s.johansson@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Westerlund" fullname="Magnus Westerlund">
      <organization>Ericsson</organization>
      <address>
        <email>magnus.westerlund@ericsson.com</email>
      </address>
    </author>
    <author initials="M." surname="Kühlewind" fullname="Mirja Kühlewind">
      <organization>Ericsson</organization>
      <address>
        <email>mirja.kuehlewind@ericsson.com</email>
      </address>
    </author>
    <date year="2025" month="July" day="07"/>
    <area>WIT</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 119?>

<t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2), an update to SCReAM congestion control for media streams such as RTP
<xref target="RFC3550"/>. SCReAMv2 includes several algorithm simplifications and adds
support for L4S. The algorithm supports handling of multiple media streams,
typical use cases are streaming for remote control, AR and 3D VR googles.
This specification obsoletes RFC 8298.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-johansson-ccwg-rfc8298bis-screamv2/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Congestion Control Working Group (ccwg) Working Group mailing list (<eref target="mailto:ccwg@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/ccwg/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/ccwg/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/gloinul/draft-johansson-ccwg-scream-bis"/>.</t>
    </note>
  </front>
  <middle>
    <?line 128?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2). This specification replaces the previous experimental version <xref target="RFC8298"/> of
SCReAM with SCReAMv2. There are many and fairly significant changes to the
original SCReAM algorithm as desribed in section <xref target="sec_changes"/>.</t>
      <t>Both SCReAM and SCReAMv2 estimates the forward queue delay in the same way as Low
Extra Delay Background Transport (LEDBAT) <xref target="RFC6817"/>.
However, while SCReAM is based on the self-clocking principle of TCP,
SCReAMv2 is not entirely self-clocked as it augments self-clocking with pacing
and a minimum send rate.</t>
      <t>Further, SCReAMv2 can take advantage of Explicit
Congestion Notification (ECN) <xref target="RFC3168"/> and Low Latency Low Loss and Scalable
throughput (L4S) <xref target="RFC9330"/> in cases where ECN or L4S is supported by the
network and the hosts. However, ECN or L4S is not required for the basic
congestion control functionality in SCReAMv2.</t>
      <section anchor="sec_changes">
        <name>Updates Compared to SCReAM (version 1)</name>
        <t>The algorithm in this memo differs considerably compared to the previous version of
SCReAM in <xref target="RFC8298"/>. The main differences are:</t>
        <ul spacing="normal">
          <li>
            <t>L4S support added. The L4S algoritm has many similarities with the DCTCP and
Prague congestion control but has a few extra modifications to make it work
well with periodic sources such as video.</t>
          </li>
          <li>
            <t>The delay based congestion control is changed to implement a pseudo-L4S
approach, this simplifies the delay based congestion control.</t>
          </li>
          <li>
            <t>The fast increase mode is removed. The reference window additive increase is
replaced with an adaptive multiplicative increase to enhance convergence
speed.</t>
          </li>
          <li>
            <t>The algorithm is more rate based than self-clocked:  </t>
            <ul spacing="normal">
              <li>
                <t>The calculated congestion window is mainly used to calculate proper media bitrates. Bytes in flight is
however allowed to exceeed the reference window. Therefore, The term
reference window is used instead of congestion window, as the reference
window does not set an absolute limit on the bytes in flight.</t>
              </li>
              <li>
                <t>The self-clocking now acts more like an emergency break
as bytes in flight can exceed the reference window only to a certain
degree. The rationale is to be able to transmit large video frames and avoid
that they are unnecessarily queued up on the sender side, but still prevent a
large network queue.</t>
              </li>
            </ul>
          </li>
          <li>
            <t>The media bitrate calculation is dramatically changed and simplified. In practive
it is manifested with a relatively simple relation between the reference window and RTT.</t>
          </li>
          <li>
            <t>Additional compensation is added to make SCReAMv2 handle cases such as large
changing frame sizes.</t>
          </li>
        </ul>
        <t>Algorithm changes in draft version -02 were:</t>
        <ul spacing="normal">
          <li>
            <t>Slow down reference window growth when close to the last known maximum value is disabled
and when L4S is active. This makes SCReAM adhere more closely to two marked packets
per RTT at steady state.</t>
          </li>
          <li>
            <t>Reference window decrease and increase reduced by up to 50% when ref_wnd/mss
is small. This reduces rate oscillations.</t>
          </li>
          <li>
            <t>Target bitrate down adjustment when ref_wnd/mss is small is modified to
avoid that the data unit queue grows excessively in certain low
bitrate cases.</t>
          </li>
          <li>
            <t>Timing set to multiples of RTTs instead of seconds.</t>
          </li>
        </ul>
        <t>Draft version -03 is major editorial pass including removal of some
outdated or background information and reorganisation of several sections:</t>
        <ul spacing="normal">
          <li>
            <t>Much shorter abstract and introduction focusing on what's new in SCReAMv2</t>
          </li>
          <li>
            <t>Removal of Section 1.1. on "Wireless (LTE and 5G) Access Properties" and
Section 1.2. on "Why is it a self-clocked algorithm?"</t>
          </li>
          <li>
            <t>New Section on "Updates compared to SCReAM (version 1)" in introduction
based on old Section on "Algorithm Changes"</t>
          </li>
          <li>
            <t>Section <xref target="ledbat-tfwc"/> updated and shortened</t>
          </li>
          <li>
            <t>Overview Section <xref target="scream-overview"/> revised; now also including the overview
figure and the basic algorithms</t>
          </li>
          <li>
            <t>Own section on "Constants and variables" removed; instead all variables are now listed
in the respective sections that explain the code</t>
          </li>
          <li>
            <t>New Section on "Sender Side State" explaining some basic variables</t>
          </li>
          <li>
            <t>Pseudo code and the corresponding explanations in Section <xref target="network-cc-2"/> on
"Network Congestion Control" moved into the respective subsections in
section <xref target="reaction-delay-loss-ce"/> on "Congestion Detection"</t>
          </li>
          <li>
            <t>Separate section on "Sender Transmission Control" introduced</t>
          </li>
          <li>
            <t>Section "Lost Data Unit Detection" merged into Section <xref target="reaction-loss"/></t>
          </li>
          <li>
            <t>Section "Stream Prioritization" removed</t>
          </li>
          <li>
            <t>Section on "Competing Flows Compensation" moved into Section <xref target="reaction-delay-loss-ce"/>
on "Congestion Detection"</t>
          </li>
        </ul>
      </section>
      <section anchor="requirements-media">
        <name>Requirements on the Media and Feedback Protocol</name>
        <t>SCReAM was originally designed to with with RTP + RTCP where <xref target="RFC8888"/> was
used as recommended feedback. RTP offers unique packet indication with the
sequence number and <xref target="RFC8888"/> offers timestamps of received packets and the
status of the ECN bits.</t>
        <t>SCReAM is however not limited to RTP as long as some requirements are fulfilled :</t>
        <ul spacing="normal">
          <li>
            <t>Media data is split in data units that when encapsulated in IP packets fit in
the network MTU.</t>
          </li>
          <li>
            <t>Each data unit can be uniquely identified.</t>
          </li>
          <li>
            <t>Data units can be queued up in a packet queue before transmission.</t>
          </li>
          <li>
            <t>Feedback can indicate reception time for each data units, or a group of data
units.</t>
          </li>
          <li>
            <t>Feedback can indicate packets that are ECN-CE marked. Unique ECN bits
indication for each packet is not necessary. An ECN-CE counter similar to
what is defined in <xref target="RFC9000"/> is sufficient.</t>
          </li>
        </ul>
      </section>
      <section anchor="ledbat-tfwc">
        <name>Comparison with LEDBAT and TFWC in TCP</name>
        <t>The core SCReAM algorithm, which is still similar in SCReAMv2, has similarities
to the concepts of self-clocking used in TCP-friendly window-based congestion
control <xref target="TFWC"/> and follows the packet conservation principle. The packet
conservation principle is described as a key factor behind the protection of
networks from congestion <xref target="Packet-conservation"/>.</t>
        <t>The reference window decrease is determined in a way similar to
LEDBAT <xref target="RFC6817"/>. However, the window increase is not based on
delay estimates but uses both a linear increase and multiplicate increase function depending
on the time since the last congestion event and introduces use of inflection points in the
reference window increase calculation to achieve reduced delay jitter.
Further, other than LEDABT which is a scavenger congestion control mostly designed
for low priority background traffic, SCReAM adjusts the qdelay target to
compete with other loss-based congestion-controlled flows.</t>
        <t>SCReAMv2 adds a new reference window validation technique, as the reference window is used as a basis for the
target bitrate calculation. For that reason, various actions are taken to avoid
that the reference window grows too much beyond the bytes in flight. Additional
contraints are applied when in congested state and when the maximum target bitrate is reached.</t>
        <t>The SCReAM/SCReAMv2 congestion control method uses techniques similar to LEDBAT
<xref target="RFC6817"/> to measure the qdelay. As is the case with LEDBAT, it is not
necessary to use synchronized clocks in the sender and receiver in order to
compute the qdelay. However, it is necessary that they use the same clock
frequency, or that the clock frequency at the receiver can be inferred reliably
by the sender. Failure to meet this requirement leads to malfunction in the
SCReAM/SCReAMv2 congestion control algorithm due to incorrect estimation of the
network queue delay. Use of <xref target="RFC8888"/> as feedback ensures that the same time
base is used in sender and receiver.</t>
      </section>
    </section>
    <section anchor="requirements">
      <name>Requirements Language</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="scream-overview">
      <name>Overview of SCReAMv2 Algorithm</name>
      <t>SCReAMv2 consists of three main parts: network congestion control, sender
transmission control, and media rate control. All of these parts reside at the
sender side while the receiver is assumpted to provide acknowledgements of received
data units and indication of ECN-CE marking, either as an accumulated bytes counter,
or per individual data unit.</t>
      <t>The sender implements media rate control and an data unit queue for each media
type or source, where data units containing encoded media frames are temporarily
stored for transmission. Figure 1 shows the details when a single media source
(or stream) is used. Scheduling and priotization of mulitiple streams is not
covered in this document. However, if multiple flows are sent, each data unit queue can be
served based on some defined priority or simply in a round-robin fashion. Alternatively,
a similar approach as coupled congestion control <xref target="RFC6365"/> can be applied.</t>
      <figure anchor="fig-sender-view">
        <name>Sender Functional View</name>
        <artset>
          <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="528" width="472" viewBox="0 0 472 528" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,32 L 8,64" fill="none" stroke="black"/>
              <path d="M 8,160 L 8,224" fill="none" stroke="black"/>
              <path d="M 8,320 L 8,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 8,512" fill="none" stroke="black"/>
              <path d="M 64,72 L 64,96" fill="none" stroke="black"/>
              <path d="M 64,120 L 64,152" fill="none" stroke="black"/>
              <path d="M 64,232 L 64,256" fill="none" stroke="black"/>
              <path d="M 64,392 L 64,416" fill="none" stroke="black"/>
              <path d="M 112,160 L 112,224" fill="none" stroke="black"/>
              <path d="M 112,320 L 112,384" fill="none" stroke="black"/>
              <path d="M 240,192 L 240,224" fill="none" stroke="black"/>
              <path d="M 240,248 L 240,336" fill="none" stroke="black"/>
              <path d="M 336,320 L 336,384" fill="none" stroke="black"/>
              <path d="M 344,144 L 344,240" fill="none" stroke="black"/>
              <path d="M 384,128 L 384,136" fill="none" stroke="black"/>
              <path d="M 392,288 L 392,312" fill="none" stroke="black"/>
              <path d="M 392,392 L 392,416" fill="none" stroke="black"/>
              <path d="M 392,448 L 392,472" fill="none" stroke="black"/>
              <path d="M 440,144 L 440,240" fill="none" stroke="black"/>
              <path d="M 456,320 L 456,384" fill="none" stroke="black"/>
              <path d="M 464,32 L 464,64" fill="none" stroke="black"/>
              <path d="M 464,480 L 464,512" fill="none" stroke="black"/>
              <path d="M 8,32 L 464,32" fill="none" stroke="black"/>
              <path d="M 8,64 L 464,64" fill="none" stroke="black"/>
              <path d="M 344,144 L 440,144" fill="none" stroke="black"/>
              <path d="M 8,160 L 112,160" fill="none" stroke="black"/>
              <path d="M 120,192 L 240,192" fill="none" stroke="black"/>
              <path d="M 8,224 L 112,224" fill="none" stroke="black"/>
              <path d="M 344,240 L 440,240" fill="none" stroke="black"/>
              <path d="M 8,320 L 112,320" fill="none" stroke="black"/>
              <path d="M 336,320 L 456,320" fill="none" stroke="black"/>
              <path d="M 240,336 L 328,336" fill="none" stroke="black"/>
              <path d="M 120,368 L 328,368" fill="none" stroke="black"/>
              <path d="M 8,384 L 112,384" fill="none" stroke="black"/>
              <path d="M 336,384 L 456,384" fill="none" stroke="black"/>
              <path d="M 8,480 L 464,480" fill="none" stroke="black"/>
              <path d="M 8,512 L 464,512" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="400,472 388,466.4 388,477.6" fill="black" transform="rotate(90,392,472)"/>
              <polygon class="arrowhead" points="400,312 388,306.4 388,317.6" fill="black" transform="rotate(90,392,312)"/>
              <polygon class="arrowhead" points="392,136 380,130.4 380,141.6" fill="black" transform="rotate(90,384,136)"/>
              <polygon class="arrowhead" points="336,368 324,362.4 324,373.6" fill="black" transform="rotate(0,328,368)"/>
              <polygon class="arrowhead" points="336,336 324,330.4 324,341.6" fill="black" transform="rotate(0,328,336)"/>
              <polygon class="arrowhead" points="72,392 60,386.4 60,397.6" fill="black" transform="rotate(270,64,392)"/>
              <polygon class="arrowhead" points="72,232 60,226.4 60,237.6" fill="black" transform="rotate(270,64,232)"/>
              <polygon class="arrowhead" points="72,72 60,66.4 60,77.6" fill="black" transform="rotate(270,64,72)"/>
              <g class="text">
                <text x="216" y="52">Media</text>
                <text x="272" y="52">encoder</text>
                <text x="384" y="84">|</text>
                <text x="372" y="100">Data</text>
                <text x="412" y="100">unit</text>
                <text x="68" y="116">target_bitrate</text>
                <text x="384" y="116">|</text>
                <text x="64" y="180">Media</text>
                <text x="392" y="180">Queue</text>
                <text x="60" y="196">Rate</text>
                <text x="388" y="196">Data</text>
                <text x="64" y="212">Control</text>
                <text x="392" y="212">Units</text>
                <text x="244" y="244">target_bitrate</text>
                <text x="392" y="260">|</text>
                <text x="64" y="276">ref_wnd</text>
                <text x="380" y="276">Data</text>
                <text x="420" y="276">unit</text>
                <text x="64" y="292">RTT</text>
                <text x="64" y="308">|</text>
                <text x="56" y="340">Network</text>
                <text x="396" y="340">Sender</text>
                <text x="60" y="356">Congestion</text>
                <text x="184" y="356">ref_wnd</text>
                <text x="396" y="356">Transmission</text>
                <text x="56" y="372">Control</text>
                <text x="392" y="372">Control</text>
                <text x="176" y="388">Bytes</text>
                <text x="212" y="388">in</text>
                <text x="252" y="388">flight</text>
                <text x="44" y="436">Congestion</text>
                <text x="124" y="436">Feedback</text>
                <text x="380" y="436">Data</text>
                <text x="420" y="436">unit</text>
                <text x="40" y="452">Bytes</text>
                <text x="76" y="452">in</text>
                <text x="116" y="452">flight</text>
                <text x="64" y="468">|</text>
                <text x="216" y="500">UDP</text>
                <text x="260" y="500">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------+
|                       Media encoder                    |
+--------------------------------------------------------+
       ^                                       |
       |                                    Data unit
 target_bitrate                                |
       |                                       V
       |                                  +-----------+
+------------+                            |           |
|    Media   |                            |   Queue   |
|    Rate    |---------------+            |   Data    |
|   Control  |               |            |   Units   |
+------------+               |            |           |
       ^               target_bitrate     +-----------+
       |                     |                  |
    ref_wnd                  |               Data unit
      RTT                    |                  |
       |                     |                  v
+------------+               |           +--------------+
|  Network   |               +---------->|    Sender    |
| Congestion |     ref_wnd               | Transmission |
|  Control   |-------------------------->|   Control    |
+------------+     Bytes in flight       +--------------+
       ^                                        |
       |                                        |
Congestion Feedback                          Data unit
  Bytes in flight                               |
       |                                        v
+--------------------------------------------------------+
|                        UDP socket                      |
+--------------------------------------------------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the data unit queue in
<xref target="fig-sender-view"/>. The data units are sent by the sender transmission controller
from the data unit queue.</t>
      <t>The sender transmission controller (in case of multiple flows a transmission
scheduler) sends the data units to the UDP socket. The sender transmission
controller limits the sending rate so
that the number of bytes in flight is less than the reference window albeit with
a slack to avoid that packets are unnecessarily delayed in the data unit queue.
A pacing rate is calculated based on the target bitrate provided by the
media rate controller.</t>
      <t>Feedback about the received bytes as well as metadata to estimate the congestion
level or queuing delay are provided to the network congestion controller.
The network congestion controller calculated reference window and provides it
togteher with the bytes in flight to the sender transmission control.</t>
      <t>The reference window and the estimated RTT is further provided to the media rate
control to compute the appropriate target bitrate. The target bitrate is
updated whenever the reference window is updated. Additional parameters are also
communicated to make the rate control more stable when the congestion window is
very small or when L4S is not active.</t>
      <section anchor="network-cc">
        <name>Network Congestion Control</name>
        <t>The network congestion control sets reference window (ref_wnd)
which puts an upper limit on how many bytes can be in
flight, i.e., transmitted but not yet acknowledged. The reference window is
however not an absolute limit as slack is given to efficiently transmit
temporary larger media objects, such as video frames. This means that the
algoritm prefers to build up a queue in the network rather than on the sender
side. Additional congestion that this causes will reflect back and cause a
reduction of the reference window.</t>
        <t>Reference window is reduced if congestion is detected. Similar as for
LEDBAT the reference window is reduced either by a fixed fraction in
case of packet loss or Classic ECN marking, or if the estimated queue
delay exceeds a given threshold depending on how much the delay
exceeds the threshold.  SCReAMv2 reduces the reference window in
proportion to the fraction of marked packets if L4S is used (scalable
congestion control).</t>
        <artwork><![CDATA[
ref_wnd = BETA_LOSS * (BETA_ECN|l4s_alpha) * qtarget_alpha * ref_wnd
]]></artwork>
        <t>After a congestion event the reference window seeks to increase by one
segment per RTT until a certain number of RTT elapses. After this
initial congestion avoidance phase the refrence window increases
multiplicativly where the increase factor is adjusted relative to a
previous max value and the time elapsed since last congestion event.
This enables a faster convergence to a higher link speed.</t>
        <artwork><![CDATA[
ref_wnd = ref_wnd + increment
]]></artwork>
      </section>
      <section anchor="sender-tc">
        <name>Sender Transmission Control</name>
        <t>The sender transmission control limits sending rate based on the
relation of the estimated link throughput (bytes in flight) and the reference window.</t>
        <artwork><![CDATA[
send_wnd = ref_wnd * REF_WND_OVERHEAD * frame_size - bytes_in_flight
]]></artwork>
        <t>The respective sending rate is achived by applying packet pacing: Even
if the send window allows for the transmission of a number of packets,
these packets are not transmitted immediately; rather, they are
transmitted in intervals given by the packet size and the estimated
link throughput. Packets are generally paced at a higher rate than the
target bitrate, this makes it possible to transmit occasionally larger
video frames in a timely manner. Further, this mitigates issues with
ACK compression that can cause increased jitter and/or packet loss in
the media traffic.</t>
      </section>
      <section anchor="media-rate-control">
        <name>Media Rate Control</name>
        <t>The media rate control calculates the media rate based on the reference window and RTT.</t>
        <artwork><![CDATA[
target_bitrate = 8 * ref_wnd / s_rtt
]]></artwork>
        <t>The media rate needs to ramp up quickly enough to get a fair share of
the system resources when link throughput increases. Further, the
reaction to reduced throughput must be prompt in order to avoid
getting too much data queued in the data unit queue(s) in the sender.</t>
        <t>For the case that multiple
streams are enabled, the media rate among the streams is distrubuted according
to relative priorities.</t>
        <t>In cases where the sender's frame queues increase rapidly, such as in the case
of a Radio Access Type (RAT) handover, the SCReAMv2 sender MAY implement
additional actions, such as discarding of encoded media frames or frame skipping
in order to ensure that the data unit queues are drained quickly. Frame skipping
results in the frame rate being temporarily reduced. Which method to use is a
design choice and is outside the scope of this algorithm description.</t>
      </section>
    </section>
    <section anchor="scream-detailed-description">
      <name>Detailed Description of SCReAMv2 Sender Algorithm</name>
      <t>This section describes the sender-side algorithm in more detail. It is split
between the network congestion control, sender transmission control, and media
rate control.</t>
      <section anchor="sender-side-state">
        <name>Sender Side State</name>
        <t>The sender needs to maintain sending state and state about the received
feedback, as explained in the following subsections, as well as the following
configuration state:</t>
        <ul spacing="normal">
          <li>
            <t>l4s_active (false): Indicates that L4S is enabled and data units are indeed
marked.</t>
          </li>
        </ul>
        <section anchor="status-update-when-sending-data">
          <name>Status Update When Sending Data</name>
          <t>SCReAMv2 is a window-based and byte-oriented congestion control
protocol, where the number of bytes transmitted is inferred from the
size of the transmitted data units. Thus, a list of transmitted data
units and their respective transmission times (wall-clock time) MUST
be kept for further calculation. Further the following variables are
needed:</t>
          <ul spacing="normal">
            <li>
              <t>data_unit_size (0): Size [byte] of the last transmitted data unit.</t>
            </li>
            <li>
              <t>bytes_in_flight: The number of bytes in flight is computed as the sum of the
sizes of the data units ranging from the data unit most recently transmitted,
down to but not including the acknowledged data unit with the highest sequence
number.</t>
            </li>
          </ul>
          <t>bytes_in_flight can be also seen as the difference between the highest transmitted
byte sequence number and the highest acknowledged byte sequence number. As an
example: If a data unit with sequence number SN is transmitted and the last
acknowledgement indicates SN-5 as the highest received sequence number, then
bytes_in_flight is computed as the sum of the size of data units with sequence
number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the
data unit with sequence number SN-3 was lost -- the size of data unit with
sequence number SN-3 will still be considered in the computation of
bytes_in_flight.</t>
          <ul spacing="normal">
            <li>
              <t>bytes_in_flight_ratio (0.0): Ratio between the bytes_in_flight and the
reference window ref_wnd. This value should be computed at the beginning of the ACK
processing prior to updating the highest received sequence number acked.</t>
            </li>
            <li>
              <t>ref_wnd_ratio (0.0): Ratio between MSS and ref_wnd capped to not
exceed 1.0 (min(1.0, MSS / ref_wnd)).</t>
            </li>
            <li>
              <t>max_bytes_in_flight (0): The maximum number of bytes in flight in the current
round trip [byte].</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in
previous round trip [byte].</t>
            </li>
          </ul>
          <t>As bytes_in_flight can spike when congestion occurs, using the maximum of
max_bytes_in_flight and max_bytes_in_flight_prev
makes it more likely that an uncongested bytes_in_flight is used.</t>
        </section>
        <section anchor="status-update-on-receiving-feedback">
          <name>Status Update on Receiving Feedback</name>
          <t>The feedback from the receiver is assumed to consist of the following elements:</t>
          <ul spacing="normal">
            <li>
              <t>The wall-clock timestamp corresponding to the received data unit with the
highest sequence number.</t>
            </li>
            <li>
              <t>data_units_acked: A list of received data units' sequence numbers.</t>
            </li>
            <li>
              <t>data_units_acked_ce: An indication if data units are ECN-CE marked.
The ECN status can be either per data unit or an accumulated count of
ECN-CE marked data units.</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): Number of bytes newly ACKed, reset to 0 when congestion
window is updated [byte].</t>
            </li>
            <li>
              <t>bytes_newly_acked_ce (0): Number of bytes newly ACKed and CE marked, reset to
0 when reference window is updated [byte].</t>
            </li>
          </ul>
          <t>bytes_newly_acked is incremented with a value
corresponding to how much the highest sequence number has increased
since the last feedback. As an example: If the previous
acknowledgement indicated the highest sequence number N and the new
acknowledgement indicated N+3, then bytes_newly_acked is incremented
by a value equal to the sum of the sizes of data units with sequence
number N+1, N+2, and N+3. Data units that are lost are also included,
which means that even though, e.g., data unit N+2 was lost, its size
is still included in the update of bytes_newly_acked. The
bytes_newly_acked_ce is, similar to bytes_newly_acked, a counter of
bytes newly acked with the extra condition that they are ECN-CE
marked. The bytes_newly_acked and bytes_newly_acked_ce are reset to
zero after a ref_wnd update.</t>
        </section>
      </section>
      <section anchor="network-cc-2">
        <name>Network Congestion Control</name>
        <t>This section explains the network congestion control, which calcultes the
reference window. The reference window gives an upper limit to the number of bytes in flight.</t>
        <section anchor="reaction-delay-loss-ce">
          <name>Congestion Detection: Delay, Data Unit Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost data units detected,</t>
            </li>
            <li>
              <t>ECN-CE marked data units detected either for classic ECN or L4S,</t>
            </li>
            <li>
              <t>Estimated queue delay exceeds a threshold.</t>
            </li>
          </ul>
          <t>A congestion event occurs if any of the above indicators are true AND it is at
least min(VIRTUAL_RTT,s_rtt) since the last congestion event. This ensures that
the reference window is reduced at most once per smoothed RTT.</t>
          <section anchor="reaction-loss">
            <name>Detecting Lost Data Units</name>
            <t>The reference window back-off due to loss events is deliberately a bit less than
is the case with TCP Reno, for example. TCP is generally used to transmit whole
files; the file is then like a source with an infinite bitrate until the whole
file has been transmitted. SCReAMv2, on the other hand, has a source which rate
is limited to a value close to the available transmit rate and often below that
value; the effect is that SCReAMv2 has less opportunity to grab free capacity
than a TCP-based file transfer. To compensate for this, it is RECOMMENDED to let
SCReAMv2 reduce the reference window less than what is the case with TCP when
loss events occur.</t>
            <t>Lost data unit detection is based on the received sequence number list. A
reordering window SHOULD be applied to prevent data unit reordering from triggering
loss events. The reordering window is specified as a time unit, similar to the
ideas behind Recent ACKnowledgement (RACK) <xref target="RFC8985"/>. The computation of the
reordering window is made possible by means of a lost flag in the list of
transmitted data units. This flag is set if the received sequence number list
indicates that the given data unit is missing. If later feedback indicates that
a previously lost marked data unit was indeed received, then the reordering window
is updated to reflect the reordering delay. The reordering window is given by
the difference in time between the event that the data unit was marked as lost and
the event that it was indicated as successfully received. Loss is detected if a
given data unit is not acknowledged within a time window (indicated by the
reordering window) after an data unit with a higher sequence number was
acknowledged.</t>
          </section>
          <section anchor="reaction-ecn-ce">
            <name>Receiving ECN-CE with classic ECN</name>
            <t>In classic ECN mode the ref_wnd is scaled by a fixed value (BETA_ECN).</t>
            <t>The reference window back-off due to an ECN event MAY be smaller than if a loss
event occurs. This is in line with the idea outlined in <xref target="RFC8511"/> to enable
ECN marking thresholds lower than the corresponding data unit drop thresholds.</t>
          </section>
          <section anchor="reaction-l4s-ce">
            <name>Receiving ECN-CE for L4S</name>
            <t>The ref_wnd is scaled down in proportion to the fraction of marked data units per
RTT. The scale down proportion is given by l4s_alpha, which is an EWMA filtered
version of the fraction of marked data units per RTT. This is inline with how DCTCP
works <xref target="RFC8257"/>. Additional methods are applied to make the reference window
reduction reasonably stable, especially when the reference window is only a few
MSS. In addition, because SCReAMv2 can quite often be source limited, additional
steps are taken to restore the reference window to a proper value after a long
period without congestion.</t>
            <t>l4s_alpha is calculated based in number of data units delivered (and marked)
the following way:</t>
            <artwork><![CDATA[
data_units_delivered_this_rtt += data_units_acked
data_units_marked_this_rtt += data_units_acked_ce
# l4s_alpha is updated at least every 10ms
if (now - last_update_l4s_alpha_time >= min(0.01,s_rtt)
  # l4s_alpha is calculated from data_units marked istf bytes marked
  fraction_marked_t = data_units_marked_this_rtt/
                      data_units_delivered_this_rtt

  l4s_alpha = L4S_AVG_G*fraction_marked_t + (1.0-L4S_AVG_G)*l4S_alpha

  last_update_l4s_alpha_time = now
  data_units_delivered_this_rtt = 0
  data_units_marked_this_rtt = 0
  last_fraction_marked = fraction_marked_t
end
]]></artwork>
            <t>This makes calculation of L4S alpha more accurate at very low bitrates,
given that the tail data unit in e.g a video frame is often smaller than MSS.</t>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>l4s_alpha (0.0): Average fraction of marked data units per RTT.</t>
              </li>
              <li>
                <t>last_update_l4s_alpha_time (0): Last time l4s_alpha was updated [s].</t>
              </li>
              <li>
                <t>data_units_delivered_this_rtt (0): Counter for delivered data units.</t>
              </li>
              <li>
                <t>data_units_marked_this_rtt (0): Counter delivered and ECN-CE marked data units.</t>
              </li>
              <li>
                <t>last_fraction_marked (0.0): fraction marked data units in last update</t>
              </li>
            </ul>
            <t>The following constant is used</t>
            <ul spacing="normal">
              <li>
                <t>L4S_AVG_G (1/16): Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha</t>
              </li>
            </ul>
          </section>
          <section anchor="reaction-delay">
            <name>Detecting Increased Queue Delay</name>
            <t>SCReAMv2 implements a delay-based congestion control approach where it mimics
L4S congestion marking when the averaged queue delay exceeds a target
threshold. This threshold is set to qdelay_target/2 and the congestion backoff
factor (l4s_alpha_v) increases linearly from 0 to 100% as qdelay_avg goes from
qdelay_target/2 to qdelay_target. The averaged qdelay (qdelay_avg) is used to
avoid that the SCReAMv2 congestion control over-reacts to scheduling jitter,
sudden delay spikes due to e.g. handover or link layer
retransmissions. Furthermore, the delay based congestion control is inactivated
when it is reasonably certain that L4S is active, i.e. L4S is enabled and
congested nodes apply L4S marking of data units. This reduces negative effects of
clockdrift, that the delay based control can introduce, whenever possible.</t>
            <t>qdelay_avg is updated with a slow attack, fast decay EWMA filter the
following way:</t>
            <artwork><![CDATA[
if (now - last_update_qdelay_avg_time >= s_rtt)
  if (qdelay < qdelay_avg)
    qdelay_avg = qdelay
  else
    qdelay_avg = QDELAY_AVG_G*qdelay + (1.0-QDELAY_AVG_G)*qdelay_avg
  end
  last_update_qdelay_avg_time = now
end
]]></artwork>
            <t>The following variables are used:</t>
            <ul spacing="normal">
              <li>
                <t>qdelay: When the sender receives feedback, the qdelay is calculated as outlined in
<xref target="RFC6817"/>. A qdelay sample is obtained for each received acknowledgement.</t>
              </li>
              <li>
                <t>last_update_qdelay_avg_time (0): Last time qdelay_avg was updated [s].</t>
              </li>
              <li>
                <t>s_rtt (0.0): Smoothed RTT [s], computed with a similar method to that
described in <xref target="RFC6298"/>.</t>
              </li>
            </ul>
            <t>The following constant is used:</t>
            <ul spacing="normal">
              <li>
                <t>QDELAY_AVG_G (1/4): Exponentially Weighted Moving Average (EWMA) factor for qdelay_avg</t>
              </li>
            </ul>
            <section anchor="competing-flows-compensation">
              <name>Competing Flows Compensation</name>
              <t>It is likely that a flow will have to share congested bottlenecks with other
flows that use a more aggressive congestion control algorithm (for example,
large FTP flows using loss-based congestion control). The worst condition occurs
when the bottleneck queues are of tail-drop type with a large buffer
size. SCReAMv2 takes care of such situations by adjusting the qdelay_target when
loss-based flows are detected, as shown in the pseudocode below.</t>
              <artwork><![CDATA[
adjust_qdelay_target(qdelay)
  qdelay_norm_t = qdelay / QDELAY_TARGET_LOW
  update_qdelay_norm_history(qdelay_norm_t)
  # Compute variance
  qdelay_norm_var_t = VARIANCE(qdelay_norm_history(200))
  # Compensation for competing traffic
  # Compute average
  qdelay_norm_avg_t = AVERAGE(qdelay_norm_history(50))
  # Compute upper limit to target delay
  new_target_t = qdelay_norm_avg_t + sqrt(qdelay_norm_var_t)
  new_target_t *= QDELAY_TARGET_LO
  if (loss_event_rate > 0.002)
    # Data unit losses detected
    qdelay_target = 1.5 * new_target_t
  else
    if (qdelay_norm_var_t < 0.2)
      # Reasonably safe to set target qdelay
      qdelay_target = new_target_t
    else
      # Check if target delay can be reduced; this helps prevent
      # the target delay from being locked to high values forever
      if (new_target_t < QDELAY_TARGET_LO)
        # Decrease target delay quickly, as measured queuing
        # delay is lower than target
        qdelay_target = max(qdelay_target * 0.5, new_target_t)
      else
        # Decrease target delay slowly
        qdelay_target *= 0.9
      end
    end
  end

  # Apply limits
  qdelay_target = min(QDELAY_TARGET_HI, qdelay_target)
  qdelay_target = max(QDELAY_TARGET_LO, qdelay_target)
]]></artwork>
              <t>The follwoing variable is used:</t>
              <ul spacing="normal">
                <li>
                  <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost data units
detected.</t>
                </li>
              </ul>
              <t>Two temporary variables are calculated. qdelay_norm_avg_t is the long-term
average queue delay, qdelay_norm_var_t is the long-term variance of the queue
delay. A high qdelay_norm_var_t indicates that the queue delay changes; this can
be an indication that bottleneck bandwidth is reduced or that a competing flow
has just entered. Thus, it indicates that it is not safe to adjust the queue
delay target.</t>
              <t>A low qdelay_norm_var_t indicates that the queue delay is relatively stable. The
reason could be that the queue delay is low, but it could also be that a
competing flow is causing the bottleneck to reach the point that data unit losses
start to occur, in which case the queue delay will stay relatively high for a
longer time.</t>
              <t>The queue delay target is allowed to be increased if either the loss event rate
is above a given threshold or qdelay_norm_var_t is low. Both these conditions
indicate that a competing flow may be present. In all other cases, the queue
delay target is decreased.</t>
              <t>The function that adjusts the qdelay_target is simple and could produce false
positives and false negatives. The case that self-inflicted congestion by the
SCReAMv2 algorithm may be falsely interpreted as the presence of competing
loss-based FTP flows is a false positive. The opposite case -- where the
algorithm fails to detect the presence of a competing FTP flow -- is a false
negative.</t>
              <t>Extensive simulations have shown that the algorithm performs well in LTE and 5G
test cases and that it also performs well in simple bandwidth-limited bottleneck
test cases with competing FTP flows. However, the potential failure of the
algorithm cannot be completely ruled out. A false positive (i.e., when
self-inflicted congestion is mistakenly identified as competing flows) is
especially problematic when it leads to increasing the target queue delay, which
can cause the end-to-end delay to increase dramatically.</t>
              <t>If it is deemed unlikely that competing flows occur over the same bottleneck,
the algorithm described in this section MAY be turned off. One such case is
QoS-enabled bearers in 3GPP-based access such as LTE and 5G. However, when
sending over the Internet, often the network conditions are not known for sure,
so in general it is not possible to make safe assumptions on how a network is
used and whether or not competing flows share the same bottleneck. Therefore,
turning this algorithm off must be considered with caution, as it can lead to
basically zero throughput if competing with loss-based traffic.</t>
            </section>
          </section>
        </section>
        <section anchor="ref-wnd-update">
          <name>Reference Window Update</name>
          <t>The reference window update contains two parts. One that reduces the reference
window when congestion events (listed above) occur, and one part that
continously increases the reference window.</t>
          <t>The following variables are defined:</t>
          <ul spacing="normal">
            <li>
              <t>ref_wnd (MIN_REF_WND): Reference window [byte].</t>
            </li>
            <li>
              <t>ref_wnd_i (1): Reference window inflection point [byte].</t>
            </li>
            <li>
              <t>qdelay_target (QDELAY_TARGET_LO): qdelay target [s], a variable qdelay target
is introduced to manage cases where a fixed qdelay target would otherwise
starve the data flow under such circumstances (e.g., FTP competes for the
bandwidth over the same bottleneck). The qdelay target is allowed to vary
between QDELAY_TARGET_LO and QDELAY_TARGET_HI.</t>
            </li>
            <li>
              <t>last_congestion_detected_time (0): Last time congestion event occured [s].</t>
            </li>
            <li>
              <t>last_ref_wnd_i_update_time (0): Last time ref_wnd_i was updated [s].</t>
            </li>
          </ul>
          <t>Further the following constants are used (the RECOMMENDED values, within parentheses "()",
for the constants are deduced from experiments):</t>
          <ul spacing="normal">
            <li>
              <t>QDELAY_TARGET_LO (0.06): Target value for the minimum qdelay [s].</t>
            </li>
            <li>
              <t>QDELAY_TARGET_HI (0.4): Target value for the maximum qdelay [s]. This
parameter provides an upper limit to how much the target qdelay
(qdelay_target) can be increased in order to cope with competing loss-based
flows. However, the target qdelay does not have to be initialized to this high
value, as it would increase end-to-end delay and also make the rate control
and congestion control loops sluggish.</t>
            </li>
            <li>
              <t>MIN_REF_WND (3000): Minimum reference window [byte].</t>
            </li>
            <li>
              <t>BYTES_IN_FLIGHT_HEAD_ROOM (2.0): Extra headroom for bytes in flight.</t>
            </li>
            <li>
              <t>BETA_LOSS (0.7): ref_wnd scale factor due to loss event.</t>
            </li>
            <li>
              <t>BETA_ECN (0.8): ref_wnd scale factor due to ECN event.</t>
            </li>
            <li>
              <t>MSS (1000): Maximum segment size = Max data unit size [byte].</t>
            </li>
            <li>
              <t>REF_WND_OVERHEAD (5.0): Indicates how much bytes in flight is allowed to
exceed ref_wnd.</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY_RTT (100): Determines how many RTTs after a congestion
event the reference window growth should be cautious.</t>
            </li>
            <li>
              <t>MUL_INCREASE_FACTOR (0.02): Determines how much (as a fraction of ref_wnd)
that the ref_wnd can increase per RTT.</t>
            </li>
            <li>
              <t>IS_L4S (false): Congestion control operates in L4S mode.</t>
            </li>
            <li>
              <t>VIRTUAL_RTT (0.025): Virtual RTT [s]. This mimics Prague's RTT fairness such that flows with RTT
below VIRTUAL_RTT should get a roughly equal share over an L4S path.</t>
            </li>
          </ul>
          <section anchor="reference-window-reduction">
            <name>Reference Window Reduction</name>
            <artwork><![CDATA[
# Compute scaling factor for reference window adjustment
# when close to the last known max value before congestion
scl_t = (ref_wnd-ref_wnd_i) / ref_wnd_i
scl_t *= 8
scl_t = scl_t * scl_t
scl_t = max(0.1, min(1.0, scl_t))

# The reference window is updated at least every VIRTUAL_RTT
if (now - last_congestion_detected_time >= min(VIRTUAL_RTT,s_rtt)
  if (loss detected)
    is_loss_t = true
  end
  if (data units marked)
    is_ce_t = true
  end
  if (qdelay > qdelay_target/2)
    # It is expected that l4s_alpha is below a given value,
    l4_alpha_lim_t = 2 / target_bitrate * MSS * 8 / s_rtt
    if (l4s_alpha < l4_alpha_lim_t || !l4s_active)
      # L4S does not seem to be active
      l4s_alpha_v_t = min(1.0, max(0.0,
         (qdelay_avg - qdelay_target / 2) /
         (qdelay_target / 2)));
      is_virtual_ce_t = true
    end
  end
end

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  if (now - last_ref_wnd_i_update_time > 10*s_rtt)
    # Update ref_wnd_i, no more often than every 10 RTTs
    # Additional median filtering over more congestion epochs
    # may improve accuracy of ref_wnd_i
    last_ref_wnd_i_update_time = now
    ref_wnd_i = ref_wnd
  end
end


# Either loss, ECN mark or increased qdelay is detected
if (is_loss_t)
  # Loss is detected
  ref_wnd = ref_wnd * BETA_LOSS
end
if (is_ce_t)
  # ECN-CE detected
  if (IS_L4S)
    # L4S mode
    backoff_t = l4s_alpha / 2

    # Increase stability for very small ref_wnd
    backOff_t *= max(0.5, 1.0 - ref_wnd_ratio)

    # Scale down backoff if close to the last known max reference window
    # This is complemented with a scale down of the reference window increase
    # Don't scale down back off if queue delay is large
    if (queue_qelay < queue_delay_target * 0.25)
        backOff *= max(0.25, sclI)

    if (now - last_congestion_detected_time >
        100*max(VIRTUAL_RTT,s_rtt))
      # A long time (>100 RTTs) since last congested because
      # link throughput exceeds max video bitrate.
      # There is a certain risk that ref_wnd has increased way above
      # bytes in flight, so we reduce it here to get it better on
      # track and thus the congestion episode is shortened
      ref_wnd = min(ref_wnd, max_bytes_in_flight_prev)

      # Also, we back off a little extra if needed
      # because alpha is quite likely very low
      # This can in some cases be an over-reaction
      # but as this function should kick in relatively seldom
      # it should not be to too big concern
      backoff_t = max(backoff_t, 0.25)

      # In addition, bump up l4sAlpha to a more credible value
      # This may over react but it is better than
      # excessive queue delay
      l4sAlpha = 0.25
    end
    ref_wnd = (1.0 - backoff_t) * ref_wnd
  else
    # Classic ECN mode
    ref_wnd = ref_wnd * BETA_ECN
  end
end
if (is_virtual_ce_t)
  backoff_t = l4s_alpha_v_t / 2
  ref_wnd = (1.0 - backoff_t) * ref_wnd
end
ref_wnd = max(MIN_REF_WND, ref_wnd)

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  last_congestion_detected_time = now
end
]]></artwork>
          </section>
          <section anchor="reference-window-increase">
            <name>Reference Window Increase</name>
            <artwork><![CDATA[
# Delay factor for multiplicative reference window increase
# after congestion

post_congestion_scale_t = max(0.0, min(1.0,
 (now - last_congestion_detected_time) /
  (POST_CONGESTION_DELAY_RTTS * max(VIRTUAL_RTT, s_rtt))))

# Scale factor for ref_wnd update
ref_wnd_scale_factor_t = 1.0 + (MUL_INCREASE_FACTOR  * ref_wnd) / MSS)


# Calculate bytes acked that are not CE marked
# For the case that only accumulated number of CE marked packets is
# reported by the feedback, it is necessary to make an approximation
# of bytes_newly_acked_ce based on average data unit size.
bytes_newly_acked_minus_ce_t = bytes_newly_acked-
                               bytes_newly_acked_ce

increment_t = bytes_newly_acked_minus_ce_t*ref_wnd_ratio

# Reduce increment for small RTTs
tmp_t = min(1.0, s_rtt / VIRTUAL_RTT)
increment_t *= tmp_t * tmp_t

# Apply limit to reference window growth when close to last
# known max value before congestion
if (is_l4s_active)
   increment_t *= max(0.25,scl_t)
else
   increment_t *= scl_t
end

# Limit on CWND growth speed further for small CWND
# This is complemented with a corresponding restriction on CWND
# reduction
increment_t *= max(0.5,1.0-ref_wnd_ratio)

# Scale up increment with multiplicative increase
# Limit multiplicative increase when congestion occured
# recently and when reference window is close to the last
# known max value
float tmp_t = ref_wnd_scale_factor_t
if (tmp_t > 1.0)
  tmp_t = 1.0 + (tmp_t - 1.0) * post_congestion_scale_t * scl_t;
end
increment *= tmp_t

# Increase ref_wnd only if bytes in flight is large enough
# Quite a lot of slack is allowed here to avoid that bitrate
# locks to low values.
# Increase is inhibited if max target bitrate is reached.
max_allowed_t = MSS + max(max_bytes_in_flight,
  max_bytes_in_flight_prev) * BYTES_IN_FLIGHT_HEAD_ROOM
int ref_wnd_t = ref_wnd + increment_t
if (ref_wnd_t <= max_allowed_t && target_bitrate < TARGET_BITRATE_MAX)
  ref_wnd = ref_wnd_t
end
]]></artwork>
            <t>The ref_wnd_scale_factor_t scales the reference window increase. The
ref_wnd_scale_factor_t is increased with larger ref_wnd to allow for a
multiplicative increase and thus a faster convergence when link capacity
increases.</t>
            <t>The multiplicative increase is restricted directly after a congestion event and
the restriction is gradually relaxed as the time since last congested
increased. The restriction makes the reference window growth to be no faster
than additive increase when congestion continusly occurs.  For L4S operation
this means that the SCReAMv2 algorithm will adhere to the 2 marked data units per
RTT equilibrium at steady state congestion, with the exception of the case
below.</t>
            <t>The reference window increase is restricted to values as small as 0.1MSS/RTT
when the reference window is close to the last known max value (ref_wnd_i). This
increases stability and reduces periodic overshoot. This restriction is applied
in full only for small reference windows when in L4S operation.</t>
            <t>It is particularly important that the reference window reflects the transmitted
bitrate especially in L4S mode operation. An inflated ref_wnd takes extra RTTs
to bring down to a correct value upon congestion and thus causes unnecessary
queue buildup. At the same time the reference window must be allowed to be large
enough to avoid that the SCReAMv2 algorithm begins to limit itself, given that
the target bitrate is calculated based on the ref_wnd. Two mechanisms are used
to manage this:</t>
            <ul spacing="normal">
              <li>
                <t>Restore correct value of ref_wnd upon congestion. This is done if is a
prolonged time since the link was congested. A typical example is that
SCReAMv2 has been rate limited, i.e the target bitrate has reached the
TARGET_BITRATE_MAX.</t>
              </li>
              <li>
                <t>Limit ref_wnd when the target_bitrate has reached TARGET_BITRATE_MAX. The
ref_wnd is restricted based on a history of the last max_bytes_in_flight
values. See <xref target="SCReAM-CPP-implementation"/> for details.</t>
              </li>
            </ul>
            <t>The two mechanisms complement one another.</t>
          </section>
        </section>
      </section>
      <section anchor="sender-transmission-control">
        <name>Sender Transmission Control</name>
        <t>The Sender Transmission control calculates of send window at the sender.
Data units are transmitted if allowed by the relation between the number of bytes
in flight and the reference window. This is controlled by the send window:</t>
        <ul spacing="normal">
          <li>
            <t>send_wnd (0): Upper limit to how many bytes can currently be
transmitted. Updated when ref_wnd is updated and when data unit is
transmitted [byte].</t>
          </li>
        </ul>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind data unit transmission in SCReAM was to allow
transmission only if the number of bytes in flight is less than the congestion
window. There are, however, two reasons why this strict rule will not work
optimally:</t>
          <ul spacing="normal">
            <li>
              <t>Bitrate variations: Media sources such as video encoders generally produce
frames whose size always vary to a larger or smaller extent. The data unit queue
absorbs the natural variations in frame sizes. However, the data unit queue should
be as short as possible to prevent the end-to-end delay from increasing. A
strict 'send only when bytes in flight is less than the reference window' rule
can cause the data unit queue to grow simply because the send window is limited. The
consequence is that the reference window will not increase, or will increase
very slowly, because the reference window is only allowed to increase when
there is a sufficient amount of data in flight. The final effect is that the
media bitrate increases very slowly or not at all.</t>
            </li>
            <li>
              <t>Reverse (feedback) path congestion: Especially in transport over
buffer-bloated networks, the one-way delay in the reverse direction can jump
due to congestion. The effect is that the acknowledgements are delayed, and
the self-clocking is temporarily halted, even though the forward path is not
congested. The REF_WND_OVERHEAD allows for some degree of reverse path
congestion as the bytes in flight is allowed to exceed ref_wnd.</t>
            </li>
          </ul>
          <t>In SCReAMv2, the send window is given by the relation between the adjusted
reference window and the amount of bytes in flight according to the pseudocode
below. The multiplication of ref_wnd with REF_WND_OVERHEAD and
rel_framesize_high has the effect that bytes in flight is 'around' the ref_wnd
rather than limited by the ref_wnd when the link is congested.  The
implementation allows the data unit queue to be small even when the frame sizes vary
and thus increased e2e delay can be avoided.</t>
          <artwork><![CDATA[
send_wnd = ref_wnd * REF_WND_OVERHEAD * rel_framesize_high -
           bytes_in_flight
]]></artwork>
          <t>The send window is updated whenever an data unit is transmitted or an feedback
messaged is received.</t>
        </section>
        <section anchor="calculate-frame-size">
          <name>Calculate Frame Size</name>
          <t>The variable rel_framesize_high is based on calculation of the high percentile
of the frame sizes. The calculation is based on a histogram of the frame sizes
relative to the expected frame size given the target bitrate and frame
period.</t>
          <ul spacing="normal">
            <li>
              <t>rel_framesize_high (1.0): High percentile of frame size, normalized by nominal
frame size for the given target bitrate</t>
            </li>
            <li>
              <t>frame_period (0.02): The frame period [s].</t>
            </li>
            <li>
              <t>frame_size: the frame size of the last encoded frame</t>
            </li>
          </ul>
          <t>The calculation of rel_framesize_high is done for every new video frame
and is outlined roughly with the pseudo code below:</t>
          <artwork><![CDATA[
tmp_t = frame_size / (target_bitrate * frame_period / 8)

if (tmp_t > 1.0)
  # Insert sample into histogram
  insert_into_histogram(tmp_t)
  # Get high percentile
  rel_framesize_high = get_histogram_high_percentile()
end
]]></artwork>
          <t>A 75%-ile is used in <xref target="SCReAM-CPP-implementation"/>, the histogram can be made
leaky such that old samples are gradually forgotten.</t>
        </section>
        <section anchor="packet-pacing">
          <name>Packet Pacing</name>
          <t>Packet pacing is used in order to mitigate coalescing, i.e., when packets are
transmitted in bursts, with the risks of increased jitter and potentially
increased packet loss. Packet pacing is also recommended to be used with L4S and
also mitigates possible issues with queue overflow due to key-frame generation
in video coders.</t>
          <ul spacing="normal">
            <li>
              <t>pace_bitrate (1e6): Data unit pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between data units [s].</t>
            </li>
          </ul>
          <t>The following constants are used by the packet pacing:</t>
          <ul spacing="normal">
            <li>
              <t>RATE_PACE_MIN (50000): Minimum pacing rate in [bps].</t>
            </li>
            <li>
              <t>PACKET_PACING_HEADROOM (1.5): Extra head room for packet pacing.</t>
            </li>
          </ul>
          <t>The time interval between consecutive data unit transmissions is
greater than or equal to t_pace, where t_pace is given by the equations below:</t>
          <artwork><![CDATA[
pace_bitrate = max(RATE_PACE_MIN, target_bitrate) *
               PACKET_PACING_HEADROOM
t_pace = data_unit_size * 8 / pace_bitrate
]]></artwork>
          <t>data_unit_size is the size of the last transmitted data unit. RATE_PACE_MIN is the
minimum pacing rate.</t>
        </section>
      </section>
      <section anchor="media-rate-control-2">
        <name>Media Rate Control</name>
        <t>The media rate control algorithm is executed whenever the reference window is
updated and calculates the target bitrate:</t>
        <ul spacing="normal">
          <li>
            <t>target_bitrate (0): Media target bitrate [bps].</t>
          </li>
        </ul>
        <t>The following constants are used by the media rate control:</t>
        <ul spacing="normal">
          <li>
            <t>BYTES_IN_FLIGHT_LIMIT</t>
          </li>
          <li>
            <t>BYTES_IN_FLIGHT_LIMIT_COMPENSATION</t>
          </li>
          <li>
            <t>PACKET_OVERHEAD (20) : Estimated packetization overhead [byte]</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MIN: Minimum target bitrate in [bps] (bits per second).</t>
          </li>
          <li>
            <t>TARGET_BITRATE_MAX: Maximum target bitrate in [bps].</t>
          </li>
        </ul>
        <t>The target bitrate is essentiatlly based
on the reference window ref_wnd and the (smoothed) RTT s_rtt according to</t>
        <artwork><![CDATA[
target_bitrate = 8 * ref_wnd / s_rtt
]]></artwork>
        <t>The role of the media rate control is to strike a reasonable balance between a
low amount of queuing in the data unit queue(s) and a sufficient amount of data to
send in order to keep the data path busy. Because the reference window is
updated based on loss, ECN-CE and delay, so does the target rate also update.</t>
        <t>The code above however needs some modifications to work fine in a number of
scenarios</t>
        <ul spacing="normal">
          <li>
            <t>L4S is inactive, i.e L4S is either not enabled or congested bottlenecks do not
L4S mark data units</t>
          </li>
          <li>
            <t>ref_wnd is very small, just a few MSS or smaller</t>
          </li>
        </ul>
        <t>The complete pseudo code for adjustment of the target bitrate is shown below</t>
        <artwork><![CDATA[
tmp_t = 1.0

# Limit bitrate if bytes in flight exceeds is close to or
# exceeds ref_wnd. This helps to avoid large rate fluctiations and
# variations in RTT.
if (queue_delay / queue_delay_target > 0.5 && bytes_in_flight_ratio > BYTES_IN_FLIGHT_LIMIT)
  tmp_t /= min(BYTES_IN_FLIGHT_LIMIT_COMPENSATION,
    bytesInFlightRatio / BYTES_IN_FLIGHT_LIMIT)
end

# Scale down rate slighty when the reference window is very
# small compared to MSS
tmp_t *= 1.0 - min(0.2, max(0.0, ref_wnd_ratio - 0.1))

# Additional compensation for packetization overhead,
# important when MSS is small
tmp_t_ *= mss/(mss + PACKET_OVERHEAD)

# Calculate target bitrate and limit to min and max allowed
# values
target_bitrate = tmp_t * 8 * ref_wnd / s_rtt
target_bitrate = min(TARGET_BITRATE_MAX,
  max(TARGET_BITRATE_MIN,target_bitrate))
]]></artwork>
        <section anchor="coder-errors">
          <name>Handling of systematic errors in video coders</name>
          <t>Some video encoders are prone to systematically generate an output bitrate that
is systematically larger or smaller than the target bitrate. SCReAMv2 can handle
some deviation inherently but for larger devation it becomes necessary to
compensate for this. The algorithm for this is detailed in
<xref target="SCReAM-CPP-implementation"/>.</t>
          <t>ToDo: A future draft version will describe this in more detail as it has been
fully integrated into SCReAMv2.</t>
        </section>
      </section>
    </section>
    <section anchor="scream-receiver">
      <name>Receiver Requirements on Feedback Intensity</name>
      <t>The simple task of the receiver is to feed back acknowledgements with with time
stamp and ECN bits indication for received data units to the sender. Upon reception
of each data unit, the receiver MUST maintain enough information to send the
aforementioned values to the sender via an RTCP transport- layer feedback
message. The frequency of the feedback message depends on the available RTCP
bandwidth. The requirements on the feedback elements and the feedback interval
are described below.</t>
      <t>SCReAMv2 benefits from relatively frequent feedback. It is RECOMMENDED that a
SCReAMv2 implementation follows the guidelines below.</t>
      <t>The feedback interval depends on the media bitrate. At low bitrates, it is
sufficient with a feedback every frame; while at high bitrates, a feedback
interval of roughly 5ms is preferred. At very high bitrates, even shorter
feedback intervals MAY be needed in order to keep the self-clocking in SCReAMv2
working well. One indication that feedback is too sparse is that the SCReAMv2
implementation cannot reach high bitrates, even in uncongested links. More
frequent feedback might solve this issue.</t>
      <t>The numbers above can be formulated as a feedback interval function that can be
useful for the computation of the desired RTCP bandwidth. The following equation
expresses the feedback rate:</t>
      <artwork><![CDATA[
# Assume 100 byte feedback packets
rate_fb = 0.02 * [average received rate] / (100.0 * 8.0);
rate_fb = min(1000, max(10, rate_fb))

# Calculate feedback intervals
fb_int = 1.0/rate_fb
]]></artwork>
      <t>Feedback should also forcibly be transmitted in any of these cases:</t>
      <ul spacing="normal">
        <li>
          <t>More than N data units received since last feedback has been transmitted</t>
        </li>
        <li>
          <t>A data unit with marker bit set or other last data unit for media frame is received</t>
        </li>
      </ul>
      <t>The transmission interval is not critical. So, in the case of multi-stream
handling between two hosts, the feedback for two or more synchronization sources
(SSRCs) can be bundled to save UDP/IP overhead. However, the final realized
feedback interval SHOULD NOT exceed 2*fb_int in such cases, meaning that a
scheduled feedback transmission event should not be delayed more than fb_int.</t>
      <t>SCReAMv2 works with AVPF regular mode; immediate or early mode is not required
by SCReAMv2 but can nonetheless be useful for RTCP messages not directly related
to SCReAMv2, such as those specified in <xref target="RFC4585"/>. It is RECOMMENDED to use
reduced-size RTCP <xref target="RFC5506"/>, where regular full compound RTCP transmission is
controlled by trr-int as described in <xref target="RFC4585"/>.</t>
      <t>While the guidelines above are somewhat RTCP specific, similar principles apply
to for instance QUIC.</t>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <t>This section covers a few discussion points.</t>
      <ul spacing="normal">
        <li>
          <t>Clock drift: SCReAM/SCReAMv2 can suffer from the same issues with clock drift
as is the case with LEDBAT <xref target="RFC6817"/>. However, Appendix A.2 in <xref target="RFC6817"/>
describes ways to mitigate issues with clock drift. A clockdrift compensation
method is also implemented in <xref target="SCReAM-CPP-implementation"/>. Furthermore, the
SCReAM implementation resets base delay history when it is determined that
clock drift becomes too large. This is achieved by reducing the target bitrate
for a few RTTs.</t>
        </li>
        <li>
          <t>REF_WND_OVERHEAD is by default quite high. The intention is to avoid that packets
are queued up on the sender side in cases when feedback is delayed or when the media
encoder produces very large frames. This is beneficial for cases where link capacity
is very high or when congested queues have high statistical multiplexing.
It is however recommended to reduce this value in case the media encoder reacts slowly
to a reduced target bitrate, because an excessive queue build-up may otherwise occur
and the better option may then be to queue up packets on the sender side.</t>
        </li>
        <li>
          <t>Clock skipping: The sender or receiver clock can occasionally skip. Handling
of this is implemented in <xref target="SCReAM-CPP-implementation"/>.</t>
        </li>
        <li>
          <t>The target bitrate given by SCReAMv2 is the bitrate including the data unit and
Forward Error Correction (FEC) overhead. The media encoder SHOULD take this
overhead into account when the media bitrate is set. This means that the media
coder bitrate SHOULD be computed as: media_rate = target_bitrate -
data_unit_plus_fec_overhead_bitrate It is not necessary to make a 100% perfect
compensation for the overhead, as the SCReAM algorithm will inherently
compensate for moderate errors. Under-compensating for the overhead has the
effect of increasing jitter, while overcompensating will cause the bottleneck
link to become underutilized.</t>
        </li>
        <li>
          <t>The link utilization with SCReAMv2 can be lower than 100%. There are several
possible reasons to this:  </t>
          <ul spacing="normal">
            <li>
              <t>Large variations in frame sizes: Large variations in frame size makes
SCReAMv2 push down the target_bitrate to give sufficient headroom and avoid
queue buildup in the network. It is in general recommended to operate video
coders in low latency mode and enable GDR (Gradual Decoding Refresh) if
possible to minimize frame size variations.</t>
            </li>
            <li>
              <t>Link layer properties: Media transport in 5G in uplink typically requires to
transmit a scheduling request (SR) to get persmission to transmit
data. Because transmission of video is frame based, there is a high
likelihood that the channel becomes idle between frames (especially with
L4S), in which case a new SR/grant exchange is needed. This potentially
means that uplink transmission slots are unused with a lower link
utilization as a result.</t>
            </li>
          </ul>
        </li>
        <li>
          <t>Packet pacing is recommended, it is however possible to operate SCReAMv2 with
  packet pacing disabled. The code in <xref target="SCReAM-CPP-implementation"/> implements
  additonal mechanisms to achieve a high link utilization when packet pacing is
  disabled.</t>
        </li>
        <li>
          <t>Feedback issues: RTCP feedback packets <xref target="RFC8888"/> can be lost, this means that
  the loss detection in SCReAMv2 may trigger even though packets arrive safely
  on the receiver side. <xref target="SCReAM-CPP-implementation"/> solves this by using
  overlapping RTCP feedback, i.e RTCP feedback is transmitted no more seldom
  than every 16th packet, and where each RTCP feedback spans the last 32
  received packets. This however creates unnecessary overhead. <xref target="RFC3550"/> RR
  (Receiver Reports) can possibly be another solution to achieve better
  robustness with less overhead. QUIC <xref target="RFC9000"/> overcomes this issue because
  of inherent design.</t>
        </li>
        <li>
          <t>SCReAM has over time been evaluated in a number of different experiments, a
  few examples are found in <xref target="SCReAM-evaluation-L4S"/>.</t>
        </li>
      </ul>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document does not require any IANA actions.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>The feedback can be vulnerable to attacks similar to those that can affect
TCP. It is therefore RECOMMENDED that the RTCP feedback is at least integrity
protected. Furthermore, as SCReAM/SCReAMv2 is self-clocked, a malicious
middlebox can drop RTCP feedback packets and thus cause the self-clocking to
stall. However, this attack is mitigated by the minimum send rate maintained by
SCReAM/SCReAMv2 when no feedback is received.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="RFC3168" target="https://www.rfc-editor.org/info/rfc3168" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3168.xml">
          <front>
            <title>The Addition of Explicit Congestion Notification (ECN) to IP</title>
            <author fullname="K. Ramakrishnan" initials="K." surname="Ramakrishnan"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="D. Black" initials="D." surname="Black"/>
            <date month="September" year="2001"/>
            <abstract>
              <t>This memo specifies the incorporation of ECN (Explicit Congestion Notification) to TCP and IP, including ECN's use of two bits in the IP header. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3168"/>
          <seriesInfo name="DOI" value="10.17487/RFC3168"/>
        </reference>
        <reference anchor="RFC3550" target="https://www.rfc-editor.org/info/rfc3550" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.3550.xml">
          <front>
            <title>RTP: A Transport Protocol for Real-Time Applications</title>
            <author fullname="H. Schulzrinne" initials="H." surname="Schulzrinne"/>
            <author fullname="S. Casner" initials="S." surname="Casner"/>
            <author fullname="R. Frederick" initials="R." surname="Frederick"/>
            <author fullname="V. Jacobson" initials="V." surname="Jacobson"/>
            <date month="July" year="2003"/>
            <abstract>
              <t>This memorandum describes RTP, the real-time transport protocol. RTP provides end-to-end network transport functions suitable for applications transmitting real-time data, such as audio, video or simulation data, over multicast or unicast network services. RTP does not address resource reservation and does not guarantee quality-of- service for real-time services. The data transport is augmented by a control protocol (RTCP) to allow monitoring of the data delivery in a manner scalable to large multicast networks, and to provide minimal control and identification functionality. RTP and RTCP are designed to be independent of the underlying transport and network layers. The protocol supports the use of RTP-level translators and mixers. Most of the text in this memorandum is identical to RFC 1889 which it obsoletes. There are no changes in the packet formats on the wire, only changes to the rules and algorithms governing how the protocol is used. The biggest change is an enhancement to the scalable timer algorithm for calculating when to send RTCP packets in order to minimize transmission in excess of the intended rate when many participants join a session simultaneously. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="64"/>
          <seriesInfo name="RFC" value="3550"/>
          <seriesInfo name="DOI" value="10.17487/RFC3550"/>
        </reference>
        <reference anchor="RFC4585" target="https://www.rfc-editor.org/info/rfc4585" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.4585.xml">
          <front>
            <title>Extended RTP Profile for Real-time Transport Control Protocol (RTCP)-Based Feedback (RTP/AVPF)</title>
            <author fullname="J. Ott" initials="J." surname="Ott"/>
            <author fullname="S. Wenger" initials="S." surname="Wenger"/>
            <author fullname="N. Sato" initials="N." surname="Sato"/>
            <author fullname="C. Burmeister" initials="C." surname="Burmeister"/>
            <author fullname="J. Rey" initials="J." surname="Rey"/>
            <date month="July" year="2006"/>
            <abstract>
              <t>Real-time media streams that use RTP are, to some degree, resilient against packet losses. Receivers may use the base mechanisms of the Real-time Transport Control Protocol (RTCP) to report packet reception statistics and thus allow a sender to adapt its transmission behavior in the mid-term. This is the sole means for feedback and feedback-based error repair (besides a few codec-specific mechanisms). This document defines an extension to the Audio-visual Profile (AVP) that enables receivers to provide, statistically, more immediate feedback to the senders and thus allows for short-term adaptation and efficient feedback-based repair mechanisms to be implemented. This early feedback profile (AVPF) maintains the AVP bandwidth constraints for RTCP and preserves scalability to large groups. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="4585"/>
          <seriesInfo name="DOI" value="10.17487/RFC4585"/>
        </reference>
        <reference anchor="RFC5506" target="https://www.rfc-editor.org/info/rfc5506" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5506.xml">
          <front>
            <title>Support for Reduced-Size Real-Time Transport Control Protocol (RTCP): Opportunities and Consequences</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="M. Westerlund" initials="M." surname="Westerlund"/>
            <date month="April" year="2009"/>
            <abstract>
              <t>This memo discusses benefits and issues that arise when allowing Real-time Transport Protocol (RTCP) packets to be transmitted with reduced size. The size can be reduced if the rules on how to create compound packets outlined in RFC 3550 are removed or changed. Based on that analysis, this memo defines certain changes to the rules to allow feedback messages to be sent as Reduced-Size RTCP packets under certain conditions when using the RTP/AVPF (Real-time Transport Protocol / Audio-Visual Profile with Feedback) profile (RFC 4585). This document updates RFC 3550, RFC 3711, and RFC 4585. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="5506"/>
          <seriesInfo name="DOI" value="10.17487/RFC5506"/>
        </reference>
        <reference anchor="RFC6298" target="https://www.rfc-editor.org/info/rfc6298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6298.xml">
          <front>
            <title>Computing TCP's Retransmission Timer</title>
            <author fullname="V. Paxson" initials="V." surname="Paxson"/>
            <author fullname="M. Allman" initials="M." surname="Allman"/>
            <author fullname="J. Chu" initials="J." surname="Chu"/>
            <author fullname="M. Sargent" initials="M." surname="Sargent"/>
            <date month="June" year="2011"/>
            <abstract>
              <t>This document defines the standard algorithm that Transmission Control Protocol (TCP) senders are required to use to compute and manage their retransmission timer. It expands on the discussion in Section 4.2.3.1 of RFC 1122 and upgrades the requirement of supporting the algorithm from a SHOULD to a MUST. This document obsoletes RFC 2988. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6298"/>
          <seriesInfo name="DOI" value="10.17487/RFC6298"/>
        </reference>
        <reference anchor="RFC6817" target="https://www.rfc-editor.org/info/rfc6817" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6817.xml">
          <front>
            <title>Low Extra Delay Background Transport (LEDBAT)</title>
            <author fullname="S. Shalunov" initials="S." surname="Shalunov"/>
            <author fullname="G. Hazel" initials="G." surname="Hazel"/>
            <author fullname="J. Iyengar" initials="J." surname="Iyengar"/>
            <author fullname="M. Kuehlewind" initials="M." surname="Kuehlewind"/>
            <date month="December" year="2012"/>
            <abstract>
              <t>Low Extra Delay Background Transport (LEDBAT) is an experimental delay-based congestion control algorithm that seeks to utilize the available bandwidth on an end-to-end path while limiting the consequent increase in queueing delay on that path. LEDBAT uses changes in one-way delay measurements to limit congestion that the flow itself induces in the network. LEDBAT is designed for use by background bulk-transfer applications to be no more aggressive than standard TCP congestion control (as specified in RFC 5681) and to yield in the presence of competing flows, thus limiting interference with the network performance of competing flows. This document defines an Experimental Protocol for the Internet community.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6817"/>
          <seriesInfo name="DOI" value="10.17487/RFC6817"/>
        </reference>
        <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8174" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9330" target="https://www.rfc-editor.org/info/rfc9330" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9330.xml">
          <front>
            <title>Low Latency, Low Loss, and Scalable Throughput (L4S) Internet Service: Architecture</title>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="M. Bagnulo" initials="M." surname="Bagnulo"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This document describes the L4S architecture, which enables Internet applications to achieve low queuing latency, low congestion loss, and scalable throughput control. L4S is based on the insight that the root cause of queuing delay is in the capacity-seeking congestion controllers of senders, not in the queue itself. With the L4S architecture, all Internet applications could (but do not have to) transition away from congestion control algorithms that cause substantial queuing delay and instead adopt a new class of congestion controls that can seek capacity with very little queuing. These are aided by a modified form of Explicit Congestion Notification (ECN) from the network. With this new architecture, applications can have both low latency and high throughput.</t>
              <t>The architecture primarily concerns incremental deployment. It defines mechanisms that allow the new class of L4S congestion controls to coexist with 'Classic' congestion controls in a shared network. The aim is for L4S latency and throughput to be usually much better (and rarely worse) while typically not impacting Classic performance.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9330"/>
          <seriesInfo name="DOI" value="10.17487/RFC9330"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2119" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC6365" target="https://www.rfc-editor.org/info/rfc6365" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.6365.xml">
          <front>
            <title>Terminology Used in Internationalization in the IETF</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="J. Klensin" initials="J." surname="Klensin"/>
            <date month="September" year="2011"/>
            <abstract>
              <t>This document provides a list of terms used in the IETF when discussing internationalization. The purpose is to help frame discussions of internationalization in the various areas of the IETF and to help introduce the main concepts to IETF participants. This memo documents an Internet Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="166"/>
          <seriesInfo name="RFC" value="6365"/>
          <seriesInfo name="DOI" value="10.17487/RFC6365"/>
        </reference>
        <reference anchor="RFC7478" target="https://www.rfc-editor.org/info/rfc7478" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.7478.xml">
          <front>
            <title>Web Real-Time Communication Use Cases and Requirements</title>
            <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
            <author fullname="S. Hakansson" initials="S." surname="Hakansson"/>
            <author fullname="G. Eriksson" initials="G." surname="Eriksson"/>
            <date month="March" year="2015"/>
            <abstract>
              <t>This document describes web-based real-time communication use cases. Requirements on the browser functionality are derived from the use cases.</t>
              <t>This document was developed in an initial phase of the work with rather minor updates at later stages. It has not really served as a tool in deciding features or scope for the WG's efforts so far. It is being published to record the early conclusions of the WG. It will not be used as a set of rigid guidelines that specifications and implementations will be held to in the future.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7478"/>
          <seriesInfo name="DOI" value="10.17487/RFC7478"/>
        </reference>
        <reference anchor="RFC8298" target="https://www.rfc-editor.org/info/rfc8298" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8298.xml">
          <front>
            <title>Self-Clocked Rate Adaptation for Multimedia</title>
            <author fullname="I. Johansson" initials="I." surname="Johansson"/>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>This memo describes a rate adaptation algorithm for conversational media services such as interactive video. The solution conforms to the packet conservation principle and uses a hybrid loss-and-delay- based congestion control algorithm. The algorithm is evaluated over both simulated Internet bottleneck scenarios as well as in a Long Term Evolution (LTE) system simulator and is shown to achieve both low latency and high video throughput in these scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8298"/>
          <seriesInfo name="DOI" value="10.17487/RFC8298"/>
        </reference>
        <reference anchor="RFC8511" target="https://www.rfc-editor.org/info/rfc8511" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8511.xml">
          <front>
            <title>TCP Alternative Backoff with ECN (ABE)</title>
            <author fullname="N. Khademi" initials="N." surname="Khademi"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="G. Armitage" initials="G." surname="Armitage"/>
            <author fullname="G. Fairhurst" initials="G." surname="Fairhurst"/>
            <date month="December" year="2018"/>
            <abstract>
              <t>Active Queue Management (AQM) mechanisms allow for burst tolerance while enforcing short queues to minimise the time that packets spend enqueued at a bottleneck. This can cause noticeable performance degradation for TCP connections traversing such a bottleneck, especially if there are only a few flows or their bandwidth-delay product (BDP) is large. The reception of a Congestion Experienced (CE) Explicit Congestion Notification (ECN) mark indicates that an AQM mechanism is used at the bottleneck, and the bottleneck network queue is therefore likely to be short. Feedback of this signal allows the TCP sender-side ECN reaction in congestion avoidance to reduce the Congestion Window (cwnd) by a smaller amount than the congestion control algorithm's reaction to inferred packet loss. Therefore, this specification defines an experimental change to the TCP reaction specified in RFC 3168, as permitted by RFC 8311.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8511"/>
          <seriesInfo name="DOI" value="10.17487/RFC8511"/>
        </reference>
        <reference anchor="RFC8699" target="https://www.rfc-editor.org/info/rfc8699" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8699.xml">
          <front>
            <title>Coupled Congestion Control for RTP Media</title>
            <author fullname="S. Islam" initials="S." surname="Islam"/>
            <author fullname="M. Welzl" initials="M." surname="Welzl"/>
            <author fullname="S. Gjessing" initials="S." surname="Gjessing"/>
            <date month="January" year="2020"/>
            <abstract>
              <t>When multiple congestion-controlled Real-time Transport Protocol (RTP) sessions traverse the same network bottleneck, combining their controls can improve the total on-the-wire behavior in terms of delay, loss, and fairness. This document describes such a method for flows that have the same sender, in a way that is as flexible and simple as possible while minimizing the number of changes needed to existing RTP applications. This document also specifies how to apply the method for the Network-Assisted Dynamic Adaptation (NADA) congestion control algorithm and provides suggestions on how to apply it to other congestion control algorithms.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8699"/>
          <seriesInfo name="DOI" value="10.17487/RFC8699"/>
        </reference>
        <reference anchor="RFC8869" target="https://www.rfc-editor.org/info/rfc8869" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8869.xml">
          <front>
            <title>Evaluation Test Cases for Interactive Real-Time Media over Wireless Networks</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="X. Zhu" initials="X." surname="Zhu"/>
            <author fullname="J. Fu" initials="J." surname="Fu"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>The Real-time Transport Protocol (RTP) is a common transport choice for interactive multimedia communication applications. The performance of these applications typically depends on a well-functioning congestion control algorithm. To ensure a seamless and robust user experience, a well-designed RTP-based congestion control algorithm should work well across all access network types. This document describes test cases for evaluating performances of candidate congestion control algorithms over cellular and Wi-Fi networks.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8869"/>
          <seriesInfo name="DOI" value="10.17487/RFC8869"/>
        </reference>
        <reference anchor="RFC8985" target="https://www.rfc-editor.org/info/rfc8985" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8985.xml">
          <front>
            <title>The RACK-TLP Loss Detection Algorithm for TCP</title>
            <author fullname="Y. Cheng" initials="Y." surname="Cheng"/>
            <author fullname="N. Cardwell" initials="N." surname="Cardwell"/>
            <author fullname="N. Dukkipati" initials="N." surname="Dukkipati"/>
            <author fullname="P. Jha" initials="P." surname="Jha"/>
            <date month="February" year="2021"/>
            <abstract>
              <t>This document presents the RACK-TLP loss detection algorithm for TCP. RACK-TLP uses per-segment transmit timestamps and selective acknowledgments (SACKs) and has two parts. Recent Acknowledgment (RACK) starts fast recovery quickly using time-based inferences derived from acknowledgment (ACK) feedback, and Tail Loss Probe (TLP) leverages RACK and sends a probe packet to trigger ACK feedback to avoid retransmission timeout (RTO) events. Compared to the widely used duplicate acknowledgment (DupAck) threshold approach, RACK-TLP detects losses more efficiently when there are application-limited flights of data, lost retransmissions, or data packet reordering events. It is intended to be an alternative to the DupAck threshold approach.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8985"/>
          <seriesInfo name="DOI" value="10.17487/RFC8985"/>
        </reference>
        <reference anchor="RFC8257" target="https://www.rfc-editor.org/info/rfc8257" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8257.xml">
          <front>
            <title>Data Center TCP (DCTCP): TCP Congestion Control for Data Centers</title>
            <author fullname="S. Bensley" initials="S." surname="Bensley"/>
            <author fullname="D. Thaler" initials="D." surname="Thaler"/>
            <author fullname="P. Balasubramanian" initials="P." surname="Balasubramanian"/>
            <author fullname="L. Eggert" initials="L." surname="Eggert"/>
            <author fullname="G. Judd" initials="G." surname="Judd"/>
            <date month="October" year="2017"/>
            <abstract>
              <t>This Informational RFC describes Data Center TCP (DCTCP): a TCP congestion control scheme for data-center traffic. DCTCP extends the Explicit Congestion Notification (ECN) processing to estimate the fraction of bytes that encounter congestion rather than simply detecting that some congestion has occurred. DCTCP then scales the TCP congestion window based on this estimate. This method achieves high-burst tolerance, low latency, and high throughput with shallow- buffered switches. This memo also discusses deployment issues related to the coexistence of DCTCP and conventional TCP, discusses the lack of a negotiating mechanism between sender and receiver, and presents some possible mitigations. This memo documents DCTCP as currently implemented by several major operating systems. DCTCP, as described in this specification, is applicable to deployments in controlled environments like data centers, but it must not be deployed over the public Internet without additional measures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8257"/>
          <seriesInfo name="DOI" value="10.17487/RFC8257"/>
        </reference>
        <reference anchor="RFC8888" target="https://www.rfc-editor.org/info/rfc8888" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8888.xml">
          <front>
            <title>RTP Control Protocol (RTCP) Feedback for Congestion Control</title>
            <author fullname="Z. Sarker" initials="Z." surname="Sarker"/>
            <author fullname="C. Perkins" initials="C." surname="Perkins"/>
            <author fullname="V. Singh" initials="V." surname="Singh"/>
            <author fullname="M. Ramalho" initials="M." surname="Ramalho"/>
            <date month="January" year="2021"/>
            <abstract>
              <t>An effective RTP congestion control algorithm requires more fine-grained feedback on packet loss, timing, and Explicit Congestion Notification (ECN) marks than is provided by the standard RTP Control Protocol (RTCP) Sender Report (SR) and Receiver Report (RR) packets. This document describes an RTCP feedback message intended to enable congestion control for interactive real-time traffic using RTP. The feedback message is designed for use with a sender-based congestion control algorithm, in which the receiver of an RTP flow sends back to the sender RTCP feedback packets containing the information the sender needs to perform congestion control.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8888"/>
          <seriesInfo name="DOI" value="10.17487/RFC8888"/>
        </reference>
        <reference anchor="RFC9000" target="https://www.rfc-editor.org/info/rfc9000" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="RFC9332" target="https://www.rfc-editor.org/info/rfc9332" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9332.xml">
          <front>
            <title>Dual-Queue Coupled Active Queue Management (AQM) for Low Latency, Low Loss, and Scalable Throughput (L4S)</title>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This specification defines a framework for coupling the Active Queue Management (AQM) algorithms in two queues intended for flows with different responses to congestion. This provides a way for the Internet to transition from the scaling problems of standard TCP-Reno-friendly ('Classic') congestion controls to the family of 'Scalable' congestion controls. These are designed for consistently very low queuing latency, very low congestion loss, and scaling of per-flow throughput by using Explicit Congestion Notification (ECN) in a modified way. Until the Coupled Dual Queue (DualQ), these Scalable L4S congestion controls could only be deployed where a clean-slate environment could be arranged, such as in private data centres.</t>
              <t>This specification first explains how a Coupled DualQ works. It then gives the normative requirements that are necessary for it to work well. All this is independent of which two AQMs are used, but pseudocode examples of specific AQMs are given in appendices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9332"/>
          <seriesInfo name="DOI" value="10.17487/RFC9332"/>
        </reference>
        <reference anchor="Packet-conservation">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/52325.52356"/>
          <refcontent>ACM SIGCOMM Computer Communication Review</refcontent>
        </reference>
        <reference anchor="LEDBAT-delay-impact" target="http://home.ifi.uio.no/michawe/research/publications/ledbat-impact-letters.pdf">
          <front>
            <title>Assessing LEDBAT's Delay Impact</title>
            <author initials="D." surname="Ros" fullname="David Ros">
              <organization/>
            </author>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2013" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/LCOMM.2013.040213.130137"/>
          <refcontent>IEEE Communications Letters, Vol. 17, No. 5,</refcontent>
        </reference>
        <reference anchor="QoS-3GPP" target="http://www.3gpp.org/ftp/specs/archive/23_series/23.203/">
          <front>
            <title>Policy and charging control architecture</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July"/>
          </front>
          <refcontent>3GPP TS 23.203</refcontent>
        </reference>
        <reference anchor="SCReAM-CPP-implementation" target="https://github.com/EricssonResearch/scream">
          <front>
            <title>SCReAM - Mobile optimised congestion control algorithm</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-evaluation-L4S" target="https://github.com/EricssonResearch/scream/blob/master/L4S-Results.pdf?raw=true">
          <front>
            <title>SCReAM - evaluations with L4S</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TFWC" target="http://www-dept.cs.ucl.ac.uk/staff/M.Handley/papers/tfwc-conext.pdf">
          <front>
            <title>Fairer TCP-Friendly Congestion Control Protocol for Multimedia Streaming Applications</title>
            <author initials="S." surname="Choi" fullname="Soo-Hyun Choi">
              <organization/>
            </author>
            <author initials="M." surname="Handley" fullname="Mark Handley">
              <organization/>
            </author>
            <date year="2007" month="December"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1364654.1364717"/>
        </reference>
      </references>
    </references>
    <?line 1367?>

<section anchor="acknowledgements">
      <name>Acknowledgments</name>
      <t>Zaheduzzaman Sarker was a co-author of RFC 8298 the previous version
of scream which this document was based on. We would like to thank the
following people for their comments, questions, and support during the
work that led to this memo: Mirja Kuehlewind.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V9W3fb1pLmO37FHnt1R3JI6mIrcZSTdCuy7KiPZftIcjJn
evVogSQoIQYBBgAtK076l83b/LGpr6r2DQBlpy9r/JBQJLAvtWvX/TIej5N5
NSvTZXZo5nW6aMe/VDdp2TRVOZ7Nbq/H9WL2dP+bp9O8GTezOkuX7/fHu0+S
Nm8LeuUiKxbj46Kavcvm5jxtM3M0T1dt2uZVaRZVbc7WRZsvs3meJul0Wmfv
6Z3j8+zo7P1+Uk2bqsjarDk0mCKZpe2hyT6sknxVH5q2Xjft/u7uN7v7ye31
oTk+/vlFktIKDs3Pp5dJs54u86ahedq7Fa3k9OTyeZK8z8p1dpgYc11X6xW9
VJXXWcOroY9tXRXm56p+l5fX5gWeMFvY5Da9sEzz4tDgr3/Os3YxqeprDJO3
N+vpobkuqrxcFzuDIBK4jAlESZKu25uqxgrGCf0H//KSNng6Mf9i39LvBein
tMBlWvd+pfkPzUmdz4LvMllkLq9MmolbyD9n+uRkVi158mBuczYxPxMUsrpY
l/No9rP0ulw3/V/vmX3Jr0xu3SufnPuv//f/3BTZbd6dO69/Sfs/3jc13pi8
W2f6RjxzkpeEcUvCvfeMAub8+fH+3t439vNXj786sJ+/fvL1U/sZuOc+H+zt
uc9ffePefUp/uM/fPD3w7x587Z956sb5Znd3131+/Hj/kJHhTUr3pB3PqrLJ
6vd8SQ51h3qfAnw9el/l87ScZSYt5xZ79WmPZfpv7D8q4H8ihEtnuGJl+JuA
/qe07P5aZwtaV5uVdAePjs/MxemL49dnZzTxcrWmk8aH5brMZ3K3z7P3eXar
79Ju8qwB+IMlPXt9emj2did7e08Odg72H+8fTOi/B1/pE3MiFjTT+ppuudn7
5ulThtDLk2c/HF2O51mR3o3z5SqdtYcb9hxumXf8bGLOqyb4Vvb6LH2fz6Nf
em/y/Sh+K3rvnuWzmzQrol9DQJ2enJzEgGnMy6wlcDUj81NVTMze1yPzqpqY
g9HnwWr3m52XgPtkf3fv8WT3ye4+/W/vMf3xdQS4s/TO4JEYfY6aJiOaSNRN
APlFY54BlOaUQWkfTuvrjFZ/07arw52dm2qZTfJFPlnn1aSsdpbY9G22U2dN
ltazm53VelrY7e0U2Xyatno240I2O1nNF3x+f6suxo9fvHnTQesHbyoa4Y4x
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
qn9JzV/X2U2RIXBhkvw/g9U7dzviAAA=

-->

</rfc>
