<?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-02" category="exp" submissionType="IETF" obsoletes="8298" version="3">
  <!-- xml2rfc v2v3 conversion 3.23.2 -->
  <front>
    <title abbrev="SCReAMv2">Self-Clocked Rate Adaptation for Multimedia</title>
    <seriesInfo name="Internet-Draft" value="draft-johansson-ccwg-rfc8298bis-screamv2-02"/>
    <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="October" day="21"/>
    <area>Transport</area>
    <workgroup>CCWG</workgroup>
    <abstract>
      <?line 113?>

<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 125?>

<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 media streams such as RTP
<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
estimates the forward queue delay in the same way as 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="requirements-media">
        <name>Requirements on media and feedback protocol</name>
        <t>SCReAM was originally designed to with with RTP + RTCP where <xref target="RFC8888"/> was
used as recommended feedback. RTP offers unique packet indication with the
sequence number and <xref target="RFC8888"/> offers timestamps of received packets and the
status of the ECN bits.</t>
        <t>SCReAM is however not limited to RTP as long as some requirements are fulfilled :</t>
        <ul spacing="normal">
          <li>
            <t>Media data is split in data units that when encapsulated in IP packets fit in
the network MTU.</t>
          </li>
          <li>
            <t>Each data unit can be uniquely identified.</t>
          </li>
          <li>
            <t>Data units can be queued up in a packet queue before transmission.</t>
          </li>
          <li>
            <t>Feedback can indicate reception time for each data units, or a group of data
units.</t>
          </li>
          <li>
            <t>Feedback can indicate packets that are ECN-CE marked. Unique ECN bits
indication for each packet is not necessary. An ECN-CE counter similar to
what is defined in <xref target="RFC9000"/> is sufficient.</t>
          </li>
        </ul>
      </section>
      <section anchor="ledbat-tfwc">
        <name>Comparison with LEDBAT and TFWC in TCP</name>
        <t>The core SCReAM algorithm, which is still similar in SCReAMv2, has similarities
to the concepts of self-clocking used in TCP-friendly window-based congestion
control <xref target="TFWC"/> and follows the packet conservation principle. The packet
conservation principle is described as a key factor behind the protection of
networks from congestion <xref target="Packet-conservation"/>.</t>
        <t>The reference window 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 data unit 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 data unit 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 data units and indication of
ECN-CE marking, either as an accumulated counter, or individual per data unit.</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 data
receiver.
The feedback from the receiver is timestamp and individual data units or group of data
units and ECN status per data unit or an accumulated ECN-CE count.
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 data unit 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 data
units 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 data unit 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 data unit queues are drained quickly. Frame skipping
results in the frame rate being temporarily reduced. Which method to use is a
design choice and is outside the scope of this algorithm description.</t>
      </section>
    </section>
    <section anchor="scream-detailed-description">
      <name>Detailed Description of SCReAMv2 sender algorithm</name>
      <t>This section describes the sender-side algorithm in more detail. It is split
between the network congestion control, sender transmission control, and media
rate control.</t>
      <t>The sender implements media rate control and an data unit queue for each media
