<?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.19 (Ruby 3.3.3) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-johansson-ccwg-rfc8298bis-screamv2-01" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.1 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-01"/>
    <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>
    <date year="2024" month="September" day="20"/>
    <area>Transport</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 112?>

<t>This memo describes a congestion control algorithm for conversational media
services such as interactive video. The solution conforms to the packet
conservation principle and is a hybrid loss- and delay based congestion control
that also supports ECN and L4S. The algorithm is evaluated over both simulated
Internet bottleneck scenarios as well as in a mobile system simulator using
LongTerm Evolution (LTE) and 5G and is shown to achieve both low latency and
high video throughput in these scenarios. This specification obsoletes RFC
8298. The algorithm supports handling of multiple media streams, typical use
cases are streaming for remote control, AR and 3D VR googles.</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 124?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Congestion in the Internet occurs when the transmitted bitrate is higher than
the available capacity over a given transmission path. Applications that are
deployed in the Internet have to employ congestion control to achieve robust
performance and to avoid congestion collapse in the Internet.</t>
      <t>Interactive real-time communication imposes a lot of requirements on the
transport; therefore, a robust, efficient rate adaptation for all access types
is an important part of interactive real-time communications, as the
transmission channel bandwidth can vary over time.</t>
      <t>Wireless access such as LTE and 5G, which is an integral part of the current
Internet, increases the importance of rate adaptation as the channel bandwidth
of a default LTE bearer <xref target="QoS-3GPP"/> can change considerably in a very short
time frame. Thus, a rate adaptation solution for interactive real-time media,
such as WebRTC <xref target="RFC7478"/>, should be both quick and be able to operate over a
large range in channel capacity.</t>
      <t>This memo describes Self-Clocked Rate Adaptation for Multimedia version 2
(SCReAMv2), an update to SCReAM congestion control for RTP streams
<xref target="RFC3550"/>. While SCReAM was originally devised for WebRTC, SCReAM as well as
SCReAMv2 can also be used for other applications where congestion control of
different type of real-time streams, especially media streams is
necessary. SCReAM is based on the self-clocking principle of TCP and uses
techniques similar to what is used in the rate adaptation algorithm based on Low
Extra Delay Background Transport (LEDBAT) <xref target="RFC6817"/>.</t>
      <t>SCReAMv2 is not entirely self-clocked as it augments self-clocking with pacing
and a minimum send rate. 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>
      <t>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.</t>
      <t>The algorithm in this memo differs greatly against the previous version of
SCReAM. 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 peridic 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. The calculated congestion
window is used mainly to calculate proper media bitrates. Bytes in flight is
however allowed to exceeed the reference window.</t>
        </li>
        <li>
          <t>The media bitrate calculation is dramatically changed and simplified.</t>
        </li>
        <li>
          <t>Additional compensation is added to make SCReAMv2 handle cases such as large
changing frame sizes.</t>
        </li>
      </ul>
      <section anchor="lte-5g">
        <name>Wireless (LTE and 5G) Access Properties</name>
        <t><xref target="RFC8869"/> describes the complications that can be observed in wireless
environments. Wireless access such as LTE and 5G typically cannot guarantee a
given bandwidth; this is true especially for default bearers. The network
throughput can vary considerably, for instance, in cases where the wireless
terminal is moving around. Even though 5G can support bitrates above 1 Gbps,
there are cases when the available bitrate can be much lower (less than 10
Mbps); examples are situations with high network load and poor coverage. An
additional complication is that the network throughput can drop for short time
intervals (e.g., at handover); these short glitches are initially very difficult
to distinguish from more permanent reductions in throughput.</t>
        <t>Unlike wireline bottlenecks with large statistical multiplexing, it is typically
not possible to try to maintain a given bitrate when congestion is detected with
the hope that other flows will yield. This is because there are generally few
other flows competing for the same bottleneck. Each user gets its own variable
throughput bottleneck, where the throughput depends on factors like channel
quality, network load, and historical throughput. The bottom line is, if the
throughput drops, the sender has no other option than to reduce the
bitrate. Once the radio scheduler has reduced the resource allocation for a
bearer, a flow in that bearer aims to reduce the sending rate quite quickly
(within one RTT) in order to avoid excessive queuing delay or packet loss. This
has the consenquence that L4S capable 5G radio bearers will build a queue unless
these are prioritized over other bearers. This differs from e.g DualQ
<xref target="RFC9332"/>, which prioritizes L4S traffic in a weighted scheduler and achives
fairness with additional marking for the L4S flows.</t>
      </section>
      <section anchor="why-selfclock">
        <name>Why is it a self-clocked algorithm?</name>
        <t>Self-clocked congestion control algorithms provide a benefit over their
rate-based counterparts in that the former consists of two adaptation
mechanisms:</t>
        <ul spacing="normal">
          <li>
            <t>A reference window computation that evolves over a longer timescale (several
RTTs) especially when the reference window evolution is dictated by estimated
delay (to minimize vulnerability to, e.g., short-term delay variations). 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>A fine-grained congestion control given by the self-clocking; it operates on a
shorter time scale (1 RTT). The benefits of self-clocking are also elaborated
upon in <xref target="TFWC"/>. The self-clocking however 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>
        <t>A rate-based congestion control algorithm typically adjusts the rate based on
delay and loss. The congestion detection needs to be done with a certain time
lag to avoid overreaction to spurious congestion events such as delay
spikes. Despite the fact that there are two or more congestion indications, the
outcome is that there is still only one mechanism to adjust the sending
rate. This makes it difficult to reach the goals of high throughput and prompt
reaction to congestion.</t>
      </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 is determined in a way similar to the congestion window in
