<?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.43 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-zengin-moq-ssts-backpressure-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="ssts-backpressure">A Backpressure Algorithm for Sender-Side Track Switching in MOQ Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-zengin-moq-ssts-backpressure-00"/>
    <author initials="A. F." surname="Zengin" fullname="Alperen Fatih Zengin">
      <organization>Ozyegin University</organization>
      <address>
        <email>fatih.zengin@ozu.edu.tr</email>
      </address>
    </author>
    <author initials="Z." surname="Gurel" fullname="Zafer Gurel">
      <organization>Ozyegin University</organization>
      <address>
        <email>zafer.gurel@ozu.edu.tr</email>
      </address>
    </author>
    <author initials="A." surname="Begen" fullname="Ali C. Begen">
      <organization>Networked Media</organization>
      <address>
        <email>ali.begen@networked.media</email>
      </address>
    </author>
    <author initials="D." surname="Ugur" fullname="Deniz Ugur">
      <organization>Ozyegin University</organization>
      <address>
        <email>deniz.ugur@ozu.edu.tr</email>
      </address>
    </author>
    <date/>
    <area>Applications and Real-Time</area>
    <workgroup>MOQ</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>sender-side track switching</keyword>
    <keyword>backpressure</keyword>
    <keyword>adaptive bitrate</keyword>
    <keyword>relay</keyword>
    <abstract>
      <?line 103?>

<t>Sender-Side Track Switching (SSTS) lets a publisher forward one track at a
time out of a switching set, and leaves the choice of which track to a
pluggable algorithm. The default algorithm divides a bandwidth estimate
between switching sets. This document defines an alternative algorithm that
uses no bandwidth estimate at all. It monitors the number of open forwarding
streams carrying the currently active tier, steps rapidly through the
switching set's ladder during fast start, regulates steady-state upshifts
dynamically according to relative bitrate jumps and the subscriber's
probing risk tolerance, and reacts to mid-group congestion using
intra-group monitoring and retroactive stream supersede. The signal
is directly observable at the publisher, requires no cooperation from
the congestion controller, and degrades toward the lowest quality under
load rather than toward none.</t>
    </abstract>
  </front>
  <middle>
    <?line 119?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Sender-Side Track Switching (SSTS) <xref target="SSTS"/> lets a subscriber group several
encodings of the same content into a <em>switching set</em> and hands the choice of
which encoding to forward to the publisher, typically a relay. The publisher forwards one member of the set at a time and dynamically switches between members as path conditions change. Which member it picks is not fixed by SSTS: the
SWITCHING_SET_ASSIGNMENT parameter names an <em>algorithm</em>, and each algorithm
defines its own fields, its own publisher behavior, and its own subscriber behavior.</t>
      <t>The default algorithm defined in <xref target="SSTS"/> is an allocation algorithm. It
starts from <tt>B_total</tt>, an estimate of the downstream bandwidth available to
the subscriber's connection, divides it between switching sets by rank and
weight, and selects, in each set, the highest member whose declared throughput
threshold fits the share the set received.</t>
      <t>That design assumes two inputs the publisher may not have:</t>
      <ul spacing="normal">
        <li>
          <t>A bandwidth estimate with a usable timebase. The estimate is obtained from
the transport stack, and what a transport stack can offer is a congestion
controller's view of the recent past: a congestion window, a pacing rate, a
smoothed round-trip time <xref target="RFC9002"/>. On a connection that is not
sending at capacity -- which is the normal state of a relay -- that view is
bounded by what was sent, not by what could have been sent, so the estimate
tends to confirm the tier already in use rather than reveal the next one up.
Measuring the headroom, rather than inferring it, requires sending data, which is a separate mechanism <xref target="Probing"/>.</t>
        </li>
        <li>
          <t>Sensitivity to absolute threshold calibration. Comparing a transport rate
estimate directly against subscriber-declared throughput thresholds requires
both numbers to share a well-calibrated absolute scale. If a track's actual
bitrate fluctuates above its declared threshold (e.g., during complex video
scenes), an estimate-driven selector may continue forwarding a track that is
already building a queue at the transport layer.</t>
        </li>
      </ul>
      <t>This document defines an algorithm that needs neither. Rather than asking
the transport stack what rate the path might support, the publisher counts
how many forwarding streams carrying the currently selected tier remain open
and unconsumed. An accumulating stream depth is direct evidence of overrun on
the connection.</t>
      <t>The cost of using evidence instead of inference is that the evidence arrives
late. A bandwidth estimate can suggest that a higher tier would fit before
anything is sent at that tier; backpressure can only report that the tier
currently in use does not fit, after a group has already been delayed. The
algorithm in this document is therefore conservative by construction: it
starts at the lowest tier, climbs only on a streak of healthy groups, and
drops on the first sign of a queue. An earlier version of this SSTS algorithm
has been evaluated in <xref target="MMSP26"/>.</t>
      <section anchor="scope">
        <name>Scope</name>
        <t>This document defines one SSTS algorithm designed for a single active
switching set per connection. Concurrent adaptation across multiple active
switching sets on the same connection is not supported by this specification;
subscribers with multiple switching sets <bcp14>SHOULD</bcp14> assign at most one switching
set to this algorithm and use an allocation algorithm (such as the default
algorithm of <xref target="SSTS"/>) for any others. This document does not change the SSTS
extension itself: negotiation, the SWITCHING_SET_ASSIGNMENT parameter, the
rules for forming and modifying switching sets, and the default algorithm
defined in <xref target="SSTS"/> are unaffected.</t>
      </section>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" 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>
      <?line -18?>

<t>This document uses the terms Track, Group, Object, Subgroup, publisher,
subscriber and relay as defined in <xref target="MoQTransport"/>, and the terms switching
set, member and algorithm as defined in <xref target="SSTS"/>. In addition:</t>
      <dl>
        <dt>Ladder:</dt>
        <dd>
          <t>The members of one switching set, ordered by ascending throughput threshold.
Position 0 is the lowest-quality member.</t>
        </dd>
        <dt>Tier:</dt>
        <dd>
          <t>An integer index into the switching set's ladder, in the range 0 to
<tt>i_max</tt>.</t>
        </dd>
        <dt>Nominal Tier Rate (<tt>R[i]</tt>):</dt>
        <dd>
          <t>The declared throughput threshold of the track at tier <tt>i</tt> of the ladder.</t>
        </dd>
        <dt>Forwarding stream:</dt>
        <dd>
          <t>A unidirectional QUIC stream the publisher has opened toward the subscriber