type or source, where data units containing encoded media frames are temporarily
stored for transmission. Figure 1 shows the details when a single media source
(or stream) is used. 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="360" viewBox="0 0 360 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 232,336 L 232,400" fill="none" stroke="black"/>
              <path d="M 232,432 L 232,472" fill="none" stroke="black"/>
              <path d="M 248,144 L 248,240" fill="none" stroke="black"/>
              <path d="M 296,128 L 296,136" fill="none" stroke="black"/>
              <path d="M 296,248 L 296,272" fill="none" stroke="black"/>
              <path d="M 296,304 L 296,328" fill="none" stroke="black"/>
              <path d="M 296,448 L 296,472" fill="none" stroke="black"/>
              <path d="M 328,480 L 328,528" fill="none" stroke="black"/>
              <path d="M 336,32 L 336,64" fill="none" stroke="black"/>
              <path d="M 344,144 L 344,240" fill="none" stroke="black"/>
              <path d="M 352,336 L 352,400" fill="none" stroke="black"/>
              <path d="M 88,32 L 336,32" fill="none" stroke="black"/>
              <path d="M 88,64 L 336,64" fill="none" stroke="black"/>
              <path d="M 248,144 L 344,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 248,240 L 344,240" fill="none" stroke="black"/>
              <path d="M 40,336 L 144,336" fill="none" stroke="black"/>
              <path d="M 232,336 L 352,336" fill="none" stroke="black"/>
              <path d="M 8,368 L 32,368" fill="none" stroke="black"/>
              <path d="M 152,368 L 224,368" fill="none" stroke="black"/>
              <path d="M 40,400 L 144,400" fill="none" stroke="black"/>
              <path d="M 232,400 L 352,400" fill="none" stroke="black"/>
              <path d="M 8,432 L 88,432" fill="none" stroke="black"/>
              <path d="M 168,432 L 232,432" fill="none" stroke="black"/>
              <path d="M 200,480 L 328,480" fill="none" stroke="black"/>
              <path d="M 200,528 L 328,528" fill="none" stroke="black"/>
              <polygon class="arrowhead" points="304,472 292,466.4 292,477.6" fill="black" transform="rotate(90,296,472)"/>
              <polygon class="arrowhead" points="304,328 292,322.4 292,333.6" fill="black" transform="rotate(90,296,328)"/>
              <polygon class="arrowhead" points="304,136 292,130.4 292,141.6" fill="black" transform="rotate(90,296,136)"/>
              <polygon class="arrowhead" points="232,368 220,362.4 220,373.6" fill="black" transform="rotate(0,224,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="192" y="52">Media</text>
                <text x="248" y="52">encoder</text>
                <text x="308" y="84">|(1)</text>
                <text x="276" y="100">Data</text>
                <text x="316" y="100">unit</text>
                <text x="136" y="116">(3)</text>
                <text x="296" y="116">|</text>
                <text x="112" y="180">Media</text>
                <text x="296" y="180">Queue</text>
                <text x="108" y="196">rate</text>
                <text x="120" y="212">control</text>
                <text x="276" y="212">Data</text>
                <text x="320" y="212">units</text>
                <text x="144" y="276">(2)</text>
                <text x="312" y="276">(4)</text>
                <text x="276" y="292">Data</text>
                <text x="316" y="292">unit</text>
                <text x="88" y="356">Network</text>
                <text x="184" y="356">(7)</text>
                <text x="292" y="356">Sender</text>
                <text x="92" y="372">congestion</text>
                <text x="292" y="372">Transmission</text>
                <text x="88" y="388">control</text>
                <text x="288" y="388">Control</text>
                <text x="308" y="420">|(5)</text>
                <text x="108" y="436">Feed</text>
                <text x="148" y="436">back</text>
                <text x="276" y="436">Data</text>
                <text x="316" y="436">unit</text>
                <text x="48" y="452">(6)</text>
                <text x="272" y="500">UDP</text>
                <text x="268" y="516">socket</text>
              </g>
            </svg>
          </artwork>
          <artwork type="ascii-art"><![CDATA[
          +------------------------------+
          |          Media encoder       |
          +------------------------------+
              ^                     |(1)
              |                 Data unit
              |(3)                  |
              |                     V
              |               +-----------+
         +---------+          |           |
         | Media   |          |   Queue   |
         | rate    |          |           |
         | control |          | Data units|
         +---------+          |           |
              ^               +-----------+
              |                     |
              | (2)                 |(4)
              |                 Data unit
              |                     |
              |                     v
    +------------+          +--------------+
    |  Network   |   (7)    |    Sender    |
+-->| congestion |--------->| Transmission |
|   |  control   |          |   Control    |
|   +------------+          +--------------+
|                                   |(5)
+----------Feed back--------+   Data unit
    (6)                     |       |
                            |       v
                        +---------------+
                        |       UDP     |
                        |     socket    |
                        +---------------+
]]></artwork>
        </artset>
      </figure>
      <t>Media frames are encoded and forwarded to the data unit queue (1) in
<xref target="fig-sender-view"/>. The data units are picked from the data unit queue (4), for
multiple flows from each data unit 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 data units 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 data unit 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): Maximum segment size = Max data unit size [byte].</t>
            </li>
            <li>
              <t>TARGET_BITRATE_MIN: Minimum target bitrate in [bps] (bits per second).</t>
            </li>
            <li>
              <t>TARGET_BITRATE_MAX: Maximum target bitrate in [bps].</t>
            </li>
            <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>PACKET_OVERHEAD (20) : Estimated packetization overhead [byte]</t>
            </li>
            <li>
              <t>POST_CONGESTION_DELAY_RTT (100): Determines how many RTTs after a congestion
