<?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-frindell-moq-subscription-flow-control-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="moq-sub-flow-control">Subscription Flow Control Extension for Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-frindell-moq-subscription-flow-control-00"/>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <date year="2026" month="October" day="07"/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>flow control</keyword>
    <abstract>
      <?line 52?>

<t>This document defines an extension to Media over QUIC Transport (MOQT) that
lets a subscriber limit the number of subgroup streams and the total bytes a
publisher may send for an individual subscription. It defines a Setup Option to
negotiate the extension and set initial limits, message parameters for
advertising these limits, messages for granting credit and signaling flow
control state, and a session error code.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://afrind.github.io/draft-frindell-moq-subscription-flow-control/draft-frindell-moq-subscription-flow-control.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-frindell-moq-subscription-flow-control/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/afrind/draft-frindell-moq-subscription-flow-control"/>.</t>
    </note>
  </front>
  <middle>
    <?line 61?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media over QUIC Transport (MOQT) <xref target="MOQT"/> delivers a subscription's Objects
across one or more subgroup streams, but provides no way for a subscriber to
bound how many streams or bytes a publisher sends for that subscription.
Transport-layer flow control operates per stream and per session, so it
cannot express a limit spanning a subscription's streams.</t>
      <t>This extension lets a subscriber limit the total subgroup streams
(MAX_SUB_STREAMS) and total bytes (MAX_SUB_BYTES) for a subscription, and grant
further credit with SUB_FLOW_CONTROL_UPDATE. Publishers signal that they are
blocked with SUB_STREAMS_BLOCKED and SUB_BYTES_BLOCKED, and report the final
size of reset subgroup streams with SUBGROUP_RESET. Violations terminate the
session with FLOW_CONTROL_EXCEEDED.</t>
      <t>Support for this extension is negotiated during session establishment using
the SUBSCRIPTION_FLOW_CONTROL Setup Option (<xref target="negotiation"/>).</t>
    </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 terminology and wire format notation of <xref target="MOQT"/>. The
subscriber sets the limits and the publisher honors them, regardless of which
endpoint is the client or server.</t>
    </section>
    <section anchor="negotiation">
      <name>Extension Negotiation</name>
      <section anchor="setup-option">
        <name>SUBSCRIPTION_FLOW_CONTROL Setup Option</name>
        <t>An endpoint indicates support for this extension by including the