to carry Objects of a Subgroup of a member of a switching set, and that has
neither been closed nor reset. A stream still draining its last Object is
open.</t>
        </dd>
        <dt>Replacement stream:</dt>
        <dd>
          <t>A forwarding stream opened during a retroactive supersede (<xref target="supersede"/>)
to re-send an in-flight Group at a lower tier after canceling the higher-tier
stream.</t>
        </dd>
        <dt>Active stream depth (<tt>d</tt>):</dt>
        <dd>
          <t>The number of currently open forwarding streams carrying the track selected
at the current tier <tt>i</tt>, excluding replacement streams (<xref target="signals"/>).</t>
        </dd>
      </dl>
    </section>
    <section anchor="algorithm-overview">
      <name>Algorithm Overview</name>
      <t>For a switching set assigned to this algorithm, the publisher orders the
member tracks into a ladder of tiers 0 to <tt>i_max</tt> by ascending
throughput threshold and maintains a current tier index <tt>i</tt>, initialized to
0.</t>
      <t>The adaptation controller evaluates the active stream depth <tt>d</tt>
across two execution paths:</t>
      <ol spacing="normal" type="1"><li>
          <t><strong>Group boundary evaluations:</strong> When the publisher begins forwarding a new
Group (a Group ID greater than the largest Group ID previously evaluated),
it checks whether the transport path is clear: the active stream depth is
within target (<tt>d &lt;= D_target</tt>, where <tt>D_target</tt> is 1 by default), no
replacement stream from a previous supersede is still in flight, and the
next tier up (<tt>i + 1</tt>) has no open forwarding stream still draining
(<xref target="signals"/>).
          </t>
          <ul spacing="normal">
            <li>
              <t>During <strong>Fast Start</strong> (<tt>exploring = true</tt>), each clear Group boundary
immediately advances the tier by one (<tt>i = i + 1</tt>) so the session can
discover available capacity rapidly. Fast start ends permanently as soon
as congestion is detected (<tt>d &gt;= D_down</tt>, where <tt>D_down</tt> is 2 by default)
or when <tt>i</tt> reaches <tt>i_max</tt>.</t>
            </li>
            <li>
              <t>During <strong>Steady-State Regulation</strong> (<tt>exploring = false</tt>), the publisher
advances from tier <tt>i</tt> to <tt>i + 1</tt> only after observing <tt>U(i)</tt> consecutive
clear Group boundaries. <tt>U(i)</tt> scales dynamically with the fractional
bitrate increase <tt>(R[i+1] - R[i]) / R[i]</tt> and the subscriber's probing
risk tolerance <tt>rho</tt>, bounded by <tt>U_min</tt> and <tt>U_max</tt>. If <tt>d &gt;= D_down</tt>
at a Group boundary, the publisher immediately steps down
one tier (<tt>i = max(i - 1, 0)</tt>) and, when <tt>Retroactive supersede</tt> is enabled,
triggers a retroactive supersede.</t>
            </li>
          </ul>
        </li>
        <li>
          <t><strong>Intra-group monitoring:</strong> Waiting for the next Group boundary to react to
a sudden bandwidth drop can stall playback. Whenever an Object is forwarded
within an ongoing Group during steady state, the publisher checks <tt>d</tt>. A
single reading of <tt>d &gt;= D_down</tt> is tolerated to allow brief
handoff overlap between consecutive Groups, but if <tt>d &gt;= D_down</tt>
persists for <tt>M</tt> consecutive Object transmissions, the publisher
immediately steps down one tier mid-Group and, when Retroactive supersede
is enabled, triggers a retroactive supersede.</t>
        </li>
      </ol>
      <t>Whenever a downshift occurs (i &lt; i_prev) and Retroactive supersede is enabled,
<strong>Retroactive Supersede</strong> (<xref target="supersede"/>) clears queued higher-bitrate bytes
from the path by resetting the newest overtaken in-flight stream with the
MOQT <tt>Cancelled</tt> error code and re-sending that Group on a new stream using
the newly selected lower-tier track, prepending cached Objects from the start
of the Subgroup and inheriting the remaining client latency budget.</t>
    </section>
    <section anchor="negotiation-and-assignment">
      <name>Negotiation and Assignment</name>
      <section anchor="negotiation">
        <name>Negotiation</name>
        <t>Support for this algorithm is advertised in the SSTS_ALGORITHMS Setup Option
of <xref target="SSTS"/> by including the algorithm identifier allocated in
<xref target="iana-algorithm"/>. An endpoint that does not advertise the identifier <bcp14>MUST
NOT</bcp14> be sent a SWITCHING_SET_ASSIGNMENT naming it; a publisher that receives
one for an algorithm it did not advertise follows the error handling of
<xref target="SSTS"/>.</t>
      </section>
      <section anchor="assignment-fields">
        <name>SWITCHING_SET_ASSIGNMENT Fields</name>
        <t>This algorithm extends the base SWITCHING_SET_ASSIGNMENT parameter of <xref target="SSTS"/>
with the fields of the default algorithm (<xref target="SSTS"/>, Section 6.1) followed by
five adaptation parameters:</t>
        <artwork><![CDATA[
SWITCHING_SET_ASSIGNMENT {
  Switching set ID (vi64),
  Algorithm ID (vi64),
  Throughput threshold (vi64),
  Set throughput weight (vi64),
  Activate switching (vi64),
  Set rank (8),
  Latency budget B (vi64),
  Probing risk factor rho_pct (vi64),
  Upshift min streak U_min (vi64),
  Upshift max streak U_max (vi64),
  Retroactive supersede (vi64)
}
]]></artwork>
        <t>The fields are interpreted as follows:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Throughput threshold:</strong> The nominal bitrate of this track in kbps. Unlike
the default algorithm of <xref target="SSTS"/>, this value is never compared against an
estimated connection bandwidth <tt>B_total</tt>. Instead, it is used for two
relative calculations:
            </t>
            <ol spacing="normal" type="1"><li>
                <t>Ordering the members within the switching set's ladder
(<tt>R[0] &lt;= R[1] &lt;= ... &lt;= R[i_max]</tt>); and</t>
              </li>
              <li>
                <t>Computing the relative step ratio <tt>(R[i+1] - R[i]) / R[i]</tt> in the dynamic