event the reference window growth should be cautious.</t>
            </li>
            <li>
              <t>MUL_INCREASE_FACTOR (0.02): Determines how much (as a fraction of ref_wnd)
that the ref_wnd can increase per RTT.</t>
            </li>
            <li>
              <t>IS_L4S (false): Congestion control operates in L4S mode.</t>
            </li>
            <li>
              <t>VIRTUAL_RTT (0.025): Virtual RTT [s]. This mimics Prague's RTT fairness such that flows with RTT
below VIRTUAL_RTT should get a roughly equal share over an L4S path.</t>
            </li>
            <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 [byte].</t>
            </li>
            <li>
              <t>ref_wnd_i (1): Reference window inflection point [byte].</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 [byte].</t>
            </li>
            <li>
              <t>max_bytes_in_flight_prev (0): The maximum number of bytes in flight in
previous round trip [byte].</t>
            </li>
            <li>
              <t>send_wnd (0): Upper limit to how many bytes can currently be
transmitted. Updated when ref_wnd is updated and when data unit is
transmitted [byte].</t>
            </li>
            <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>data_unit_size (0): Size [byte] of the last transmitted data unit.</t>
            </li>
            <li>
              <t>loss_event_rate (0.0): The estimated fraction of RTTs with lost data units
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 data units in last update</t>
            </li>
            <li>
              <t>l4s_alpha (0.0): Average fraction of marked data units per RTT.</t>
            </li>
            <li>
              <t>l4s_active (false): Indicates that L4S is enabled and data units 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>data_units_delivered_this_rtt (0): Counter for delivered data units.</t>
            </li>
            <li>
              <t>data_units_marked_this_rtt (0): Counter delivered and ECN-CE marked data units.</t>
            </li>
            <li>
              <t>last_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): Data unit pacing rate [bps].</t>
            </li>
            <li>
              <t>t_pace (1e-6): Pacing interval between data units [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: Data units are transmitted if
allowed by the relation between the number of bytes in flight and the
reference window. This is controlled by the send window.</t>
          </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 data units. Thus, a list of transmitted data
units 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 data units ranging from the data unit most recently transmitted,
down to but not including the acknowledged data unit 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 a data unit with sequence number SN is transmitted and the last
acknowledgement indicates SN-5 as the highest received sequence number, then
bytes_in_flight is computed as the sum of the size of data units with sequence
number SN-4, SN-3, SN-2, SN-1, and SN. It does not matter if, for instance, the
data unit with sequence number SN-3 was lost -- the size of data unit with
sequence number SN-3 will still be considered in the computation of
bytes_in_flight.</t>
        <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 data units with sequence
number N+1, N+2, and N+3. Data units that are lost are also included,
which means that even though, e.g., data unit N+2 was lost, its size
is still included in the update of bytes_newly_acked. The
bytes_newly_acked_ce is, similar to bytes_newly_acked, a counter of
bytes newly acked with the extra condition that they are ECN-CE
marked. The bytes_newly_acked and bytes_newly_acked_ce are reset to
zero after a ref_wnd update.</t>
        <t>The feedback from the receiver is assumed to consist of the following elements.</t>
        <ul spacing="normal">
          <li>
            <t>A list of received data units' sequence numbers. With an indication
if data units are ECN-CE marked, the ECN status can be either per
data unit or an accumulated count of ECN-CE marked data units.</t>
          </li>
          <li>
            <t>The wall-clock timestamp corresponding to the received data unit with the
highest sequence number.</t>
          </li>
        </ul>
        <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 data units delivered (and marked). This makes calculation of L4S alpha more
accurate at very low bitrates, given that the tail data unit in e.g a video frame
is often smaller than MSS.</t>
        <t>The smoothed RTT (s_rtt) is computed in a way similar to <xref target="RFC6298"/>.</t>
        <artwork><![CDATA[
data_units_delivered_this_rtt += data_units_acked
data_units_marked_this_rtt += data_units_acked_ce
# l4s_alpha is updated at least every 10ms
if (now - last_update_l4s_alpha_time >= min(0.01,s_rtt)
  # l4s_alpha is calculated from data_units marked istf bytes marked
  fraction_marked_t = data_units_marked_this_rtt/
                      data_units_delivered_this_rtt

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

  last_update_l4s_alpha_time = now
  data_units_delivered_this_rtt = 0
  data_units_marked_this_rtt = 0
  last_fraction_marked = fraction_marked_t
end

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, Data unit Loss and ECN-CE</name>
          <t>Congestion is detected based on three different indicators:</t>
          <ul spacing="normal">
            <li>
              <t>Lost data units detected. The loss detection is described in <xref target="detect-loss"/>.</t>
            </li>
            <li>
              <t>ECN-CE marked data units 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 data units</name>
            <t>The reference window back-off due to loss events is deliberately a bit less than
is the case with TCP Reno, for example. TCP is generally used to transmit whole
files; the file is then like a source with an infinite bitrate until the whole
file has been transmitted. SCReAMv2, on the other hand, has a source which rate
is limited to a value close to the available transmit rate and often below that
value; the effect is that SCReAMv2 has less opportunity to grab free capacity
than a TCP-based file transfer. To compensate for this, it is RECOMMENDED to let
SCReAMv2 reduce the reference window less than what is the case with TCP when
loss events occur.</t>
          </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 data unit 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 data units per
RTT. The scale down proportion is given by l4s_alpha, which is an EWMA filtered
version of the fraction of marked data units per RTT. This is inline with how DCTCP
works <xref target="RFC8257"/>. Additional methods are applied to make the reference window
reduction reasonably stable, especially when the reference window is only a few
MSS. In addition, because SCReAMv2 can quite often be source limited, additional
steps are taken to restore the reference window to a proper value after a long
period without congestion.</t>
          </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 data units. 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 (data units marked)
    is_ce_t = true
  end
  if (qdelay > qdelay_target/2)
    # It is expected that l4s_alpha is below a given value,
    l4_alpha_lim_t = 2 / target_bitrate * MSS * 8 / s_rtt
    if (l4s_alpha < l4_alpha_lim_t || !l4s_active)
      # L4S does not seem to be active
      l4s_alpha_v_t = min(1.0, max(0.0,
         (qdelay_avg - qdelay_target / 2) /
         (qdelay_target / 2)));
      is_virtual_ce_t = true
    end
  end
end

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


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

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

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

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

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

if (is_loss_t || is_ce_t || is_virtual_ce_t)
  last_congestion_detected_time = now
end
]]></artwork>
          <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_RTTS * max(VIRTUAL_RTT, s_rtt))))

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


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

