<?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.29 (Ruby 3.4.4) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lcurley-moq-lite-02" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="moql">Media over QUIC - Lite</title>
    <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-lite-02"/>
    <author fullname="Luke Curley">
      <organization/>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="November" day="12"/>
    <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 representing a single moment in time.</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>A session is established after the necessary QUIC, WebTransport, and moq-lite handshakes have completed.
The moq-lite handshake is simple and consists of version and extension negotiation.</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 and relationship between these tracks is determined by the application or via an out-of-band mechanism.</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 will always start at the latest Group and continues until either the publisher or subscriber cancels the subscription.</t>
        <t>A subscriber chooses the priority of each subscription, hinting to the publisher which Track should arrive first during congestion.
This 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 should be prepared to handle this with a jitter buffer at the group level.</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 a known size.
A frame should represent a single moment in time and avoid any buffering that would increase latency.</t>
        <t>There's no timestamp or metadata associated with a Frame, this is the responsibility of the application.</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>After a connection is established, the client opens a Session Stream and sends a SESSION_CLIENT message, to which the server replies with a SESSION_SERVER message.
The session is active until either endpoint closes or resets the Session Stream.</t>
        <t>This session handshake is used to negotiate the moq-lite version and any extensions.
See the Extension section for more information.</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">0x0</td>
              <td align="left">Session</td>
              <td align="left">Client</td>
            </tr>
            <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">0x20</td>
              <td align="left">SessionCompat</td>
              <td align="left">Client</td>
            </tr>
          </tbody>
        </table>
        <section anchor="session-1">
          <name>Session</name>
          <t>The Session stream is used to establish the moq-lite session, negotiating the version and any extensions.
This stream remains open for the duration of the session and its closure indicates the session is closed.</t>
          <t>The client <bcp14>MUST</bcp14> open the Session Stream, write the Session Stream ID (0x0), and write a SESSION_CLIENT message.
If the server does not support any of the client's versions, it <bcp14>MUST</bcp14> close the stream with an error code and <bcp14>MAY</bcp14> close the connection.
Otherwise, the server replies with a SESSION_SERVER message to complete the handshake.</t>
          <t>Afterwards, both endpoints <bcp14>MAY</bcp14> send SESSION_UPDATE messages.
This is currently used to notify the other endpoint of a significant change in the session bitrate.</t>
          <t>This draft's version is combined with the constant <tt>0xff0dad00</tt>.
For example, moq-lite-draft-04 is identified as <tt>0xff0dad04</tt>.</t>
        </section>
        <section anchor="sessioncompat">
          <name>SessionCompat</name>
          <t>The SessionCompat stream exists to support moq-transport draft 11-14.
This will be removed in a future version as moq-transport draft 15 uses ALPN instead.</t>
          <t>The client writes a CLIENT_SETUP message on the SessionCompat stream and receives a SERVER_SETUP message in response.</t>
          <t>Consult the MoqTransport (<xref target="moqt"/>) draft for more information about the encoding.
Notably, each message contains a u16 length prefix instead of a VarInt (moq-lite).</t>
          <t>If a moq-lite version is negotiated, this stream becomes a normal Session stream.
If a moq-transport version is negotiated, this stream becomes the MoqTransport control stream.</t>
        </section>
        <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 an ANNOUNCE_INIT message containing all currently active broadcasts that currently match the prefix, followed by ANNOUNCE messages for any changes.</t>
          <t>The ANNOUNCE_INIT message contains an array of all currently active broadcast paths encoded as a suffix.
Each path in ANNOUNCE_INIT can be treated as if it were an ANNOUNCE message with status <tt>active</tt>.</t>
          <t>After ANNOUNCE_INIT, the publisher sends ANNOUNCE messages for any changes also encoded as a suffix.
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> (unless included in ANNOUNCE_INIT) 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_INIT and 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 <bcp14>MUST</bcp14> reply with an SUBSCRIBE_OK message.</t>
          <t>The publisher <bcp14>SHOULD</bcp14> close the stream after the track has ended.
