Skip to main content

Subscription Flow Control Extension for Media over QUIC Transport
draft-frindell-moq-subscription-flow-control-00

Document Type Active Internet-Draft (individual)
Authors Alan Frindell , Ian Swett
Last updated 2026-10-06
RFC stream (None)
Intended RFC status (None)
Formats
Stream Stream state (No stream defined)
Consensus boilerplate Unknown
RFC Editor Note (None)
IESG IESG state I-D Exists
Telechat date (None)
Responsible AD (None)
Send notices to (None)
draft-frindell-moq-subscription-flow-control-00
Media Over QUIC                                         A. Frindell, Ed.
Internet-Draft                                                      Meta
Intended status: Standards Track                           I. Swett, Ed.
Expires: 10 April 2027                                            Google
                                                          7 October 2026

   Subscription Flow Control Extension for Media over QUIC Transport
            draft-frindell-moq-subscription-flow-control-00

Abstract

   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.

About This Document

   This note is to be removed before publishing as an RFC.

   The latest revision of this draft can be found at
   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
   https://datatracker.ietf.org/doc/draft-frindell-moq-subscription-
   flow-control/.

   Discussion of this document takes place on the Media Over QUIC
   Working Group mailing list (mailto:moq@ietf.org), which is archived
   at https://mailarchive.ietf.org/arch/browse/moq/.  Subscribe at
   https://www.ietf.org/mailman/listinfo/moq/.

   Source for this draft and an issue tracker can be found at
   https://github.com/afrind/draft-frindell-moq-subscription-flow-
   control.

Status of This Memo

   This Internet-Draft is submitted in full conformance with the
   provisions of BCP 78 and BCP 79.

Frindell & Swett          Expires 10 April 2027                 [Page 1]
Internet-Draft            moq-sub-flow-control              October 2026

   Internet-Drafts are working documents of the Internet Engineering
   Task Force (IETF).  Note that other groups may also distribute
   working documents as Internet-Drafts.  The list of current Internet-
   Drafts is at https://datatracker.ietf.org/drafts/current/.

   Internet-Drafts are draft documents valid for a maximum of six months
   and may be updated, replaced, or obsoleted by other documents at any
   time.  It is inappropriate to use Internet-Drafts as reference
   material or to cite them other than as "work in progress."

   This Internet-Draft will expire on 10 April 2027.

Copyright Notice

   Copyright (c) 2026 IETF Trust and the persons identified as the
   document authors.  All rights reserved.

   This document is subject to BCP 78 and the IETF Trust's Legal
   Provisions Relating to IETF Documents (https://trustee.ietf.org/
   license-info) in effect on the date of publication of this document.
   Please review these documents carefully, as they describe your rights
   and restrictions with respect to this document.  Code Components
   extracted from this document must include Revised BSD License text as
   described in Section 4.e of the Trust Legal Provisions and are
   provided without warranty as described in the Revised BSD License.

Table of Contents

   1.  Introduction  . . . . . . . . . . . . . . . . . . . . . . . .   3
   2.  Conventions and Definitions . . . . . . . . . . . . . . . . .   3
   3.  Extension Negotiation . . . . . . . . . . . . . . . . . . . .   3
     3.1.  SUBSCRIPTION_FLOW_CONTROL Setup Option  . . . . . . . . .   4
   4.  Flow Control Model  . . . . . . . . . . . . . . . . . . . . .   4
     4.1.  Stream Sequence . . . . . . . . . . . . . . . . . . . . .   5
     4.2.  Publisher Behavior When Blocked . . . . . . . . . . . . .   6
     4.3.  Byte Accounting . . . . . . . . . . . . . . . . . . . . .   6
   5.  Message Parameters  . . . . . . . . . . . . . . . . . . . . .   7
     5.1.  MAX_SUB_STREAMS Parameter . . . . . . . . . . . . . . . .   7
     5.2.  MAX_SUB_BYTES Parameter . . . . . . . . . . . . . . . . .   7
   6.  Messages  . . . . . . . . . . . . . . . . . . . . . . . . . .   7
     6.1.  SUB_FLOW_CONTROL_UPDATE . . . . . . . . . . . . . . . . .   8
     6.2.  SUBGROUP_RESET  . . . . . . . . . . . . . . . . . . . . .   8
     6.3.  SUB_STREAMS_BLOCKED . . . . . . . . . . . . . . . . . . .   9
     6.4.  SUB_BYTES_BLOCKED . . . . . . . . . . . . . . . . . . . .   9
   7.  Error Handling  . . . . . . . . . . . . . . . . . . . . . . .   9
   8.  Security Considerations . . . . . . . . . . . . . . . . . . .   9
   9.  IANA Considerations . . . . . . . . . . . . . . . . . . . . .  10
     9.1.  Setup Option  . . . . . . . . . . . . . . . . . . . . . .  10