LEDBAT <xref target="RFC6817"/>. LEDBAT is a congestion control algorithm that uses send and
receive timestamps to estimate the queuing delay (from now on denoted "qdelay")
along the transmission path. This information is used to adjust the congestion
window. The general problem described in the paper is that the base delay is
offset by LEDBAT's own queue buildup. The big difference with using LEDBAT in
the SCReAM context lies in the facts that the source is rate limited and that
the RTP queue must be kept short (preferably empty). In addition, the output
from a video encoder is rarely constant bitrate; static content (talking heads,
for instance) gives almost zero video bitrate. This yields two useful properties
when LEDBAT's delay-based rate estimation techniques are used as part of SCReAM;
they help to avoid the issues described in <xref target="LEDBAT-delay-impact"/>:</t>
        <ol spacing="normal" type="1"><li>
            <t>There is always a certain probability that SCReAM is short of data to
transmit; this means that the network queue will become empty every once in a
while.</t>
          </li>
          <li>
            <t>The max video bitrate can be lower than the link capacity. If the max video
bitrate is 5 Mbps and the capacity is 10 Mbps, then the network queue will
become empty.</t>
          </li>
        </ol>
        <t>It is sufficient that any of the two conditions above is fulfilled to make the
base delay update properly. Furthermore, <xref target="LEDBAT-delay-impact"/> describes an
issue with short-lived competing flows. In SCReAM, these short-lived flows will
cause the self-clocking to slow down, thereby building up the RTP queue; in
turn, this results in a reduced media video bitrate. Thus, SCReAM slows the
bitrate more when there are competing short-lived flows than the traditional use
of LEDBAT does. The basic functionality in the use of LEDBAT in SCReAM is quite
simple; however, there are a few steps in order to make the concept work with
conversational media:</t>
        <ul spacing="normal">
          <li>
            <t>Addition of a media rate control function.</t>
          </li>
          <li>
            <t>Reference window validation techniques. 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
max target bitrate is reached.</t>
          </li>
          <li>
            <t>Use of inflection points in the reference window calculation to achieve
reduced delay jitter.</t>
          </li>
          <li>
            <t>Adjustment of qdelay target for better performance when competing with other
loss-based congestion-controlled flows.</t>
          </li>
        </ul>
        <t>The above-mentioned features will be described in more detail in Section
<xref target="scream-detailed-description"/>.</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 still consists of three main parts: network congestion control, sender
transmission control, and media rate control. All of these parts reside at the
sender side. Figure 1 shows the functional overview of a SCReAMv2 sender. The
receiver-side algorithm is very simple in comparison, as it only generates
feedback containing acknowledgements of received RTP packets and indication of
ECN bits.</t>
      <section anchor="network-cc">
        <name>Network Congestion Control</name>
        <t>The network congestion control sets an upper limit on how much data can be in
the network (bytes in flight); this limit is called reference window (ref_wnd)
and is used in the sender transmission control.</t>
        <t>The sender calculates the reference window based on the feedback from the RTP
receiver. The feedback is timestamp and ECN echo for individual RTP packets.</t>
        <t>The receiver of the media echoes a list of received RTP packets and the
timestamp of the RTP packet with the highest sequence number back to the sender
in feedback packets. The sender keeps a list of transmitted packets, their
respective sizes, and the time they were transmitted. This information is used
to determine the number of bytes that can be transmitted at any given time
instant. A reference window 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 a slack is given to efficiently transmit
temporary larger media objects, such as video frames.</t>
        <t>The reference window seeks to increase by one segment per RTT and this increase
regardless congestion occurs or not, the reference window increase is restriced
or relaxed based on the current value of the reference window relative to a
previous max value and the time elapsed since last congestion event. The
reference window update is increased by one MSS (maximum known RTP packet size)
per RTT with some variation based on reference window size and time elapsed
since the last congestion event. Multiplicative increase allows the congestion
to increase by a fraction of ref_wnd when congestion has not occured for a
while. The reference window is thus an adaptive multiplicative increase that is
mainly additive increase when steady state is reached but allows a faster
convergence to a higher link speed.</t>
        <t>Reference window reduction is triggered by:</t>
        <ul spacing="normal">
          <li>
            <t>Packet loss or Classic ECN marking is detected : The reference window is
reduced by a predetermined fraction.</t>
          </li>
          <li>
            <t>Estimated queue delay exceeds a given threshold : The reference window is
reduced given by how much the delay exceeds the threshold.</t>
          </li>
          <li>
            <t>L4S ECN marking detected : The reference window is reduced in proportion to
the fraction of packets that are marked (scalable congestion control).</t>
          </li>
        </ul>
      </section>
      <section anchor="sender-tc">
        <name>Sender Transmission Control</name>
        <t>The sender transmission control limits the output of data, given by the relation
between the number of bytes in flight and the reference window. The congestion
window is however not a hard limit, additional slack is given to avoid that RTP
packets are queued up unnecessarily on the sender side. 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. Packet pacing is used to mitigate issues with
ACK compression that MAY cause increased jitter and/or packet loss in the media
traffic. Packet pacing limits the packet transmission rate given by the
estimated link throughput. 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.</t>
      </section>
      <section anchor="media-rate-control">
        <name>Media Rate Control</name>
        <t>The media rate control serves to adjust the media bitrate to ramp up quickly
enough to get a fair share of the system resources when link throughput
increases.</t>
        <t>The reaction to reduced throughput must be prompt in order to avoid getting too
much data queued in the RTP packet queue(s) in the sender. The media rate is
calculated based on the reference window and RTT. 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 RTP 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>
      <t>The sender implements media rate control and an RTP queue for each media type or