upshift streak formula (<xref target="state-machine"/>).
If two members of a switching set declare the same throughput threshold, the
publisher <bcp14>MUST</bcp14> break the tie deterministically (for example, by order of
assignment arrival) and keep the order stable while both members remain in
the set.</t>
              </li>
            </ol>
          </li>
          <li>
            <t><strong>Set throughput weight:</strong> Expressed as an integer <tt>N</tt> in the range 1 to 10
as defined in <xref target="SSTS"/>. Because this algorithm operates on a single switching
set per connection and does not divide a bandwidth budget across sets, the
publisher parses this field for wire compatibility with <xref target="SSTS"/> Section 6.1
and ignores its value.</t>
          </li>
          <li>
            <t><strong>Activate switching:</strong> As defined in <xref target="SSTS"/>. When 0, switching is paused
for the set. When <tt>N</tt>, the publisher activates switching for the set once at
least <tt>N</tt> tracks in the set have active subscriptions.</t>
          </li>
          <li>
            <t><strong>Set rank:</strong> Expressed as an 8-bit unsigned integer (0-255) as defined in
<xref target="SSTS"/>. The publisher parses this field for wire compatibility with
<xref target="SSTS"/> Section 6.1 and ignores its value.</t>
          </li>
          <li>
            <t><strong>Latency budget (<tt>B</tt>):</strong> The subscriber's reorder/jitter buffer budget in
milliseconds. Any in-flight forwarding stream that remains open for longer
than <tt>B</tt> milliseconds without completing is reset by the publisher (Group
discarded). When retroactive supersede replaces an overtaken stream of age
<tt>t_age</tt>, the replacement stream inherits a remaining deadline of
<tt>T_resend = max(1, B - t_age)</tt> ms. Setting <tt>B = 0</tt>
designates a latency-insensitive profile where delivery timeout resets are
disabled and the publisher performs lossless forwarding without drop
deadlines.</t>
          </li>
          <li>
            <t><strong>Probing risk factor (<tt>rho_pct</tt>):</strong> The probing risk tolerance <tt>rho</tt>
(<tt>0 &lt; rho &lt;= 1</tt>), encoded as an integer percentage <tt>rho_pct</tt>. A value of
<tt>0</tt> selects the publisher default (<tt>25</tt>, corresponding to <tt>rho = 0.25</tt>),
<tt>1..100</tt> are explicit percentages, and values greater than <tt>100</tt> <bcp14>MUST</bcp14> be
clamped to <tt>100</tt>. Larger values climb more aggressively across large
bitrate jumps; smaller values require longer observation streaks.</t>
          </li>
          <li>
            <t><strong>Upshift min streak (<tt>U_min</tt>):</strong> The minimum number of consecutive
uncongested Group boundaries required before stepping up one tier in steady
state. When set to <tt>0</tt> (unset) or set below 2, the publisher clamps
<tt>U_min</tt> to a minimum of <tt>2</tt> to ensure stability, with a default
<tt>U_default = 2</tt>.</t>
          </li>
          <li>
            <t><strong>Upshift max streak (<tt>U_max</tt>):</strong> The upper bound on the number of
consecutive uncongested Group boundaries required before stepping up one
tier in steady state. When set to <tt>0</tt> (unset), the publisher leaves
<tt>U_max</tt> unbounded (no upper cap is enforced). If <tt>U_max &gt; 0</tt> and
<tt>U_max &lt; U_min</tt>, the publisher <bcp14>MUST</bcp14> set <tt>U_max = U_min</tt>. A
subscriber can enforce a static upshift interval of <tt>K</tt> Groups (bypassing
<tt>rho</tt>) by setting <tt>U_min = U_max = K</tt>.</t>
          </li>
          <li>
            <t><strong>Retroactive supersede:</strong> Controls whether the publisher performs
retroactive supersede (<xref target="supersede"/>) upon a downshift. When set to <tt>1</tt>, a
downshift cancels the newest overtaken in-flight stream and re-sends the
affected Subgroup from its beginning at the newly selected lower tier.
Unlike <tt>rho_pct</tt>, <tt>U_min</tt>, and <tt>U_max</tt>, a value of <tt>0</tt> does not select a
default; when set to <tt>0</tt>, retroactive supersede is disabled: in-flight
Groups are not canceled and continue to completion on the track they
started on, while the lowered tier <tt>i</tt> takes effect at the next new Group
boundary. Any non-zero value is treated as <tt>1</tt>.</t>
          </li>
        </ul>
        <t>When multiple subscriptions in the same switching set specify different values
for any set-level field (<tt>Activate switching</tt>, <tt>Latency budget</tt>, <tt>Probing risk
factor</tt>, <tt>Upshift min streak</tt>, <tt>Upshift max streak</tt>, or <tt>Retroactive supersede</tt>), the
publisher <bcp14>MUST</bcp14> use the value from the most recently received message for that set.</t>
      </section>
      <section anchor="subscriber-behavior">
        <name>Subscriber Behavior</name>
        <t>The subscriber follows the general rules of <xref target="SSTS"/> for establishing and
modifying switching sets, adding or removing tracks, and pausing or resuming
switching via <tt>Activate switching</tt>.</t>
        <t>A subscriber <bcp14>MUST NOT</bcp14> assign more than one active switching set per connection
to this algorithm. If a subscriber uses multiple switching sets on the same
connection, it <bcp14>SHOULD</bcp14> assign at most one switching set (typically video) to
this algorithm and assign the remaining switching sets to an algorithm that
allocates bandwidth across sets, such as the default algorithm of <xref target="SSTS"/>.
In particular, constant-bitrate or low-bitrate media such as audio <bcp14>SHOULD</bcp14> be
subscribed as ordinary MOQT tracks or assigned to another algorithm rather
than occupying the single switching set governed by this algorithm. If a
publisher nevertheless receives a <tt>SWITCHING_SET_ASSIGNMENT</tt> assigning an
additional active switching set on the same connection to this algorithm, it
<bcp14>SHOULD</bcp14> reject the assignment or leave the additional set inactive.</t>
        <t>When configuring the adaptation parameters in <xref target="assignment-fields"/>, it is
<bcp14>RECOMMENDED</bcp14> that the subscriber leave <tt>Upshift min streak</tt> (<tt>U_min</tt>) and
<tt>Upshift max streak</tt> (<tt>U_max</tt>) unset (<tt>0</tt>) and adjust upshift sensitivity
solely using <tt>Probing risk factor</tt> (<tt>rho</tt>). A subscriber that requires a
fixed upshift interval of <tt>K</tt> clear Groups (<tt>K &gt;= 2</tt>) regardless of the
relative bitrate step size <bcp14>MAY</bcp14> bypass <tt>rho</tt> by setting <tt>U_min = U_max = K</tt>.</t>
        <t>A subscriber whose media pipeline cannot discard partially buffered Groups and