Either endpoint <bcp14>MAY</bcp14> reset/cancel the stream at any time.</t>
        </section>
      </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> close the session if it receives an unknown stream type.</t>
      </section>
      <section anchor="sessionclient">
        <name>SESSION_CLIENT</name>
        <t>The client initiates the session by sending a SESSION_CLIENT message.</t>
        <artwork><![CDATA[
SESSION_CLIENT Message {
  Message Length (i)
  Supported Versions Count (i)
  Supported Version (i)
  Extension Count (i)
  [
    Extension ID (i)
    Extension Payload (b)
  ]...
}
]]></artwork>
      </section>
      <section anchor="sessionserver">
        <name>SESSION_SERVER</name>
        <t>The server responds with the selected version and any extensions.</t>
        <artwork><![CDATA[
SESSION_SERVER Message {
  Message Length (i)
  Selected Version (i)
  Extension Count (i)
  [
    Extension ID (i)
    Extension Payload (b)
  ]...
}
]]></artwork>
      </section>
      <section anchor="sessionupdate">
        <name>SESSION_UPDATE</name>
        <artwork><![CDATA[
SESSION_UPDATE Message {
  Message Length (i)
  Session Bitrate (i)
}
]]></artwork>
        <t><strong>Session Bitrate</strong>:
The estimated bitrate of the QUIC connection in bits per second.
This <bcp14>SHOULD</bcp14> be sourced directly from the QUIC congestion controller.
A value of 0 indicates that this information is not available.</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 an ANNOUNCE_INIT message containing any matching and active broadcasts, followed by ANNOUNCE messages for any updates.
Implementations <bcp14>SHOULD</bcp14> consider reasonable limits on the number of matching broadcasts to prevent resource exhaustion.</t>
      </section>
      <section anchor="announceinit">
        <name>ANNOUNCE_INIT</name>
        <t>A publisher sends an ANNOUNCE_INIT message immediately after receiving an ANNOUNCE_PLEASE to communicate all currently active broadcasts that match the requested prefix.
Only the suffixes are encoded on the wire, as the full path can be constructed by prepending the requested prefix.</t>
        <t>This message is useful to avoid race conditions, as ANNOUNCE_INIT does not trickle in like ANNOUNCE messages.
For example, an API server that wants to list the current participants could issue an ANNOUNCE_PLEASE and immediately return the ANNOUNCE_INIT response.
Without ANNOUNCE_INIT, the API server would have use a timer to wait until ANNOUNCE to guess when all ANNOUNCE messages have been received.</t>
        <artwork><![CDATA[
ANNOUNCE_INIT Message {
  Message Length (i)
  Suffix Count (i),
  [
    Broadcast Path Suffix (s),
  ]...
}
]]></artwork>
        <t><strong>Suffix Count</strong>:
The number of active broadcast path suffixes that follow.
This can be 0.
A publisher <bcp14>MUST NOT</bcp14> include duplicate suffixes in a single ANNOUNCE_INIT message.</t>
        <t><strong>Broadcast Path Suffix</strong>:
Each suffix is combined with the broadcast path prefix from ANNOUNCE_PLEASE to form the full broadcast path.
This includes all currently active broadcasts matching the prefix.</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 the ANNOUNCE_INIT and all prior ANNOUNCE messages combined.
A client <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),
}
]]></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>
      </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 (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 transmission priority of the subscription relative to all other active subscriptions within the session.
The publisher <bcp14>SHOULD</bcp14> transmit <em>higher</em> values first during congestion.</t>
      </section>
      <section anchor="subscribeupdate">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber can modify a subscription with a SUBSCRIBE_UPDATE message.</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Message Length (i)
  Subscriber Priority (i)
}
]]></artwork>
        <t><strong>Subscriber Priority</strong>:
The new subscriber priority; see SUBSCRIBE.</t>
      </section>
      <section anchor="subscribeok">
        <name>SUBSCRIBE_OK</name>
        <t>The SUBSCRIBE_OK is sent in response to a SUBSCRIBE.</t>
        <artwork><![CDATA[
SUBSCRIBE_OK Message {
  Message Length = 0
}
]]></artwork>
        <t>That's right, it's an empty message at the moment.</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.</t>
      </section>
      <section anchor="frame-1">
        <name>FRAME</name>
        <t>The FRAME message is a payload at a specific point of time.</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-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 ANNOUNCE_INIT.</t>
          </li>
          <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>Uses HTTP for VOD instead of FETCH.</t>
        </li>
        <li>
          <t>Extensions instead of parameters.</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 start at 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</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>StartGroup</t>
          </li>
          <li>
            <t>StartObject</t>
          </li>
          <li>
            <t>EndGroup</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="20" month="October" year="2025"/>
          <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-15"/>
      </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 591?>

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

-->

</rfc>