source, where RTP packets containing encoded media frames are temporarily stored
for transmission. Figure 1 shows the details when a single media source (or
stream) is used. A transmission scheduler (not shown in the figure) is added to
support multiple streams. The transmission scheduler can enforce differing
priorities between the streams and act like a coupled congestion controller for
multiple flows. Support for multiple streams is implemented in
<xref target="SCReAM-CPP-implementation"/>.</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="544" width="336" viewBox="0 0 336 544" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
              <path d="M 8,368 L 8,432" fill="none" stroke="black"/>
              <path d="M 40,336 L 40,400" fill="none" stroke="black"/>
              <path d="M 80,160 L 80,224" fill="none" stroke="black"/>
              <path d="M 88,32 L 88,64" fill="none" stroke="black"/>
              <path d="M 120,72 L 120,152" fill="none" stroke="black"/>
              <path d="M 120,232 L 120,328" fill="none" stroke="black"/>
              <path d="M 144,336 L 144,400" fill="none" stroke="black"/>
              <path d="M 160,160 L 160,224" fill="none" stroke="black"/>
              <path d="M 200,480 L 200,528" fill="none" stroke="black"/>
              <path d="M 208,336 L 208,400" fill="none" stroke="black"/>
              <path d="M 224,144 L 224,240" fill="none" stroke="black"/>
              <path d="M 232,432 L 232,472" fill="none" stroke="black"/>
              <path d="M 272,128 L 272,136" fill="none" stroke="black"/>
              <path d="M 272,248 L 272,272" fill="none" stroke="black"/>
              <path d="M 272,304 L 272,328" fill="none" stroke="black"/>
              <path d="M 272,448 L 272,472" fill="none" stroke="black"/>
              <path d="M 304,480 L 304,528" fill="none" stroke="black"/>
              <path d="M 312,32 L 312,64" fill="none" stroke="black"/>
              <path d="M 320,144 L 320,240" fill="none" stroke="black"/>
              <path d="M 328,336 L 328,400" fill="none" stroke="black"/>
              <path d="M 88,32 L 312,32" fill="none" stroke="black"/>
              <path d="M 88,64 L 312,64" fill="none" stroke="black"/>
              <path d="M 224,144 L 320,144" fill="none" stroke="black"/>
              <path d="M 80,160 L 160,160" fill="none" stroke="black"/>
              <path d="M 80,224 L 160,224" fill="none" stroke="black"/>
              <path d="M 224,240 L 320,240" fill="none" stroke="black"/>
              <path d="M 40,336 L 144,336" fill="none" stroke="black"/>
              <path d="M 208,336 L 328,336" fill="none" stroke="black"/>
              <path d="M 8,368 L 32,368" fill="none" stroke="black"/>
              <path d="M 152,368 L 200,368" fill="none" stroke="black"/>
              <path d="M 40,400 L 144,400" fill="none" stroke="black"/>
              <path d="M 208,400 L 328,400" fill="none" stroke="black"/>
              <path d="M 8,432 L 112,432" fill="none" stroke="black"/>
              <path d="M 152,432 L 232,432" fill="none" stroke="black"/>
              <path d="M 200,480 L 304,480" fill="none" stroke="black"/>
              <path d="M 200,528 L 304,528" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="280,472 268,466.4 268,477.6" fill="black" transform="rotate(90,272,472)"/>
              <polygon class="arrowhead" points="280,328 268,322.4 268,333.6" fill="black" transform="rotate(90,272,328)"/>
              <polygon class="arrowhead" points="280,136 268,130.4 268,141.6" fill="black" transform="rotate(90,272,136)"/>
              <polygon class="arrowhead" points="208,368 196,362.4 196,373.6" fill="black" transform="rotate(0,200,368)"/>
              <polygon class="arrowhead" points="128,232 116,226.4 116,237.6" fill="black" transform="rotate(270,120,232)"/>
              <polygon class="arrowhead" points="128,72 116,66.4 116,77.6" fill="black" transform="rotate(270,120,72)"/>
              <polygon class="arrowhead" points="40,368 28,362.4 28,373.6" fill="black" transform="rotate(0,32,368)"/>
              <g class="text">
                <text x="176" y="52">Media</text>
                <text x="232" y="52">encoder</text>
                <text x="284" y="84">|(1)</text>
                <text x="272" y="100">RTP</text>
                <text x="136" y="116">(3)</text>
                <text x="272" y="116">|</text>
                <text x="112" y="180">Media</text>
                <text x="272" y="180">Queue</text>
                <text x="108" y="196">rate</text>
                <text x="120" y="212">control</text>
                <text x="240" y="212">RTP</text>
                <text x="288" y="212">packets</text>
                <text x="144" y="276">(2)</text>
                <text x="288" y="276">(4)</text>
                <text x="272" y="292">RTP</text>
                <text x="88" y="356">Network</text>
                <text x="176" y="356">(7)</text>
                <text x="268" y="356">Sender</text>
                <text x="92" y="372">congestion</text>
                <text x="268" y="372">Transmission</text>
                <text x="88" y="388">control</text>
                <text x="264" y="388">Control</text>
                <text x="284" y="420">|(5)</text>
                <text x="132" y="436">RTCP</text>
                <text x="272" y="436">RTP</text>
                <text x="48" y="452">(6)</text>
                <text x="256" y="500">UDP</text>
                <text x="252" y="516">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
          +---------------------------+
          |        Media encoder      |
          +---------------------------+
              ^                  |(1)
              |                 RTP
              |(3)               |
              |                  V
              |            +-----------+
         +---------+       |           |
         | Media   |       |   Queue   |
         | rate    |       |           |
         | control |       |RTP packets|
         +---------+       |           |
              ^            +-----------+
              |                  |
              | (2)              |(4)
              |                 RTP
              |                  |
              |                  v
    +------------+       +--------------+
    |  Network   |  (7)  |    Sender    |
+-->| congestion |------>| Transmission |
|   |  control   |       |   Control    |
|   +------------+       +--------------+
|                                |(5)
+-------------RTCP----------+   RTP
    (6)                     |    |
                            |    v
                        +------------+
                        |     UDP    |
                        |   socket   |
                        +------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the RTP queue (1) in