replace them with a re-sent Subgroup stream <bcp14>MUST</bcp14> set <tt>Retroactive supersede</tt>
to <tt>0</tt> in <tt>SWITCHING_SET_ASSIGNMENT</tt> (<xref target="assignment-fields"/>).
When <tt>Retroactive supersede</tt> is enabled (<tt>1</tt>), the publisher aborts the
overtaken in-flight forwarding stream with a QUIC <tt>RESET_STREAM</tt> and opens a
replacement stream for the same Group ID on the newly selected lower-tier
track, starting from the beginning of the affected Subgroup. Upon receiving
a <tt>RESET_STREAM</tt> carrying the MOQT <tt>Cancelled</tt> error code on a stream
belonging to the switching set -- or upon receiving a new forwarding stream
for the same Group ID on a different member track of the switching set --
the subscriber <bcp14>MUST</bcp14> discard any Objects already buffered from the canceled
higher-tier stream that have not yet been passed to the decoder, and <bcp14>MUST</bcp14>
instead buffer and decode the Objects arriving on the replacement stream
from the beginning of the Subgroup so that inter-frame decoder state remains
valid. For any Object position that has already been presented prior to the
switch, the subscriber <bcp14>MUST</bcp14> decode the replacement Object without rendering
it; it <bcp14>MUST NOT</bcp14> present the same Object position twice.</t>
      </section>
    </section>
    <section anchor="publisher-behavior">
      <name>Publisher Behavior</name>
      <section anchor="ladder">
        <name>Ladder Construction</name>
        <t>For the active switching set assigned to this algorithm, the publisher orders
its member tracks into a ladder <tt>L = [m[0], m[1], ..., m[i_max]]</tt> sorted
by ascending declared throughput threshold
<tt>R[0] &lt;= R[1] &lt;= ... &lt;= R[i_max]</tt>.</t>
        <t>Whenever a track is added to or removed from the switching set, the publisher
recomputes the ladder and sets the current tier index <tt>i</tt> to the highest tier
whose nominal rate <tt>R[i]</tt> does not exceed the nominal rate of the previously
selected track (clamped to the range 0 to <tt>i_max</tt>).</t>
      </section>
      <section anchor="signals">
        <name>Signals</name>
        <t>The publisher scopes its congestion signal strictly to the currently active
tier <tt>i</tt> of the switching set controlled by this algorithm.</t>
        <t>For any tier <tt>j</tt> of the switching set, let <tt>ordinary_open_streams(j)</tt> be the
number of currently open forwarding streams carrying track <tt>m[j]</tt> that were
<strong>not</strong> opened as replacement streams by a retroactive supersede
(<xref target="supersede"/>). The counter is incremented when the publisher opens an
ordinary forwarding stream for <tt>m[j]</tt> and decremented when that stream closes,
is reset by the publisher, or is stopped by the subscriber (<tt>STOP_SENDING</tt>).
Similarly, let <tt>open_replacement_streams</tt> be the number of currently open
replacement streams for the switching set, incremented when a replacement
stream is opened during a retroactive supersede and decremented when it
closes, is reset, or is stopped. Streams belonging to tracks outside the
switching set (such as an ordinary audio subscription) <bcp14>MUST NOT</bcp14> be counted in
either counter.</t>
        <t>The active stream depth <tt>d</tt> evaluated by the state machine is:</t>
        <artwork><![CDATA[
d = ordinary_open_streams(i)
]]></artwork>
        <t>Isolating <tt>d</tt> to the active tier <tt>i</tt> and excluding replacement streams has two
important properties:</t>
        <ul spacing="normal">
          <li>
            <t><strong>No cooldown state required:</strong> When the publisher steps down from tier
<tt>i_prev</tt> to a lower tier <tt>i</tt>, any streams still draining from
<tt>i_prev</tt> (or older tiers) are not counted in <tt>d</tt> at tier <tt>i</tt>. The
controller evaluates whether the new tier <tt>i</tt> is sustainable on its own
merits without cascading downshifts from historical congestion.</t>
          </li>
          <li>
            <t><strong>No separate timeout counter required:</strong> Streams that expire due to the
latency budget <tt>B</tt> are symptoms of queue accumulation that has already
raised <tt>d</tt> to or above <tt>D_down</tt>. Filtering timeout events out of
<tt>d</tt> avoids double-penalizing the tier after a downshift has already taken
place.</t>
          </li>
        </ul>
        <t>Because <tt>d</tt> is scoped strictly to ordinary forwarding streams at the current
tier <tt>i</tt>, <tt>d &lt;= D_target</tt> alone does not guarantee that the pipeline
is clear to step up to tier <tt>i + 1</tt>. The publisher therefore combines
<tt>d &lt;= D_target</tt> with two boolean climb guards when evaluating whether a
Group boundary is clear:</t>
        <ul spacing="normal">
          <li>
            <t><strong>Repair in flight (<tt>resent_in_flight</tt>):</strong> True when at least one
replacement stream opened by a previous retroactive supersede (<xref target="supersede"/>)
is still open for the switching set (<tt>open_replacement_streams &gt; 0</tt>).
Because replacement streams are excluded from <tt>d</tt> so a downshift
cannot trigger a second downshift, an open
replacement stream cannot be counted as a clear boundary either: until the
repair finishes, the overtaken delivery has not resolved.</t>
          </li>
          <li>
            <t><strong>Target rung occupied (<tt>target_occupied</tt>):</strong> True when <tt>i &lt; i_max</tt> and
<tt>ordinary_open_streams(i + 1) &gt; 0</tt> (at least one ordinary forwarding stream
is still open at the next tier up). An old stream draining at tier <tt>i + 1</tt>
is not congestion at tier <tt>i</tt> and <bcp14>MUST NOT</bcp14> trigger a downshift, but stepping
up to tier <tt>i + 1</tt> while that stream is still open would immediately combine
the new Group's stream with the lingering one (<tt>d &gt;= 2</tt>) and force an
immediate downshift. At the top of the ladder (<tt>i = i_max</tt>),
<tt>target_occupied</tt> is false.</t>
          </li>
        </ul>
        <t>A Group boundary is considered <em>clear</em> if and only if <tt>d &lt;= D_target</tt>,
