<?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-05" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-05"/>
    <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="October" day="20"/>
    <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>
        <t>Draft version -04</t>
        <ul spacing="normal">
          <li>
            <t>Restructuring of code</t>
          </li>
          <li>
            <t>Reduction of target rate when bytes_in_flight is higher than ref_wnd is done also when l4s_active, replaced with requirement that queue_delay is large</t>
          </li>
          <li>
            <t>Additional constraint for increase of ref_wnd added</t>
          </li>
          <li>
            <t>Discussion on when it is beneficial to reduce REF_WND_OVERHEAD added.</t>
          </li>
        </ul>
        <t>Draft version -05 contains some clarifications based on a review by Per Kjellander
 and Björn Terelius plus some code modifications and text.</t>
        <ul spacing="normal">
          <li>
            <t>l4s_active state removed as delay based congestion control is always active</t>
          </li>
          <li>
            <t>ref_wnd reduction when long time since congested limited to only limit ref_wnd to last max_bytes_in_flight_prev</t>
          </li>
          <li>
            <t>Calculation of l4s_alpha is modified to use a fast attack slow decay EWMA filter</t>
          </li>
          <li>
            <t>Congestion backoff downscaling also for virtual L4S marking when ref_wnd is very small</t>
          </li>
          <li>
            <t>Congestion backoff is reduced if RTT is higher than VIRTUAL_RTT</t>
          </li>
          <li>
            <t>ref_wnd increase is reduced if L4S is likely non-active and queue delay increases</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.</t>
        <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

  # Apply a fast attack slow decay EWMA
  if (fraction_marked_t >= l4s_alpha)
     l4s_alpha = L4S_AVG_G_UP*fraction_marked_t + (1.0-L4S_AVG_G_UP)*l4S_alpha
  else
     l4s_alpha = (1.0-L4S_AVG_G_DOWN)*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 constants are used</t>
            <ul spacing="normal">
              <li>
                <t>L4S_AVG_G_UP (1/8): Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha increase</t>
              </li>
              <li>
                <t>L4S_AVG_G_DOWN (1/128): Exponentially Weighted Moving Average (EWMA) factor for l4s_alpha decrease</t>
              </li>
            </ul>
            <t>The calculation of l4s_alpha is done with an fast attack slow decay EWMA filter.
This can give a more stable performance when L4S bottlenecks have high marking thresholds.</t>
          </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 >= min(virtual_rtt,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.
It is typically sufficient with one update per 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 detected [s].</t>
            </li>
            <li>
              <t>last_reaction_to_congestion_time (0): Last time congestion avoidance 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 (1.5): 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. See section <xref target="discussion"/> for recommendations.</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
# ref_wnd_i is updated before this code
# loss_detected and data_units_marked indicates that packets
# are marked or lost since last_reaction_to_congestion_time
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))

if (loss_detected || data_units_marked)
   last_congestion_detected_time = now
end

# The reference window is updated at least every VIRTUAL_RTT
if (now - last_reaction_to_congestion_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 && !(is_ce_t || is_loss_t))
    # 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 does not seem to be active
      l4s_alpha_v_t = min(1.0,2.0*l4_alpha_lim_t*
         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 when RTT is high ot avoid overreaction to
    # congestion
    backoff_t /= max(1.0, srtt/VIRTUAL_RTT)

    # 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_delay < queue_delay_target * 0.25)
        backoff *= max(0.25, scl_t)

    if (now - last_reaction_to_congestion_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)
    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

  # Scale down backoff when RTT is high ot avoid overreaction to
  # congestion
  backoff_t /= max(1.0, srtt/VIRTUAL_RTT)

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

  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_reaction_to_congestion_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
increment_t *= max(0.25,scl_t)

# 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)

# Reduce CWND growth if L4S not enabled or non-functional and queue delay grows
if (l4sAlpha < 0.0001)
   increment *= max(0.1, 1.0 - queue_avg / (qdelay_target / 4))
end

# 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 (0.9)</t>
          </li>
          <li>
            <t>BYTES_IN_FLIGHT_LIMIT_COMPENSATION (1.5)</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 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.25 && 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. More details on this will be provided in a later draft version.</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 1407?>

<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: Per Kjellander, Björn Terelius.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8W9W3fb1pYm+o5fsY49qiI5JHWxlTjKTroVWXbU27K9JTk5
dWrU0QBJUEIMAgwAStb2Tv2sfuq3+mNnfnPOdQNA2emqHscPCUUC6zLXXPN+
GY/HybyalekyOzTzOl2049+qm7Rsmqocz2Z31+N6MXu+/93zad6Mm1mdpcvb
/fHuQdLmbUGvXGTFYnxcVLMP2dycp21mjubpqk3bvCrNoqrN2bpo82U2z9Mk
nU7r7JbeOT7Pjs5u95Nq2lRF1mbNocEUySxtD032cZXkq/rQtPW6afd3d7/b
3U/urg/N8fGvr5KUVnBofj29TJr1dJk3Dc3T3q9oJacnly+T5DYr19lhYsx1
Xa1X9FJVXmcNr4Y+tnVVmF+r+kNeXptXeMJsYZPb9MIyzYtDg7/+e561i0lV
X2OYvL1ZTw/NdVHl5brYGQSRwGVMIEqSdN3eVDVWME7oP/iXl7TB04n5H/Yt
/V6AfkoLXKZ171ea/9Cc1Pks+C6TRebyyqSZuIX890yfnMyqJU8ezG3OJuZX
gkJWF+tyHs1+ll6X66b/6wOzL/mVyZ175bNz//U//tdNkd3l3bnz+re0/+ND
U+ONyYd1pm/EMyd5SRi3JNy7ZRQw5y+P9/f2vrOfv3n6zYH9/O2zb5/bz8A9
9/lgb899/uY79+5z+sN9/u75gX/34Fv/zHM3zne7u7vu89On+4eMDO9Suift
eFaVTVbf8iU51B3qfQrw9ei2yudpOctMWs4t9urTHsv039h/VMD/QgiXznDF
yvA3Af0vadn9tc4WtK42K+kOHh2fmYvTV8dvz85o4uVqTSeND8t1mc/kbp9n
t3l2p+/SbvKsAfiDJb14e3po9nYne3vPDnYO9p/uH0zovwff6BNzIhY00/qa
brnZ++75c4bQ65MXPx1djudZkd6P8+UqnbWHG/Ycbpl3/GJizqsm+Fb2+iK9
zefRL703+X4Ufy96757ls5s0K6JfQ0CdnpycxIBpzOusJXA1I/NLVUzM3rcj
86aamIPRl8Fq97ud14D7ZH937+lk99nuPv1v7yn98W0EuLP03uCRGH2OmiYj
mkjUTQD5VWNeAJTmlEFpH07r64xWf9O2q8OdnZtqmU3yRT5Z59WkrHaW2PRd
tlNnTZbWs5ud1Xpa2O3tFNl8mrZ6NuNCNjtZzRd8fn+rLsZPX71710HrR+8q
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

-->

</rfc>