increment_t = bytes_newly_acked_minus_ce_t*ref_wnd_ratio

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

# Apply limit to reference window growth when close to last
# known max value before congestion
scl_t = (ref_wnd-ref_wnd_i) / ref_wnd_i
scl_t *= 4
scl_t = scl_t * scl_t
scl_t = max(0.1, min(1.0, scl_t))
if (!is_l4s_active)
  increment_t *= scl_t
end

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

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

# Increase ref_wnd only if bytes in flight is large enough
# Quite a lot of slack is allowed here to avoid that bitrate
# locks to low values.
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 data units per
RTT equilibrium at steady state congestion, with the exception of the case
below.</t>
          <t>The reference window increase is restricted to values as small as 0.1MSS/RTT
when the reference window is close to the last known max value (ref_wnd_i). This
increases stability and reduces periodic overshoot. This restriction is applied
in full only for small reference windows when in L4S operation.</t>
          <t>It is particularly important that the reference window reflects the transmitted
bitrate especially in L4S mode operation. An inflated ref_wnd takes extra RTTs
to bring down to a correct value upon congestion and thus causes unnecessary
queue buildup. At the same time the reference window must be allowed to be large
enough to avoid that the SCReAMv2 algorithm begins to limit itself, given that
the target bitrate is calculated based on the ref_wnd. Two mechanisms are used
to manage this:</t>
          <ul spacing="normal">
            <li>
              <t>Restore correct value of ref_wnd upon congestion. This is done if is a
prolonged time since the link was congested. A typical example is that
SCReAMv2 has been rate limited, i.e the target bitrate has reached the
TARGET_BITRATE_MAX.</t>
            </li>
            <li>
              <t>Limit ref_wnd when the target_bitrate has reached TARGET_BITRATE_MAX. The
ref_wnd is restricted based on a history of the last max_bytes_in_flight
values. See <xref target="SCReAM-CPP-implementation"/> for details.</t>
            </li>
          </ul>
          <t>The two mechanisms complement one another.</t>
        </section>
        <section anchor="detect-loss">
          <name>Lost Data Unit Detection</name>
          <t>Lost data unit detection is based on the received sequence number list. A