<tt>resent_in_flight</tt> is false, and <tt>target_occupied</tt> is false. When
<tt>d &lt;= D_target</tt> but either guard is true, the boundary is neither clear nor
congested: <tt>clear_streak</tt> and <tt>monitor_streak</tt> are reset to <tt>0</tt>, and the
current tier <tt>i</tt> and <tt>exploring</tt> state are held unchanged.</t>
      </section>
      <section anchor="state-machine">
        <name>State Machine and Adaptation Logic</name>
        <t>In addition to the per-tier <tt>ordinary_open_streams(j)</tt> counters and the
switching set's validated parameters (<tt>rho</tt> in <tt>(0, 1]</tt>, <tt>U_min &gt;= 2</tt>,
<tt>U_max</tt> set to <tt>0</tt> or <tt>&gt;= U_min</tt>, <tt>B</tt>, and <tt>retroactive_supersede</tt> from
<xref target="assignment-fields"/>), the publisher maintains the following state for the
switching set:</t>
        <artwork><![CDATA[
i                        : integer, initially 0    ; current tier
exploring                : boolean, initially true ; fast-start exploration flag
clear_streak             : integer, initially 0    ; consecutive clear Groups
monitor_streak           : integer, initially 0    ; consecutive congested Objects
g_last                   : integer or none         ; largest Group ID evaluated
open_replacement_streams : integer, initially 0    ; open supersede streams
                                                   ;   for this switching set
]]></artwork>
        <t>The internal threshold constants have the following default values:</t>
        <artwork><![CDATA[
D_target = 1  ; max active streams considered clear
D_down   = 2  ; active streams indicating overlap/queuing
M        = 3  ; consecutive intra-group samples with d >= D_down
              ; required to trigger a mid-group downshift
]]></artwork>
        <t>The controller runs on two events: when the first Object of a new Group <tt>g</tt> is
about to be forwarded (<tt>is_new_group</tt> is true when <tt>g_last == none</tt> or
<tt>g &gt; g_last</tt>), and when a subsequent Object of an active Group is about to
be forwarded (<tt>is_new_group</tt> is false).</t>
        <artwork><![CDATA[
on_object_forward(g):
  d = ordinary_open_streams(i)
  resent_in_flight = (open_replacement_streams > 0)
  target_occupied = (i < i_max) and (ordinary_open_streams(i + 1) > 0)
  i_prev = i
  is_new_group = (g_last == none or g > g_last)

  if is_new_group:                          ; 1. Group boundary evaluation
    g_last = g
    is_clear = (d <= D_target) and (not resent_in_flight) and (not target_occupied)

    if is_clear:                            ; Clear: eligible to climb
      monitor_streak = 0
      clear_streak = clear_streak + 1
      if i < i_max:
        step_ratio = 1.0 if R[i] == 0 else (R[i + 1] - R[i]) / R[i]
        U_i = max( U_min, ceil( step_ratio / rho ) )
        if U_max > 0:
          U_i = min( U_max, U_i )
      else:
        U_i = 2
      needed = 1 if exploring else U_i
      if clear_streak >= needed:
        i = min( i + 1, i_max )
        clear_streak = 0
        if exploring and i >= i_max:
          exploring = false
    else if d >= D_down:                    ; Congested: downshift
      clear_streak = 0
      monitor_streak = 0
      exploring = false
      i = max( i - 1, 0 )
    else:                                   ; Guarded (or D_target < d < D_down):
      clear_streak = 0                      ;   hold tier, reset streaks
      monitor_streak = 0

  else:                                     ; 2. Intra-group monitor
    if d >= D_down:
      monitor_streak = monitor_streak + 1
    else:
      monitor_streak = 0

    if (not exploring) and i > 0 and monitor_streak >= M:
      i = i - 1
      monitor_streak = 0
      clear_streak = 0

  downshifted = (i < i_prev)

  if downshifted and retroactive_supersede == 1: ; 3. Retroactive supersede
    trigger_retroactive_supersede(i, i_prev)     ; if s_last > i and cache exist,
                                                 ; cancels s_last and opens a
                                                 ; replacement stream at tier i
                                                 ; with Subgroup Objects 0..N-1

  if is_new_group:                          ; 4. Forward current Object
    open ordinary forwarding stream for Group g on track m[i]
    forward current Object on Group g's new stream
  else if a replacement stream is open for Group g:
    forward current Object on Group g's replacement stream
  else:
    forward current Object on Group g's existing stream
]]></artwork>
        <section anchor="fast-start-exploring-true">
          <name>Fast Start (<tt>exploring = true</tt>)</name>
          <t>At the start of a session, <tt>exploring</tt> is <tt>true</tt> and <tt>i = 0</tt>. At each clear
Group boundary (d &lt;= D_target with both resent_in_flight and target_occupied false),
the required streak is <tt>needed = 1</tt>,
allowing the tier to climb by one rung per Group boundary without waiting for
multi-Group observation windows. During fast start, the intra-group monitor is
disarmed (<tt>not exploring</tt> is false) so that each newly probed tier is tested
across at least one complete Group transmission. Fast start terminates
permanently (<tt>exploring = false</tt>) as soon as <tt>d &gt;= D_down</tt> is
observed at a Group boundary or when <tt>i</tt> reaches <tt>i_max</tt>.</t>
        </section>
        <section anchor="steady-state-regulation-exploring-false">
          <name>Steady-State Regulation (<tt>exploring = false</tt>)</name>
          <t>Once fast start ends, advancing from tier <tt>i</tt> to tier <tt>i + 1</tt> requires <tt>U(i)</tt>
consecutive clear Group boundaries (<tt>d &lt;= D_target</tt> with both
<tt>resent_in_flight</tt> and <tt>target_occupied</tt> false), where:</t>
          <artwork><![CDATA[
U(i) = max(2, U_min, ceil((R[i+1] - R[i]) / (R[i] * rho)))
]]></artwork>
          <t>When <tt>U_max</tt> is greater than 0, the computed value is reduced to <tt>U_max</tt> if it
exceeds <tt>U_max</tt>.</t>
          <t>Here <tt>(R[i+1] - R[i]) / R[i]</tt> is the fractional increase in nominal bitrate
required by the next ladder tier. A step that doubles the bitrate requires
twice the observation window of a step that increases the bitrate by 50%. If
<tt>R[i] = 0</tt>, the publisher treats the step ratio as 1.0.</t>
          <t>Conversely, if <tt>d &gt;= D_down</tt> at any Group boundary, the publisher