<xref target="fig-sender-view"/>. The RTP packets are picked from the RTP queue (4), for
multiple flows from each RTP queue based on some defined priority order or
simply in a round-robin fashion, by the sender transmission controller.</t>
      <t>The sender transmission controller (in case of multiple flows a transmission
scheduler) sends the RTP packets to the UDP socket (5). In the general case, all
media SHOULD go through the sender transmission controller and is limited 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 RTP queue.</t>
      <t>RTCP packets are received (6) and the information about the bytes in flight and
reference window is exchanged between the network congestion control and the
sender transmission control (7).</t>
      <t>The reference window and the estimated RTT is communicated to the media rate
control (2) 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. This is described more in detail below.</t>
      <section anchor="constants-variables">
        <name>Constants and variables</name>
        <t>Constants and state variables are listed in this section. Temporary variables
are not listed; instead, they are appended with '_t' in the pseudocode to
indicate their local scope.</t>
        <section anchor="constants">
          <name>Constants</name>
          <t>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>MAX_BYTES_IN_FLIGHT_HEAD_ROOM (1.1): Headroom for the limitation of ref_wnd.</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 byte): Maximum segment size = Max RTP packet size.</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>
            <li>
              <t>RATE_PACE_MIN (50000): Minimum pacing rate in [bps].</t>
            </li>
            <li>
              <t>REF_WND_OVERHEAD (1.5): Indicates how much bytes in flight is allowed to
exceed ref_wnd.</t>
            </li>
            <li>
              <t>L4S_AVG_G (1.0/16): Exponentially
Weighted Moving Average (EWMA) factor for l4s_alpha</t>
            </li>
            <li>
              <t>QDELAY_AVG_G (1.0/4): Exponentially
Weighted Moving Average (EWMA) factor for qdelay_avg</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY (4.0): Determines how long (seconds) after a congestion
event that 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]</t>
            </li>
            <li>
              <t>PACKET_PACING_HEADROOM (1.5): Extra head room for packet pacing.</t>
            </li>
            <li>
              <t>BYTES_IN_FLIGHT_HEAD_ROOM (2.0): Extra headroom for bytes in flight.</t>
            </li>
          </ul>
        </section>
        <section anchor="state-variables">
          <name>State Variables</name>
          <t>The values within parentheses "()" indicate initial values.</t>
          <ul spacing="normal">
            <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>qdelay_fraction_avg (0.0): Fractional qdelay filtered by the Exponentially
Weighted Moving Average (EWMA).</t>
            </li>
            <li>
              <t>ref_wnd (MIN_REF_WND): Reference window.</t>
            </li>
            <li>
              <t>ref_wnd_i (1): Reference window inflection point.</t>
            </li>
            <li>
              <t>bytes_newly_acked (0): The number of bytes that was acknowledged with the last
received acknowledgement, i.e., bytes acknowledged since the last ref_wnd
update.</t>
            </li>
            <li>
              <t>max_bytes_in_flight (0): The maximum number of bytes in flight in the last
round trip.</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in
previous round trip.</t>
            </li>
            <li>
              <t>send_wnd (0): Upper limit to how many bytes can currently be
transmitted. Updated when ref_wnd is updated and when RTP packet is
transmitted.</t>
            </li>
            <li>
              <t>target_bitrate (0): Media target bitrate [bps].</t>
            </li>
            <li>
              <t>rate_media (0.0): Measured bitrate [bps] from the media encoder.</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>
            <li>
              <t>rtp_size (0): Size [byte] of the last transmitted RTP packet.</t>
            </li>
            <li>
              <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost packets
detected.</t>
            </li>
            <li>
              <t>bytes_in_flight_ratio (0.0): Ratio between the bytes in flight and the
reference window.</t>
            </li>
            <li>
              <t>ref_wnd_ratio (0.0): Ratio between MSS and ref_wnd.</t>
            </li>
            <li>
              <t>last_fraction_marked (0.0): fraction marked packets in last update</t>
            </li>
            <li>
              <t>l4s_alpha (0.0): Average fraction of marked packets per RTT.</t>
            </li>
            <li>
              <t>l4s_active (false): Indicates that L4S is enabled and packets are indeed
marked.</t>
            </li>
            <li>
              <t>last_update_l4s_alpha_time (0): Last time l4s_alpha was updated [s].</t>
            </li>
            <li>
              <t>last_update_qdelay_avg_time (0): Last time qdelay_avg was updated [s].</t>
            </li>
            <li>
              <t>packets_delivered_this_rtt (0): Counter for delivered packets.</t>
            </li>
            <li>
              <t>packets_marked_this_rtt (0): Counter delivered and ECN-CE marked packets.</t>
            </li>
            <li>
              <t>last_congestion_detected_time (0): Last time congestion event occured [s].</t>
            </li>
            <li>
              <t>last_ref_wnd_i_update_time (0): Last time ref_wnd_i was updated [s].</t>
            </li>
            <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>
            <li>
              <t>pace_bitrate (1e6): Packet pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between packets [s].</t>
            </li>
            <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>
          </ul>
        </section>
      </section>
      <section anchor="network-cc-2">
        <name>Network Congestion Control</name>
        <t>This section explains the network congestion control, which performs two main
functions:</t>
        <ul spacing="normal">
          <li>
            <t>Computation of reference window at the sender: This gives an upper limit to
the number of bytes in flight.</t>
          </li>
          <li>
            <t>Calculation of send window at the sender: RTP packets 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>
          </li>
        </ul>
        <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 RTP
packets. Thus, a list of transmitted RTP packets and their respective
transmission times (wall-clock time) MUST be kept for further calculation.</t>
        <t>The number of bytes in flight (bytes_in_flight) is computed as the sum of the