reordering window SHOULD be applied to prevent data unit reordering from triggering
loss events. The reordering window is specified as a time unit, similar to the
ideas behind Recent ACKnowledgement (RACK) <xref target="RFC8985"/>. The computation of the
reordering window is made possible by means of a lost flag in the list of
transmitted data units. This flag is set if the received sequence number list
indicates that the given data unit is missing. If later feedback indicates that
a previously lost marked data unit was indeed received, then the reordering window
is updated to reflect the reordering delay. The reordering window is given by
the difference in time between the event that the data unit was marked as lost and
the event that it was indicated as successfully received. Loss is detected if a
given data unit is not acknowledged within a time window (indicated by the
reordering window) after an data unit with a higher sequence number was
acknowledged.</t>
        </section>
        <section anchor="send-window">
          <name>Send Window Calculation</name>
          <t>The basic design principle behind data unit transmission in SCReAM was to allow
transmission only if the number of bytes in flight is less than the congestion
window. There are, however, two reasons why this strict rule will not work
optimally:</t>
          <ul spacing="normal">
            <li>
              <t>Bitrate variations: Media sources such as video encoders generally produce
frames whose size always vary to a larger or smaller extent. The data unit queue
absorbs the natural variations in frame sizes. However, the data unit queue should
be as short as possible to prevent the end-to-end delay from increasing. A
strict 'send only when bytes in flight is less than the reference window' rule
can cause the data unit queue to grow simply because the send window is limited. The
consequence is that the reference window will not increase, or will increase
very slowly, because the reference window is only allowed to increase when
there is a sufficient amount of data in flight. The final effect is that the
media bitrate increases very slowly or not at all.</t>
            </li>
            <li>
              <t>Reverse (feedback) path congestion: Especially in transport over
buffer-bloated networks, the one-way delay in the reverse direction can jump
due to congestion. The effect is that the acknowledgements are delayed, and
the self-clocking is temporarily halted, even though the forward path is not
congested. The REF_WND_OVERHEAD allows for some degree of reverse path
congestion as the bytes in flight is allowed to exceed ref_wnd.</t>
            </li>
          </ul>
          <t>In SCReAMv2, the send window is given by the relation between the adjusted
reference window and the amount of bytes in flight according to the pseudocode
below. The multiplication of ref_wnd with REF_WND_OVERHEAD and
rel_framesize_high has the effect that bytes in flight is 'around' the ref_wnd
rather than limited by the ref_wnd when the link is congested.  The
implementation allows the data unit queue to be small even when the frame sizes vary
and thus increased e2e delay can be avoided.</t>
          <artwork><![CDATA[
send_wnd = ref_wnd * REF_WND_OVERHEAD * rel_framesize_high -
           bytes_in_flight
]]></artwork>
          <t>The send window is updated whenever an data unit is transmitted or an feedback
messaged is received.</t>
          <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 data unit transmissions is
greater than or equal to t_pace, where t_pace is given by the equations below :</t>
          <artwork><![CDATA[
pace_bitrate = max(RATE_PACE_MIN, target_bitrate) *
               PACKET_PACING_HEADROOM
t_pace = data_unit_size * 8 / pace_bitrate
]]></artwork>
          <t>data_unit_size is the size of the last transmitted data unit. RATE_PACE_MIN is the
minimum pacing rate.</t>
        </section>
        <section 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. Data units from
two or more data unit 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 data unit queue(s) and a sufficient amount of data to
send in order to keep the data path busy. Because the reference window is
updated based on loss, ECN-CE and delay, so does the target rate also update.</t>
        <t>The code above however needs some modifications to work fine in a number of
scenarios</t>
        <ul spacing="normal">
          <li>
            <t>L4S is inactive, i.e L4S is either not enabled or congested bottlenecks do not
L4S mark data units</t>
          </li>
          <li>
            <t>ref_wnd is very small, just a few MSS or smaller</t>
          </li>
        </ul>
        <t>The complete pseudo code for adjustment of the target bitrate is shown below</t>
        <artwork><![CDATA[
tmp_t = 1.0

# limit bitrate if bytes in flight exceeds is close to or
# exceeds ref_wnd. This helps to avoid large rate fluctiations and
# variations in RTT
# 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.2, max(0.0, ref_wnd_ratio - 0.1))

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

# Calculate target bitrate and limit to min and max allowed
# values
target_bitrate = tmp_t * 8 * ref_wnd / s_rtt
target_bitrate = min(TARGET_BITRATE_MAX,
  max(TARGET_BITRATE_MIN,target_bitrate))
]]></artwork>
      </section>
      <section anchor="competing-flows-compensation">
        <name>Competing Flows Compensation</name>
        <t>It is likely that a flow will have to share congested bottlenecks with other
