<?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.34 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lcurley-moq-lite-03" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="moql">Media over QUIC - Lite</title>
    <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-lite-03"/>
    <author fullname="Luke Curley">
      <organization/>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <date year="2026" month="March" day="17"/>
    <area>wit</area>
    <workgroup>moq</workgroup>
    <abstract>
      <?line 24?>

<t>moq-lite is designed to fanout live content 1-&gt;N across the internet.
It leverages QUIC to prioritize important content, avoiding head-of-line blocking while respecting encoding dependencies.
While primarily designed for media, the transport is payload agnostic and can be proxied by relays/CDNs without knowledge of codecs, containers, or encryption keys.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Media Over QUIC Working Group mailing list (moq@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/kixelated/moq-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 30?>

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

</section>
    <section anchor="rationale">
      <name>Rationale</name>
      <t>This draft is based on MoqTransport <xref target="moqt"/>.
The concepts, motivations, and terminology are very similar and when in doubt, refer to existing MoqTransport literature.
A few things have been renamed (ex. object -&gt; frame) to better align with media terminology.</t>
      <t>I absolutely believe in the motivation and potential of Media over QUIC.
The layering is phenomenal and addresses many of the problems with current live media protocols.
I fully support the goals of the working group and the IETF process.</t>
      <t>But it's been difficult to design such an experimental protocol via committee.
MoqTransport has become too complicated.</t>
      <t>There are too many messages, optional modes, and half-baked features.
Too many hypotheses, too many potential use-cases, too many diametrically opposed opinions.
This is expected (and even desired) as compromise gives birth to a standard.</t>
      <t>But I believe the standardization process is hindering practical experimentation.
The ideas behind MoQ can be proven now before being cemented as an RFC.
We should spend more time building an <em>actual</em> application and less time arguing about a hypothetical one.</t>
      <t>moq-lite is the bare minimum needed for a real-time application aiming to replace WebRTC.
Every feature from MoqTransport that is not necessary (or has not been implemented yet) has been removed for simplicity.
This includes many great ideas (ex. group order) that may be added as they are needed.
This draft is the current state, not the end state.</t>
    </section>
    <section anchor="concepts">
      <name>Concepts</name>
      <t>moq-lite consists of:</t>
      <ul spacing="normal">
        <li>
          <t><strong>Session</strong>: An established QUIC connection between a client and server.</t>
        </li>
        <li>
          <t><strong>Broadcast</strong>: A collection of Tracks from a single publisher.</t>
        </li>
        <li>
          <t><strong>Track</strong>: An series of Groups, each of which can be delivered and decoded <em>out-of-order</em>.</t>
        </li>
        <li>
          <t><strong>Group</strong>: An series of Frames, each of which must be delivered and decoded <em>in-order</em>.</t>
        </li>
        <li>
          <t><strong>Frame</strong>: A sized payload of bytes within a Group.</t>
        </li>
      </ul>
      <t>The application determines how to split data into broadcast, tracks, groups, and frames.
The moq-lite layer provides fanout, prioritization, and caching even for latency sensitive applications.</t>
      <section anchor="session">
        <name>Session</name>
        <t>A Session consists of a connection between a client and a server.
There is currently no P2P support within QUIC so it's out of scope for moq-lite.</t>
        <t>The moq-lite version identifier is <tt>moq-lite-xx</tt> where <tt>xx</tt> is the two-digit draft version.
For bare QUIC, this is negotiated as an ALPN token during the QUIC handshake.
For WebTransport over HTTP/3, the QUIC ALPN remains <tt>h3</tt> and the moq-lite version is advertised via the <tt>WT-Available-Protocols</tt> and <tt>WT-Protocol</tt> CONNECT headers.</t>
        <t>The session is active immediately after the QUIC/WebTransport connection is established.
Extensions are negotiated via stream probing: an endpoint opens a stream with an unknown type and the peer resets it if unsupported.</t>
        <t>While moq-lite is a point-to-point protocol, it's intended to work end-to-end via relays.
Each client establishes a session with a CDN edge server, ideally the closest one.
Any broadcasts and subscriptions are transparently proxied by the CDN behind the scenes.</t>
      </section>
      <section anchor="broadcast">
        <name>Broadcast</name>
        <t>A Broadcast is a collection of Tracks from a single publisher.
This corresponds to a MoqTransport's "track namespace".</t>
        <t>A publisher may produce multiple broadcasts, each of which is advertised via an ANNOUNCE message.
The subscriber uses the ANNOUNCE_PLEASE message to discover available broadcasts.
These announcements are live and can change over time, allowing for dynamic origin discovery.</t>
        <t>A broadcast consists of any number of Tracks.
The contents, relationships, and encoding of tracks are determined by the application.</t>
      </section>
      <section anchor="track">
        <name>Track</name>
        <t>A Track is a series of Groups identified by a unique name within a Broadcast.</t>
        <t>A track consists of a single active Group at any moment, called the "latest group".
When a new Group is started, the previous Group is closed and may be dropped for any reason.
The duration before an incomplete group is dropped is determined by the application and the publisher/subscriber's latency target.</t>
        <t>Every subscription is scoped to a single Track.
A subscription starts at a configurable Group (defaulting to the latest) and continues until a configurable end Group or until either the publisher or subscriber cancels the subscription.</t>
        <t>The subscriber and publisher both indicate their delivery preference:
- <tt>Priority</tt> indicates if Track A should be transmitted instead of Track B.
- <tt>Ordered</tt> indicates if the Groups within a Track should be transmitted in order.
- <tt>Max Latency</tt> indicates the maximum duration before a Group is abandoned.</t>
        <t>The combination of these preferences enables the most important content to arrive during network degradation while still respecting encoding dependencies.</t>
      </section>
      <section anchor="group">
        <name>Group</name>
        <t>A Group is an ordered stream of Frames within a Track.</t>
        <t>Each group consists of an append-only list of Frames.
A Group is served by a dedicated QUIC stream which is closed on completion, reset by the publisher, or cancelled by the subscriber.
This ensures that all Frames within a Group arrive reliably and in order.</t>
        <t>In contrast, Groups may arrive out of order due to network congestion and prioritization.
The application <bcp14>SHOULD</bcp14> process or buffer groups out of order to avoid blocking on flow control.</t>
      </section>
      <section anchor="frame">
        <name>Frame</name>
        <t>A Frame is a payload of bytes within a Group.</t>
        <t>A frame is used to represent a chunk of data with an upfront size.
The contents are opaque to the moq-lite layer.</t>
      </section>
    </section>
    <section anchor="flow">
      <name>Flow</name>
      <t>This section outlines the flow of messages within a moq-lite session.
See the section for Messages section for the specific encoding.</t>
      <section anchor="connection">
        <name>Connection</name>
        <t>moq-lite runs on top of WebTransport.
WebTransport is a layer on top of QUIC and HTTP/3, required for web support.
The API is nearly identical to QUIC with the exception of stream IDs.</t>
        <t>How the WebTransport connection is authenticated is out-of-scope for this draft.</t>
      </section>
      <section anchor="termination">
        <name>Termination</name>
        <t>QUIC bidirectional streams have an independent send and receive direction.
Rather than deal with half-open states, moq-lite combines both sides.
If an endpoint closes the send direction of a stream, the peer <bcp14>MUST</bcp14> also close their send direction.</t>
        <t>moq-lite contains many long-lived transactions, such as subscriptions and announcements.
These are terminated when the underlying QUIC stream is terminated.</t>
        <t>To terminate a stream, an endpoint may:
- close the send direction (STREAM with FIN) to gracefully terminate (all messages are flushed).
- reset the send direction (RESET_STREAM) to immediately terminate.</t>
        <t>After resetting the send direction, an endpoint <bcp14>MAY</bcp14> close the recv direction (STOP_SENDING).
However, it is ultimately the other peer's responsibility to close their send direction.</t>
      </section>
      <section anchor="handshake">
        <name>Handshake</name>
        <t>See the <xref target="session"/> section for ALPN negotiation and session activation details.</t>
      </section>
    </section>
    <section anchor="streams">
      <name>Streams</name>
      <t>moq-lite uses a bidirectional stream for each transaction.
If the stream is closed, potentially with an error, the transaction is terminated.</t>
      <section anchor="bidirectional-streams">
        <name>Bidirectional Streams</name>
        <t>Bidirectional streams are used for control streams.
There's a 1-byte STREAM_TYPE at the beginning of each stream.</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Stream</th>
              <th align="left">Creator</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Announce</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Subscribe</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Fetch</td>
              <td align="left">Subscriber</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Probe</td>
              <td align="left">Subscriber</td>
            </tr>
          </tbody>
        </table>
        <section anchor="announce">
          <name>Announce</name>
          <t>A subscriber can open a Announce Stream to discover broadcasts matching a prefix.</t>
          <t>The subscriber creates the stream with a ANNOUNCE_PLEASE message.
The publisher replies with ANNOUNCE messages for any matching broadcasts and any future changes.
Each ANNOUNCE message contains one of the following statuses:</t>
          <ul spacing="normal">
            <li>
              <t><tt>active</tt>: a matching broadcast is available.</t>
            </li>
            <li>
              <t><tt>ended</tt>: a previously <tt>active</tt> broadcast is no longer available.</t>
            </li>
          </ul>
          <t>Each broadcast starts as <tt>ended</tt> and <bcp14>MUST</bcp14> alternate between <tt>active</tt> and <tt>ended</tt>.
The subscriber <bcp14>MUST</bcp14> reset the stream if it receives a duplicate status, such as two <tt>active</tt> statuses in a row or an <tt>ended</tt> without <tt>active</tt>.
When the stream is closed, the subscriber <bcp14>MUST</bcp14> assume that all broadcasts are now <tt>ended</tt>.</t>
          <t>Path prefix matching and equality is done on a byte-by-byte basis.
There <bcp14>MAY</bcp14> be multiple Announce Streams, potentially containing overlapping prefixes, that get their own ANNOUNCE messages.</t>
        </section>
        <section anchor="subscribe">
          <name>Subscribe</name>
          <t>A subscriber opens Subscribe Streams to request a Track.</t>
          <t>The subscriber <bcp14>MUST</bcp14> start a Subscribe Stream with a SUBSCRIBE message followed by any number of SUBSCRIBE_UPDATE messages.
The publisher replies with a SUBSCRIBE_OK message followed by any number of SUBSCRIBE_DROP and additional SUBSCRIBE_OK messages.
The first message on the response stream <bcp14>MUST</bcp14> be a SUBSCRIBE_OK; it is not valid to send a SUBSCRIBE_DROP before SUBSCRIBE_OK.</t>
          <t>The publisher closes the stream (FIN) when every group from start to end has been accounted for, either via a GROUP stream (completed or reset) or a SUBSCRIBE_DROP message.
Unbounded subscriptions (no end group) stay open until the publisher closes the stream to indicate the track has ended, or either endpoint resets.
Either endpoint <bcp14>MAY</bcp14> reset/cancel the stream at any time.</t>
        </section>
        <section anchor="fetch">
          <name>Fetch</name>
          <t>A subscriber opens a Fetch Stream (0x3) to request a single Group from a Track.</t>
          <t>The subscriber sends a FETCH message containing the broadcast path, track name, priority, and group sequence.
Unlike Group Streams (which <bcp14>MUST</bcp14> start with a GROUP message), the publisher responds with FRAME messages directly on the same bidirectional stream — there is no preceding GROUP header.
The Subscribe ID and Group Sequence for the returned FRAME messages are implicit, taken from the original FETCH request.
The publisher FINs the stream after the last frame, or resets the stream on error.</t>
          <t>Fetch behaves like HTTP: a single request/response per stream.</t>
        </section>
        <section anchor="probe">
          <name>Probe</name>
          <t>A subscriber opens a Probe Stream (0x4) to measure the available bitrate of the connection.</t>
          <t>The subscriber sends a PROBE message with a target bitrate on the bidirectional stream.
The subscriber <bcp14>MAY</bcp14> send additional PROBE messages on the same stream to update the target bitrate; the publisher <bcp14>MUST</bcp14> treat each PROBE as a new target to attempt.
The publisher <bcp14>SHOULD</bcp14> pad the connection to achieve the most recent target bitrate.
The publisher periodically replies with PROBE messages on the same bidirectional stream containing the current measured bitrate.</t>
          <t>If the publisher does not support PROBE (e.g., congestion controller is not exposed), it <bcp14>MUST</bcp14> reset the stream.</t>
        </section>
      </section>
    </section>
    <section anchor="delivery">
      <name>Delivery</name>
      <t>The most important concept in moq-lite is how to deliver a subscription.
QUIC can only improve the user experience if data is delivered out-of-order during congestion.
This is the sole reason why data is divided into Broadcasts, Tracks, Groups, and Frames.</t>
      <t>moq-lite consists of multiple groups being transmitted in parallel across separate streams.
How these streams get transmitted over the network is very important, and yet has been distilled down into a few simple properties:</t>
      <section anchor="prioritization">
        <name>Prioritization</name>
        <t>The Publisher and Subscriber both exchange <tt>Priority</tt> and <tt>Ordered</tt> values:
- <tt>Priority</tt> determines which Track should be transmitted next.
- <tt>Ordered</tt> determines which Group within the Track should be transmitted next.</t>
        <t>A publisher <bcp14>SHOULD</bcp14> attempt to transmit streams based on these fields.
This depends on the QUIC implementation and it may not be possible to get fine-grained control.</t>
        <section anchor="priority">
          <name>Priority</name>
          <t>The <tt>Subscriber Priority</tt> is scoped to the connection.
The <tt>Publisher Priority</tt> <bcp14>SHOULD</bcp14> be used to resolve conflicts or ties.</t>
          <t>A conflict can occur when a relay tries to serve multiple downstream subscriptions from a single upstream subscription.
Any upstream subscription <bcp14>SHOULD</bcp14> use the publisher priority, not some combination of different subscriber priorities.</t>
          <t>Rather than try to explain everything, here's an example:</t>
          <t><strong>Example:</strong>
There are two people in a conference call, Ali and Bob.</t>
          <t>We subscribe to both of their audio tracks with priority 2 and video tracks with priority 1.
This will cause equal priority for <tt>Ali</tt> and <tt>Bob</tt> while prioritizing audio.
<tt>
ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2
ali/video + bob/video: subscriber_priority=1 publisher_priority=1
</tt></t>
          <t>If Bob starts actively speaking, they can bump their publisher priority via a SUBSCRIBE_OK message.
This would cause tracks be delivered in this order:
<tt>
bob/audio: subscriber_priority=2 publisher_priority=3
ali/audio: subscriber_priority=2 publisher_priority=2
bob/video: subscriber_priority=1 publisher_priority=2
ali/video: subscriber_priority=1 publisher_priority=1
</tt></t>
          <t>The subscriber priority takes precedence, so we could override it if we decided to full-screen Ali's window:
<tt>
ali/audio subscriber_priority=4 publisher_priority=2
ali/video subscriber_priority=3 publisher_priority=1
bob/audio subscriber_priority=2 publisher_priority=3
bob/video subscriber_priority=1 publisher_priority=2
</tt></t>
        </section>
        <section anchor="ordered">
          <name>Ordered</name>
          <t>The <tt>Subscriber Ordered</tt> field signals if older (0x1) or newer (0x0) groups should be transmitted first within a Track.
The <tt>Publisher Ordered</tt> field <bcp14>MAY</bcp14> likewise be used to resolve conflicts.</t>
          <t>An application <bcp14>SHOULD</bcp14> use <tt>ordered</tt> when it wants to provide a VOD-like experience, preferring to buffer old groups rather than skip them.
An application <bcp14>SHOULD NOT</bcp14> use <tt>ordered</tt> when it wants to provide a live experience, preferring to skip old groups rather than buffer them.</t>
          <t>Note that <xref target="expiration"/> is not affected by <tt>ordered</tt>.
An old group may still be cancelled/skipped if it exceeds <tt>max_latency</tt> set by either peer.
An application <bcp14>MUST</bcp14> support gaps and out-of-order delivery even when <tt>ordered</tt> is true.</t>
        </section>
      </section>
      <section anchor="expiration">
        <name>Expiration</name>
        <t>The Publisher and Subscriber both transmit a <tt>Max Latency</tt> value, indicating the maximum duration before a group is expired.</t>
        <t>It is not crucial to aggressively expire groups thanks to <xref target="prioritization"/>.
However, a lower priority group will still consume RAM, bandwidth, and potentially flow control.
It is <bcp14>RECOMMENDED</bcp14> that an application set conservative limits and only resort to expiration when data is absolutely no longer needed.</t>
        <t>A subscriber <bcp14>SHOULD</bcp14> expire groups based on the <tt>Subscriber Max Latency</tt> in SUBSCRIBE/SUBSCRIBE_UPDATE.
A publisher <bcp14>SHOULD</bcp14> expire groups based on the <tt>Publisher Max Latency</tt> in SUBSCRIBE_OK.
An implementation <bcp14>MAY</bcp14> use the minimum of both when determining when to expire a group.</t>
        <t>Group age is computed relative to the latest group by sequence number.
A group is never expired until at least the next group (by sequence number) has been received or queued.
Once a newer group exists, a group is considered expired if the time between its arrival and the latest group's arrival exceeds <tt>Max Latency</tt>.
The arrival time is when the first byte of a group is received (subscriber) or queued (publisher).
An expired group <bcp14>SHOULD</bcp14> BE reset at the QUIC level to avoid consuming flow control.</t>
      </section>
      <section anchor="unidirectional-streams">
        <name>Unidirectional Streams</name>
        <t>Unidirectional streams are used for data transmission.</t>
        <table>
          <thead>
            <tr>
              <th align="right">ID</th>
              <th align="left">Stream</th>
              <th align="left">Creator</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Group</td>
              <td align="left">Publisher</td>
            </tr>
          </tbody>
        </table>
        <section anchor="group-1">
          <name>Group</name>
          <t>A publisher creates Group Streams in response to a Subscribe Stream.</t>
          <t>A Group Stream <bcp14>MUST</bcp14> start with a GROUP message and <bcp14>MAY</bcp14> be followed by any number of FRAME messages.
A Group <bcp14>MAY</bcp14> contain zero FRAME messages, potentially indicating a gap in the track.
A frame <bcp14>MAY</bcp14> contain an empty payload, potentially indicating a gap in the group.</t>
          <t>Both the publisher and subscriber <bcp14>MAY</bcp14> reset the stream at any time.
This is not a fatal error and the session remains active.
The subscriber <bcp14>MAY</bcp14> cache the error and potentially retry later.</t>
        </section>
      </section>
    </section>
    <section anchor="encoding">
      <name>Encoding</name>
      <t>This section covers the encoding of each message.</t>
      <section anchor="message-length">
        <name>Message Length</name>
        <t>Most messages are prefixed with a variable-length integer indicating the number of bytes in the message payload that follows.
This length field does not include the length of the varint length itself.</t>
        <t>An implementation <bcp14>SHOULD</bcp14> close the connection with a PROTOCOL_VIOLATION if it receives a message with an unexpected length.
The version and extensions should be used to support new fields, not the message length.</t>
      </section>
      <section anchor="streamtype">
        <name>STREAM_TYPE</name>
        <t>All streams start with a short header indicating the stream type.</t>
        <artwork><![CDATA[
STREAM_TYPE {
  Stream Type (i)
}
]]></artwork>
        <t>The stream ID depends on if it's a bidirectional or unidirectional stream, as indicated in the Streams section.
A receiver <bcp14>MUST</bcp14> reset the stream if it receives an unknown stream type.
Unknown stream types <bcp14>MUST NOT</bcp14> be treated as fatal; this enables extension negotiation via stream probing.</t>
      </section>
      <section anchor="announceplease">
        <name>ANNOUNCE_PLEASE</name>
        <t>A subscriber sends an ANNOUNCE_PLEASE message to indicate it wants to receive an ANNOUNCE message for any broadcasts with a path that starts with the requested prefix.</t>
        <artwork><![CDATA[
ANNOUNCE_PLEASE Message {
  Message Length (i)
  Broadcast Path Prefix (s),
}
]]></artwork>
        <t><strong>Broadcast Path Prefix</strong>:
Indicate interest for any broadcasts with a path that starts with this prefix.</t>
        <t>The publisher <bcp14>MUST</bcp14> respond with ANNOUNCE messages for any matching and active broadcasts, followed by ANNOUNCE messages for any future updates.
Implementations <bcp14>SHOULD</bcp14> consider reasonable limits on the number of matching broadcasts to prevent resource exhaustion.</t>
      </section>
      <section anchor="announce-1">
        <name>ANNOUNCE</name>
        <t>A publisher sends an ANNOUNCE message to advertise a change in broadcast availability.
Only the suffix is encoded on the wire, as the full path can be constructed by prepending the requested prefix.</t>
        <t>The status is relative to all prior ANNOUNCE messages on the same stream.
A publisher <bcp14>MUST</bcp14> ONLY alternate between status values (from active to ended or vice versa).</t>
        <artwork><![CDATA[
ANNOUNCE Message {
  Message Length (i)
  Announce Status (i),
  Broadcast Path Suffix (s),
  Hops (i),
}
]]></artwork>
        <t><strong>Announce Status</strong>:
A flag indicating the announce status.</t>
        <ul spacing="normal">
          <li>
            <t><tt>ended</tt> (0): A path is no longer available.</t>
          </li>
          <li>
            <t><tt>active</tt> (1): A path is now available.</t>
          </li>
        </ul>
        <t><strong>Broadcast Path Suffix</strong>:
This is combined with the broadcast path prefix to form the full broadcast path.</t>
        <t><strong>Hops</strong>:
The number of hops from the origin publisher.
This is used as a tiebreaker when there are multiple paths to the same broadcast.
A relay <bcp14>SHOULD</bcp14> increment this value when forwarding an announcement.</t>
      </section>
      <section anchor="subscribe-1">
        <name>SUBSCRIBE</name>
        <t>SUBSCRIBE is sent by a subscriber to start a subscription.</t>
        <artwork><![CDATA[
SUBSCRIBE Message {
  Message Length (i)
  Subscribe ID (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Subscriber Ordered (8)
  Subscriber Max Latency (i)
  Start Group (i)
  End Group (i)
}
]]></artwork>
        <t><strong>Subscribe ID</strong>:
A unique identifier chosen by the subscriber.
A Subscribe ID <bcp14>MUST NOT</bcp14> be reused within the same session, even if the prior subscription has been closed.</t>
        <t><strong>Subscriber Priority</strong>:
The priority of the subscription within the session, represented as a u8.
The publisher <bcp14>SHOULD</bcp14> transmit <em>higher</em> values first during congestion.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Subscriber Ordered</strong>:
A single byte representing whether groups are transmitted in ascending (0x1) or descending (0x0) order.
The publisher <bcp14>SHOULD</bcp14> transmit <em>older</em> groups first during congestion if true.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Subscriber Max Latency</strong>:
This value is encoded in milliseconds and represents the maximum age of a group relative to the latest group.
The publisher <bcp14>SHOULD</bcp14> reset old group streams when the difference in arrival time between the group and the latest group exceeds this duration.
See the <xref target="expiration"/> section for more information.</t>
        <t><strong>Start Group</strong>:
The first group to deliver.
A value of 0 means the latest group (default).
A non-zero value is the absolute group sequence + 1.</t>
        <t><strong>End Group</strong>:
The last group to deliver (inclusive).
A value of 0 means unbounded (default).
A non-zero value is the absolute group sequence + 1.</t>
      </section>
      <section anchor="subscribeupdate">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber can modify a subscription with a SUBSCRIBE_UPDATE message.
A subscriber <bcp14>MAY</bcp14> send multiple SUBSCRIBE_UPDATE messages to update the subscription.
The start and end group can be changed in either direction (growing or shrinking).</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Message Length (i)
  Subscriber Priority (8)
  Subscriber Ordered (8)
  Subscriber Max Latency (i)
  Start Group (i)
  End Group (i)
}
]]></artwork>
        <t>See <xref target="subscribe"/> for information about each field.</t>
      </section>
      <section anchor="subscribeok">
        <name>SUBSCRIBE_OK</name>
        <t>A SUBSCRIBE_OK message is sent in response to a SUBSCRIBE.