sizes of the RTP packets ranging from the RTP packet most recently transmitted,
down to but not including the acknowledged packet with the highest sequence
number. This can be translated to the difference between the highest transmitted
byte sequence number and the highest acknowledged byte sequence number. As an
example: If an RTP packet 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 RTP packets with sequence
number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the
packet with sequence number SN-3 was lost -- the size of RTP packet with
sequence number SN-3 will still be considered in the computation of
bytes_in_flight.</t>
        <t>bytes_in_flight_ratio is calculated as the ratio between bytes_flight and
ref_wnd. This value should be computed at the beginning of the ACK
processing. ref_wnd_ratio is computed as the relation between MSS and ref_wnd.</t>
        <t>Furthermore, a variable 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 RTP
packets with sequence number N+1, N+2, and N+3. Packets that are lost are also
included, which means that even though, e.g., packet 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>
        <t>The feedback from the receiver is assumed to consist of the following elements.</t>
        <ul spacing="normal">
          <li>
            <t>A list of received RTP packets' sequence numbers. With an indication if
packets are ECN-CE marked.</t>
          </li>
          <li>
            <t>The wall-clock timestamp corresponding to the received RTP packet with the
highest sequence number.</t>
          </li>
        </ul>
        <t>It is recommended to use RFC8888 <xref target="RFC8888"/> for the feedback as it supports the
feedback elements described above.</t>
        <t>When the sender receives RTCP feedback, the qdelay is calculated as outlined in
<xref target="RFC6817"/>. A qdelay sample is obtained for each received acknowledgement. A
number of variables are updated as illustrated by the pseudocode below;
temporary variables are appended with '_t'. Division operation is always
floating point unless otherwise noted. l4s_alpha is calculated based in number
of packets delivered (and marked). This makes calculation of L4S alpha more
accurate at very low bitrates, given that the tail RTP packet in a video frame
is often smaller than MSS.</t>
        <t>The smoothed RTT (s_rtt) is computed in a way similar to <xref target="RFC6298"/>.</t>
        <artwork><![CDATA[
packets_delivered_this_rtt += packets_acked
packets_marked_this_rtt += packets_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 packets marked istf bytes marked
  fraction_marked_t = packets_marked_this_rtt/
                      packets_delivered_this_rtt

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

  last_update_l4s_alpha_time = now
  packets_delivered_this_rtt = 0
  packets_marked_this_rtt = 0
  last_fraction_marked = fraction_marked_t
end

if (now - last_update_qdelay_avg_time >= s_rtt)
  # qdelay_avg is updated with a slow attack, fast decay EWMA filter
  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>
        <section anchor="reaction-delay-loss-ce">
          <name>Reaction to Delay, Packet Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost packets detected. The loss detection is described in <xref target="detect-loss"/>.</t>
            </li>
            <li>
              <t>ECN-CE marked packets detected.</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>Lost packets</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>
          </section>
          <section anchor="reaction-ecn-ce">
            <name>ECN-CE and 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 packet drop thresholds.</t>
          </section>
          <section anchor="reaction-l4s-ce">
            <name>ECN-CE and L4S</name>
            <t>The ref_wnd is scaled down in proportion to the fraction of marked packets per
RTT. The scale down proportion is given by l4s_alpha, which is an EWMA filtered
version of the fraction of marked packets 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>
          </section>
          <section anchor="reaction-delay">
            <name>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 packets. This reduces negative effects of
clockdrift, that the delay based control can introduce, whenever possible.</t>
          </section>
        </section>
        <section anchor="ref-wnd-update">
          <name>Reference Window Update</name>
          <t>The reference window update contains two parts. One that reduces the congestion
window when congestion events (listed above) occur, and one part that
continously increases the reference window.</t>
          <t>The target bitrate is updated whenever the reference window is updated.</t>
          <t>Actions when congestion detected</t>
          <artwork><![CDATA[
# The reference window is updated at least every VIRTUAL_RTT
if (now - last_congestion_detected_time >= min(VIRTUAL_RTT,s_rtt)
  if (loss detected)
    is_loss_t = true
  end
  if (packets marked)
    is_ce_t = true
  end
  if (qdelay > qdelay_target/2)
    # It is expected that l4s_alpha is below a given value,
    l4_alpha_lim_t = 2 / target_bitrate * MSS * 8 / s_rtt
    if (l4s_alpha < l4_alpha_lim_t || !l4s_active)
      # L4S does not seem to be active
      l4s_alpha_v_t = min(1.0, max(0.0,
         (qdelay_avg - qdelay_target / 2) /
         (qdelay_target / 2)));
      is_virtual_ce_t = true
    end
  end
end

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  if (now - last_ref_wnd_i_update_time > 0.25)
    # Update ref_wnd_i
    # 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.8, 1.0 - ref_wnd_ratio * 2)

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

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

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

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  last_congestion_detected_time = now
end
]]></artwork>
          <t>The variable max_bytes_in_flight_prev indicates the maximum bytes in flights in
the previous round trip. The reason to this is that bytes in flight can spike
when congestion occurs, max_bytes_in_flight_prev thus ensures better that an
uncongested bytes in flight is used.</t>
          <t>Reference window increase</t>
          <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))

# 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
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
scl_t = (ref_wnd-ref_wnd_i) / ref_wnd_i
scl_t *= 4
scl_low_limit_t = 0.1
if (is_l4s_active)
  # Restrict limit to small reference windows. The limitation
  # is gradually lifted and completely removed when
  # ref_wnd > 50MSS
  scl_low_limit_t = max(0.1, min(1.0, 0.02 / ref_wnd_ratio));
end

scl_t = scl_t * scl_t
scl_t = max(scl_low_limit_t, min(1.0, scl_t))
increment_t *= scl_t

# Slow down ref_wnd increase when ref_wnd is only a few MSS
# The ref_wnd increase can be as slow as
# LOW_REF_WND_SCALE_FACTOR*MSS per RTT
float tmp_t = ref_wnd_scale_factor_t

# Further limit multiplicative increase when congestion occured
# recently.
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.
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)
  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 variable max_bytes_in_flight indicates the max bytes in flight in the