Frindell & Swett          Expires 10 April 2027                 [Page 2]
Internet-Draft            moq-sub-flow-control              October 2026

     9.2.  Message Parameters  . . . . . . . . . . . . . . . . . . .  10
     9.3.  Message Types . . . . . . . . . . . . . . . . . . . . . .  10
     9.4.  Session Termination Error Code  . . . . . . . . . . . . .  11
   10. References  . . . . . . . . . . . . . . . . . . . . . . . . .  11
     10.1.  Normative References . . . . . . . . . . . . . . . . . .  11
     10.2.  Informative References . . . . . . . . . . . . . . . . .  12
   Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . .  12
   Authors' Addresses  . . . . . . . . . . . . . . . . . . . . . . .  12

1.  Introduction

   Media over QUIC Transport (MOQT) [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.

   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.

   Support for this extension is negotiated during session establishment
   using the SUBSCRIPTION_FLOW_CONTROL Setup Option (Section 3).

2.  Conventions and Definitions

   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 [RFC2119] [RFC8174] when, and only when, they appear in all
   capitals, as shown here.

   This document uses the terminology and wire format notation of
   [MOQT].  The subscriber sets the limits and the publisher honors
   them, regardless of which endpoint is the client or server.

3.  Extension Negotiation

Frindell & Swett          Expires 10 April 2027                 [Page 3]
Internet-Draft            moq-sub-flow-control              October 2026

3.1.  SUBSCRIPTION_FLOW_CONTROL Setup Option

   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 (Section 4).

   SUBSCRIPTION_FLOW_CONTROL Setup Option {
     Option Type (vi64) = 0x0B,
     Length (vi64),
     Initial Max Sub Streams (vi64),
     Initial Max Sub Bytes (vi64),
   }

              Figure 1: SUBSCRIPTION_FLOW_CONTROL Setup Option

   *  Initial Max Sub Streams: The initial MAX_SUB_STREAMS limit.

   *  Initial Max Sub Bytes: The initial MAX_SUB_BYTES limit.

   When an endpoint receives a SUBSCRIPTION_FLOW_CONTROL Setup Option
   whose value does not contain exactly two varints, it MUST close the
   session with a KEY_VALUE_FORMATTING_ERROR.

   The extension is negotiated when an endpoint has both sent and
   received this option, per the extension negotiation described in
   [MOQT].  It applies to both directions of the session.

   An endpoint that offers this extension MUST support RESET_STREAM_AT
   ([RELIABLE-RESET]).  When an endpoint negotiates this extension with
   a peer that does not support RESET_STREAM_AT, it MUST close the
   session with a PROTOCOL_VIOLATION.

4.  Flow Control Model

   Every subscription has a stream limit and a byte limit, initialized
   from the subscriber's SUBSCRIPTION_FLOW_CONTROL Setup Option
   (Section 3.1), which SUBSCRIBE or SUBSCRIBE_TRACKS can override
   (Section 5).  The subscriber grants additional credit with
   SUB_FLOW_CONTROL_UPDATE (Section 6.1).  Credit is not granted with
   REQUEST_UPDATE because it solicits a response, which is unnecessary.

   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.

Frindell & Swett          Expires 10 April 2027                 [Page 4]
Internet-Draft            moq-sub-flow-control              October 2026

   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 (Section 4.3).  A
   publisher MUST NOT exceed a limit in effect for a subscription.  When
   a subscriber detects a violation, it MUST close the session with a
   FLOW_CONTROL_EXCEEDED (Section 7).

   The subscriber attributes each subgroup stream to a subscription by
   its Track Alias, so when the extension is negotiated, a publisher
   MUST NOT 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
   MUST close the session with a DUPLICATE_TRACK_ALIAS.

4.1.  Stream Sequence

   When the extension is negotiated, every SUBGROUP_HEADER includes a
   Stream Sequence field:

   SUBGROUP_HEADER {
     Type Flags (vi64),
     Track Alias (vi64),
     Group ID (vi64),
     [Subgroup ID (vi64),]
     [Publisher Priority (8),]
     Stream Sequence (vi64),
   }

               Figure 2: SUBGROUP_HEADER with Stream Sequence

   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.

   When a subscriber receives a SUBGROUP_HEADER with a Stream Sequence
   greater than or equal to the stream limit, it MUST close the session
   with a FLOW_CONTROL_EXCEEDED.  When a subscriber detects a Stream
   Sequence it has already received for the subscription, it MUST close
   the session with a PROTOCOL_VIOLATION.

Frindell & Swett          Expires 10 April 2027                 [Page 5]
Internet-Draft            moq-sub-flow-control              October 2026

4.2.  Publisher Behavior When Blocked

   When sending would exceed a limit, the publisher MUST NOT open a
   subgroup stream beyond the stream limit and MUST NOT 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 SHOULD send SUB_STREAMS_BLOCKED or SUB_BYTES_BLOCKED, as
   applicable.

   Being blocked does not extend an Object's lifetime; the delivery
   timeouts of [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
   Section 4.3.

   If retaining blocked Objects would exceed its resource limits, a
   publisher MAY terminate the subscription with PUBLISH_DONE and
   TOO_FAR_BEHIND ([MOQT]).

4.3.  Byte Accounting

   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.

   Accounting is at byte granularity.  A publisher MAY 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 [MOQT].

   Each subgroup stream consumes byte credit exactly once.  For a stream
   closed with a FIN, the bytes received consume credit.

   When a publisher resets a stream, it reports the bytes sent on it in
   the Final Size field of SUBGROUP_RESET (Section 6.2), and the stream
   consumes that much credit.

   A publisher MUST 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 (Section 4.1) and can
   match it to the corresponding SUBGROUP_RESET.

Frindell & Swett          Expires 10 April 2027                 [Page 6]
Internet-Draft            moq-sub-flow-control              October 2026

   On native QUIC, this Final Size equals that of RESET_STREAM_AT
   ([RELIABLE-RESET]).  WebTransport ([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 MUST close the session with a
   PROTOCOL_VIOLATION.

   For example, with 100 bytes of credit and a 200-byte Object:

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.

5.  Message Parameters

   This extension defines two Message Parameters ([MOQT]).  If set in
   SUBSCRIBE or SUBSCRIBE_TRACKS, each parameter overrides the initial
   limit (Section 3.1), 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.

   A SUB_FLOW_CONTROL_UPDATE MUST NOT 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 MUST close the session with a
   PROTOCOL_VIOLATION.

5.1.  MAX_SUB_STREAMS Parameter

   MAX_SUB_STREAMS (Parameter Type 0x33) is a varint limiting the total
   number of subgroup streams the publisher can open for the
   subscription.

5.2.  MAX_SUB_BYTES Parameter

   MAX_SUB_BYTES (Parameter Type 0x36) is a varint limiting the total
   bytes the publisher can send across the subscription's subgroup
   streams (Section 4.3).

6.  Messages

   Each message below is sent on the subscription's request stream using
   MOQT control message framing with a 16-bit Length ([MOQT]).  None
   consumes a Request ID or solicits a response.

Frindell & Swett          Expires 10 April 2027                 [Page 7]
Internet-Draft            moq-sub-flow-control              October 2026

6.1.  SUB_FLOW_CONTROL_UPDATE

   A subscriber sends SUB_FLOW_CONTROL_UPDATE to grant additional
   credit.  It MAY be sent any time after the subscription is
   established, whether or not the publisher is blocked, so a subscriber
   that intends to grant credit MUST keep the send direction of the
   request stream open.  It has no effect if received after the
   subscription ends.

   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 MUST close the session with a PROTOCOL_VIOLATION.

   SUB_FLOW_CONTROL_UPDATE Message {
     Type (vi64) = 0x14,
     Length (16),
     Number of Parameters (vi64),
     Parameters (..) ...,
   }

               Figure 3: MOQT SUB_FLOW_CONTROL_UPDATE Message

   *  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 MUST close the
      session with a PROTOCOL_VIOLATION.

6.2.  SUBGROUP_RESET

   A publisher sends SUBGROUP_RESET to report the final byte count of a
   reset subgroup stream (Section 4.3).

   SUBGROUP_RESET Message {
     Type (vi64) = 0x1F,
     Length (16),
     Stream Sequence (vi64),
     Final Size (vi64),
   }

                   Figure 4: MOQT SUBGROUP_RESET Message

   *  Stream Sequence: The Stream Sequence of the reset subgroup stream
      (Section 4.1).

   *  Final Size: The bytes sent on the stream before it was reset.

Frindell & Swett          Expires 10 April 2027                 [Page 8]
Internet-Draft            moq-sub-flow-control              October 2026

6.3.  SUB_STREAMS_BLOCKED

   A publisher sends SUB_STREAMS_BLOCKED when it wants to open a
   subgroup stream but MAX_SUB_STREAMS prevents it.

   SUB_STREAMS_BLOCKED Message {
     Type (vi64) = 0x12,
     Length (16),
     Maximum Streams (vi64),
   }

                 Figure 5: MOQT SUB_STREAMS_BLOCKED Message

   *  Maximum Streams: The stream limit that was reached.

6.4.  SUB_BYTES_BLOCKED

   A publisher sends SUB_BYTES_BLOCKED when it has data to send but
   MAX_SUB_BYTES prevents it.

   SUB_BYTES_BLOCKED Message {
     Type (vi64) = 0x13,
     Length (16),
     Maximum Bytes (vi64),
   }

                  Figure 6: MOQT SUB_BYTES_BLOCKED Message

   *  Maximum Bytes: The byte limit that was reached.

7.  Error Handling

   FLOW_CONTROL_EXCEEDED (0x1C):  A session termination error code
      indicating that the peer violated a subscription flow control
      limit (MAX_SUB_STREAMS or MAX_SUB_BYTES).

8.  Security Considerations

   These limits let a subscriber bound the resources a publisher
   consumes per subscription, complementing transport flow control.  A
   subscriber SHOULD set limits consistent with the resources it will
   devote to a subscription.

   SUB_STREAMS_BLOCKED and SUB_BYTES_BLOCKED are advisory.  A subscriber
   MUST NOT rely on receiving them and MUST 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.

Frindell & Swett          Expires 10 April 2027                 [Page 9]
Internet-Draft            moq-sub-flow-control              October 2026

   A misbehaving publisher could under-report Final Size in
   SUBGROUP_RESET to evade MAX_SUB_BYTES; Section 4.3 describes how a
   subscriber detects this when the transport reports the stream's Final
   Size.

9.  IANA Considerations

   This document registers entries in registries established by [MOQT].
   All codepoints are provisional pending working group adoption and can
   be reassigned by IANA to avoid collisions.

9.1.  Setup Option

   IANA is requested to add the following entry to the "MOQT Setup
   Options" registry:

           +======+===========================+===============+
           | Type | Name                      | Specification |
           +======+===========================+===============+
           | 0x0B | SUBSCRIPTION_FLOW_CONTROL | Section 3.1   |
           +------+---------------------------+---------------+

                                 Table 1

9.2.  Message Parameters

   IANA is requested to add the following entries to the "MOQT Message
   Parameters" registry:

           +================+=================+===============+
           | Parameter Type | Parameter Name  | Specification |
           +================+=================+===============+
           |           0x33 | MAX_SUB_STREAMS | Section 5.1   |
           +----------------+-----------------+---------------+
           |           0x36 | MAX_SUB_BYTES   | Section 5.2   |
           +----------------+-----------------+---------------+

                                 Table 2

9.3.  Message Types

   IANA is requested to add the following entries to the "MOQT Message
   Types" registry.  None is the first message on a stream.

Frindell & Swett          Expires 10 April 2027                [Page 10]
Internet-Draft            moq-sub-flow-control              October 2026

        +======+=======================================+=========+
        |   ID | Messages                              | Stream  |
        +======+=======================================+=========+
        | 0x12 | SUB_STREAMS_BLOCKED (Section 6.3)     | Request |
        +------+---------------------------------------+---------+
        | 0x13 | SUB_BYTES_BLOCKED (Section 6.4)       | Request |
        +------+---------------------------------------+---------+
        | 0x14 | SUB_FLOW_CONTROL_UPDATE (Section 6.1) | Request |
        +------+---------------------------------------+---------+
        | 0x1F | SUBGROUP_RESET (Section 6.2)          | Request |
        +------+---------------------------------------+---------+

                                 Table 3

9.4.  Session Termination Error Code

   IANA is requested to add the following entry to the "MOQT Session
   Termination Error Codes" registry:

             +=======================+======+===============+
             | Name                  | Code | Specification |
             +=======================+======+===============+
             | FLOW_CONTROL_EXCEEDED | 0x1C | Section 7     |
             +-----------------------+------+---------------+

                                 Table 4

10.  References

10.1.  Normative References

   [MOQT]     Nandakumar, S., Vasiliev, V., Swett, I., and A. Frindell,
              "Media over QUIC Transport", Work in Progress, Internet-
              Draft, draft-ietf-moq-transport-22, 1 October 2026,
              <https://datatracker.ietf.org/doc/html/draft-ietf-moq-
              transport-22>.

   [RELIABLE-RESET]
              Seemann, M. and K. Oku, "QUIC Stream Resets with Partial
              Delivery", Work in Progress, Internet-Draft, draft-ietf-
              quic-reliable-stream-reset-11, 6 September 2026,
              <https://datatracker.ietf.org/doc/html/draft-ietf-quic-
              reliable-stream-reset-11>.

   [RFC2119]  Bradner, S., "Key words for use in RFCs to Indicate
              Requirement Levels", BCP 14, RFC 2119,
              DOI 10.17487/RFC2119, March 1997,
              <https://www.rfc-editor.org/rfc/rfc2119>.

Frindell & Swett          Expires 10 April 2027                [Page 11]
Internet-Draft            moq-sub-flow-control              October 2026

   [RFC8174]  Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC
              2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174,
              May 2017, <https://www.rfc-editor.org/rfc/rfc8174>.

10.2.  Informative References

   [WebTransport]
              Frindell, A., Kinnear, E., and V. Vasiliev, "WebTransport
              over HTTP/3", Work in Progress, Internet-Draft, draft-
              ietf-webtrans-http3-16, 6 July 2026,
              <https://datatracker.ietf.org/doc/html/draft-ietf-
              webtrans-http3-16>.

Acknowledgments

   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.

Authors' Addresses

   Alan Frindell (editor)
   Meta
   Email: afrind@meta.com

   Ian Swett (editor)
   Google
   Email: ianswett@google.com

Frindell & Swett          Expires 10 April 2027                [Page 12]