The publisher <bcp14>MAY</bcp14> send multiple SUBSCRIBE_OK messages to update the subscription.
The first message on the response stream <bcp14>MUST</bcp14> be a SUBSCRIBE_OK; a SUBSCRIBE_DROP <bcp14>MUST NOT</bcp14> precede it.</t>
        <artwork><![CDATA[
SUBSCRIBE_OK Message {
  Type (i) = 0x0
  Message Length (i)
  Publisher Priority (8)
  Publisher Ordered (8)
  Publisher Max Latency (i)
  Start Group (i)
  End Group (i)
}
]]></artwork>
        <t><strong>Type</strong>:
Set to 0x0 to indicate a SUBSCRIBE_OK message.</t>
        <t><strong>Start Group</strong>:
The resolved absolute start group sequence.
A value of 0 means the start group is not yet known; the publisher <bcp14>MUST</bcp14> send a subsequent SUBSCRIBE_OK with a resolved value.
A non-zero value is the absolute group sequence + 1.</t>
        <t><strong>End Group</strong>:
The resolved absolute end group sequence (inclusive).
A value of 0 means unbounded.
A non-zero value is the absolute group sequence + 1.</t>
        <t>See <xref target="subscribe"/> for information about the other fields.</t>
      </section>
      <section anchor="subscribedrop">
        <name>SUBSCRIBE_DROP</name>
        <t>A SUBSCRIBE_DROP message is sent by the publisher on the Subscribe Stream when groups cannot be served.</t>
        <artwork><![CDATA[
SUBSCRIBE_DROP Message {
  Type (i) = 0x1
  Message Length (i)
  Start Group (i)
  End Group (i)
  Error Code (i)
}
]]></artwork>
        <t><strong>Type</strong>:
Set to 0x1 to indicate a SUBSCRIBE_DROP message.</t>
        <t><strong>Start Group</strong>:
The first absolute group sequence in the dropped range.</t>
        <t><strong>End Group</strong>:
The last absolute group sequence in the dropped range (inclusive).</t>
        <t><strong>Error Code</strong>:
An application-specific error code.
A value of 0 indicates no error; the groups are simply unavailable.</t>
      </section>
      <section anchor="fetch-1">
        <name>FETCH</name>
        <t>FETCH is sent by a subscriber to request a single group from a track.</t>
        <artwork><![CDATA[
FETCH Message {
  Message Length (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Group Sequence (i)
}
]]></artwork>
        <t><strong>Broadcast Path</strong>:
The broadcast path of the track to fetch from.</t>
        <t><strong>Track Name</strong>:
The name of the track to fetch from.</t>
        <t><strong>Subscriber Priority</strong>:
The priority of the fetch within the session, represented as a u8.
See the <xref target="prioritization"/> section for more information.</t>
        <t><strong>Group Sequence</strong>:
The sequence number of the group to fetch.</t>
        <t>The publisher responds with FRAME messages on the same stream.
The publisher FINs the stream after the last frame, or resets on error.</t>
      </section>
      <section anchor="probe-1">
        <name>PROBE</name>
        <t>PROBE is used to measure the available bitrate of the connection.</t>
        <artwork><![CDATA[
PROBE Message {
  Message Length (i)
  Bitrate (i)
}
]]></artwork>
        <t><strong>Bitrate</strong>:
When sent by the subscriber (stream opener): the target bitrate in bits per second that the publisher should pad up to.
When sent by the publisher (responder): the current measured bitrate in bits per second.</t>
      </section>
      <section anchor="group-2">
        <name>GROUP</name>
        <t>The GROUP message contains information about a Group, as well as a reference to the subscription being served.</t>
        <artwork><![CDATA[
GROUP Message {
  Message Length (i)
  Subscribe ID (i)
  Group Sequence (i)
}
]]></artwork>
        <t><strong>Subscribe ID</strong>:
The corresponding Subscribe ID.
This ID is used to distinguish between multiple subscriptions for the same track.</t>
        <t><strong>Group Sequence</strong>:
The sequence number of the group.
This <bcp14>SHOULD</bcp14> increase by 1 for each new group.
A subscriber <bcp14>MUST</bcp14> handle gaps, potentially caused by congestion.</t>
      </section>
      <section anchor="frame-1">
        <name>FRAME</name>
        <t>The FRAME message is a payload within a group.</t>
        <artwork><![CDATA[
FRAME Message {
  Message Length (i)
  Payload (b)
}
]]></artwork>
        <t><strong>Payload</strong>:
An application specific payload.
A generic library or relay <bcp14>MUST NOT</bcp14> inspect or modify the contents unless otherwise negotiated.</t>
      </section>
    </section>
    <section anchor="appendix-a-changelog">
      <name>Appendix A: Changelog</name>
      <section anchor="moq-lite-03">
        <name>moq-lite-03</name>
        <ul spacing="normal">
          <li>
            <t>Version negotiated via ALPN (<tt>moq-lite-xx</tt>) instead of SETUP messages.</t>
          </li>
          <li>
            <t>Removed Session, SessionCompat streams and SESSION_CLIENT/SESSION_SERVER/SESSION_UPDATE messages.</t>
          </li>
          <li>
            <t>Unknown stream types reset instead of fatal; enables extension negotiation via stream probing.</t>
          </li>
          <li>
            <t>Added FETCH stream for single group download.</t>
          </li>
          <li>
            <t>Added Start Group and End Group to SUBSCRIBE, SUBSCRIBE_UPDATE, and SUBSCRIBE_OK.</t>
          </li>
          <li>
            <t>Added SUBSCRIBE_DROP on Subscribe stream.</t>
          </li>
          <li>
            <t>Subscribe stream closed (FIN) when all groups accounted for.</t>
          </li>
          <li>
            <t>Added PROBE stream replacing SESSION_UPDATE bitrate.</t>
          </li>
          <li>
            <t>Removed ANNOUNCE_INIT message.</t>
          </li>
          <li>
            <t>Added <tt>Hops</tt> to ANNOUNCE.</t>
          </li>
          <li>
            <t>Added <tt>Subscriber Max Latency</tt> and <tt>Subscriber Ordered</tt> to SUBSCRIBE and SUBSCRIBE_UPDATE.</t>
          </li>
          <li>
            <t>Added <tt>Publisher Priority</tt>, <tt>Publisher Max Latency</tt>, and <tt>Publisher Ordered</tt> to SUBSCRIBE_OK.</t>
          </li>
          <li>
            <t>SUBSCRIBE_OK may be sent multiple times.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-02">
        <name>moq-lite-02</name>
        <ul spacing="normal">
          <li>
            <t>Added SessionCompat stream.</t>
          </li>
          <li>
            <t>Editorial stuff.</t>
          </li>
        </ul>
      </section>
      <section anchor="moq-lite-01">
        <name>moq-lite-01</name>
        <ul spacing="normal">
          <li>
            <t>Added Message Length (i) to all messages.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="appendix-b-upstream-differences">
      <name>Appendix B: Upstream Differences</name>
      <t>A quick comparison of moq-lite and moq-transport-14:</t>
      <ul spacing="normal">
        <li>
          <t>Streams instead of request IDs.</t>
        </li>
        <li>
          <t>Pull only: No unsolicited publishing.</t>
        </li>
        <li>
          <t>FETCH is HTTP-like (single request/response) vs MoqTransport FETCH (multiple groups).</t>
        </li>
        <li>
          <t>Extensions negotiated via stream probing instead of parameters.</t>
        </li>
        <li>
          <t>Both moq-lite and MoqTransport use ALPN for version identification.</t>
        </li>
        <li>
          <t>Names use utf-8 strings instead of byte arrays.</t>
        </li>
        <li>
          <t>Track Namespace is a string, not an array of any array of bytes.</t>
        </li>
        <li>
          <t>Subscriptions default to the latest group, not the latest object.</t>
        </li>
        <li>
          <t>No subgroups</t>
        </li>
        <li>
          <t>No group/object ID gaps</t>
        </li>
        <li>
          <t>No object properties</t>
        </li>
        <li>
          <t>No datagrams</t>
        </li>
        <li>
          <t>No paused subscriptions (forward=0)</t>
        </li>
      </ul>
      <section anchor="deleted-messages">
        <name>Deleted Messages</name>
        <ul spacing="normal">
          <li>
            <t>GOAWAY</t>
          </li>
          <li>
            <t>MAX_SUBSCRIBE_ID</t>
          </li>
          <li>
            <t>REQUESTS_BLOCKED</t>
          </li>
          <li>
            <t>SUBSCRIBE_ERROR</t>
          </li>
          <li>
            <t>UNSUBSCRIBE</t>
          </li>
          <li>
            <t>PUBLISH_DONE</t>
          </li>
          <li>
            <t>PUBLISH</t>
          </li>
          <li>
            <t>PUBLISH_OK</t>
          </li>
          <li>
            <t>PUBLISH_ERROR</t>
          </li>
          <li>
            <t>FETCH_OK</t>
          </li>
          <li>
            <t>FETCH_ERROR</t>
          </li>
          <li>
            <t>FETCH_CANCEL</t>
          </li>
          <li>
            <t>FETCH_HEADER</t>
          </li>
          <li>
            <t>TRACK_STATUS</t>
          </li>
          <li>
            <t>TRACK_STATUS_OK</t>
          </li>
          <li>
            <t>TRACK_STATUS_ERROR</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_OK</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_ERROR</t>
          </li>
          <li>
            <t>PUBLISH_NAMESPACE_CANCEL</t>
          </li>
          <li>
            <t>SUBSCRIBE_NAMESPACE_OK</t>
          </li>
          <li>
            <t>SUBSCRIBE_NAMESPACE_ERROR</t>
          </li>
          <li>
            <t>UNSUBSCRIBE_NAMESPACE</t>
          </li>
          <li>
            <t>OBJECT_DATAGRAM</t>
          </li>
        </ul>
      </section>
      <section anchor="renamed-messages">
        <name>Renamed Messages</name>
        <ul spacing="normal">
          <li>
            <t>SUBSCRIBE_NAMESPACE -&gt; ANNOUNCE_PLEASE</t>
          </li>
          <li>
            <t>SUBGROUP_HEADER -&gt; GROUP</t>
          </li>
        </ul>
      </section>
      <section anchor="deleted-fields">
        <name>Deleted Fields</name>
        <t>Some of these fields occur in multiple messages.</t>
        <ul spacing="normal">
          <li>
            <t>Request ID</t>
          </li>
          <li>
            <t>Track Alias</t>
          </li>
          <li>
            <t>Group Order</t>
          </li>
          <li>
            <t>Filter Type</t>
          </li>
          <li>
            <t>StartObject</t>
          </li>
          <li>
            <t>Expires</t>
          </li>
          <li>
            <t>ContentExists</t>
          </li>
          <li>
            <t>Largest Group ID</t>
          </li>
          <li>
            <t>Largest Object ID</t>
          </li>
          <li>
            <t>Parameters</t>
          </li>
          <li>
            <t>Subgroup ID</t>
          </li>
          <li>
            <t>Object ID</t>
          </li>
          <li>
            <t>Object Status</t>
          </li>
          <li>
            <t>Extension Headers</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <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="2" month="March" year="2026"/>
          <abstract>
            <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-17"/>
      </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>
    <?line 726?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
WjTm2W89WTx1d1JI8L/mBHpUxmwAAA==

-->

</rfc>