immediately steps down to <tt>max(i - 1, 0)</tt>, resets <tt>clear_streak</tt> and
<tt>monitor_streak</tt> to <tt>0</tt>, and, when Retroactive supersede is enabled,
initiates a retroactive supersede (<xref target="supersede"/>).</t>
        </section>
        <section anchor="intra-group-monitoring">
          <name>Intra-Group Monitoring</name>
          <t>Waiting for the next Group boundary to adapt can leave a congested stream
blocking the connection when path capacity drops mid-Group. During steady
state (<tt>exploring = false</tt>), the publisher evaluates <tt>d</tt> prior to forwarding
each Object within a Group. Because a brief overlap (<tt>d = 2</tt>) can occur
naturally during the handoff between the last Object of Group <tt>g - 1</tt> and the
first Object of Group <tt>g</tt>, a single reading of <tt>d &gt;= D_down</tt> is
tolerated. If <tt>d &gt;= D_down</tt> persists for <tt>M</tt> consecutive Object
forwarding events while <tt>i &gt; 0</tt>, the publisher immediately decrements <tt>i</tt> by 1,
resets both streak counters, and, when Retroactive supersede is enabled,
executes a retroactive supersede (<xref target="supersede"/>).</t>
        </section>
      </section>
      <section anchor="supersede">
        <name>Retroactive Supersede</name>
        <t>A purely forward-looking downshift that only takes effect on the <em>next</em> Group
leaves the currently in-flight Group at the higher tier queued in the
transport send buffer, prolonging congestion. To evacuate those queued bytes
immediately, whenever a decision lowers the tier (<tt>i &lt; i_prev</tt>) and
<tt>Retroactive supersede</tt> is enabled (<tt>1</tt>, <xref target="assignment-fields"/>), the
publisher performs a <em>retroactive supersede</em> on the switching set:</t>
        <ol spacing="normal" type="1"><li>
            <t><strong>Locate and cancel the overtaken stream:</strong> The publisher identifies the
newest in-flight forwarding stream <tt>s_last</tt> for the switching set that is
carrying a track from a tier higher than <tt>i</tt> and that still has unsent
Objects or bytes remaining in the transport send buffer yet to be
transmitted on the wire (a stream whose bytes have all left the send
buffer and is merely awaiting acknowledgment or closure is left to
finish). If no such stream <tt>s_last</tt> exists, or if the cached beginning of
the affected Subgroup on track <tt>m[i]</tt> is unavailable, steps 2-4 are
skipped. Otherwise, the publisher aborts <tt>s_last</tt> by sending a QUIC
<tt>RESET_STREAM</tt> frame with the MOQT <tt>Cancelled</tt> error code.</t>
          </li>
          <li>
            <t><strong>Open a replacement stream at tier <tt>i</tt>:</strong> The publisher opens a new
unidirectional QUIC stream for the same Group ID using the track newly
selected at tier <tt>i</tt>, writes the Subgroup header, and prepends the
affected Subgroup's initial Objects <tt>0</tt> to <tt>N - 1</tt> of track <tt>m[i]</tt> from
the relay's object cache (where <tt>N</tt> is the number of Objects already
dispatched on <tt>s_last</tt>), followed by subsequent live Objects of that
Subgroup as they arrive. If the relay has already received the remaining
Objects of the Subgroup and no further live Objects will arrive, it
replays those cached Objects as well.</t>
          </li>
          <li>
            <t><strong>Inherit the remaining latency budget:</strong> Let <tt>t_age</tt> be the
elapsed time in milliseconds since <tt>s_last</tt> was originally opened.
If the subscriber configured a non-zero latency budget <tt>B &gt; 0</tt>
(<xref target="assignment-fields"/>), the publisher assigns the replacement stream a delivery
timeout of <tt>T_resend = max(1, B - t_age)</tt>.
If <tt>B = 0</tt>, no delivery timeout deadline is applied to the replacement
stream.</t>
          </li>
          <li>
            <t><strong>Mark as replacement and exclude from <tt>d</tt>:</strong> The replacement stream is
marked as a re-sent stream: it increments <tt>open_replacement_streams</tt> while
open (setting <tt>resent_in_flight</tt>) and <bcp14>MUST NOT</bcp14> be counted in
<tt>ordinary_open_streams(j)</tt> for any tier <tt>j</tt> (<xref target="signals"/>), ensuring that
replacing an overtaken Group does not artificially inflate <tt>d</tt> or
<tt>target_occupied</tt>.</t>
          </li>
        </ol>
        <t>When <tt>Retroactive supersede</tt> is disabled (<tt>0</tt>), the publisher skips steps 1-4
above: any Group already in flight continues to be forwarded on the track
selected when that Group started, and the newly lowered tier <tt>i</tt> is applied
starting with the next new Group. Because the still-draining stream at the
higher tier sets <tt>target_occupied</tt> (<xref target="signals"/>), the state machine is
automatically prevented from stepping back up into that tier until the
in-flight Group finishes draining.</t>
      </section>
    </section>
    <section anchor="limitations">
      <name>Properties and Trade-Offs</name>
      <section anchor="reactive-congestion-detection">
        <name>Reactive Congestion Detection</name>
        <t>Because active stream depth measures unconsumed streams rather
than estimating path capacity in advance, congestion is detected only after a
Group has begun to overlap with the next Group (<tt>d &gt;= D_down</tt>).
Retroactive supersede (<xref target="supersede"/>) mitigates the latency penalty of late
detection by aborting the stalled high-bitrate stream and replacing it with a
lower-bitrate encoding within the remaining latency budget <tt>B</tt>, provided the
relay holds the earlier Objects of that Group in its cache.</t>
      </section>
      <section anchor="no-absolute-bitrate-floor">
        <name>No Absolute Bitrate Floor</name>
        <t>The algorithm never falls below tier 0. If the path cannot sustain even the
lowest-bitrate member (tier 0) of the ladder, streams at tier 0
will exceed the latency budget <tt>B</tt> and be reset on delivery timeout, while the
publisher continues attempting to forward tier 0. Deciding to terminate a
subscription entirely when tier 0 is unsustainable is a publisher policy
decision outside the scope of this algorithm.</t>
      </section>
      <section anchor="single-switching-set-scope">
        <name>Single Switching Set Scope</name>
        <t>This algorithm adapts a single switching set per connection. Because