flows that use a more aggressive congestion control algorithm (for example,
large FTP flows using loss-based congestion control). The worst condition occurs
when the bottleneck queues are of tail-drop type with a large buffer
size. SCReAMv2 takes care of such situations by adjusting the qdelay_target when
loss-based flows are detected, as shown in the pseudocode below.</t>
        <artwork><![CDATA[
adjust_qdelay_target(qdelay)
  qdelay_norm_t = qdelay / QDELAY_TARGET_LOW
  update_qdelay_norm_history(qdelay_norm_t)
  # Compute variance
  qdelay_norm_var_t = VARIANCE(qdelay_norm_history(200))
  # Compensation for competing traffic
  # Compute average
  qdelay_norm_avg_t = AVERAGE(qdelay_norm_history(50))
  # Compute upper limit to target delay
  new_target_t = qdelay_norm_avg_t + sqrt(qdelay_norm_var_t)
  new_target_t *= QDELAY_TARGET_LO
  if (loss_event_rate > 0.002)
    # Data unit losses detected
    qdelay_target = 1.5 * new_target_t
  else
    if (qdelay_norm_var_t < 0.2)
      # Reasonably safe to set target qdelay
      qdelay_target = new_target_t
    else
      # Check if target delay can be reduced; this helps prevent
      # the target delay from being locked to high values forever
      if (new_target_t < QDELAY_TARGET_LO)
        # Decrease target delay quickly, as measured queuing
        # delay is lower than target
        qdelay_target = max(qdelay_target * 0.5, new_target_t)
      else
        # Decrease target delay slowly
        qdelay_target *= 0.9
      end
    end
  end

  # Apply limits
  qdelay_target = min(QDELAY_TARGET_HI, qdelay_target)
  qdelay_target = max(QDELAY_TARGET_LO, qdelay_target)
]]></artwork>
        <t>Two temporary variables are calculated. qdelay_norm_avg_t is the long-term
average queue delay, qdelay_norm_var_t is the long-term variance of the queue
delay. A high qdelay_norm_var_t indicates that the queue delay changes; this can
be an indication that bottleneck bandwidth is reduced or that a competing flow
has just entered. Thus, it indicates that it is not safe to adjust the queue
delay target.</t>
        <t>A low qdelay_norm_var_t indicates that the queue delay is relatively stable. The
reason could be that the queue delay is low, but it could also be that a
competing flow is causing the bottleneck to reach the point that data unit losses
start to occur, in which case the queue delay will stay relatively high for a
longer time.</t>
        <t>The queue delay target is allowed to be increased if either the loss event rate
is above a given threshold or qdelay_norm_var_t is low. Both these conditions
indicate that a competing flow may be present. In all other cases, the queue
delay target is decreased.</t>
        <t>The function that adjusts the qdelay_target is simple and could produce false
positives and false negatives. The case that self-inflicted congestion by the
SCReAMv2 algorithm may be falsely interpreted as the presence of competing
loss-based FTP flows is a false positive. The opposite case -- where the
algorithm fails to detect the presence of a competing FTP flow -- is a false
negative.</t>
        <t>Extensive simulations have shown that the algorithm performs well in LTE and 5G
test cases and that it also performs well in simple bandwidth-limited bottleneck
test cases with competing FTP flows. However, the potential failure of the
algorithm cannot be completely ruled out. A false positive (i.e., when
self-inflicted congestion is mistakenly identified as competing flows) is
especially problematic when it leads to increasing the target queue delay, which
can cause the end-to-end delay to increase dramatically.</t>
        <t>If it is deemed unlikely that competing flows occur over the same bottleneck,
the algorithm described in this section MAY be turned off. One such case is
QoS-enabled bearers in 3GPP-based access such as LTE and 5G. However, when
sending over the Internet, often the network conditions are not known for sure,
so in general it is not possible to make safe assumptions on how a network is
used and whether or not competing flows share the same bottleneck. Therefore,
turning this algorithm off must be considered with caution, as it can lead to
basically zero throughput if competing with loss-based traffic.</t>
      </section>
      <section 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 data units to the sender. Upon reception