current round trip.</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 packets 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 anchor="detect-loss">
          <name>Lost Packet Detection</name>
          <t>Lost packet detection is based on the received sequence number list. A
reordering window SHOULD be applied to prevent packet 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 packets. This flag is set if the received sequence number list
indicates that the given packet is missing. If later feedback indicates that
a previously lost marked packet 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 packet was marked as lost and
the event that it was indicated as successfully received. Loss is detected if a
given RTP packet is not acknowledged within a time window (indicated by the
reordering window) after an packet with a higher sequence number was
acknowledged.</t>
        </section>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind packet 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 RTP queue
absorbs the natural variations in frame sizes. However, the RTP 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 RTP 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 RTP 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 packet is transmitted or an feedback
messaged is received.</t>
          <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. The calculation of rel_framesize_high is done for every new video frame
and is outlined roughly with the pseudo code below. For more detailed code, see
<xref target="SCReAM-CPP-implementation"/>.</t>
          <artwork><![CDATA[
# frame_size is that frame size for the last encoded frame
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. The time interval between consecutive packet 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 = rtp_size * 8 / pace_bitrate
]]></artwork>
          <t>rtp_size is the size of the last transmitted RTP packet. RATE_PACE_MIN is the
minimum pacing rate.</t>
        </section>
        <section anchor="stream-prioritization">
          <name>Stream Prioritization</name>
          <t>The SCReAM algorithm makes a distinction between network congestion control and
media rate control. This is easily extended to many streams. RTP packets from
two or more RTP queues are scheduled at the rate permitted by the network
congestion control.</t>
          <t>The scheduling can be done by means of a few different scheduling regimes. For