backpressure is observed as open forwarding streams rather than an explicit
bandwidth rate <tt>B_total</tt>, the signal reports whether the currently selected
track fits the path, but does not produce a divisible bitrate figure that can
be partitioned across multiple independent switching sets by rank and weight.
Subscribers that require concurrent adaptation across multiple switching sets
on the same connection <bcp14>SHOULD</bcp14> use an allocation algorithm such as the default
algorithm of <xref target="SSTS"/>.</t>
      </section>
    </section>
    <section anchor="implementation-status">
      <name>Implementation Status</name>
      <t><em>This section is to be removed before publishing as an RFC, per
<xref target="RFC7942"/>.</em></t>
      <t>An experimental implementation of the algorithm described in this document has
been developed for the MOQtail relay <xref target="MOQtail"/>. It covers <xref target="ladder"/>,
<xref target="signals"/>, <xref target="state-machine"/>, and <xref target="supersede"/> for a single switching set,
including cached object replay and the inherited re-send deadline.
The prototype currently differs from this specification in two respects.
First, rather than exposing a single algorithm identifier whose supersede
behavior is toggled by the <tt>Retroactive supersede</tt> field in
<tt>SWITCHING_SET_ASSIGNMENT</tt> (<xref target="assignment-fields"/>), it registers the
supersede and non-supersede modes as two separate provisional algorithm
identifiers from the private-use range pending the allocation requested in
<xref target="iana-algorithm"/>; consequently, the <tt>Retroactive supersede</tt> field value is
not yet acted on even though the wire codec parses the trailing extension
fields. Second, it does not yet reject a second active switching set.
An earlier version of this SSTS algorithm has been evaluated in <xref target="MMSP26"/>, and
the current prototype has also been evaluated against the MOQtail publisher and
subscriber; interoperability with other SSTS implementations has not yet been
tested.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document defines an algorithm for an existing MOQT extension and inherits
the security considerations of <xref target="MoQTransport"/> and <xref target="SSTS"/>, including the
asymmetric resource exhaustion that switching set fan-out makes easier. The
considerations below are those that differ from the default algorithm.</t>
      <section anchor="inaccurate-throughput-thresholds-cannot-starve-a-track">
        <name>Inaccurate Throughput Thresholds Cannot Starve a Track</name>
        <t>In the default algorithm of <xref target="SSTS"/>, a track whose declared throughput
threshold exceeds the publisher's bandwidth estimate <tt>B_total</tt> is never
selected. Under the algorithm defined in this document, throughput thresholds
are used only for ladder ordering and relative step size calculation
<tt>(R[i+1] - R[i]) / R[i]</tt>. A miscalibrated absolute threshold cannot permanently
prevent the algorithm from probing a higher tier once the transport queue is
clear, and if the probed tier exceeds actual path capacity, stream depth <tt>d</tt>
rises and forces a downshift regardless of what bitrate was declared.</t>
      </section>
      <section anchor="subscriber-manipulation-of-flow-control-or-parameters">
        <name>Subscriber Manipulation of Flow Control or Parameters</name>
        <t>A subscriber that intentionally withholds QUIC flow control credit or stops
reading from forwarding streams causes <tt>d</tt> to rise, forcing the publisher down
to tier 0. Because tier state is isolated per connection, a slow subscriber
only degrades its own quality and causes the publisher to send it <em>fewer</em>
bytes.</t>
        <t>Conversely, a subscriber that signals an aggressive probing risk factor
(<tt>rho_pct = 100</tt>, <tt>U_min = 2</tt>) can cause the publisher to probe
upward more frequently, triggering more frequent retroactive supersedes. Each
retroactive supersede cancels an existing stream and re-sends cached Objects
at a lower bitrate. Publishers <bcp14>SHOULD</bcp14> bound the rate of retroactive supersedes
(for example, at most one supersede per Group ID per switching set) so that
repeated downshifts within a single Group do not cause excessive cache reads
or stream churn.</t>
      </section>
      <section anchor="resource-cost-of-the-signals">
        <name>Resource Cost of the Signals</name>
        <t>The state and stream counter the publisher keeps (<xref target="signals"/>,
<xref target="state-machine"/>) are bounded and freed with the connection.
There are no process-wide tables keyed by subscriber identity, and no state
that outlives a subscription, so a subscriber cannot cause unbounded memory
growth at the publisher by repeatedly creating and destroying switching sets.
Publishers <bcp14>SHOULD</bcp14> nevertheless bound the number of switching sets and members
per connection, as recommended by <xref target="SSTS"/>.</t>
      </section>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <section anchor="iana-algorithm">
        <name>SSTS Algorithm Registration</name>
        <t>IANA is requested to add the following entry to the "SSTS-Algorithms" registry