of each data unit, the receiver MUST maintain enough information to send the
aforementioned values to the sender via an RTCP transport- layer feedback
message. The frequency of the feedback message depends on the available RTCP
bandwidth. The requirements on the feedback elements and the feedback interval
are described below.</t>
      <t>SCReAMv2 benefits from relatively frequent feedback. It is RECOMMENDED that a
SCReAMv2 implementation follows the guidelines below.</t>
      <t>The feedback interval depends on the media bitrate. At low bitrates, it is
sufficient with a feedback every frame; while at high bitrates, a feedback
interval of roughly 5ms is preferred. At very high bitrates, even shorter
feedback intervals MAY be needed in order to keep the self-clocking in SCReAMv2
working well. One indication that feedback is too sparse is that the SCReAMv2
implementation cannot reach high bitrates, even in uncongested links. More
frequent feedback might solve this issue.</t>
      <t>The numbers above can be formulated as a feedback interval function that can be
useful for the computation of the desired RTCP bandwidth. The following equation
expresses the feedback rate:</t>
      <artwork><![CDATA[
# Assume 100 byte feedback packets
rate_fb = 0.02 * [average received rate] / (100.0 * 8.0);
rate_fb = min(1000, max(10, rate_fb))

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

<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:
H4sIAAAAAAAAA8V96Xfb1pLnd/wVGPv0RHJIarGVRe68HkWWHU17e5KSTE+f
Hh2QBEU8kwQfAErWc9x/+1T9quouACg7PR9GJ8eRSOAudevWvgyHw2RaTlbZ
Mj9Op1U2a4Z/K+fZqq7L1XAyubsZVrPJD4c//jAu6mE9qfJseXs43D9MmqJZ
0CuX+WI2PF2Ukw/5NL3Imjw9mWbrJmuKcpXOyip9s1k0xTKfFlmSjcdVfkvv
nF7kJ29uD5NyXJeLvMnr45SnSCZZc5zmH9dJsa6O06ba1M3h/v6PNNvdzXF6
evr7qySjFRynVxWtcF1WTVJvxsuirmm25n5N6zk/u3qZpo/TbFGXx+mjYjXN
1zn9s2oeDdJH5yc/0/9oVY/OL65ePkqS23y1yY+TNL2pys2a5ihXN3mNxdOv
TVUu0t/L6kOxuklf8RPpDsNkl15YZsXiOOW//keRN7NRWd3wMEUz34yP05tF
Waw2i71eiAoYhwTRJMk2zbyseAXDhP7hn2JF8Dgfpf/T3tLP5YzOaYHLrOp8
S/Mfp2dVMQk+y2WRhbwyqkduIf8j1ydHk3KJyYO50zej9HeCQl4tNqtpNPub
7Ga1qbvfPjD7Eq+M7twr8dxJsSI0WRLC3OIg0ouXp4cHBz/a798/+/4H+52R
xP1+dHDgfv/uR/f8D/SH+/3HH478u0ff+2d+cOP8uL+/735/+vTwGMfwPiOE
boaTclXn1S2w+Vi3pYgfYMrJbVlMs9UkT7PV1PBGn/bnqz9D/6uC+zc66mzC
d2EVficA/y1btb+t8hmtqyGUPk5PTt+kl+evTt+9eUMTL9cbgjH/stysiolc
wov8tsjv9F3aTZHXDPJgSS/enR+nB/ujg4NnR3tHh08Pj0b079F3+sSUbjXN
tLmh65ge/PjDD4DQ67MXP59cDaf5IrsfFst1NmmOt+w53DJ2/GKUXpR18Kns
9UV2W0yjbzpvAjMX/1h03n1TTOZZvoi+DQF1fnZ2FgOmTl/nDYGrHqS/lYtR
evD9IH1bjtKjwdfBav/HvdcM99Hh/sHT0f6z/UP638FT+uP7CHBvsvuUH4nR
56SucyJbRFcEkN/U6QsGZXoOUNrDWXWT0+rnTbM+3tubl8t8VMyK0aYoR6ty
b8mbvsv3qrzOs2oy31tvxgvb3t4in46zRs9muJDNjtbTGc7vr+Xl8Omr9+9b
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
Nl+kGyT9AAA=

-->

</rfc>