example, the method for coupled congestion control specified in <xref target="RFC8699"/> can
be used. One implementation of SCReAMv2 <xref target="SCReAM-CPP-implementation"/> uses
credit-based scheduling. In credit-based scheduling, credit is accumulated by
queues as they wait for service and is spent while the queues are being
serviced. For instance, if one queue is allowed to transmit 1000 bytes, then a
credit of 1000 bytes is allocated to the other unscheduled queues. This
principle can be extended to weighted scheduling, where the credit allocated to
unscheduled queues depends on the relative weights. The latter is also
implemented in <xref target="SCReAM-CPP-implementation"/> in which case the target bitrate
for the streams are also scaled relative to the scheduling priority.</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 updates the target bitrate. The target bitrate is essentiatlly based
on the reference window and the (smoothed) 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 RTP 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 packets</t>
          </li>
          <li>
            <t>ref_wnd is very small, just a few MSS or smaller</t>
          </li>
        </ul>
        <t>The complete pseudo code for adjustment of the target bitrate is shown below</t>
        <artwork><![CDATA[
tmp_t = 1.0

# limit bitrate if bytes in flight exceeds is close to or
# exceeds ref_wnd. This helps to avoid large rate fluctiations and
# variations in RTT
# Only applied when L4S is inactive
if (!l4s_active && 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.8, max(0.0, ref_wnd_ratio - 0.1))

# 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>
      <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)
    # Packet 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>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 packet 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 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 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 packets to the sender. Upon reception
of each RTP packet, 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 RTCP 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 packets received since last RTCP feedback has been transmitted</t>
        </li>
        <li>
          <t>An RTP packet with marker bit set 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>
    </section>
    <section anchor="discussion">
      <name>Discussion</name>
      <t>This section covers a few discussion points.</t>
      <ul spacing="normal">
        <li>
          <t>Clock drift: SCReAM/SCReAMv2 can suffer from the same issues with clock drift
as is the case with LEDBAT <xref target="RFC6817"/>. However, Appendix A.2 in <xref target="RFC6817"/>
describes ways to mitigate issues with clock drift. A clockdrift compensation
method is also implemented in <xref target="SCReAM-CPP-implementation"/>. Furthermore, the
SCReAM implementation resets base delay history when it is determined that
clock drift becomes too large. This is achieved by reducing the target bitrate
for a few RTTs.</t>
        </li>
        <li>
          <t>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 RTP 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 -
rtp_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>RFC8888 Feedback issues: RTCP feedback packets 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.</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="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="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="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="RFC9332" target="https://www.rfc-editor.org/info/rfc9332" xml:base="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.9332.xml">
          <front>
            <title>Dual-Queue Coupled Active Queue Management (AQM) for Low Latency, Low Loss, and Scalable Throughput (L4S)</title>
            <author fullname="K. De Schepper" initials="K." surname="De Schepper"/>
            <author fullname="B. Briscoe" initials="B." role="editor" surname="Briscoe"/>
            <author fullname="G. White" initials="G." surname="White"/>
            <date month="January" year="2023"/>
            <abstract>
              <t>This specification defines a framework for coupling the Active Queue Management (AQM) algorithms in two queues intended for flows with different responses to congestion. This provides a way for the Internet to transition from the scaling problems of standard TCP-Reno-friendly ('Classic') congestion controls to the family of 'Scalable' congestion controls. These are designed for consistently very low queuing latency, very low congestion loss, and scaling of per-flow throughput by using Explicit Congestion Notification (ECN) in a modified way. Until the Coupled Dual Queue (DualQ), these Scalable L4S congestion controls could only be deployed where a clean-slate environment could be arranged, such as in private data centres.</t>
              <t>This specification first explains how a Coupled DualQ works. It then gives the normative requirements that are necessary for it to work well. All this is independent of which two AQMs are used, but pseudocode examples of specific AQMs are given in appendices.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9332"/>
          <seriesInfo name="DOI" value="10.17487/RFC9332"/>
        </reference>
        <reference anchor="Packet-conservation">
          <front>
            <title>Congestion Avoidance and Control</title>
            <author initials="V." surname="Jacobson" fullname="Van Jacobson">
              <organization/>
            </author>
            <date year="1988" month="August"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/52325.52356"/>
          <refcontent>ACM SIGCOMM Computer Communication Review</refcontent>
        </reference>
        <reference anchor="LEDBAT-delay-impact" target="http://home.ifi.uio.no/michawe/research/publications/ledbat-impact-letters.pdf">
          <front>
            <title>Assessing LEDBAT's Delay Impact</title>
            <author initials="D." surname="Ros" fullname="David Ros">
              <organization/>
            </author>
            <author initials="M." surname="Welzl" fullname="Michael Welzl">
              <organization/>
            </author>
            <date year="2013" month="May"/>
          </front>
          <seriesInfo name="DOI" value="10.1109/LCOMM.2013.040213.130137"/>
          <refcontent>IEEE Communications Letters, Vol. 17, No. 5,</refcontent>
        </reference>
        <reference anchor="QoS-3GPP" target="http://www.3gpp.org/ftp/specs/archive/23_series/23.203/">
          <front>
            <title>Policy and charging control architecture</title>
            <author>
              <organization/>
            </author>
            <date year="2017" month="July"/>
          </front>
          <refcontent>3GPP TS 23.203</refcontent>
        </reference>
        <reference anchor="SCReAM-CPP-implementation" target="https://github.com/EricssonResearch/scream">
          <front>
            <title>SCReAM - Mobile optimised congestion control algorithm</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="SCReAM-evaluation-L4S" target="https://github.com/EricssonResearch/scream/blob/master/L4S-Results.pdf?raw=true">
          <front>
            <title>SCReAM - evaluations with L4S</title>
            <author initials="" surname="Ericsson Research">
              <organization/>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="TFWC" target="http://www-dept.cs.ucl.ac.uk/staff/M.Handley/papers/tfwc-conext.pdf">
          <front>
            <title>Fairer TCP-Friendly Congestion Control Protocol for Multimedia Streaming Applications</title>
            <author initials="S." surname="Choi" fullname="Soo-Hyun Choi">
              <organization/>
            </author>
            <author initials="M." surname="Handley" fullname="Mark Handley">
              <organization/>
            </author>
            <date year="2007" month="December"/>
          </front>
          <seriesInfo name="DOI" value="10.1145/1364654.1364717"/>
        </reference>
      </references>
    </references>
    <?line 1367?>

<section anchor="acknowledgements">
      <name>Acknowledgments</name>
      <t>Zaheduzzaman Sarker was a co-author of RFC 8298 the previous version
of scream which this document was based on. We would like to thank the
following people for their comments, questions, and support during the
work that led to this memo: Mirja Kuehlewind.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8V9aXfb5pLmd/wKjH16IjkktdhKHLt9ZxRZdtzt7UpKMj19
enRAEpRwTQK8AChF13H/9ql6qupdAFBOej5MTk5CkcC71r6Ox+NkXs3KbJU/
S+d1tmjHf6uus7JpqnI8m91ejevF7OnhD0+nRTNuZnWerW4Ox/sHSVu0S3rl
PF8uxifLavYpn6dnWZunx/Ns3WZtUZXpoqrTd5tlW6zyeZEl2XRa5zf0zslZ
fvzu5jCppk21zNu8eZbyFMksa5+l+W/rpFjXz9K23jTt4f7+D/uHye3Vs/Tk
5NfXSUYreJZe1LTCdVW3SbOZroqmodnauzWt583pxas0fZhmy6Z6lj4oynm+
zuk/ZftglD54c/wj/Y9W9eDN2cWrB0lyk5eb/FmSpld1tVnTHFV5lTdYPH1s
62qZ/lrVn4ryKn3NT6Q7fCa79MIqK5bPUv7rfxZ5u5hU9RUPU7TXm+mz9GpZ
FeVmuTd4onKMYzrRJMk27XVV8wrGCf2H/ylKOo83k/Rf7C39Xu7oDS1wldW9
X2n+Z+lpXcyC73JZZCGvTJqJW8j/zPXJyaxaYfJg7vTdJP2VTiGvl5tyHs3+
LrsqN03/13tmX+GVya17JZ47KUoCkxUBzA0uIj17dXJ4cPCDff7+yfdP7TMD
ift8dHDgPn/3g3v+Kf3hPv/w9Mi/e/S9ff7h8ePDZzjujxkBbjueVWWT1zeA
2me6fAXwACKOb6pinpWzPM3KucGHPu3vUf8Z+496rL/QlWYzhvky/E0O9pes
7P5a5wtaV0ug+yw9PnmXnr95ffLh3TuaeLXe0Fnyh9WmLGaCbGf5TZHf6ru0
myJv+GiDJb388OZZerA/OTh4crR3dPj48GhC/z36Tp+YE/bSTJsrQrv04Ien
T3FCb09f/nh8MZ7ny+xuXKzW2ax9tmXP4Zax45eT9Kxqgm9lry+zm2Ie/dJ7
ExC4/Mey9+67Ynad5cvo1/Cg3pyensYH06Rv85aOqxmlv1TLSXrw/Sh9X03S
o9EfO6v9H/be8rlPDvcPHk/2n+wf0v8OHtMf30cH9y67S/mRGHyOmyYn8kT0
Qw7ymyZ9yUeZvsFR2sNZfZXT6q/bdv1sb++6WuWTYlFMNkU1Kau9FW/6Nt+r
8ybP6tn13nozXdr29pb5fJq1ejfjpWx2sp4vcH9/rc7Hj19//NgB6wcfKxrh
DpBMg9dXvMSZkjyeo2jzWbup8wcDh8zjpRfn6eFjOpTHw3u4vb2dPL5ar5kw
7i3a9V6zzmfNHoa+yfcOH1/Kue/JIHvRWf7LZonD/B5bEH4xPvn4kTe5zFe0
iCFUlefScfqumhbLPK3WxHmKhhjTzCOx2+PyqqqJWq/+EAILVBqBI1yTixjY
ekN7Fy7A5G3PXrE39oT4h/vKb7LlBvsZv31yvm1P/qkmvaXxU3r2/8vS96bL
arq3ypic79EixvQ78XhA3P+os9sXxLdz7O/i1a8nXbB7lRU1ka6Lk4/jV3T9
5ZwueoDpfqyrtprRh1iESM9bXgLD6vF67VDgwZ84iPNJenJdFdEPQlrOq2r8
092m7Pw+MAZRp58IcZb53cAw77L6U+fnr1Pjg8ffPfnu6MmE///9wfdbUYro
8LqdzJrJZracZLPJ5tNe02aLxd67iU65t87WhP977eJ2xnwt/60FLZARBb1e
5rN8NaVrIOmKUKzs8t/HB985Pvv46GjfPj858vyUvv7OPn8X8OXvnh44Pksf
n3i+/PRpwH9pzGQ8HqfZtGlrJoTJxXXRpKt8VaXznCCtmOZNmt2LuQAO+vaG
9gtAyJapSJrMzIsZDdBsZtdp1tC1EbTSNLTJlJhPTvT/4jpPSfzc2NgshTRp
W6Ut/bCGXJCEckG6rotyVhD9AdEseHXXd9OaWNmyapoxvgWbTKfZMNFJ2uus
hWhKC1uz/Nqkpyfv8SZhkqzJb4+mUKyn0SraZTqtCPGbYrVZ8nfJG95Vmbf8
PaFXmc8+pc0sL7O6qBre9m2+XMr2abEroYrNHWHuykahE9wwe0re0mov8nqV
nt7Yoey8vTjdxeKOXtuem+vqtuRTyoiO53SaWNKyuk15SaVwlOS6uLqWc6bT
JLn56pokFl4FnW2T+zXyjnlQYg3E7lSQcVoBg0rCMl/3YNzhXTPMMzWoFumK
qQTfjlCKBpSCmD7pBTTykraZk4LRMFTVuf7MrzIQ1QR2pLroNY3S4zPs9/HL
9Jez9KqqrpZ5MxGAXRVzQrMkeUiSOD0838yw6M8Pi+DPL0kSEDXZd+puq5rN
NjVdznUuP7SszayKlq95WtBftBQ6FT5EunOCmTLhx7IbkqezKe1wlhF8Fu2d
AEVGWscNDyXDQBkiAG6vJxGRTAX46jwhGrKs7miy7sKuM7pQutt8xQ8M4V5w
8XU1JUExIWID+d3EYn6C5eT47eUyW9PFdyakI30TICbdyHLMlJ5eCCVbYvoV
7o3grOWrrvO/b4iNsBzQpBXGTFpTCZ/znyStVHU+oldkmaM0XxCAEcNpU5xv
FmupGePJjChGw/CSNwmjt8xctxm9tM5qTF18fb0Ec1nj12Q3QlJWWZLkOqVT
ui3mhDUzmuEmq/UaeSA6kF9pY0tehy7HKBjhoqLiiCCHBMJUl0gLuqoJvm2F
fMAEXzVt1RGIET3GzJtPkX+3fdGd8XF2DkRW319wQs9mROIWGaEaFjQlwYCW
/vmzSZlfvmBX/OoV8KkhIlAT0N4JDaKN3jENIc0dB7eoiWcyem8aXFZnJY4+
8x0NHz2wfZTYMf2aT88uTmhFqjp++TLi+TZLQi0lVgQ7RCf5LOkb4BPBbEVw
zJMLRiVL5ry0HN5F4e/OEG8yzK7+hDGETwJgcZjsmD1kd8QXulkzk+Y1qew3
gIY81tnFRyNyCbbLnPrLF1KcrpnM68u3dCZENUm8JxC/o7XeQCDmAeSoRvak
ZxeJLQh3CXZFJ7Wx9yrGrzQLScstY9zQQqtFMi8Wi5yhEZgl6GuX54h0DhaA
JUbkm4A8IbZGiEB4MrGl0skLixXcJ/mKzn3G584E3fNpmosETVw1rb5JSKW5
Lou/b1gwIM2ALpmP+ZbpIg2JDSqF6qGE4z1u4rfVbXL6G6G4KnQ/ksjAViSa
zJmniIVC69sVgGTZiG4o8QdM05ZE0+h0GO3vgp3QJMy4iWJvroTQxbuEDsDQ
SLybN0j8vSiJpxN3JKkaG5ikrzY1X9YojW60zT7x5m6IrmVXOKXT3/gyizbk
Wu+r1vPkHRJTdBMsHBKaQ2Yhtv9W2T4+V0y36IdzYriMWUnA/XdIwtEhWP6j
IRixQJIEfFgSIvCixyBoCI9nlngHYkpk7LaqBXH5iq6rhpSO9KfqlrgRbTF+
nU9V2YRALb9Cd1fMkiF82pQzESCZq9K67LwM0WMJpSYGms2Ulq5rwqlq07Dh
kuR8KKdLh97YL8swtF9CBsNKvjw3B0s3tH8WS4iPik6+ID2J4aG4KjEvoY8Q
VRNRE8Nqh78GolhzJEcyTDtqBXRs0ivCr5ZmyK4y0mnaeCu2erdikcBW9Ghq
+DwTSYrk+Ec4dL0wAqx5Ppfn+WtdxoqEi0a2p6hXtEWuqizP/fJEUZV0hI91
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
X4qRVukB7gAA

-->

</rfc>