established by <xref target="SSTS"/>:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Type</th>
              <th align="left">Name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">TBD</td>
              <td align="left">Backpressure</td>
              <td align="left">This document</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MoQTransport">
          <front>
            <title>Media over QUIC Transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <author fullname="Ian Swett" initials="I." surname="Swett">
              <organization>Google</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <date day="1" month="October" year="2026"/>
            <abstract>
              <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-22"/>
        </reference>
        <reference anchor="SSTS" target="https://github.com/wilaw/moqt-ssts/blob/main/draft-wilaw-moq-moqt-ssts.md">
          <front>
            <title>Sender-Side Track Switching</title>
            <author initials="W." surname="Law" fullname="Will Law">
              <organization/>
            </author>
            <author initials="I." surname="Swett" fullname="Ian Swett">
              <organization/>
            </author>
            <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
              <organization/>
            </author>
            <author initials="M." surname="Zanaty" fullname="Mo Zanaty">
              <organization/>
            </author>
            <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
              <organization/>
            </author>
            <author initials="A." surname="Begen" fullname="Ali Begen">
              <organization/>
            </author>
            <author initials="Z." surname="Gurel" fullname="Zafer Gurel">
              <organization/>
            </author>
            <author initials="G." surname="Simon" fullname="Gwendal Simon">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
        </reference>
        <reference anchor="RFC2119">
          <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="RFC8174">
          <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9002">
          <front>
            <title>QUIC Loss Detection and Congestion Control</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9002"/>
          <seriesInfo name="DOI" value="10.17487/RFC9002"/>
        </reference>
        <reference anchor="RFC7942">
          <front>
            <title>Improving Awareness of Running Code: The Implementation Status Section</title>
            <author fullname="Y. Sheffer" initials="Y." surname="Sheffer"/>
            <author fullname="A. Farrel" initials="A." surname="Farrel"/>
            <date month="July" year="2016"/>
            <abstract>
              <t>This document describes a simple process that allows authors of Internet-Drafts to record the status of known implementations by including an Implementation Status section. This will allow reviewers and working groups to assign due consideration to documents that have the benefit of running code, which may serve as evidence of valuable experimentation and feedback that have made the implemented protocols more mature.</t>
              <t>This process is not mandatory. Authors of Internet-Drafts are encouraged to consider using the process for their documents, and working groups are invited to think about applying the process to all of their protocol specifications. This document obsoletes RFC 6982, advancing it to a Best Current Practice.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="205"/>
          <seriesInfo name="RFC" value="7942"/>
          <seriesInfo name="DOI" value="10.17487/RFC7942"/>
        </reference>
        <reference anchor="Probing">
          <front>
            <title>Probe Tracks for Bandwidth Estimation in Media over QUIC Transport</title>
            <author fullname="Zafer Gürel" initials="Z." surname="Gürel">
              <organization>Ozyegin University</organization>
            </author>
            <author fullname="Ali C. Begen" initials="A. C." surname="Begen">
              <organization>Networked Media</organization>
            </author>
            <author fullname="Deniz Ugur" initials="D." surname="Ugur">
              <organization>Ozyegin University</organization>
            </author>
            <date day="12" month="October" year="2026"/>
            <abstract>
              <t>   This document defines probe tracks for Media over QUIC Transport
   (MOQT): tracks of synthetic objects, generated on demand, that
   measure the bandwidth of a single hop.  Probe tracks live under
   reserved, session-scoped Track Namespaces and are never forwarded or
   cached.  The track name selects the shape of the probe: target
   bitrate, duration or size, object rate, object size, group structure
   and key-object bursts.  For a downlink probe, a subscriber subscribes
   to a probe track in the namespace (.session, .probe), and the relay
   generates it, so the subscriber can measure whether a higher bitrate
   is sustainable on the relay-to-subscriber hop before it switches to a
   higher-quality track.  For an uplink probe, a publisher generates a
   probe track and publishes it to its relay in the namespace (.session,
   .sink), to measure the publisher-to-relay hop.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-gurel-moq-probing-00"/>
        </reference>
        <reference anchor="MOQtail" target="https://doi.org/10.1145/3793853.3799817">
          <front>
            <title>MOQtail: open-source, IETF-compliant MOQT protocol libraries</title>
            <author initials="Z." surname="Gurel" fullname="Zafer Gurel">
              <organization/>
            </author>
            <author initials="D." surname="Ugur" fullname="Deniz Ugur">
              <organization/>
            </author>
            <author initials="A. C." surname="Begen" fullname="Ali C. Begen">
              <organization/>
            </author>
            <date year="2026" month="April"/>
          </front>
          <seriesInfo name="ACM" value="Proc. ACM Multimedia Systems Conf. (MMSys), Hong Kong"/>
          <seriesInfo name="DOI" value="10.1145/3793853.3799817"/>
        </reference>
        <reference anchor="MMSP26">
          <front>
            <title>Relay-Side Latency-Budget-Aware Rate Adaptation in MOQ Transport</title>
            <author initials="A. F." surname="Zengin" fullname="Alperen F. Zengin">
              <organization/>
            </author>
            <author initials="Z." surname="Gurel" fullname="Zafer Gurel">
              <organization/>
            </author>
            <author initials="A. C." surname="Begen" fullname="Ali C. Begen">
              <organization/>
            </author>
            <date year="2026"/>
          </front>
          <seriesInfo name="IEEE" value="Proc. IEEE Int. Workshop on Multimedia Signal Processing (MMSP)"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA6V97XLbRrL2/7mKOU6dCqVD0pLjbBI5zjnyV+Jay85a8qZ2
UykRJEEKMQgwAGiZcbzXcq7lvbK3n+6eD4CgrOxx1W4kCBgMenq6n/6c0Whk
mqzJ0xN759Q+SmZv11Va15sqtaf5sqyy5mplF2Vlz9Ninlaj82ye2ouK7rPn
11kzu8qKpc0Ke/bqb7hc1Ouyau6YZDqt0ncntq6bejSNRjXzclYkK3rdvEoW
zej3tFhmxWhV/jbauXd0dGTmSUP3fnhyevH0o5nRLzSnLY3bzI3J1tWJbapN
3dw7Ovrm6J5JqjQ5safrdZ7RrVlZ1DYp5vZ1muSji2yVmnozXWV1TX+52K5p
3OdPL56Z67J6u6zKzfoEX2Heplu6Mj8xdmSfF01aFWkzeoLJ4kotZKhBhobJ
UDsy4M+tT6Xfk3mybrJ3qZ1mdHfD16o0T7bG1A3N7TLJy4Imsk1rU6+Sqrn8
bVM2aX1ii9KssxP7c1POhrYmolbpoqaftiv5gei4StZreu8vxiSb5qqsaMp2
RP+ztCA0wunYPhvbfzKB+arQ/TRfp1Va2GdEoav4z2W1TIrsdybciX31+zal
v9g3BU2/qrNmyzelqyTLT+wCD49l8f6n/H0zTuebcVOZ9gz+ObbfEyHy6O3/
TBZpFV39My/9Hc+Ol3h2/zvpqx+ly7T9xZl9HF9uv/Rl2oAF0rk9S+dZEr8x
ybPxFI/9T+FuGq/4pvZLn4ztG5pX9M4nKb0gXPwznznHo+MNPdr6yqKsVgl4
Cct8Vv7N7zZi49GTcZY2C95GjbtOt52fX5yf8Nhuj9+wje/IjUm1TGnMq6ZZ
1yd37y5JAmym41m5unud5cn1XXpHw3v17jQvp3dpzsVd2cv8d56Dv2e8mvOo
so3vHd37C/8a+BX/RkLEn8b2RXKt1xwdf8ryPLqstz4f07TTpunc/DwpWtf1
7vOxfUl7LXm7oR3WeeR8c5XUu3/WJ89o/yRFousTnjor29f19r+P7d+TOsuz
9F3ngb9ns4aEaOevox6WbbNtfH3Us6n2byx///dEq2xVdkf//po4Icn1byYr
FjF/vX72+Jujo3v641ff3Ocff6zKKTGKMBzvQ17ttVwGW776WwMebrGcu2jL
dVqM6nJTzdIhi94RcRXJ6qRo8OSFpYFI3JW5zbNplVRZWvfz5LzMxrSj7h4f
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
9AfGe/QEAzyKvSx/dE4E/8OY/w/hxuA2T5YAAA==

-->

</rfc>