SUBSCRIPTION_FLOW_CONTROL Setup Option in its SETUP message. The option also
sets the initial limits for subscriptions in which the endpoint is the
subscriber (<xref target="model"/>).</t>
        <figure anchor="subscription-flow-control-format">
          <name>SUBSCRIPTION_FLOW_CONTROL Setup Option</name>
          <artwork><![CDATA[
SUBSCRIPTION_FLOW_CONTROL Setup Option {
  Option Type (vi64) = 0x0B,
  Length (vi64),
  Initial Max Sub Streams (vi64),
  Initial Max Sub Bytes (vi64),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Initial Max Sub Streams: The initial MAX_SUB_STREAMS limit.</t>
          </li>
          <li>
            <t>Initial Max Sub Bytes: The initial MAX_SUB_BYTES limit.</t>
          </li>
        </ul>
        <t>When an endpoint receives a SUBSCRIPTION_FLOW_CONTROL Setup Option whose value
does not contain exactly two varints, it <bcp14>MUST</bcp14> close the session with a
<tt>KEY_VALUE_FORMATTING_ERROR</tt>.</t>
        <t>The extension is negotiated when an endpoint has both sent and received this
option, per the extension negotiation described in <xref target="MOQT"/>. It applies to both
directions of the session.</t>
        <t>An endpoint that offers this extension <bcp14>MUST</bcp14> support RESET_STREAM_AT
(<xref target="RELIABLE-RESET"/>). When an endpoint negotiates this extension with a peer
that does not support RESET_STREAM_AT, it <bcp14>MUST</bcp14> close the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
      </section>
    </section>
    <section anchor="model">
      <name>Flow Control Model</name>
      <t>Every subscription has a stream limit and a byte limit, initialized from the
subscriber's SUBSCRIPTION_FLOW_CONTROL Setup Option (<xref target="setup-option"/>), which
SUBSCRIBE or SUBSCRIBE_TRACKS can override (<xref target="parameters"/>). The subscriber
grants additional credit with SUB_FLOW_CONTROL_UPDATE
(<xref target="message-sub-flow-control-update"/>). Credit is not granted with REQUEST_UPDATE
because it solicits a response, which is unnecessary.</t>
      <t>The limits apply only to subgroup streams; Objects sent as datagrams are not
counted. Limits and the messages defined here are scoped to a single session
and are not forwarded. A relay honors its downstream subscriber's limits and
independently sets its own limits toward its upstream publisher.</t>
      <t>Limits are per subscription and cumulative over its lifetime: the stream count
is the total number of subgroup streams opened, and the byte count is the total
bytes sent across them (<xref target="byte-accounting"/>). A publisher <bcp14>MUST NOT</bcp14> exceed a
limit in effect for a subscription. When a subscriber detects a violation, it
<bcp14>MUST</bcp14> close the session with a <tt>FLOW_CONTROL_EXCEEDED</tt> (<xref target="errors"/>).</t>
      <t>The subscriber attributes each subgroup stream to a subscription by its Track
Alias, so when the extension is negotiated, a publisher <bcp14>MUST NOT</bcp14> assign the same
Track Alias to more than one subscription in the session, even if the
subscriptions are to the same Track or are not concurrent. When a subscriber
detects a SUBSCRIBE_OK or PUBLISH with a Track Alias previously assigned to
another subscription, it <bcp14>MUST</bcp14> close the session with a <tt>DUPLICATE_TRACK_ALIAS</tt>.</t>
      <section anchor="stream-sequence">
        <name>Stream Sequence</name>
        <t>When the extension is negotiated, every SUBGROUP_HEADER includes a Stream
Sequence field:</t>
        <figure anchor="moq-sub-flow-control-subgroup-header">
          <name>SUBGROUP_HEADER with Stream Sequence</name>
          <artwork><![CDATA[
SUBGROUP_HEADER {
  Type Flags (vi64),
  Track Alias (vi64),
  Group ID (vi64),
  [Subgroup ID (vi64),]
  [Publisher Priority (8),]
  Stream Sequence (vi64),
}
]]></artwork>
        </figure>
        <t>Stream Sequence uniquely identifies a subgroup stream within its subscription.
The publisher sets it to 0 on the first subgroup stream it opens for a
subscription and increments it by 1 for each subsequent stream.</t>
        <t>When a subscriber receives a SUBGROUP_HEADER with a Stream Sequence greater than
or equal to the stream limit, it <bcp14>MUST</bcp14> close the session with a
<tt>FLOW_CONTROL_EXCEEDED</tt>. When a subscriber detects a Stream Sequence it has
already received for the subscription, it <bcp14>MUST</bcp14> close the session with a
<tt>PROTOCOL_VIOLATION</tt>.</t>
      </section>
      <section anchor="blocked">
        <name>Publisher Behavior When Blocked</name>
        <t>When sending would exceed a limit, the publisher <bcp14>MUST NOT</bcp14> open a subgroup stream
beyond the stream limit and <bcp14>MUST NOT</bcp14> send bytes beyond the byte limit, even if
this means stopping in the middle of a stream. It retains the blocked Objects
until it receives additional credit, and <bcp14>SHOULD</bcp14> send SUB_STREAMS_BLOCKED or
SUB_BYTES_BLOCKED, as applicable.</t>
        <t>Being blocked does not extend an Object's lifetime; the delivery timeouts of
<xref target="MOQT"/> (SUBGROUP_DELIVERY_TIMEOUT and OBJECT_DELIVERY_TIMEOUT) continue to
apply. A subgroup stream reset because of an expired timeout is accounted for as
described in <xref target="byte-accounting"/>.</t>
        <t>If retaining blocked Objects would exceed its resource limits, a publisher <bcp14>MAY</bcp14>
terminate the subscription with PUBLISH_DONE and <tt>TOO_FAR_BEHIND</tt> (<xref target="MOQT"/>).</t>
      </section>
      <section anchor="byte-accounting">
        <name>Byte Accounting</name>
        <t>The byte count includes all bytes serialized on the subscription's subgroup
streams: the SUBGROUP_HEADER (including the stream type) and each Object's
header fields and payload. It excludes QUIC and WebTransport framing.</t>
        <t>Accounting is at byte granularity. A publisher <bcp14>MAY</bcp14> send part of an Object and
stop at the byte limit, leaving the stream open and resuming when credit
arrives, subject to the delivery timeout and ordering rules of <xref target="MOQT"/>.</t>
        <t>Each subgroup stream consumes byte credit exactly once. For a stream closed
with a FIN, the bytes received consume credit.</t>
        <t>When a publisher resets a stream, it reports the bytes sent on it in the Final
Size field of SUBGROUP_RESET (<xref target="message-subgroup-reset"/>), and the stream
consumes that much credit.</t>
        <t>A publisher <bcp14>MUST</bcp14> reset subgroup streams using RESET_STREAM_AT with a
reliable_size that includes the SUBGROUP_HEADER, so the subscriber always
learns the stream's Stream Sequence (<xref target="stream-sequence"/>) and can match it to
the corresponding SUBGROUP_RESET.</t>
        <t>On native QUIC, this Final Size equals that of RESET_STREAM_AT
(<xref target="RELIABLE-RESET"/>). WebTransport (<xref target="WebTransport"/>) implementations do not
necessarily expose the transport Final Size. When a subscriber receives a
SUBGROUP_RESET whose Final Size does not match the one reported by the
transport, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
        <t>For example, with 100 bytes of credit and a 200-byte Object:</t>
        <artwork><![CDATA[
1. Publisher sends 100 bytes (SUBGROUP_HEADER, Object header,
   partial payload), reaching the limit, and SHOULD send
   SUB_BYTES_BLOCKED.
2. The Object's delivery timeout expires.
3. Publisher resets the stream and sends SUBGROUP_RESET with
   Final Size = 100.
4. The stream consumes 100 bytes of credit: limit reached, not exceeded.
]]></artwork>
      </section>
    </section>
    <section anchor="parameters">
      <name>Message Parameters</name>
      <t>This extension defines two Message Parameters (<xref target="MOQT"/>). If set in SUBSCRIBE or
SUBSCRIBE_TRACKS, each parameter overrides the initial limit
(<xref target="setup-option"/>), even if the value is smaller. In PUBLISH, it echoes the
value from the corresponding SUBSCRIBE_TRACKS. When sent in
SUB_FLOW_CONTROL_UPDATE, the value is added to the current limit.</t>
      <t>A SUB_FLOW_CONTROL_UPDATE <bcp14>MUST NOT</bcp14> raise a limit above 2^64-1. When a publisher
receives a SUB_FLOW_CONTROL_UPDATE that would raise a limit above 2^64-1, it
<bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
      <section anchor="max-sub-streams">
        <name>MAX_SUB_STREAMS Parameter</name>
        <t>MAX_SUB_STREAMS (Parameter Type 0x33) is a varint limiting the total number of
subgroup streams the publisher can open for the subscription.</t>
      </section>
      <section anchor="max-sub-bytes">
        <name>MAX_SUB_BYTES Parameter</name>
        <t>MAX_SUB_BYTES (Parameter Type 0x36) is a varint limiting the total bytes the
publisher can send across the subscription's subgroup streams
(<xref target="byte-accounting"/>).</t>
      </section>
    </section>
    <section anchor="messages">
      <name>Messages</name>
      <t>Each message below is sent on the subscription's request stream using MOQT
control message framing with a 16-bit Length (<xref target="MOQT"/>). None consumes a
Request ID or solicits a response.</t>
      <section anchor="message-sub-flow-control-update">
        <name>SUB_FLOW_CONTROL_UPDATE</name>
        <t>A subscriber sends <tt>SUB_FLOW_CONTROL_UPDATE</tt> to grant additional credit. It <bcp14>MAY</bcp14>
be sent any time after the subscription is established, whether or not the
publisher is blocked, so a subscriber that intends to grant credit <bcp14>MUST</bcp14> keep the
send direction of the request stream open. It has no effect if received after
the subscription ends.</t>
        <t>Each parameter value is a delta to the current limit, so limits never decrease.
When a publisher receives a SUB_FLOW_CONTROL_UPDATE with a delta of 0, it <bcp14>MUST</bcp14>
close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
        <figure anchor="moq-transport-sub-flow-control-update-format">
          <name>MOQT SUB_FLOW_CONTROL_UPDATE Message</name>
          <artwork><![CDATA[
SUB_FLOW_CONTROL_UPDATE Message {
  Type (vi64) = 0x14,
  Length (16),
  Number of Parameters (vi64),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Parameters: MAX_SUB_STREAMS and/or MAX_SUB_BYTES, each granting additional
credit. When a publisher receives a SUB_FLOW_CONTROL_UPDATE with neither
parameter, it <bcp14>MUST</bcp14> close the session with a <tt>PROTOCOL_VIOLATION</tt>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subgroup-reset">
        <name>SUBGROUP_RESET</name>
        <t>A publisher sends <tt>SUBGROUP_RESET</tt> to report the final byte count of a reset
subgroup stream (<xref target="byte-accounting"/>).</t>
        <figure anchor="moq-transport-subgroup-reset-format">
          <name>MOQT SUBGROUP_RESET Message</name>
          <artwork><![CDATA[
SUBGROUP_RESET Message {
  Type (vi64) = 0x1F,
  Length (16),
  Stream Sequence (vi64),
  Final Size (vi64),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Stream Sequence: The Stream Sequence of the reset subgroup stream
(<xref target="stream-sequence"/>).</t>
          </li>
          <li>
            <t>Final Size: The bytes sent on the stream before it was reset.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sub-streams-blocked">
        <name>SUB_STREAMS_BLOCKED</name>
        <t>A publisher sends <tt>SUB_STREAMS_BLOCKED</tt> when it wants to open a subgroup stream
but MAX_SUB_STREAMS prevents it.</t>
        <figure anchor="moq-transport-sub-streams-blocked-format">
          <name>MOQT SUB_STREAMS_BLOCKED Message</name>
          <artwork><![CDATA[
SUB_STREAMS_BLOCKED Message {
  Type (vi64) = 0x12,
  Length (16),
  Maximum Streams (vi64),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Streams: The stream limit that was reached.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sub-bytes-blocked">
        <name>SUB_BYTES_BLOCKED</name>
        <t>A publisher sends <tt>SUB_BYTES_BLOCKED</tt> when it has data to send but MAX_SUB_BYTES
prevents it.</t>
        <figure anchor="moq-transport-sub-bytes-blocked-format">
          <name>MOQT SUB_BYTES_BLOCKED Message</name>
          <artwork><![CDATA[
SUB_BYTES_BLOCKED Message {
  Type (vi64) = 0x13,
  Length (16),
  Maximum Bytes (vi64),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Bytes: The byte limit that was reached.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="errors">
      <name>Error Handling</name>
      <dl>
        <dt>FLOW_CONTROL_EXCEEDED (0x1C):</dt>
        <dd>
          <t>A session termination error code indicating that the peer violated a
subscription flow control limit (MAX_SUB_STREAMS or MAX_SUB_BYTES).</t>
        </dd>
      </dl>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>These limits let a subscriber bound the resources a publisher consumes per
subscription, complementing transport flow control. A subscriber <bcp14>SHOULD</bcp14> set
limits consistent with the resources it will devote to a subscription.</t>
      <t>SUB_STREAMS_BLOCKED and SUB_BYTES_BLOCKED are advisory. A subscriber <bcp14>MUST NOT</bcp14>
rely on receiving them and <bcp14>MUST</bcp14> enforce limits regardless. A subscriber that
grants credit only in response to them could stall a publisher that does not
send them; granting credit proactively avoids this.</t>
      <t>A misbehaving publisher could under-report Final Size in SUBGROUP_RESET to
evade MAX_SUB_BYTES; <xref target="byte-accounting"/> describes how a subscriber detects this
when the transport reports the stream's Final Size.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document registers entries in registries established by <xref target="MOQT"/>. All
codepoints are provisional pending working group adoption and can be reassigned
by IANA to avoid collisions.</t>
      <section anchor="iana-setup-option">
        <name>Setup Option</name>
        <t>IANA is requested to add the following entry to the "MOQT Setup Options"
registry:</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">0x0B</td>
              <td align="left">SUBSCRIPTION_FLOW_CONTROL</td>
              <td align="left">
                <xref target="setup-option"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-parameters">
        <name>Message Parameters</name>
        <t>IANA is requested to add the following entries to the "MOQT Message Parameters"
registry:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Parameter Type</th>
              <th align="left">Parameter Name</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x33</td>
              <td align="left">MAX_SUB_STREAMS</td>
              <td align="left">
                <xref target="max-sub-streams"/></td>
            </tr>
            <tr>
              <td align="right">0x36</td>
              <td align="left">MAX_SUB_BYTES</td>
              <td align="left">
                <xref target="max-sub-bytes"/></td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-message-types">
        <name>Message Types</name>
        <t>IANA is requested to add the following entries to the "MOQT Message Types"
registry. None is the first message on a stream.</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Messages</th>
              <th align="left">Stream</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x12</td>
              <td align="left">SUB_STREAMS_BLOCKED (<xref target="message-sub-streams-blocked"/>)</td>
              <td align="left">Request</td>
            </tr>
            <tr>
              <td align="right">0x13</td>
              <td align="left">SUB_BYTES_BLOCKED (<xref target="message-sub-bytes-blocked"/>)</td>
              <td align="left">Request</td>
            </tr>
            <tr>
              <td align="right">0x14</td>
              <td align="left">SUB_FLOW_CONTROL_UPDATE (<xref target="message-sub-flow-control-update"/>)</td>
              <td align="left">Request</td>
            </tr>
            <tr>
              <td align="right">0x1F</td>
              <td align="left">SUBGROUP_RESET (<xref target="message-subgroup-reset"/>)</td>
              <td align="left">Request</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="iana-error-code">
        <name>Session Termination Error Code</name>
        <t>IANA is requested to add the following entry to the "MOQT Session Termination
Error Codes" registry:</t>
        <table>
          <thead>
            <tr>
              <th align="left">Name</th>
              <th align="center">Code</th>
              <th align="left">Specification</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">FLOW_CONTROL_EXCEEDED</td>
              <td align="center">0x1C</td>
              <td align="left">
                <xref target="errors"/></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="MOQT">
          <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="RELIABLE-RESET">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="6" month="September" year="2026"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

   This document defines a new QUIC frame, the RESET_STREAM_AT frame,
   that allows resetting a stream, while guaranteeing delivery of stream
   data up to a certain byte offset.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-11"/>
        </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="WebTransport">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="6" month="July" year="2026"/>
            <abstract>
              <t>   WebTransport over HTTP/3 is a binding of the WebTransport protocol
   framework [OVERVIEW] to HTTP/3 [HTTP3].  It provides support for
   unidirectional streams, bidirectional streams, and datagrams, all
   multiplexed within the same HTTP/3 connection.  WebTransport enables
   application clients constrained by the Web security model to
   communicate with a remote application server using a secure
   multiplexed transport.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-16"/>
        </reference>
      </references>
    </references>
    <?line 427?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>This extension is derived from a proposal to add subscription flow control to
the base Media over QUIC Transport protocol. The initial conversion of that
proposal into this extension draft was drafted with the assistance of Claude
Code.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
zDz4m2EuOI9TVcVaHNOvGP8X2Zi46To/AAA=

-->

</rfc>
