<?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.23 (Ruby 3.3.6) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-transport-09" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.27.0 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-09"/>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization>Discord</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <author initials="K." surname="Pugin" fullname="Kirill Pugin">
      <organization>Meta</organization>
      <address>
        <email>ikir@meta.com</email>
      </address>
    </author>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="V." surname="Vasiliev" fullname="Victor Vasiliev">
      <organization>Google</organization>
      <address>
        <email>vasilvv@google.com</email>
      </address>
    </author>
    <author initials="I." surname="Swett" fullname="Ian Swett" role="editor">
      <organization>Google</organization>
      <address>
        <email>ianswett@google.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <abstract>
      <?line 64?>

<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>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://moq-wg.github.io/moq-transport/draft-ietf-moq-transport.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-ietf-moq-transport/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/moq-wg/moq-transport"/>.</t>
    </note>
  </front>
  <middle>
    <?line 73?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Media Over QUIC Transport (MOQT) is a protocol that is optimized
for the QUIC protocol <xref target="QUIC"/>, either directly or via WebTransport
<xref target="WebTransport"/>, for the dissemination of media. MOQT utilizes a
publish/subscribe workflow in which producers of media publish data in
response to subscription requests from a multiplicity of endpoints. MOQT
supports wide range of use-cases with different resiliency and latency
(live, interactive) needs without compromising the scalability and cost
effectiveness associated with content delivery networks.</t>
      <t>MOQT is a generic protocol designed to work in concert with multiple
MoQ Streaming Formats. These MoQ Streaming Formats define how content is
encoded, packaged, and mapped to MOQT objects, along with policies for
discovery and subscription.</t>
      <ul spacing="normal">
        <li>
          <t><xref target="model"/> describes the data model employed by MOQT.</t>
        </li>
        <li>
          <t><xref target="session"/> covers aspects of setting up a MOQT session.</t>
        </li>
        <li>
          <t><xref target="priorities"/> covers mechanisms for prioritizing subscriptions.</t>
        </li>
        <li>
          <t><xref target="relays-moq"/> covers behavior at the relay entities.</t>
        </li>
        <li>
          <t><xref target="message"/> covers how control messages are encoded on the wire.</t>
        </li>
        <li>
          <t><xref target="data-streams"/> covers how data messages are encoded on the wire.</t>
        </li>
      </ul>
      <section anchor="motivation">
        <name>Motivation</name>
        <t>The development of MOQT is driven by goals in a number of areas -
specifically latency, the robust feature set of QUIC and relay
support.</t>
        <section anchor="latency">
          <name>Latency</name>
          <t>Latency is necessary to correct for variable network throughput. Ideally live
content is consumed at the same bitrate it is produced. End-to-end latency would
be fixed and only subject to encoding and transmission delays. Unfortunately,
networks have variable throughput, primarily due to congestion. Attempting to
deliver content encoded at a higher bitrate than the network can support causes
queuing along the path from producer to consumer. The speed at which a protocol
can detect and respond to congestion determines the overall latency. TCP-based
protocols are simple but are slow to detect congestion and suffer from
head-of-line blocking. Protocols utilizing UDP directly can avoid queuing, but
the application is then responsible for the complexity of fragmentation,
congestion control, retransmissions, receiver feedback, reassembly, and
more. One goal of MOQT is to achieve the best of both these worlds: leverage the
features of QUIC to create a simple yet flexible low latency protocol that can
rapidly detect and respond to congestion.</t>
        </section>
        <section anchor="leveraging-quic">
          <name>Leveraging QUIC</name>
          <t>The parallel nature of QUIC streams can provide improvements in the face
of loss. A goal of MOQT is to design a streaming protocol to leverage
the transmission benefits afforded by parallel QUIC streams as well
exercising options for flexible loss recovery.</t>
        </section>
        <section anchor="convergence">
          <name>Convergence</name>
          <t>Some live media architectures today have separate protocols for ingest and
distribution, for example RTMP and HTTP based HLS or DASH. Switching protocols
necessitates intermediary origins which re-package the
media content. While specialization can have its benefits, there are efficiency
gains to be had in not having to re-package content. A goal of MOQT is to
develop a single protocol which can be used for transmission from contribution
to distribution. A related goal is the ability to support existing encoding and
packaging schemas, both for backwards compatibility and for interoperability
with the established content preparation ecosystem.</t>
        </section>
        <section anchor="relays">
          <name>Relays</name>
          <t>An integral feature of a protocol being successful is its ability to
deliver media at scale. Greatest scale is achieved when third-party
networks, independent of both the publisher and subscriber, can be
leveraged to relay the content. These relays must cache content for
distribution efficiency while simultaneously routing content and
deterministically responding to congestion in a multi-tenant network. A
goal of MOQT is to treat relays as first-class citizens of the protocol
and ensure that objects are structured such that information necessary
for distribution is available to relays while the media content itself
remains opaque and private.</t>
        </section>
      </section>
      <section anchor="terms-and-definitions">
        <name>Terms and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>The following terms are used with the first letter capitalized.</t>
        <dl>
          <dt>Client:</dt>
          <dd>
            <t>The party initiating a Transport Session.</t>
          </dd>
          <dt>Server:</dt>
          <dd>
            <t>The party accepting an incoming Transport Session.</t>
          </dd>
          <dt>Endpoint:</dt>
          <dd>
            <t>A Client or Server.</t>
          </dd>
          <dt>Peer:</dt>
          <dd>
            <t>The other endpoint than the one being described</t>
          </dd>
          <dt>Publisher:</dt>
          <dd>
            <t>An endpoint that handles subscriptions by sending requested Objects from the requested track.</t>
          </dd>
          <dt>Subscriber:</dt>
          <dd>
            <t>An endpoint that subscribes to and receives tracks.</t>
          </dd>
          <dt>Original Publisher:</dt>
          <dd>
            <t>The initial publisher of a given track.</t>
          </dd>
          <dt>End Subscriber:</dt>
          <dd>
            <t>A subscriber that initiates a subscription and does not send the data on to other subscribers.</t>
          </dd>
          <dt>Relay:</dt>
          <dd>
            <t>An entity that is both a Publisher and a Subscriber, but not the Original
Publisher or End Subscriber.</t>
          </dd>
          <dt>Upstream:</dt>
          <dd>
            <t>In the direction of the Original Publisher</t>
          </dd>
          <dt>Downstream:</dt>
          <dd>
            <t>In the direction of the End Subscriber(s)</t>
          </dd>
          <dt>Transport Session:</dt>
          <dd>
            <t>A raw QUIC connection or a WebTransport session.</t>
          </dd>
          <dt>Congestion:</dt>
          <dd>
            <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>A temporal sequence of objects. A group represents a join point in a
track. See (<xref target="model-group"/>).</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>An object is an addressable unit whose payload is a sequence of
bytes. Objects form the base element in the MOQT data model. See
(<xref target="model-object"/>).</t>
          </dd>
          <dt>Track:</dt>
          <dd>
            <t>A track is a collection of groups. See (<xref target="model-track"/>).</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref section="1.3" sectionFormat="comma" target="RFC9000"/>)
when describing the binary encoding.</t>
        <t>As a quick reference, the following list provides a non normative summary
of the parts of RFC9000 field syntax that are used in this specification.</t>
        <dl>
          <dt>x (L):</dt>
          <dd>
            <t>Indicates that x is L bits long</t>
          </dd>
          <dt>x (i):</dt>
          <dd>
            <t>Indicates that x holds an integer value using the variable-length
encoding as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>)</t>
          </dd>
          <dt>x (..):</dt>
          <dd>
            <t>Indicates that x can be any length including zero bits long.  Values
 in this format always end on a byte boundary.</t>
          </dd>
          <dt>[x (L)]:</dt>
          <dd>
            <t>Indicates that x is optional and has a length of L</t>
          </dd>
          <dt>x (L) ...:</dt>
          <dd>
            <t>Indicates that x is repeated zero or more times and that each instance
has a length of L</t>
          </dd>
        </dl>
        <t>This document extends the RFC9000 syntax and with the additional field types:</t>
        <dl>
          <dt>x (b):</dt>
          <dd>
            <t>Indicates that x consists of a variable length integer encoding as
described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many bytes
of binary data</t>
          </dd>
          <dt>x (tuple):</dt>
          <dd>
            <t>Indicates that x is a tuple, consisting of a variable length integer encoded
as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many variable
length tuple fields, each of which are encoded as (b) above.</t>
          </dd>
        </dl>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
      </section>
    </section>
    <section anchor="model">
      <name>Object Data Model</name>
      <t>MOQT has a hierarchical data model, comprised of tracks which contain
groups, and groups that contain objects. Inside of a group, the objects
can be organized into subgroups.</t>
      <t>To give an example of how an application might use this data model,
consider an application sending high and low resolution video using a
codec with temporal scalability. Each resolution is sent as a separate
track to allow the subscriber to pick the appropriate resolution given
the display environment and available bandwidth. Each "group of pictures"
in a video is sent as a group because the first frame is needed to
decode later frames. This allows the client to join at the logical points
where they can get the information to start decoding the stream.
The temporal layers are sent as separate sub groups to allow the
priority mechanism to favour the base layer when there is not enough
bandwidth to send both the base and enhancement layers. Each frame of
video on a given layer is sent as a single object.</t>
      <section anchor="model-object">
        <name>Objects</name>
        <t>The basic data element of MOQT is an object.  An object is an
addressable unit whose payload is a sequence of bytes.  All objects
belong to a group, indicating ordering and potential
dependencies. <xref target="model-group"/>  An object is uniquely identified by
its track namespace, track name, group ID, and object ID, and must be an
identical sequence of bytes regardless of how or where it is retrieved.
An Object can become unavailable, but its contents <bcp14>MUST NOT</bcp14> change over
time.</t>
        <t>Objects are comprised of two parts: metadata and a payload.  The metadata is
never encrypted and is always visible to relays (see <xref target="relays-moq"/>). The
payload portion may be encrypted, in which case it is only visible to the
Original Publisher and End Subscribers. The Original Publisher is solely
responsible for the content of the object payload. This includes the
underlying encoding, compression, any end-to-end encryption, or
authentication. A relay <bcp14>MUST NOT</bcp14> combine, split, or otherwise modify object
payloads.</t>
        <t>Objects within a group are ordered numerically by their Object ID.</t>
      </section>
      <section anchor="model-subgroup">
        <name>Subgroups</name>
        <t>A subgroup is a sequence of one or more objects from the same group
(<xref target="model-group"/>) in ascending order by Object ID. Objects in a subgroup
have a dependency and priority relationship consistent with sharing a
stream and are sent on a single stream whenever possible. A Group is delivered
using at least as many streams as there are Subgroups,
typically with a one-to-one mapping between Subgroups and streams.</t>
        <t>When a Track's forwarding preference (see <xref target="object-fields"/>) is
"Datagram", Objects are not sent in Subgroups and the
description in the remainder of this section does not apply.</t>
        <t>Streams offer in-order reliable delivery and the ability to cancel sending
and retransmission of data. Furthermore, many implementations offer the ability
to control the relative priority of streams, which allows control over the
scheduling of sending data on active streams.</t>
        <t>Every object within a Group belongs to exactly one Subgroup.</t>
        <t>Objects from two subgroups cannot be sent on the same stream. Objects from the
same Subgroup <bcp14>MUST NOT</bcp14> be sent on different streams, unless one of the streams
was reset prematurely, or upstream conditions have forced objects from a Subgroup
to be sent out of Object ID order.</t>
        <t>Original publishers assign each Subgroup a Subgroup ID, and do so as they see fit.  The
scope of a Subgroup ID is a Group, so Subgroups from different Groups <bcp14>MAY</bcp14> share a Subgroup
ID without implying any relationship between them. In general, publishers assign
objects to subgroups in order to leverage the features of streams as described
above.</t>
        <t>An example strategy for using stream properties follows. If object B is
dependent on object A, then delivery of B can follow A, i.e. A and B can be
usefully delivered over a single stream. Furthermore, in this example:</t>
        <ul spacing="normal">
          <li>
            <t>If an object is dependent on all previous objects in a Subgroup, it is added to
that Subgroup.</t>
          </li>
          <li>
            <t>If an object is not dependent on all of the objects in a Subgroup, it goes in
a different Subgroup.</t>
          </li>
          <li>
            <t>There are often many ways to compose Subgroups that meet these criteria. Where
possible, choose the composition that results in the fewest Subgroups in a group
to minimize the number of streams used.</t>
          </li>
        </ul>
      </section>
      <section anchor="model-group">
        <name>Groups</name>
        <t>A group is a collection of objects and is a sub-unit of a track (<xref target="model-track"/>).
Groups <bcp14>SHOULD</bcp14> be indendepently useful, so objects within a group <bcp14>SHOULD NOT</bcp14> depend
on objects in other groups. A group provides a join point for subscriptions, so a
subscriber that does not want to receive the entire track can opt to receive only
the latest group(s).  The publisher then selectively transmits objects based on
their group membership.  Groups can contain any number of objects.</t>
        <t>Within a track, the original publisher <bcp14>SHOULD</bcp14> produce Group IDs which increase
with time. Subscribers to tracks which do not follow this requirement <bcp14>SHOULD NOT</bcp14>
use range filters which span multiple groups in FETCH or SUBSCRIBE. SUBSCRIBE and
FETCH delivery use Group Order, so a FETCH cannot deliver Groups out of order
and a subscription could have unexpected delivery order if Group IDs do not increase
with time.</t>
      </section>
      <section anchor="model-track">
        <name>Track</name>
        <t>A track is a sequence of groups (<xref target="model-group"/>). It is the entity
against which a subscriber issues a subscription request.  A subscriber
can request to receive individual tracks starting at a group boundary,
including any new objects pushed by the publisher while the track is
active.</t>
        <section anchor="track-name">
          <name>Track Naming and Scopes</name>
          <t>In MOQT, every track is identified by a Full Track Name, consisting of a Track
Namespace and a Track Name.</t>
          <t>Track Namespace is an ordered N-tuple of bytes where N can be between 1 and 32.
The structured nature of Track Namespace allows relays and applications to
manipulate prefixes of a namespace. If an endpoint receives a Track Namespace
tuple with an N of 0 or more than 32, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
          <t>Track Name is a sequence of bytes that identifies an individual track within the
namespace.</t>
          <t>In this specification, both the Track Namespace tuple fields and the Track Name
are not constrained to a specific encoding. They carry a sequence of bytes and
comparison between two Track Namespace tuple fields or Track Names is done by
exact comparison of the bytes. Specifications that use MoQ Transport may
constrain the information in these fields, for example by restricting them to
UTF-8. Any specification that does needs to specify the canonicalization into
the bytes in the Track Namespace or Track Name such that exact comparison works.</t>
        </section>
        <section anchor="track-scope">
          <name>Scope</name>
          <t>A MOQT scope is a set of servers (as identified by their connection
URIs) for which the tuple of Track Name and Track Namespace are
guaranteed to be unique and identify a specific track. It is up to
the application using MOQT to define how broad or narrow the scope is.
An application that deals with connections between devices
on a local network may limit the scope to a single connection; by
contrast, an application that uses multiple CDNs to serve media may
require the scope to include all of those CDNs.</t>
          <t>Because the tuple of Track Namespace and Track Name are unique within an
MOQT scope, they can be used as a cache key.
MOQT does not provide any in-band content negotiation methods similar to
the ones defined by HTTP (<xref section="10" sectionFormat="comma" target="RFC9110"/>); if, at a given
moment in time, two tracks within the same scope contain different data,
they have to have different names and/or namespaces.</t>
        </section>
        <section anchor="connection-url">
          <name>Connection URL</name>
          <t>Each track <bcp14>MAY</bcp14> have one or more associated connection URLs specifying
network hosts through which a track may be accessed. The syntax of the
Connection URL and the associated connection setup procedures are
specific to the underlying transport protocol usage <xref target="session"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="session">
      <name>Sessions</name>
      <section anchor="session-establishment">
        <name>Session establishment</name>
        <t>This document defines a protocol that can be used interchangeably both
over a QUIC connection directly <xref target="QUIC"/>, and over WebTransport
<xref target="WebTransport"/>.  Both provide streams and datagrams with similar
semantics (see <xref section="4" sectionFormat="comma" target="I-D.ietf-webtrans-overview"/>); thus, the
main difference lies in how the servers are identified and how the
connection is established.  When using QUIC, datagrams <bcp14>MUST</bcp14> be
supported via the [QUIC-DATAGRAM] extension, which is already a
requirement for WebTransport over HTTP/3.</t>
        <t>There is no definition of the protocol over other transports,
such as TCP, and applications using MoQ might need to fallback to
another protocol when QUIC or WebTransport aren't available.</t>
        <section anchor="webtransport">
          <name>WebTransport</name>
          <t>A MOQT server that is accessible via WebTransport can be identified
using an HTTPS URI (<xref section="4.2.2" sectionFormat="comma" target="RFC9110"/>).  A MOQT session can be
established by sending an extended CONNECT request to the host and the
path indicated by the URI, as described in
(<xref section="3" sectionFormat="comma" target="WebTransport"/>).</t>
        </section>
        <section anchor="quic">
          <name>QUIC</name>
          <t>A MOQT server that is accessible via native QUIC can be identified by a
URI with a "moqt" scheme.  The "moqt" URI scheme is defined as follows,
using definitions from <xref target="RFC3986"/>:</t>
          <artwork><![CDATA[
moqt-URI = "moqt" "://" authority path-abempty [ "?" query ]
]]></artwork>
          <t>The <tt>authority</tt> portion <bcp14>MUST NOT</bcp14> contain an empty <tt>host</tt> portion.
The <tt>moqt</tt> URI scheme supports the <tt>/.well-known/</tt> path prefix defined in
<xref target="RFC8615"/>.</t>
          <t>This protocol does not specify any semantics on the <tt>path-abempty</tt> and
<tt>query</tt> portions of the URI.  The contents of those are left up to the
application.</t>
          <t>The client can establish a connection to a MoQ server identified by a
given URI by setting up a QUIC connection to the host and port
identified by the <tt>authority</tt> section of the URI.  The <tt>path-abempty</tt>
and <tt>query</tt> portions of the URI are communicated to the server using the
PATH parameter (<xref target="path"/>) which is sent in the CLIENT_SETUP message at the
start of the session.  The ALPN value <xref target="RFC7301"/> used by the protocol
is <tt>moq-00</tt>.</t>
        </section>
      </section>
      <section anchor="version-negotiation">
        <name>Version and Extension Negotiation</name>
        <t>Endpoints use the exchange of Setup messages to negotiate the MOQT version and
any extensions to use.</t>
        <t>The client indicates the MOQT versions it supports in the CLIENT_SETUP message
(see <xref target="message-setup"/>). It also includes the union of all Setup Parameters
<xref target="setup-params"/> required for a handshake by any of those versions.</t>
        <t>Within any MOQT version, clients request the use of extensions by adding Setup
parameters corresponding to that extension. No extensions are defined in this
document.</t>
        <t>The server replies with a SERVER_SETUP message that indicates the chosen
version, includes all parameters required for a handshake in that version, and
parameters for every extension requested by the client that it supports.</t>
        <t>New versions of MOQT <bcp14>MUST</bcp14> specify which existing extensions can be used with
that version. New extensions <bcp14>MUST</bcp14> specify the existing versions with which they
can be used.</t>
        <t>If a given parameter carries the same information in multiple versions,
but might have different optimal values in those versions, there <bcp14>SHOULD</bcp14> be
separate Setup parameters for that information in each version.</t>
      </section>
      <section anchor="session-init">
        <name>Session initialization</name>
        <t>The first stream opened is a client-initiated bidirectional control stream where
the endpoints exchange Setup messages (<xref target="message-setup"/>).  All messages defined
in this draft except OBJECT and OBJECT_WITH_LENGTH are sent on the control
stream after the Setup message. Control messages <bcp14>MUST NOT</bcp14> be sent on any other
stream, and a peer receiving a control message on a different stream closes the
session as a 'Protocol Violation'. Objects <bcp14>MUST NOT</bcp14> be sent on the control
stream, and a peer receiving an Object on the control stream closes the session
as a 'Protocol Violation'.</t>
        <t>This draft only specifies a single use of bidirectional streams. Objects are
sent on unidirectional streams.  Because there are no other uses of
bidirectional streams, a peer <bcp14>MAY</bcp14> currently close the session as a
'Protocol Violation' if it receives a second bidirectional stream.</t>
        <t>The control stream <bcp14>MUST NOT</bcp14> be closed at the underlying transport layer while the
session is active.  Doing so results in the session being closed as a
'Protocol Violation'.</t>
      </section>
      <section anchor="stream-cancellation">
        <name>Stream Cancellation</name>
        <t>Streams aside from the control stream <bcp14>MAY</bcp14> be canceled due to congestion
or other reasons by either the publisher or subscriber. Early termination of a
stream does not affect the MoQ application state, and therefore has no
effect on outstanding subscriptions.</t>
      </section>
      <section anchor="session-termination">
        <name>Termination</name>
        <t>The Transport Session can be terminated at any point.  When native QUIC
is used, the session is closed using the CONNECTION_CLOSE frame
(<xref section="19.19" sectionFormat="comma" target="QUIC"/>).  When WebTransport is used, the session is
closed using the CLOSE_WEBTRANSPORT_SESSION capsule (<xref section="5" sectionFormat="comma" target="WebTransport"/>).</t>
        <t>The application <bcp14>MAY</bcp14> use any error message and <bcp14>SHOULD</bcp14> use a relevant
code, as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">No Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Protocol Violation</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Duplicate Track Alias</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Parameter Length Mismatch</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Too Many Subscribes</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">GOAWAY Timeout</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Control Message Timeout</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Data Stream Timeout</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>No Error: The session is being terminated without an error.</t>
          </li>
          <li>
            <t>Internal Error: An implementation specific error occurred.</t>
          </li>
          <li>
            <t>Unauthorized: The endpoint breached an agreement, which <bcp14>MAY</bcp14> have been
 pre-negotiated by the application.</t>
          </li>
          <li>
            <t>Protocol Violation: The remote endpoint performed an action that was
disallowed by the specification.</t>
          </li>
          <li>
            <t>Duplicate Track Alias: The endpoint attempted to use a Track Alias
that was already in use.</t>
          </li>
          <li>
            <t>Too Many Subscribes: The session was closed because the subscriber used
a Subscribe ID equal or larger than the current Maximum Subscribe ID.</t>
          </li>
          <li>
            <t>GOAWAY Timeout: The session was closed because the peer took too long to
close the session in response to a GOAWAY (<xref target="message-goaway"/>) message.
See session migration (<xref target="session-migration"/>).</t>
          </li>
          <li>
            <t>Control Message Timeout: The session was closed because the peer took too
long to respond to a control message.</t>
          </li>
          <li>
            <t>Data Stream Timeout: The session was closed because the peer took too
long to send data expected on an open Data Stream <xref target="data-streams"/>.  This
includes fields of a stream header or an object header within a data
stream. If an endpoint times out waiting for a new object header on an
open subgroup stream, it <bcp14>MAY</bcp14> send a STOP_SENDING on that stream, terminate
the subscription, or close the session with an error.</t>
          </li>
        </ul>
      </section>
      <section anchor="session-migration">
        <name>Migration</name>
        <t>MOQT requires a long-lived and stateful session. However, a service
provider needs the ability to shutdown/restart a server without waiting for all
sessions to drain naturally, as that can take days for long-form media.
MOQT enables proactively draining sessions via the GOAWAY message (<xref target="message-goaway"/>).</t>
        <t>The server sends a GOAWAY message, signaling the client to establish a new
session and migrate any active subscriptions. The GOAWAY message optionally
contains a new URI for the new session, otherwise the current URI is
reused. The server <bcp14>SHOULD</bcp14> terminate the session with 'GOAWAY Timeout' after a
sufficient timeout if there are still open subscriptions or fetches on a
connection.</t>
        <t>When the server is a subscriber, it <bcp14>SHOULD</bcp14> send a GOAWAY message to downstream
subscribers prior to any UNSUBSCRIBE messages to upstream publishers.</t>
        <t>After the client receives a GOAWAY, it's <bcp14>RECOMMENDED</bcp14> that the client waits until
there are no more active subscriptions before closing the session with NO_ERROR.
Ideally this is transparent to the application using MOQT, which involves
establishing a new session in the background and migrating active subscriptions
and announcements. The client can choose to delay closing the session if it
expects more OBJECTs to be delivered. The server closes the session with a
'GOAWAY Timeout' if the client doesn't close the session quickly enough.</t>
      </section>
    </section>
    <section anchor="track-discovery">
      <name>Track Discovery and Retrieval</name>
      <t>Discovery of MoQT servers is always done out-of-band. Namespace discovery can be
done in the context of an established MoQT session.</t>
      <t>Given sufficient out of band information, it is valid for a subscriber
to send a SUBSCRIBE or FETCH message to a publisher (including a relay) without
any previous MoQT messages besides SETUP. However, SUBSCRIBE_ANNOUNCES and
ANNOUNCE messages provide an in-band means of discovery of subscribers and
publishers for a namespace.</t>
      <t>The syntax of these messages is described in <xref target="message"/>.</t>
      <section anchor="subscribeannounces">
        <name>SUBSCRIBE_ANNOUNCES</name>
        <t>If the subscriber is aware of a namespace of interest, it can send
SUBSCRIBE_ANNOUNCES to publishers/relays it has established a session with. The
recipient of this message will send any relevant ANNOUNCE or UNANNOUNCE messages
for that namespace, or subset of that namespace.</t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_ANNOUNCES_OK or
SUBSCRIBE_ANNOUNCES_ERROR in response to a SUBSCRIBE_ANNOUNCES. The subscriber
<bcp14>SHOULD</bcp14> close the session with a protocol error if it detects receiving more than
one.</t>
        <t>The receiver of a SUBSCRIBE_ANNOUNCES_OK or SUBSCRIBE_ANNOUNCES_ERROR ought to
forward the result to the application, so that it can make decisions about
further publishers to contact.</t>
        <t>An UNSUBSCRIBE_ANNOUNCES withdraws a previous SUBSCRIBE_ANNOUNCES. It does
not prohibit the receiver (publisher) from sending further ANNOUNCE messages.</t>
      </section>
      <section anchor="announce">
        <name>ANNOUNCE</name>
        <t>A publisher <bcp14>MAY</bcp14> send ANNOUNCE messages to any subscriber. An ANNOUNCE indicates
to the subscriber where to route a SUBSCRIBE or FETCH for that namespace. A
subscriber <bcp14>MAY</bcp14> send SUBSCRIBE or FETCH for a namespace without having received
an ANNOUNCE for it.</t>
        <t>If a publisher is authoritative for a given namespace, or is a relay that has
received an authorized ANNOUNCE for that namespace from an upstream publisher,
it <bcp14>MUST</bcp14> send an ANNOUNCE to any subscriber that has subscribed to ANNOUNCE for
that namespace, or a subset of that namespace. A publisher <bcp14>MAY</bcp14> send the ANNOUNCE
to any other subscriber.</t>
        <t>An endpoint <bcp14>SHOULD NOT</bcp14>, however, send an ANNOUNCE advertising a namespace that
exactly matches a namespace for which the peer sent an earlier ANNOUNCE
(i.e. an ANNOUNCE ought not to be echoed back to its sender).</t>
        <t>The receiver of an ANNOUNCE_OK or ANNOUNCE_ERROR <bcp14>SHOULD</bcp14> report this to the
application to inform the search for additional subscribers for a namespace,
or abandoning the attempt to publish under this namespace. This might be
especially useful in upload or chat applications. A subscriber <bcp14>MUST</bcp14> send exactly
one ANNOUNCE_OK or ANNOUNCE_ERROR in response to an ANNOUNCE. The publisher
<bcp14>SHOULD</bcp14> close the session with a protocol error if it receives more than one.</t>
        <t>An UNANNOUNCE message withdraws a previous ANNOUNCE, although it is not a
protocol error for the subscriber to send a SUBSCRIBE or FETCH message after
receiving an UNANNOUNCE.</t>
        <t>A subscriber can send ANNOUNCE_CANCEL to revoke acceptance of an ANNOUNCE, for
example due to expiration of authorization credentials. The message enables the
publisher to ANNOUNCE again with refreshed authorization, or discard associated
state. After receiving an ANNOUNCE_CANCEL, the publisher does not send UNANNOUNCE.</t>
        <t>While ANNOUNCE does provide hints on where to route a SUBSCRIBE or FETCH, it is
not a full-fledged routing protocol and does not protect against loops and other
phenomena. In particular, ANNOUNCE <bcp14>SHOULD NOT</bcp14> be used to find paths through
richly connected networks of relays.</t>
      </section>
      <section anchor="subscribefetch">
        <name>SUBSCRIBE/FETCH</name>
        <t>The central interaction with a publisher is to send SUBSCRIBE and/or FETCH for
a particular track. The subscriber expects to receive a
SUBSCRIBE_OK/FETCH_OK and objects from the track.</t>
        <t>A subscriber <bcp14>MAY</bcp14> send a SUBSCRIBE or FETCH for a track to any publisher. If it
has accepted an ANNOUNCE with a namespace that exactly matches the namespace for
that track, it <bcp14>SHOULD</bcp14> only request it from the senders of those ANNOUNCE
messages.</t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_OK or SUBSCRIBE_ERROR in response to
a SUBSCRIBE. It <bcp14>MUST</bcp14> send exactly one FETCH_OK or FETCH_ERROR in response to a
FETCH. The subscriber <bcp14>SHOULD</bcp14> close the session with a protocol error if it
receives more than one.</t>
        <t>A subscriber keeps SUBSCRIBE state until it sends UNSUBSCRIBE, or after receipt
of a SUBSCRIBE_DONE or SUBSCRIBE_ERROR. Note that SUBSCRIBE_DONE does not
usually indicate that state can immediately be destroyed, see
<xref target="message-subscribe-done"/>.</t>
        <t>A subscriber keeps FETCH state until it sends FETCH_CANCEL, receives
FETCH_ERROR, or receives a FIN or RESET_STREAM for the FETCH data stream. If the
data stream is already open, it <bcp14>MAY</bcp14> send STOP_SENDING for the data stream along
with FETCH_CANCEL, but <bcp14>MUST</bcp14> send FETCH_CANCEL.</t>
        <t>The Publisher can destroy subscription or fetch state as soon as it has received
UNSUBSCRIBE or FETCH_CANCEL, respectively. It <bcp14>MUST</bcp14> reset any open streams
associated with the SUBSCRIBE or FETCH. It can also destroy state after closing
the FETCH data stream.</t>
        <t>The publisher can immediately delete SUBSCRIBE state after sending
SUBSCRIBE_DONE, but <bcp14>MUST NOT</bcp14> send it until it has closed all related streams. It
can destroy all FETCH state after closing the data stream.</t>
        <t>A SUBSCRIBE_ERROR or FETCH_ERROR indicates no objects will be delivered, and
both endpoints can immediately destroy relevant state. Objects <bcp14>MUST NOT</bcp14> be sent
for requests that end with an error.</t>
      </section>
    </section>
    <section anchor="priorities">
      <name>Priorities</name>
      <t>MoQ priorities allow a subscriber and original publisher to influence
the transmission order of Objects within a session in the presence of
congestion.</t>
      <section anchor="definitions">
        <name>Definitions</name>
        <t>MoQT maintains priorities between different <em>schedulable objects</em>.
A schedulable object in MoQT is either:</t>
        <ol spacing="normal" type="1"><li>
            <t>An object that belongs to a subgroup where that object would be the next
object to be sent in that subgroup.</t>
          </li>
          <li>
            <t>An object that belongs to a track with delivery preference Datagram.</t>
          </li>
        </ol>
        <t>Since a single subgroup or datagram has a single publisher priority, it can be
useful to conceptualize this process as scheduling subgroups or datagrams
instead of individual objects on them.</t>
        <t>A <em>priority number</em> is an unsigned integer with a value between 0 and 255.
A lower priority number indicates higher priority; the highest priority is 0.</t>
        <t><em>Subscriber Priority</em> is a priority number associated with an individual
subscription.  It is specified in the SUBSCRIBE message, and can be updated via
SUBSCRIBE_UPDATE message.  The subscriber priority of an individual schedulable
object is the subscriber priority of the subscription that caused that object
to be sent. When subscriber priority is changed, a best effort <bcp14>SHOULD</bcp14> be made
to apply the change to all objects that have not been sent, but it is
implementation dependent what happens to objects that have already been
received and possibly scheduled.</t>
        <t><em>Publisher Priority</em> is a priority number associated with an individual
schedulable object.  It is specified in the header of the respective subgroup or
datagram, and is the same for all objects in a single subgroup.</t>
        <t><em>Group Order</em> is a property of an invidual subscription.  It can be either
'Ascending' (groups with lower group ID are sent first), or 'Descending'
(groups with higher group ID are sent first).  The publisher communicates its
group order in the SUBSCRIBE_OK message; the subscriber can override it in its
SUBSCRIBE message.  The group order of an existing subscription cannot be
changed.</t>
      </section>
      <section anchor="scheduling-algorithm">
        <name>Scheduling Algorithm</name>
        <t>When an MoQT publisher has multiple schedulable objects it can choose between,
the objects <bcp14>SHOULD</bcp14> be selected as follows:</t>
        <ol spacing="normal" type="1"><li>
            <t>If two objects have a different subscriber priority associated with them,
the one with <strong>the highest subscriber priority</strong> is sent first.</t>
          </li>
          <li>
            <t>If two objects have the same subscriber priority, but a different publisher
priority, the one with <strong>the highest publisher priority</strong> is sent first.</t>
          </li>
          <li>
            <t>If two objects have the same subscriber and publisher priority, but belong
to two different groups of the same track,
<strong>the group order</strong> of the associated subscription is used to
decide the one that is sent first.</t>
          </li>
          <li>
            <t>If two objects belong to the same group of the same track,
the one with <strong>the lowest Subgroup ID</strong> (for tracks
with delivery preference Subgroup), or <strong>the lowest Object ID</strong> (for tracks
with delivery preference Datagram) is sent first.</t>
          </li>
        </ol>
        <t>This algorithm does not provide a well-defined ordering for objects that belong
to different subscriptions, but have the same subscriber and publisher
priority.  The ordering in those cases is implementation-defined, though the
expectation is that all subscriptions will be able to send some data.</t>
        <t>Given the critical nature of control messages and their relatively
small size, the control stream <bcp14>SHOULD</bcp14> be prioritized higher than all
subscribed Objects.</t>
      </section>
      <section anchor="considerations-for-setting-priorities">
        <name>Considerations for Setting Priorities</name>
        <t>Relays <bcp14>SHOULD</bcp14> respect the subscriber and original publisher's priorities.
Relays <bcp14>SHOULD NOT</bcp14> directly use Subscriber Priority or Group Order
from incoming subscriptions for upstream subscriptions. Relays use of
Subscriber Priority for upstream subscriptions can be based on
factors specific to it, such as the popularity of the
content or policy, or relays can specify the same value for all
upstream subscriptions.</t>
        <t>MoQ Sessions can span multiple namespaces, and priorities might not
be coordinated across namespaces.  The subscriber's priority is
considered first, so there is a mechanism for a subscriber to fix
incompatibilities between different namespaces prioritization schemes.
Additionally, it is anticipated that when multiple namespaces
are present within a session, the namespaces could be coordinating,
possibly part of the same application.  In cases when pooling among
namespaces is expected to cause issues, multiple MoQ sessions, either
within a single connection or on multiple connections can be used.</t>
        <t>Implementations that have a default priority <bcp14>SHOULD</bcp14> set it to a value in
the middle of the range (eg: 128) to allow non-default priorities to be
set either higher or lower.</t>
      </section>
    </section>
    <section anchor="relays-moq">
      <name>Relays</name>
      <t>Relays are leveraged to enable distribution scale in the MoQ
architecture. Relays can be used to form an overlay delivery network,
similar in functionality to Content Delivery Networks
(CDNs). Additionally, relays serve as policy enforcement points by
validating subscribe and publish requests at the edge of a network.</t>
      <t>Relays are endpoints, which means they terminate Transport Sessions in order to
have visibility of MoQ Object metadata.</t>
      <t>Relays <bcp14>MAY</bcp14> cache Objects, but are not required to.</t>
      <section anchor="subscriber-interactions">
        <name>Subscriber Interactions</name>
        <t>Subscribers subscribe to tracks by sending a SUBSCRIBE
(<xref target="message-subscribe-req"/>) control message for each track of
interest. Relays <bcp14>MUST</bcp14> ensure subscribers are authorized to access the
content associated with the track. The authorization
information can be part of subscription request itself or part of the
encompassing session. The specifics of how a relay authorizes a user are outside
the scope of this specification.</t>
        <t>The relay will have to send an upstream SUBSCRIBE and/or FETCH if it does not
have all the objects in the FETCH, or is not currently subscribed to the full
requested range. In this case, it <bcp14>SHOULD</bcp14> withhold sending its own SUBSCRIBE_OK
until receiving one from upstream. It <bcp14>MUST</bcp14> withhold FETCH_OK until receiving
one from upstream.</t>
        <t>For successful subscriptions, the publisher maintains a list of
subscribers for each track. Each new OBJECT belonging to the
track within the subscription range is forwarded to each active
subscriber, dependent on the congestion response.</t>
        <t>A caching relay saves Objects to its cache identified by the Object's
Full Track Name, Group ID and Object ID. Relays <bcp14>MUST</bcp14> be able to
process objects for the same Full Track Name from multiple
publishers and forward objects to active matching subscriptions.
If multiple objects are received with the same Full Track Name,
Group ID and Object ID, Relays <bcp14>MAY</bcp14> ignore subsequently received Objects
or <bcp14>MAY</bcp14> use them to update the cache. Implementations that update the
cache need to protect against cache poisoning.</t>
        <t>A relay <bcp14>MUST NOT</bcp14> reorder or drop objects received on a multi-object stream when
forwarding to subscribers, unless it has application specific information.</t>
        <t>Relays <bcp14>MAY</bcp14> aggregate authorized subscriptions for a given track when
multiple subscribers request the same track. Subscription aggregation
allows relays to make only a single upstream subscription for the
track. The published content received from the upstream subscription
request is cached and shared among the pending subscribers.</t>
        <section anchor="graceful-subscriber-relay-switchover">
          <name>Graceful Subscriber Relay Switchover</name>
          <t>This section describes behavior a subscriber <bcp14>MAY</bcp14> implement
to allow for a better user experience when a relay sends a GOAWAY.</t>
          <t>When a subscriber receives the GOAWAY message, it starts the process
of connecting to a new relay and sending the SUBSCRIBE requests for
all active subscriptions to the new relay. The new relay will send a
response to the subscribes and if they are successful, the subscriptions
to the old relay can be stopped with an UNSUBSCRIBE.</t>
        </section>
      </section>
      <section anchor="publisher-interactions">
        <name>Publisher Interactions</name>
        <t>Publishing through the relay starts with publisher sending ANNOUNCE
control message with a <tt>Track Namespace</tt> (<xref target="model-track"/>).
The ANNOUNCE enables the relay to know which publisher to forward a
SUBSCRIBE to.</t>
        <t>Relays <bcp14>MUST</bcp14> verify that publishers are authorized to publish
the content associated with the set of
tracks whose Track Namespace matches the announced namespace. Where the
authorization and identification of the publisher occurs depends on the way the
relay is managed and is application specific.</t>
        <t>A Relay can receive announcements from multiple publishers for the same
Track Namespace and it <bcp14>SHOULD</bcp14> respond with the same response to each of the
publishers, as though it was responding to an ANNOUNCE
from a single publisher for a given track namespace.</t>
        <t>When a publisher wants to stop
new subscriptions for an announced namespace it sends an UNANNOUNCE.
A subscriber indicates it will no longer route subscriptions for a
namespace it previously responded ANNOUNCE_OK to by sending an
ANNOUNCE_CANCEL.</t>
        <t>A relay manages sessions from multiple publishers and subscribers,
connecting them based on the track namespace. This <bcp14>MUST</bcp14> use an exact
match on track namespace unless otherwise negotiated by the application.
For example, a SUBSCRIBE namespace=foobar message will be forwarded to
the session that sent ANNOUNCE namespace=foobar.</t>
        <t>When a relay receives an incoming SUBSCRIBE request that triggers an
upstream subscription, it <bcp14>SHOULD</bcp14> send a SUBSCRIBE request to each
publisher that has announced the subscription's namespace, unless it
already has an active subscription for the Objects requested by the
incoming SUBSCRIBE request from all available publishers.</t>
        <t>When a relay receives an incoming ANNOUNCE for a given namespace, for
each active upstream subscription that matches that namespace, it <bcp14>SHOULD</bcp14> send a
SUBSCRIBE to the publisher that sent the ANNOUNCE.</t>
        <t>OBJECT message headers carry a short hop-by-hop <tt>Track Alias</tt> that maps to
the Full Track Name (see <xref target="message-subscribe-ok"/>). Relays use the
<tt>Track Alias</tt> of an incoming OBJECT message to identify its track and find
the active subscribers for that track. Relays <bcp14>MUST</bcp14> forward OBJECT messages to
matching subscribers in accordance to each subscription's priority, group order,
and delivery timeout.</t>
        <section anchor="graceful-publisher-network-switchover">
          <name>Graceful Publisher Network Switchover</name>
          <t>This section describes behavior that a publisher <bcp14>MAY</bcp14>
choose to implement to allow for a better users experience when
switching between networks, such as WiFi to Cellular or vice versa.</t>
          <t>If the original publisher detects it is likely to need to switch networks,
for example because the WiFi signal is getting weaker, and it does not
have QUIC connection migration available, it establishes a new session
over the new interface and sends an ANNOUCE. The relay will forward
matching subscribes and the publisher publishes objects on both sessions.
Once the subscriptions have migrated over to session on the new network,
the publisher can stop publishing objects on the old network. The relay
will drop duplicate objects received on both subscriptions.
Ideally, the subscriptions downstream from the relay do no observe this
change, and keep receiving the objects on the same subscription.</t>
        </section>
        <section anchor="graceful-publisher-relay-switchover">
          <name>Graceful Publisher Relay Switchover</name>
          <t>This section describes behavior that a publisher <bcp14>MAY</bcp14> choose to implement
to allow for a better user experience when a relay sends them a GOAWAY.</t>
          <t>When a publisher receives a GOAWAY, it starts the process of
connecting to a new relay and sends announces, but it does not immediately
stop publishing objects to the old relay. The new relay will send
subscribes and the publisher can start sending new objects to the new relay
instead of the old relay. Once objects are going to the new relay,
the announcement and subscription to the old relay can be stopped.</t>
        </section>
      </section>
      <section anchor="relay-object-handling">
        <name>Relay Object Handling</name>
        <t>MOQT encodes the delivery information for a stream via OBJECT headers
(<xref target="message-object"/>).  A relay <bcp14>MUST NOT</bcp14> modify Object properties when
forwarding.</t>
        <t>A relay <bcp14>MUST</bcp14> treat the object payload as opaque.  A relay <bcp14>MUST NOT</bcp14>
combine, split, or otherwise modify object payloads.  A relay <bcp14>SHOULD</bcp14>
prioritize sending Objects based on <xref target="priorities"/>.</t>
        <t>A publisher <bcp14>SHOULD</bcp14> begin sending incomplete objects when available to
avoid incurring additional latency.</t>
        <t>A relay that reads from one stream and writes to another in order can
introduce head-of-line blocking.  Packet loss will cause stream data to
be buffered in the library, awaiting in-order delivery, which could
increase latency over additional hops.  To mitigate this, a relay <bcp14>MAY</bcp14>
read and write stream data out of order subject to flow control
limits.  See section 2.2 in <xref target="QUIC"/>.</t>
      </section>
    </section>
    <section anchor="message">
      <name>Control Messages</name>
      <t>MOQT uses a single bidirectional stream to exchange control messages, as
defined in <xref target="session-init"/>.  Every single message on the control stream is
formatted as follows:</t>
      <figure anchor="moq-transport-message-format">
        <name>MOQT Message</name>
        <artwork><![CDATA[
MOQT Control Message {
  Message Type (i),
  Message Length (i),
  Message Payload (..),
}
]]></artwork>
      </figure>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Messages</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x2</td>
            <td align="left">SUBSCRIBE_UPDATE (<xref target="message-subscribe-update-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0x3</td>
            <td align="left">SUBSCRIBE (<xref target="message-subscribe-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">SUBSCRIBE_ERROR (<xref target="message-subscribe-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x6</td>
            <td align="left">ANNOUNCE  (<xref target="message-announce"/>)</td>
          </tr>
          <tr>
            <td align="right">0x7</td>
            <td align="left">ANNOUNCE_OK (<xref target="message-announce-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x8</td>
            <td align="left">ANNOUNCE_ERROR (<xref target="message-announce-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x9</td>
            <td align="left">UNANNOUNCE  (<xref target="message-unannounce"/>)</td>
          </tr>
          <tr>
            <td align="right">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0xC</td>
            <td align="left">ANNOUNCE_CANCEL (<xref target="message-announce-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0xD</td>
            <td align="left">TRACK_STATUS_REQUEST (<xref target="message-track-status-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0xE</td>
            <td align="left">TRACK_STATUS (<xref target="message-track-status"/>)</td>
          </tr>
          <tr>
            <td align="right">0x10</td>
            <td align="left">GOAWAY (<xref target="message-goaway"/>)</td>
          </tr>
          <tr>
            <td align="right">0x11</td>
            <td align="left">SUBSCRIBE_ANNOUNCES (<xref target="message-subscribe-ns"/>)</td>
          </tr>
          <tr>
            <td align="right">0x12</td>
            <td align="left">SUBSCRIBE_ANNOUNCES_OK (<xref target="message-sub-ann-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x13</td>
            <td align="left">SUBSCRIBE_ANNOUNCES_ERROR (<xref target="message-sub-ann-error"/></td>
          </tr>
          <tr>
            <td align="right">0x14</td>
            <td align="left">UNSUBSCRIBE_ANNOUNCES (<xref target="message-unsub-ann"/>)</td>
          </tr>
          <tr>
            <td align="right">0x15</td>
            <td align="left">MAX_SUBSCRIBE_ID (<xref target="message-max-subscribe-id"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1A</td>
            <td align="left">SUBSCRIBES_BLOCKED (<xref target="message-subscribes-blocked"/>)</td>
          </tr>
          <tr>
            <td align="right">0x16</td>
            <td align="left">FETCH (<xref target="message-fetch"/>)</td>
          </tr>
          <tr>
            <td align="right">0x17</td>
            <td align="left">FETCH_CANCEL (<xref target="message-fetch-cancel"/>)</td>
          </tr>
          <tr>
            <td align="right">0x18</td>
            <td align="left">FETCH_OK (<xref target="message-fetch-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x19</td>
            <td align="left">FETCH_ERROR (<xref target="message-fetch-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x40</td>
            <td align="left">CLIENT_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x41</td>
            <td align="left">SERVER_SETUP (<xref target="message-setup"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown message type <bcp14>MUST</bcp14> close the session.
Control messages have a length to make parsing easier, but no control
messages are intended to be ignored. If the length does not match the
length of the message content, the receiver <bcp14>MUST</bcp14> close the session.</t>
      <section anchor="params">
        <name>Parameters</name>
        <t>Some messages include a Parameters field that encode optional message
elements. They contain a type, length, and value.</t>
        <t>Senders <bcp14>MUST NOT</bcp14> repeat the same parameter type in a message. Receivers
<bcp14>SHOULD</bcp14> check that there are no duplicate parameters and close the session
as a 'Protocol Violation' if found.</t>
        <t>Receivers ignore unrecognized parameters.</t>
        <t>The format of Parameters is as follows:</t>
        <figure anchor="moq-param">
          <name>MOQT Parameter</name>
          <artwork><![CDATA[
Parameter {
  Parameter Type (i),
  Parameter Length (i),
  Parameter Value (..),
}
]]></artwork>
        </figure>
        <t>Parameter Type is an integer that indicates the semantic meaning of the
parameter. Setup message parameters use a namespace that is constant across all
MoQ Transport versions. All other messages use a version-specific namespace. For
example, the integer '1' can refer to different parameters for Setup messages
and for all other message types.</t>
        <t>SETUP message parameter types are defined in <xref target="setup-params"/>. Version-
specific parameter types are defined in <xref target="version-specific-params"/>.</t>
        <t>The Parameter Length field of the String Parameter encodes the length
of the Parameter Value field in bytes.</t>
        <t>Each parameter description will indicate the data type in the Parameter Value
field. If a receiver understands a parameter type, and the parameter length
implied by that type does not match the Parameter Length field, the receiver
<bcp14>MUST</bcp14> terminate the session with error code 'Parameter Length Mismatch'.</t>
        <section anchor="version-specific-params">
          <name>Version Specific Parameters</name>
          <t>Each version-specific parameter definition indicates the message types in which
it can appear. If it appears in some other type of message, it <bcp14>MUST</bcp14> be ignored.
Note that since Setup parameters use a separate namespace, it is impossible for
these parameters to appear in Setup messages.</t>
          <section anchor="authorization-info">
            <name>AUTHORIZATION INFO</name>
            <t>AUTHORIZATION INFO parameter (Parameter Type 0x02) identifies a track's
authorization information in a SUBSCRIBE, SUBSCRIBE_ANNOUNCES, ANNOUNCE
or FETCH message. This parameter is populated for cases where the authorization
is required at the track level. The value is an ASCII string.</t>
          </section>
          <section anchor="delivery-timeout">
            <name>DELIVERY TIMEOUT Parameter</name>
            <t>The DELIVERY TIMEOUT parameter (Parameter Type 0x03) <bcp14>MAY</bcp14> appear in a
SUBSCRIBE, SUBSCRIBE_OK, or a SUBSCRIBE_UDPATE message.  It is the duration in
milliseconds the relay <bcp14>SHOULD</bcp14> continue to attempt forwarding Objects after
they have been received.  The start time for the timeout is based on when the
beginning of the Object is received, and does not depend upon the forwarding
preference. There is no explicit signal that an Object was not sent because
the delivery timeout was exceeded.</t>
            <t>If both the subscriber and publisher specify the parameter, they use the min of the
two values for the subscription.  The publisher <bcp14>SHOULD</bcp14> always specify the value
received from an upstream subscription when there is one, and nothing otherwise.
If an earlier Object arrives later than subsequent Objects, relays can consider
the receipt time as that of the next later Object, with the assumption that the
Object's data was reordered.</t>
            <t>If neither the subscriber or publisher specify DELIVERY TIMEOUT, all Objects
in the track matching the subscription filter are delivered as indicated by
their Group Order and Priority.  If a subscriber exceeds the publisher's
resource limits by failing to consume objects at a sufficient rate, the
publisher <bcp14>MAY</bcp14> terminate the subscription with error 'Too Far Behind'.</t>
            <t>If an object in a subgroup exceeds the delivery timeout, the publisher <bcp14>MUST</bcp14>
reset the underlying transport stream (see <xref target="closing-subgroup-streams"/>).</t>
            <t>When sent by a subscriber, this parameter is intended to be specific to a
subscription, so it <bcp14>SHOULD NOT</bcp14> be forwarded upstream by a relay that intends
to serve multiple subscriptions for the same track.</t>
            <t>Publishers <bcp14>SHOULD</bcp14> consider whether the entire Object is likely to be delivered
before sending any data for that Object, taking into account priorities,
congestion control, and any other relevant information.</t>
          </section>
          <section anchor="max-cache-duration">
            <name>MAX CACHE DURATION Parameter</name>
            <t>MAX_CACHE_DURATION (Parameter Type 0x04): An integer expressing a number of
milliseconds. If present, the relay <bcp14>MUST NOT</bcp14> start forwarding any individual
Object received through this subscription after the specified number of
milliseconds has elapsed since the beginning of the Object was received.  This
means Objects earlier in a multi-object stream will expire earlier than Objects
later in the stream. Once Objects have expired, their state becomes unknown, and
a relay that handles a subscription that includes those Objects re-requests them.</t>
          </section>
        </section>
      </section>
      <section anchor="message-setup">
        <name>CLIENT_SETUP and SERVER_SETUP</name>
        <t>The <tt>CLIENT_SETUP</tt> and <tt>SERVER_SETUP</tt> messages are the first messages exchanged
by the client and the server; they allow the endpoints to establish the mutually
supported version and agree on the initial configuration before any objects are
exchanged. It is a sequence of key-value pairs called Setup parameters; the
semantics and format of which can vary based on whether the client or server is
sending.  To ensure future extensibility of MOQT, endpoints <bcp14>MUST</bcp14> ignore unknown
setup parameters. TODO: describe GREASE for those.</t>
        <t>The wire format of the Setup messages are as follows:</t>
        <figure anchor="moq-transport-setup-format">
          <name>MOQT Setup Messages</name>
          <artwork><![CDATA[
CLIENT_SETUP Message {
  Type (i) = 0x40,
  Length (i),
  Number of Supported Versions (i),
  Supported Version (i) ...,
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}

SERVER_SETUP Message {
  Type (i) = 0x41,
  Length (i),
  Selected Version (i),
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}
]]></artwork>
        </figure>
        <t>The available versions and Setup parameters are detailed in the next sections.</t>
        <section anchor="setup-versions">
          <name>Versions</name>
          <t>MoQ Transport versions are a 32-bit unsigned integer, encoded as a varint.
This version of the specification is identified by the number 0x00000001.
Versions with the most significant 16 bits of the version number cleared are
reserved for use in future IETF consensus documents.</t>
          <t>The client offers the list of the protocol versions it supports; the
server <bcp14>MUST</bcp14> reply with one of the versions offered by the client. If the
server does not support any of the versions offered by the client, or
the client receives a server version that it did not offer, the
corresponding peer <bcp14>MUST</bcp14> close the session.</t>
          <t>[[RFC editor: please remove the remainder of this section before
publication.]]</t>
          <t>The version number for the final version of this specification (0x00000001), is
reserved for the version of the protocol that is published as an RFC.
Version numbers used to identify IETF drafts are created by adding the draft
number to 0xff000000. For example, draft-ietf-moq-transport-13 would be
identified as 0xff00000D.</t>
        </section>
        <section anchor="setup-params">
          <name>Setup Parameters</name>
          <section anchor="path">
            <name>PATH</name>
            <t>The PATH parameter (Parameter Type 0x01) allows the client to specify the path
of the MoQ URI when using native QUIC (<xref target="QUIC"/>).  It <bcp14>MUST NOT</bcp14> be used by
the server, or when WebTransport is used.  If the peer receives a PATH
parameter from the server, or when WebTransport is used, it <bcp14>MUST</bcp14> close
the connection. It follows the URI formatting rules <xref target="RFC3986"/>.</t>
            <t>When connecting to a server using a URI with the "moqt" scheme, the
client <bcp14>MUST</bcp14> set the PATH parameter to the <tt>path-abempty</tt> portion of the
URI; if <tt>query</tt> is present, the client <bcp14>MUST</bcp14> concatenate <tt>?</tt>, followed by
the <tt>query</tt> portion of the URI to the parameter.</t>
          </section>
          <section anchor="max-subscribe-id">
            <name>MAX_SUBSCRIBE_ID</name>
            <t>The MAX_SUBSCRIBE_ID parameter (Parameter Type 0x02) communicates an initial
value for the Maximum Subscribe ID to the receiving subscriber. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> create subscriptions.</t>
          </section>
        </section>
      </section>
      <section anchor="message-goaway">
        <name>GOAWAY</name>
        <t>An endpoint sends a <tt>GOAWAY</tt> message to inform the peer it intends to close
the session soon.  Servers can use GOAWAY to initiate session migration
(<xref target="session-migration"/>) with an optional URI.</t>
        <t>The GOAWAY message does not impact subscription state. A subscriber
<bcp14>SHOULD</bcp14> individually UNSUBSCRIBE for each existing subscription, while a
publisher <bcp14>MAY</bcp14> reject new requests while in the draining state.</t>
        <t>Upon receiving a GOAWAY, an endpoint <bcp14>SHOULD NOT</bcp14> initiate new requests to
the peer including SUBSCRIBE, FETCH, ANNOUNCE and SUBSCRIBE_ANNOUNCE.</t>
        <t>The endpoint <bcp14>MUST</bcp14> terminate the session with a Protocol Violation
(<xref target="session-termination"/>) if it receives multiple GOAWAY messages.</t>
        <figure anchor="moq-transport-goaway-format">
          <name>MOQT GOAWAY Message</name>
          <artwork><![CDATA[
GOAWAY Message {
  Type (i) = 0x10,
  Length (i),
  New Session URI Length (i),
  New Session URI (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>New Session URI: When received by a client, indicates where the client can
connect to continue this session.  The client <bcp14>MUST</bcp14> use this URI for the new
session if provided. If the URI is zero bytes long, the client can reuse the
current URI is reused instead. The new session URI <bcp14>SHOULD</bcp14> use the same scheme
as the current URL to ensure compatibility.  </t>
            <t>
If a server receives a GOAWAY with a non-zero New Session URI Length it <bcp14>MUST</bcp14>
terminate the session with a Protocol Violation.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-req">
        <name>SUBSCRIBE</name>
        <t>A subscription causes the publisher to send newly published objects for a track.
A subscriber <bcp14>MUST NOT</bcp14> make multiple active subscriptions for a track within a
single session and publishers <bcp14>SHOULD</bcp14> treat this as a protocol violation.</t>
        <t><strong>Filter Types</strong></t>
        <t>The subscriber specifies a filter on the subscription to allow
the publisher to identify which objects need to be delivered.</t>
        <t>There are 3 types of filters:</t>
        <t>Latest Object (0x2): Specifies an open-ended subscription beginning from
the current object of the current group.  If no content has been delivered yet,
the subscription starts with the first published or received group.</t>
        <t>AbsoluteStart (0x3):  Specifies an open-ended subscription beginning
from the object identified in the StartGroup and StartObject fields. If the
StartGroup is prior to the current group, the subscription starts at the
beginning of the current object like the 'Latest Object' filter.</t>
        <t>AbsoluteRange (0x4):  Specifies a closed subscription starting at StartObject
in StartGroup and ending at the largest object in EndGroup.  The start and
end of the range are inclusive.  EndGroup <bcp14>MUST</bcp14> specify the same or a later
group than StartGroup. If the StartGroup is prior to the current group, the
subscription starts at the beginning of the current object like the 'Latest
Object' filter.</t>
        <t>A filter type other than the above <bcp14>MUST</bcp14> be treated as error.</t>
        <t>If a subscriber wants to subscribe to Objects both before and after
the Latest Object, it can send a SUBSCRIBE for the Latest Object
followed by a FETCH. Depending upon the application, one might want to send
both messages at the same time or wait for the first to return before sending
the second.</t>
        <t>The format of SUBSCRIBE is as follows:</t>
        <figure anchor="moq-transport-subscribe-format">
          <name>MOQT SUBSCRIBE Message</name>
          <artwork><![CDATA[
SUBSCRIBE Message {
  Type (i) = 0x3,
  Length (i),
  Subscribe ID (i),
  Track Alias (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
  Subscriber Priority (8),
  Group Order (8),
  Filter Type (i),
  [StartGroup (i),
   StartObject (i)],
  [EndGroup (i)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The subscriber specified identifier used to manage a
subscription. <tt>Subscribe ID</tt> is a variable length integer that <bcp14>MUST</bcp14> be
unique and monotonically increasing within a session and <bcp14>MUST</bcp14> be less
than the session's Maximum Subscribe ID.</t>
          </li>
          <li>
            <t>Track Alias: A session specific identifier for the track.
Messages that reference a track, such as OBJECT (<xref target="message-object"/>),
reference this Track Alias instead of the Track Name and Track Namespace to
reduce overhead. If the Track Alias is already being used for a different
track, the publisher <bcp14>MUST</bcp14> close the session with a Duplicate Track Alias
error (<xref target="session-termination"/>).</t>
          </li>
          <li>
            <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Group Order: Allows the subscriber to request Objects be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
A value of 0x0 indicates the original publisher's Group Order <bcp14>SHOULD</bcp14> be
used. Values larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>Filter Type: Identifies the type of filter, which also indicates whether
the StartGroup/StartObject and EndGroup/EndObject fields will be present.</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID. Only present for "AbsoluteStart" and
"AbsoluteRange" filter types.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID. Only present for "AbsoluteStart" and
"AbsoluteRange" filter types.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID, inclusive. Only present for the "AbsoluteRange"
filter type.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>On successful subscription, the publisher <bcp14>MUST</bcp14> reply with a SUBSCRIBE_OK,
allowing the subscriber to determine the start group/object when not explicitly
specified and the publisher <bcp14>SHOULD</bcp14> start delivering objects.</t>
        <t>If a publisher cannot satisfy the requested start or end or if the end has
already been published it <bcp14>SHOULD</bcp14> send a SUBSCRIBE_ERROR with code 'Invalid Range'.
A publisher <bcp14>MUST NOT</bcp14> send objects from outside the requested start and end.</t>
      </section>
      <section anchor="message-subscribe-update-req">
        <name>SUBSCRIBE_UPDATE</name>
        <t>A subscriber issues a SUBSCRIBE_UPDATE to a publisher to request a change to
an existing subscription. Subscriptions can only become more narrow, not wider,
because an attempt to widen a subscription could fail. If Objects before the
start or after the end of the current subscription are needed, a fetch might
be able to retrieve objects before the start. The start Object <bcp14>MUST NOT</bcp14>
decrease and when it increases, there is no guarantee that a publisher will
not have already sent Objects before the new start Object.  The end Group
<bcp14>MUST NOT</bcp14> increase and when it decreases, there is no guarantee that a publisher
will not have already sent Objects after the new end Object. A publisher <bcp14>SHOULD</bcp14>
close the Session as a 'Protocol Violation' if the SUBSCRIBE_UPDATE violates
either rule or if the subscriber specifies a Subscribe ID that has not existed
within the Session.</t>
        <t>There is no control message in response to a SUBSCRIBE_UPDATE, because it is
expected that it will always succeed and the worst outcome is that it is not
processed promptly and some extra objects from the existing subscription are
delivered.</t>
        <t>Unlike a new subscription, SUBSCRIBE_UPDATE can not cause an Object to be
delivered multiple times.  Like SUBSCRIBE, EndGroup <bcp14>MUST</bcp14> specify the
same or a later object than StartGroup and StartObject.</t>
        <t>The format of SUBSCRIBE_UPDATE is as follows:</t>
        <figure anchor="moq-transport-subscribe-update-format">
          <name>MOQT SUBSCRIBE_UPDATE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Type (i) = 0x2,
  Length (i),
  Subscribe ID (i),
  StartGroup (i),
  StartObject (i),
  EndGroup (i),
  Subscriber Priority (8),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The subscription identifier that is unique within the session.
This <bcp14>MUST</bcp14> match an existing Subscribe ID.</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID, plus 1. A value of 0 means the subscription is
open-ended.</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a subscription relative to
other subscriptions in the same session. Lower numbers get higher priority.
See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-unsubscribe">
        <name>UNSUBSCRIBE</name>
        <t>A subscriber issues a <tt>UNSUBSCRIBE</tt> message to a publisher indicating it is no
longer interested in receiving media for the specified track and requesting that
the publisher stop sending Objects as soon as possible.</t>
        <t>The format of <tt>UNSUBSCRIBE</tt> is as follows:</t>
        <figure anchor="moq-transport-unsubscribe-format">
          <name>MOQT UNSUBSCRIBE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE Message {
  Type (i) = 0xA,
  Length (i),
  Subscribe ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-fetch">
        <name>FETCH</name>
        <t>A subscriber issues a FETCH to a publisher to request a range of already published
objects within a track. The publisher responding to a FETCH is responsible for retrieving
all available Objects. If there are gaps between Objects, the publisher omits them from the
fetch response. All omitted objects have status Object Does Not Exist.</t>
        <t><strong>Fetch Types</strong></t>
        <t>There are two types of Fetch messages:</t>
        <t>Standalone Fetch (0x1) : A Fetch of Objects performed independently of any Subscribe.</t>
        <t>Joining Fetch (0x2) : A Fetch joined together with a Subscribe by specifying
the Subscribe ID of an active subscription. A publisher receiving a
Joining Fetch uses properties of the associated Subscribe to determine the
Track Namespace, Track, StartGroup, StartObject, EndGroup, and EndObject such that
it is contiguous with the associated Subscribe. The Joining Fetch begins the
Preceding Group Offset prior to the associated subscription.</t>
        <t>A Subscriber can use a Joining Fetch to, for example, fill a playback buffer with a
certain number of groups prior to the live edge of a track.</t>
        <t>A Joining Fetch is only permitted when the associated Subscribe has the Filter
Type Latest Object.</t>
        <t>A Fetch Type other than 0x1 or 0x2 <bcp14>MUST</bcp14> be treated as an error.</t>
        <t>A publisher responds to a FETCH request with either a FETCH_OK or a FETCH_ERROR
message.  If it responds with FETCH_OK, the publisher creates a new unidirectional
stream that is used to send the Objects.  A relay <bcp14>MAY</bcp14> start sending objects immediately
in response to a FETCH, even if sending the FETCH_OK takes longer because it requires
going upstream to populate the latest object.</t>
        <t>The Object Forwarding Preference does not apply to fetches.</t>
        <t>Fetch specifies an inclusive range of Objects starting at StartObject
in StartGroup and ending at EndObject in EndGroup. EndGroup and EndObject <bcp14>MUST</bcp14>
specify the same or a later object than StartGroup and StartObject.</t>
        <t>The format of FETCH is as follows:</t>
        <figure anchor="moq-transport-fetch-format">
          <name>MOQT FETCH Message</name>
          <artwork><![CDATA[
FETCH Message {
  Type (i) = 0x16,
  Length (i),
  Subscribe ID (i),
  Subscriber Priority (8),
  Group Order (8),
  Fetch Type (i),
  [Track Namespace (tuple),
   Track Name Length (i),
   Track Name (..),
   StartGroup (i),
   StartObject (i),
   EndGroup (i),
   EndObject (i),]
  [Joining Subscribe ID (i),
   Preceding Group Offset (i),]
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <t>Fields common to all Fetch Types:</t>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The Subscribe ID identifies a given fetch request. Subscribe ID
is a variable length integer that <bcp14>MUST</bcp14> be unique and monotonically increasing
within a session.</t>
          </li>
          <li>
            <t>Subscriber Priority: Specifies the priority of a fetch request relative to
other subscriptions or fetches in the same session. Lower numbers get higher
priority. See <xref target="priorities"/>.</t>
          </li>
          <li>
            <t>Group Order: Allows the subscriber to request Objects be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
A value of 0x0 indicates the original publisher's Group Order <bcp14>SHOULD</bcp14> be
used. Values larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>Fetch Type: Identifies the type of Fetch, whether joining or standalone.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>Fields present only for Standalone Fetch (0x1):</t>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>StartGroup: The start Group ID.</t>
          </li>
          <li>
            <t>StartObject: The start Object ID.</t>
          </li>
          <li>
            <t>EndGroup: The end Group ID.</t>
          </li>
          <li>
            <t>EndObject: The end Object ID, plus 1. A value of 0 means the entire group is
requested.</t>
          </li>
        </ul>
        <t>Fields present only for Joining Fetch (0x2):</t>
        <ul spacing="normal">
          <li>
            <t>Joining Subscribe ID: The Subscribe ID of the existing subscription to be
joined. If a publisher receives a Joining Fetch with a Subscribe ID that does
not correspond to an existing Subscribe, it <bcp14>MUST</bcp14> respond with a Fetch Error.</t>
          </li>
          <li>
            <t>Preceding Group Offset: The group offset for the Fetch prior and relative
to the Current Group of the corresponding Subscribe. A value of 0 indicates
the Fetch starts at the beginning of the Current Group.</t>
          </li>
        </ul>
        <t>Objects that are not yet published will not be retrieved by a FETCH.
The latest available Object is indicated in the FETCH_OK, and is the last
Object a fetch will return if the EndGroup and EndObject have not yet been
published.</t>
        <t>A publisher <bcp14>MUST</bcp14> send fetched groups in the determined group order, either
ascending or descending. Within each group, objects are sent in Object ID order;
subgroup ID is not used for ordering.</t>
        <t>If StartGroup/StartObject is greater than the latest published Object group,
the publisher <bcp14>MUST</bcp14> return FETCH_ERROR with error code 'No Objects'.</t>
        <section anchor="calculating-the-range-of-a-joining-fetch">
          <name>Calculating the Range of a Joining Fetch</name>
          <t>A publisher that receives a Fetch of type Type 0x2 treats it
as a Fetch with a range dynamically determined by the Preceding Group Offset
and field values derived from the corresponding subscription.</t>
          <t>The Largest Group ID and Largest Object ID values from the corresponding
subscription are used to calculate the end of a Joining Fetch so the Objects
retrieved by the FETCH and SUBSCRIBE are contiguous and non-overlapping.
If no Objects have been published for the track, and the SUBSCRIBE_OK has a
ContentExists value of 0, the publisher responds with a FETCH_ERROR with
error code 'No Objects'.</t>
          <t>The publisher receiving a Joining Fetch computes the range as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Fetch StartGroup: Subscribe Largest Group - Preceding Group Offset</t>
            </li>
            <li>
              <t>Fetch StartObject: 0</t>
            </li>
            <li>
              <t>Fetch EndGroup: Subscribe Largest Group</t>
            </li>
            <li>
              <t>Fetch EndObject: Subscribe Largest Object</t>
            </li>
          </ul>
          <t>A Fetch EndObject of 0 requests the entire group, but Fetch will not
retrieve Objects that have not yet been published, so 1 is subtracted from
the Fetch EndGroup if Fetch EndObject is 0.</t>
        </section>
      </section>
      <section anchor="message-fetch-cancel">
        <name>FETCH_CANCEL</name>
        <t>A subscriber issues a <tt>FETCH_CANCEL</tt> message to a publisher indicating it is no
longer interested in receiving Objects for the fetch specified by 'Subscribe ID'.
The publisher <bcp14>SHOULD</bcp14> close the unidirectional stream as soon as possible.</t>
        <t>The format of <tt>FETCH_CANCEL</tt> is as follows:</t>
        <figure anchor="moq-transport-fetch-cancel">
          <name>MOQT FETCH_CANCEL Message</name>
          <artwork><![CDATA[
FETCH_CANCEL Message {
  Type (i) = 0x17,
  Length (i),
  Subscribe ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-fetch"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-ok">
        <name>ANNOUNCE_OK</name>
        <t>The subscriber sends an ANNOUNCE_OK control message to acknowledge the
successful authorization and acceptance of an ANNOUNCE message.</t>
        <figure anchor="moq-transport-announce-ok">
          <name>MOQT ANNOUNCE_OK Message</name>
          <artwork><![CDATA[
ANNOUNCE_OK Message
{
  Type (i) = 0x7,
  Length (i),
  Track Namespace (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-error">
        <name>ANNOUNCE_ERROR</name>
        <t>The subscriber sends an ANNOUNCE_ERROR control message for tracks that
failed authorization.</t>
        <figure anchor="moq-transport-announce-error">
          <name>MOQT ANNOUNCE_ERROR Message</name>
          <artwork><![CDATA[
ANNOUNCE_ERROR Message
{
  Type (i) = 0x8,
  Length (i),
  Track Namespace (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for announcement failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for announcement error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in ANNOUNCE_ERROR, as defined
below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Uninterested</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-announce-cancel">
        <name>ANNOUNCE_CANCEL</name>
        <t>The subscriber sends an <tt>ANNOUNCE_CANCEL</tt> control message to
indicate it will stop sending new subscriptions for tracks
within the provided Track Namespace.</t>
        <figure anchor="moq-transport-announce-cancel-format">
          <name>MOQT ANNOUNCE_CANCEL Message</name>
          <artwork><![CDATA[
ANNOUNCE_CANCEL Message {
  Type (i) = 0xC,
  Length (i),
  Track Namespace (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase Length (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for canceling the announcement.
ANNOUNCE_CANCEL uses the same error codes as ANNOUNCE_ERROR
(<xref target="message-announce-error"/>).</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for announcement cancelation.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-track-status-req">
        <name>TRACK_STATUS_REQUEST</name>
        <t>A potential subscriber sends a 'TRACK_STATUS_REQUEST' message on the control
stream to obtain information about the current status of a given track.</t>
        <t>A TRACK_STATUS message <bcp14>MUST</bcp14> be sent in response to each TRACK_STATUS_REQUEST.</t>
        <figure anchor="moq-track-status-request-format">
          <name>MOQT TRACK_STATUS_REQUEST Message</name>
          <artwork><![CDATA[
TRACK_STATUS_REQUEST Message {
  Type (i) = 0xD,
  Length (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
}
]]></artwork>
        </figure>
      </section>
      <section anchor="message-subscribe-ns">
        <name>SUBSCRIBE_ANNOUNCES</name>
        <t>The subscriber sends the SUBSCRIBE_ANNOUNCES control message to a publisher
to request the current set of matching announcements, as well as future updates
to the set.</t>
        <figure anchor="moq-transport-subscribe-ns-format">
          <name>MOQT SUBSCRIBE_ANNOUNCES Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES Message {
  Type (i) = 0x11,
  Length (i),
  Track Namespace Prefix (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: An ordered N-Tuple of byte fields which are matched
against track namespaces known to the publisher.  For example, if the publisher
is a relay that has received ANNOUNCE messages for namespaces ("example.com",
"meeting=123", "participant=100") and ("example.com", "meeting=123",
"participant=200"), a SUBSCRIBE_ANNOUNCES for ("example.com", "meeting=123")
would match both.  If an endpoint receives a Track Namespace Prefix tuple with
an N of 0 or more than 32, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
        <t>The publisher will respond with SUBSCRIBE_ANNOUNCES_OK or
SUBSCRIBE_ANNOUNCES_ERROR.  If the SUBSCRIBE_ANNOUNCES is successful,
the publisher will forward any matching ANNOUNCE messages to the subscriber
that it has not yet sent.  If the set of matching ANNOUNCE messages changes, the
publisher sends the corresponding ANNOUNCE or UNANNOUNCE message.</t>
        <t>A subscriber cannot make overlapping namespace subscriptions on a single
session.  Within a session, if a publisher receives a SUBSCRIBE_ANNOUNCES
with a Track Namespace Prefix that is a prefix of an earlier
SUBSCRIBE_ANNOUNCES or vice versa, it <bcp14>MUST</bcp14> respond with
SUBSCRIBE_ANNOUNCES_ERROR, with error code SUBSCRIBE_ANNOUNCES_OVERLAP.</t>
        <t>The publisher <bcp14>MUST</bcp14> ensure the subscriber is authorized to perform this
namespace subscription.</t>
        <t>SUBSCRIBE_ANNOUNCES is not required for a publisher to send ANNOUNCE and
UNANNOUNCE messages to a subscriber.  It is useful in applications or relays
where subscribers are only interested in or authorized to access a subset of
available announcements.</t>
      </section>
      <section anchor="message-unsub-ann">
        <name>UNSUBSCRIBE_ANNOUNCES</name>
        <t>A subscriber issues a <tt>UNSUBSCRIBE_ANNOUNCES</tt> message to a publisher
indicating it is no longer interested in ANNOUNCE and UNANNOUNCE messages for
the specified track namespace prefix.</t>
        <t>The format of <tt>UNSUBSCRIBE_ANNOUNCES</tt> is as follows:</t>
        <figure anchor="moq-transport-unsub-ann-format">
          <name>MOQT UNSUBSCRIBE Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE_ANNOUNCES Message {
  Type (i) = 0x14,
  Length (i),
  Track Namespace Prefix (tuple)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-ok">
        <name>SUBSCRIBE_OK</name>
        <t>A publisher sends a SUBSCRIBE_OK control message for successful
subscriptions.</t>
        <figure anchor="moq-transport-subscribe-ok">
          <name>MOQT SUBSCRIBE_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_OK
{
  Type (i) = 0x4,
  Length (i),
  Subscribe ID (i),
  Expires (i),
  Group Order (8),
  ContentExists (8),
  [Largest Group ID (i)],
  [Largest Object ID (i)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Expires: Time in milliseconds after which the subscription is no
longer valid. A value of 0 indicates that the subscription does not expire
or expires at an unknown time.  Expires is advisory and a subscription can
end prior to the expiry time or last longer.</t>
          </li>
          <li>
            <t>Group Order: Indicates the subscription will be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
Values of 0x0 and those larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>ContentExists: 1 if an object has been published on this track, 0 if not.
If 0, then the Largest Group ID and Largest Object ID fields will not be
present. Any other value is a protocol error and <bcp14>MUST</bcp14> terminate the
session with a Protocol Violation (<xref target="session-termination"/>).</t>
          </li>
          <li>
            <t>Largest Group ID: The largest Group ID available for this track. This field
is only present if ContentExists has a value of 1.</t>
          </li>
          <li>
            <t>Largest Object ID: The largest Object ID available within the largest Group ID
for this track. This field is only present if ContentExists has a value of 1.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-error">
        <name>SUBSCRIBE_ERROR</name>
        <t>A publisher sends a SUBSCRIBE_ERROR control message in response to a
failed SUBSCRIBE.</t>
        <figure anchor="moq-transport-subscribe-error">
          <name>MOQT SUBSCRIBE_ERROR Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ERROR
{
  Type (i) = 0x5,
  Length (i),
  Subscribe ID (i),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
  Track Alias (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for subscription failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
          <li>
            <t>Track Alias: When Error Code is 'Retry Track Alias', the subscriber <bcp14>SHOULD</bcp14> re-issue the
SUBSCRIBE with this Track Alias instead. If this Track Alias is already in use,
the subscriber <bcp14>MUST</bcp14> close the connection with a Duplicate Track Alias error
(<xref target="session-termination"/>).</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in SUBSCRIBE_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Track Does Not Exist</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Invalid Range</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Retry Track Alias</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-fetch-ok">
        <name>FETCH_OK</name>
        <t>A publisher sends a FETCH_OK control message in response to successful fetches.
A publisher <bcp14>MAY</bcp14> send Objects in response to a FETCH before the FETCH_OK message is sent,
but the FETCH_OK <bcp14>MUST NOT</bcp14> be sent until the latest group and object are known.</t>
        <figure anchor="moq-transport-fetch-ok">
          <name>MOQT FETCH_OK Message</name>
          <artwork><![CDATA[
FETCH_OK
{
  Type (i) = 0x18,
  Length (i),
  Subscribe ID (i),
  Group Order (8),
  End Of Track (8),
  Largest Group ID (i),
  Largest Object ID (i),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Fetch Identifier as defined in <xref target="message-fetch"/>.</t>
          </li>
          <li>
            <t>Group Order: Indicates the fetch will be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
Values of 0x0 and those larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>End Of Track: 1 if all objects have been published on this track, so
the Largest Group ID and Object Id indicate the last Object in the track,
0 if not.</t>
          </li>
          <li>
            <t>Largest Group ID: The largest Group ID available for this track.</t>
          </li>
          <li>
            <t>Largest Object ID: The largest Object ID available within the largest Group ID
for this track.</t>
          </li>
          <li>
            <t>Subscribe Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-fetch-error">
        <name>FETCH_ERROR</name>
        <t>A publisher sends a FETCH_ERROR control message in response to a
failed FETCH.</t>
        <figure anchor="moq-transport-fetch-error">
          <name>MOQT FETCH_ERROR Message</name>
          <artwork><![CDATA[
FETCH_ERROR
{
  Type (i) = 0x19,
  Length (i),
  Subscribe ID (i),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for fetch failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for fetch error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in FETCH_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Track Does Not Exist</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Invalid Range</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-subscribe-done">
        <name>SUBSCRIBE_DONE</name>
        <t>A publisher sends a <tt>SUBSCRIBE_DONE</tt> message to indicate it is done publishing
Objects for that subscription.  The Status Code indicates why the subscription
ended, and whether it was an error. Because SUBSCRIBE_DONE is sent on the
control stream, it is likely to arrive at the receiver before late-arriving
objects, and often even late-opening streams. However, the receiver uses it
as an indication that it should receive any late-opening streams in a relatively
short time.</t>
        <t>Note that some objects in the subscribed track might never be delivered,
because a stream was reset, or never opened in the first place, due to the
delivery timeout.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> send SUBSCRIBE_DONE until it has closed all streams it will
ever open, and has no further datagrams to send, for a subscription. After
sending SUBSCRIBE_DONE, the sender can immediately destroy subscription state,
although stream state can persist until delivery completes. The sender might
persist subscription state to enforce the delivery timeout by resetting streams
on which it has already sent FIN, only deleting it when all such streams have
received ACK of the FIN.</t>
        <t>A sender <bcp14>MUST NOT</bcp14> destroy subscription state until it sends SUBSCRIBE_DONE,
though it can choose to stop sending objects (and thus send SUBSCRIBE_DONE) for
any reason.</t>
        <t>A subscriber that receives SUBSCRIBE_DONE <bcp14>SHOULD</bcp14> set a timer of at least its
delivery timeout in case some objects are still inbound due to prioritization
or packet loss. The subscriber <bcp14>MAY</bcp14> dispense with a timer if it sent UNSUBSCRIBE
or is otherwise no longer interested in objects from the track. Once the timer
has expired, the receiver destroys subscription state once all open streams for
the subscription have closed. A subscriber <bcp14>MAY</bcp14> discard subscription state
earlier, at the cost of potentially not delivering some late objects to the
application. The subscriber <bcp14>SHOULD</bcp14> send STOP_SENDING on all streams related to
the subscription when it deletes subscription state.</t>
        <t>The format of <tt>SUBSCRIBE_DONE</tt> is as follows:</t>
        <figure anchor="moq-transport-subscribe-fin-format">
          <name>MOQT SUBSCRIBE_DONE Message</name>
          <artwork><![CDATA[
SUBSCRIBE_DONE Message {
  Type (i) = 0xB,
  Length (i),
  Subscribe ID (i),
  Status Code (i),
  Stream Count (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Status Code: An integer status code indicating why the subscription ended.</t>
          </li>
          <li>
            <t>Stream Count: An integer indicating the number of data streams the publisher
opened for this subscription.  This helps the subscriber know if it has received
all of the data published in this subscription by comparing the number of
streams received.  The subscriber can immediately remove all subscription state
once the same number of streams have been processed.  If the track had
Forwarding Preference = Datagram, the publisher <bcp14>MUST</bcp14> set Stream Count to 0.  If
the publisher is unable to set Stream Count to the exact number of streams
opened for the subscription, it <bcp14>MUST</bcp14> set Stream Count to 2^62 - 1. Subscribers
<bcp14>SHOULD</bcp14> use a timeout or other mechanism to remove subscription state in case
the publisher set an incorrect value, reset a stream before the SUBGROUP_HEADER,
or set the maximum value.  If a subscriber receives more streams for a
subscription than specified in Stream Count, it <bcp14>MAY</bcp14> close the session with a
Protocol Violation.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant status code in
SUBSCRIBE_DONE, as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Track Ended</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Subscription Ended</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Going Away</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Expired</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Too Far Behind</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="message-max-subscribe-id">
        <name>MAX_SUBSCRIBE_ID</name>
        <t>A publisher sends a MAX_SUBSCRIBE_ID message to increase the number of
subscriptions a subscriber can create within a session.</t>
        <t>The Maximum Subscribe Id <bcp14>MUST</bcp14> only increase within a session, and
receipt of a MAX_SUBSCRIBE_ID message with an equal or smaller Subscribe ID
value is a 'Protocol Violation'.</t>
        <figure anchor="moq-transport-max-subscribe-id">
          <name>MOQT MAX_SUBSCRIBE_ID Message</name>
          <artwork><![CDATA[
MAX_SUBSCRIBE_ID
{
  Type (i) = 0x15,
  Length (i),
  Subscribe ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: The new Maximum Subscribe ID for the session. If a Subscribe ID
<xref target="message-subscribe-req"/> equal or larger than this is received by the publisher
that sent the MAX_SUBSCRIBE_ID, the publisher <bcp14>MUST</bcp14> close the session with an
error of 'Too Many Subscribes'.</t>
          </li>
        </ul>
        <t>MAX_SUBSCRIBE_ID is similar to MAX_STREAMS in (<xref section="4.6" sectionFormat="comma" target="RFC9000"/>),
and similar considerations apply when deciding how often to send MAX_SUBSCRIBE_ID.
For example, implementations might choose to increase MAX_SUBSCRIBE_ID as
subscriptions close to keep the number of subscriptions available to subscribers
roughly consistent.</t>
      </section>
      <section anchor="message-subscribes-blocked">
        <name>SUBSCRIBES_BLOCKED</name>
        <t>The SUBSCRIBES_BLOCKED message is sent when a subscriber would like to begin
a new subscription, but cannot because the Subscribe ID would exceed the
Maximum Subscribe ID value sent by the peer.  The subscriber <bcp14>SHOULD</bcp14> send only
one SUBSCRIBES_BLOCKED for a given Maximum Subscribe ID.</t>
        <t>A publisher <bcp14>MAY</bcp14> send a MAX_SUBSCRIBE_ID upon receipt of SUBSCRIBES_BLOCKED,
but it <bcp14>MUST NOT</bcp14> rely on SUBSCRIBES_BLOCKED to trigger sending a
MAX_SUBSCRIBE_ID, because sending SUBSCRIBES_BLOCKED is not required.</t>
        <figure anchor="moq-transport-subscribes-blocked">
          <name>MOQT SUBSCRIBES_BLOCKED Message</name>
          <artwork><![CDATA[
SUBSCRIBES_BLOCKED
{
  Type (i) = 0x1A,
  Length (i),
  Maximum Subscribe ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Subscribe ID: The Maximum Subscribe ID for the session on which the subscriber
is blocked. More on Subscribe ID in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce">
        <name>ANNOUNCE</name>
        <t>The publisher sends the ANNOUNCE control message to advertise where the
receiver can route SUBSCRIBEs for tracks within the announced
Track Namespace. The receiver verifies the publisher is authorized to
publish tracks under this namespace.</t>
        <figure anchor="moq-transport-announce-format">
          <name>MOQT ANNOUNCE Message</name>
          <artwork><![CDATA[
ANNOUNCE Message {
  Type (i) = 0x6,
  Length (i),
  Track Namespace (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>)</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-unannounce">
        <name>UNANNOUNCE</name>
        <t>The publisher sends the <tt>UNANNOUNCE</tt> control message to indicate
its intent to stop serving new subscriptions for tracks
within the provided Track Namespace.</t>
        <figure anchor="moq-transport-unannounce-format">
          <name>MOQT UNANNOUNCE Message</name>
          <artwork><![CDATA[
UNANNOUNCE Message {
  Type (i) = 0x9,
  Length (i),
  Track Namespace (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="message-track-status">
        <name>TRACK_STATUS</name>
        <t>A publisher sends a 'TRACK_STATUS' message on the control stream in response
to a TRACK_STATUS_REQUEST message.</t>
        <figure anchor="moq-track-status-format">
          <name>MOQT TRACK_STATUS Message</name>
          <artwork><![CDATA[
TRACK_STATUS Message {
  Type (i) = 0xE,
  Length (i),
  Track Namespace (tuple),
  Track Name Length(i),
  Track Name (..),
  Status Code (i),
  Last Group ID (i),
  Last Object ID (i),
}
]]></artwork>
        </figure>
        <t>The 'Status Code' field provides additional information about the status of the
track. It <bcp14>MUST</bcp14> hold one of the following values. Any other value is a malformed
message.</t>
        <t>0x00: The track is in progress, and subsequent fields contain the highest group
and object ID for that track.</t>
        <t>0x01: The track does not exist. Subsequent fields <bcp14>MUST</bcp14> be zero, and any other
value is a malformed message.</t>
        <t>0x02: The track has not yet begun. Subsequent fields <bcp14>MUST</bcp14> be zero. Any other
value is a malformed message.</t>
        <t>0x03: The track has finished, so there is no "live edge." Subsequent fields
contain the highest Group and object ID known.</t>
        <t>0x04: The publisher is a relay that cannot obtain the current track status from
upstream. Subsequent fields contain the largest group and object ID known.</t>
        <t>Any other value in the Status Code field is a malformed message.</t>
        <t>When a relay is subscribed to a track, it can simply return the highest group
and object ID it has observed, whether or not that object was cached or
completely delivered. If not subscribed, a relay <bcp14>SHOULD</bcp14> send a
TRACK_STATUS_REQUEST upstream to obtain updated information.</t>
        <t>Alternatively, the relay <bcp14>MAY</bcp14> subscribe to the track to obtain the same
information.</t>
        <t>If a relay cannot or will not do either, it should return its best available
information with status code 0x04.</t>
        <t>The receiver of multiple TRACK_STATUS messages for a track uses the information
from the latest arriving message, as they are delivered in order on a single
stream.</t>
      </section>
      <section anchor="message-sub-ann-ok">
        <name>SUBSCRIBE_ANNOUNCES_OK</name>
        <t>A publisher sends a SUBSCRIBE_ANNOUNCES_OK control message for successful
namespace subscriptions.</t>
        <figure anchor="moq-transport-sub-ann-ok">
          <name>MOQT SUBSCRIBE_ANNOUNCES_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES_OK
{
  Type (i) = 0x12,
  Length (i),
  Track Namespace Prefix (tuple),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-sub-ann-error">
        <name>SUBSCRIBE_ANNOUNCES_ERROR</name>
        <t>A publisher sends a SUBSCRIBE_ANNOUNCES_ERROR control message in response to
a failed SUBSCRIBE_ANNOUNCES.</t>
        <figure anchor="moq-transport-sub-ann-error">
          <name>MOQT SUBSCRIBE_ANNOUNCES_ERROR Message</name>
          <artwork><![CDATA[
SUBSCRIBE_ANNOUNCES_ERROR
{
  Type (i) = 0x13,
  Length (i),
  Track Namespace Prefix (tuple),
  Error Code (i),
  Reason Phrase Length (i),
  Reason Phrase (..),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace Prefix: As defined in <xref target="message-subscribe-ns"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for the namespace subscription
failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for the namespace subscription error.</t>
          </li>
        </ul>
        <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in SUBSCRIBE_ANNOUNCES_ERROR,
as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Namespace Prefix Unknown</td>
            </tr>
          </tbody>
        </table>
      </section>
    </section>
    <section anchor="data-streams">
      <name>Data Streams</name>
      <t>A publisher sends Objects matching a subscription on Data Streams.</t>
      <t>All unidirectional MOQT streams start with a variable-length integer indicating
the type of the stream in question.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBGROUP_HEADER  (<xref target="subgroup-header"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">FETCH_HEADER  (<xref target="fetch-header"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>All MOQT datagrams start with a variable-length integer indicating the type of
the datagram.</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Type</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x1</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-datagram"/>)</td>
          </tr>
          <tr>
            <td align="right">0x2</td>
            <td align="left">OBJECT_DATAGRAM_STATUS (<xref target="object-datagram"/>)</td>
          </tr>
        </tbody>
      </table>
      <t>An endpoint that receives an unknown stream or datagram type <bcp14>MUST</bcp14> close the
session.</t>
      <t>The publisher only sends Objects after receiving a SUBSCRIBE or FETCH.  The
publisher <bcp14>MUST NOT</bcp14> send Objects that are not requested.  If an endpoint receives
an Object it never requested, it <bcp14>SHOULD</bcp14> terminate the session with a protocol
violation. Objects can arrive after a subscription or fetch has been cancelled,
so the session <bcp14>MUST NOT</bcp14> be teriminated in that case.</t>
      <t>Every Track has a single 'Object Forwarding Preference' and the Original
Publisher <bcp14>MUST NOT</bcp14> mix different forwarding preferences within a single track.
If a subscriber receives different forwarding preferences for a track, it
<bcp14>SHOULD</bcp14> close the session with an error of 'Protocol Violation'.</t>
      <section anchor="message-object">
        <name>Object Headers</name>
        <t>An OBJECT message contains a range of contiguous bytes from from the
specified track, as well as associated metadata required to deliver,
cache, and forward it.  Objects are sent by publishers.</t>
        <section anchor="object-fields">
          <name>Canonical Object Fields</name>
          <t>A canonical MoQ Object has the following information:</t>
          <ul spacing="normal">
            <li>
              <t>Track Namespace and Track Name: The track this object belongs to.</t>
            </li>
            <li>
              <t>Group ID: The object is a member of the indicated group ID
<xref target="model-group"/> within the track.</t>
            </li>
            <li>
              <t>Object ID: The order of the object within the group.  The
IDs starts at 0, increasing sequentially for each object within the
group.</t>
            </li>
            <li>
              <t>Publisher Priority: An 8 bit integer indicating the publisher's priority for
the Object <xref target="priorities"/>.</t>
            </li>
            <li>
              <t>Object Forwarding Preference: An enumeration indicating how a publisher sends
an object. The preferences are Subgroup and Datagram.  An Object
<bcp14>MUST</bcp14> be sent according to its <tt>Object Forwarding Preference</tt>, described below.</t>
            </li>
            <li>
              <t>Subgroup ID: The object is a member of the indicated subgroup ID (<xref target="model-subgroup"/>)
within the group. This field is omitted if the Object Forwarding Preference is
Track or Datagram.</t>
            </li>
            <li>
              <t>Object Status: As enumeration used to indicate missing
objects or mark the end of a group or track. See <xref target="object-status"/> below.</t>
            </li>
            <li>
              <t>Object Extension Length: The total length of the Object Extension Headers
block, in bytes.</t>
            </li>
            <li>
              <t>Object Extensions : A sequence of Object Extension Headers. See
<xref target="object-extensions"/> below.</t>
            </li>
            <li>
              <t>Object Payload: An opaque payload intended for an End Subscriber and <bcp14>SHOULD
NOT</bcp14> be processed by a relay. Only present when 'Object Status' is Normal (0x0).</t>
            </li>
          </ul>
          <section anchor="object-status">
            <name>Object Status</name>
            <t>The Object Status informs subscribers what objects will not be received
because they were never produced, are no longer available, or because they
are beyond the end of a group or track.</t>
            <t><tt>Status</tt> can have following values:</t>
            <ul spacing="normal">
              <li>
                <t>0x0 := Normal object. This status is implicit for any non-zero length object.
       Zero-length objects explicitly encode the Normal status.</t>
              </li>
              <li>
                <t>0x1 := Indicates Object does not exist. Indicates that this object
       does not exist at any publisher and it will not be published in
       the future. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x3 := Indicates end of Group. ObjectId is one greater that the
       largest object produced in the group identified by the
       GroupID. This is sent right after the last object in the
       group. If the ObjectID is 0, it indicates there are no Objects
       in this Group. This <bcp14>SHOULD</bcp14> be cached. A publisher <bcp14>MAY</bcp14> use an end of
       Group object to signal the end of all open Subgroups in a Group.</t>
              </li>
              <li>
                <t>0x4 := Indicates end of Track and Group. GroupID is the largest group produced
       in this track and the ObjectId is one greater than the largest object
       produced in that group. An object with this status that has a Group ID
       less than any other Group ID, or an Object ID less than or equal to the
       largest in the group, is a protocol error, and the receiver <bcp14>MUST</bcp14>
       terminate the session. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x5 := Indicates end of Track. GroupID is one greater than the largest group
       produced in this track and the ObjectId is zero. An object with this
       status that has a Group ID less than or equal to any other Group ID, or
       an Object ID other than zero, is a protocol error, and the receiver
       <bcp14>MUST</bcp14> terminate the session. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
            </ul>
            <t>Any other value <bcp14>SHOULD</bcp14> be treated as a protocol error and terminate the
session with a Protocol Violation (<xref target="session-termination"/>).
Any object with a status code other than zero <bcp14>MUST</bcp14> have an empty payload.</t>
            <t>Though some status information could be inferred from QUIC stream state,
that information is not reliable and cacheable.</t>
          </section>
          <section anchor="object-extensions">
            <name>Object Extension Header</name>
            <t>Object Extension Headers are visible to relays and allow the transmission of
future metadata relevant to MOQT Object distribution. Any Object metadata never
accessed by the transport or relays <bcp14>SHOULD</bcp14> be serialized as part of the Object
payload and not as an extension header.</t>
            <t>Extension Headers are defined in external specifications and registered in an
IANA table <xref target="iana"/>. These specifications define the type and value of the
header, along with any rules concerning processing, modification, caching and
forwarding. A relay which is coded to implement these rules is said to
"support" the extension.</t>
            <t>If unsupported by the relay, Extension Headers <bcp14>MUST NOT</bcp14> be modified, <bcp14>MUST</bcp14> be
cached as part of the Object and <bcp14>MUST</bcp14> be forwarded by relays.</t>
            <t>If supported by the relay and subject to the processing rules specified in the
definition of the extension, Extension Headers <bcp14>MAY</bcp14> be modified, added, removed,
and/or cached by relays.</t>
            <t>Object Extension Headers are serialized as defined below:</t>
            <figure anchor="object-extension-format">
              <name>Object Extension Header Format</name>
              <artwork><![CDATA[
Extension Header {
  Header Type (i),
  [Header Value (i)]
  [Header Length (i),
   Header Value (..)]
}
]]></artwork>
            </figure>
            <ul spacing="normal">
              <li>
                <t>Header type: an unsigned integer, encoded as a varint, identifying the type
of the extension and also the subsequent serialization.</t>
              </li>
              <li>
                <t>Header values: even types are followed by a single varint encoded value. Odd
types are followed by a varint encoded length and then the header value.
Header types are registered in the IANA table 'MOQ Extension Headers'.
See <xref target="iana"/>.</t>
              </li>
            </ul>
          </section>
        </section>
      </section>
      <section anchor="object-datagram">
        <name>Object Datagram</name>
        <t>An <tt>OBJECT_DATAGRAM</tt> carries a single object in a datagram.</t>
        <t>An Object received in an <tt>OBJECT_DATAGRAM</tt> message has an <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>. To send an Object with <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>, determine the length of the header and
payload and send the Object as datagram. In certain scenarios where the object
size can be larger than maximum datagram size for the session, the Object
will be dropped.</t>
        <figure anchor="object-datagram-format">
          <name>MOQT OBJECT_DATAGRAM</name>
          <artwork><![CDATA[
OBJECT_DATAGRAM {
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload (..),
}
]]></artwork>
        </figure>
        <t>There is no explicit length field.  The entirety of the transport datagram
following Publisher Priority contains the Object Payload.</t>
      </section>
      <section anchor="object-datagram-status">
        <name>Object Datagram Status</name>
        <t>An <tt>OBJECT_DATAGRAM_STATUS</tt> is similar to OBEJCT_DATAGRAM except it
conveys an Object Status and has no payload.</t>
        <figure anchor="object-datagram-status-format">
          <name>MOQT OBJECT_DATAGRAM_STATUS</name>
          <artwork><![CDATA[
OBJECT_DATAGRAM_STATUS {
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Status (i),
}
]]></artwork>
        </figure>
      </section>
      <section anchor="streams">
        <name>Streams</name>
        <t>When objects are sent on streams, the stream begins with a Subgroup Header
and is followed by one or more sets of serialized object fields.
If a stream ends gracefully in the middle of a serialized Object, the session
<bcp14>SHOULD</bcp14> be terminated with a Protocol Violation.</t>
        <t>A publisher <bcp14>SHOULD NOT</bcp14> open more than one stream at a time with the same Subgroup
Header field values.</t>
        <section anchor="subgroup-header">
          <name>Subgroup Header</name>
          <t>When a stream begins with <tt>SUBGROUP_HEADER</tt>, all Objects on the stream
belong to the track requested in the Subscribe message identified by <tt>Track Alias</tt>
and the subgroup indicated by 'Group ID' and <tt>Subgroup ID</tt>.</t>
          <figure anchor="object-header-format">
            <name>MOQT SUBGROUP_HEADER</name>
            <artwork><![CDATA[
SUBGROUP_HEADER {
  Track Alias (i),
  Group ID (i),
  Subgroup ID (i),
  Publisher Priority (8),
}
]]></artwork>
          </figure>
          <t>All Objects received on a stream opened with <tt>SUBGROUP_HEADER</tt> have an
<tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Subgroup</tt>, find the open
stream that is associated with the subscription, <tt>Group ID</tt> and <tt>Subgroup ID</tt>,
or open a new one and send the <tt>SUBGROUP_HEADER</tt>. Then serialize the
following fields.</t>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <figure anchor="object-subgroup-format">
            <name>MOQT Subgroup Fields</name>
            <artwork><![CDATA[
{
  Object ID (i),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>A publisher <bcp14>MUST NOT</bcp14> send an Object on a stream if its Object ID is less than a
previously sent Object ID within a given group in that stream.</t>
        </section>
        <section anchor="closing-subgroup-streams">
          <name>Closing Subgroup Streams</name>
          <t>Subscribers will often need to know if they have received all objects in a
Subgroup, particularly if they serve as a relay or cache. QUIC and Webtransport
streams provide signals that can be used for this purpose. Closing Subgroups
promptly frees system resources and often unlocks flow control credit to open
more streams.</t>
          <t>If a sender has delivered all objects in a Subgroup to the QUIC stream, except
any objects before the beginning of a subscription, it <bcp14>MUST</bcp14> close the
stream with a FIN.</t>
          <t>If a sender closes the stream before delivering all such objects to the QUIC
stream, it <bcp14>MUST</bcp14> use a RESET_STREAM or RESET_STREAM_AT
<xref target="I-D.draft-ietf-quic-reliable-stream-reset"/> frame. This includes an open
Subgroup exceeding its Delivery Timeout, early termination of subscription due to
an UNSUBSCRIBE message, a publisher's decision to end the subscription early, or a
SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group
or the start after the current Group.  When RESET_STREAM_AT is used, the
reliable_size <bcp14>SHOULD</bcp14> include the stream header so the receiver can identify the
corresponding subscription and accurately account for reset data streams when
handling SUBSCRIBE_DONE (see <xref target="message-subscribe-done"/>).  Publishers that reset
data streams without using RESET_STREAM_AT with an appropriate reliable_size can
cause subscribers to hold on to subscription state until a timeout expires.</t>
          <t>A sender might send all objects in a Subgroup and the FIN on a QUIC stream,
and then reset the stream. In this case, the receiving application would receive
the FIN if and only if all objects were received. If the application receives
all data on the stream and the FIN, it can ignore any RESET_STREAM it receives.</t>
          <t>If a sender will not deliver any objects from a Subgroup, it <bcp14>MAY</bcp14> send
a SUBGROUP_HEADER on a new stream, with no objects, and then send RESET_STREAM_AT
with a reliable_size equal to the length of the stream header. This explicitly
tells the receiver there is an unsent Subgroup.</t>
          <t>Since SUBSCRIBEs always end on a group boundary, an ending subscription can
always cleanly close all its subgroups. A sender that terminates a stream
early for any other reason (e.g., to handoff to a different sender) <bcp14>MUST</bcp14>
use RESET_STREAM or RESET_STREAM_AT. Senders <bcp14>SHOULD</bcp14> terminate a stream on
Group boundaries to avoid doing so.</t>
          <t>An MoQT implementation that processes a stream FIN is assured it has received
all objects in a subgroup from the start of the subscription. If a relay, it
can forward stream FINs to its own subscribers once those objects have been
sent. A relay <bcp14>MAY</bcp14> treat receipt of EndOfGroup, GroupDoesNotExist, or
EndOfTrack objects as a signal to close corresponding streams even if the FIN
has not arrived, as further objects on the stream would be a protocol violation.</t>
          <t>Similarly, an EndOfGroup message indicates the maximum Object ID in the
Group, so if all Objects in the Group have been received, a FIN can be sent on
any stream where the entire subgroup has been sent. This might be complex to
implement.</t>
          <t>Processing a RESET_STREAM or RESET_STREAM_AT means that there might be other
objects in the Subgroup beyond the last one received. A relay might immediately
reset the corresponding downstream stream, or it might attempt to recover the
missing Objects in an effort send all the objects in the subgroups and the FIN. It also
might send RESET_STREAM_AT with reliable_size set to the last object it has, so
as to reliably deliver the objects it has while signaling that other objects
might exist.</t>
          <t>A subscriber <bcp14>MAY</bcp14> send a QUIC STOP_SENDING frame for a subgroup stream if the Group
or Subgroup is no longer of interest to it. The publisher <bcp14>SHOULD</bcp14> respond with
RESET_STREAM or RESET_STREAM_AT. If RESET_STREAM_AT is sent, note that the receiver
has indicated no interest in the objects, so setting a reliable_size beyond the
stream header is of questionable utility.</t>
          <t>RESET_STREAM and STOP_SENDING on SUBSCRIBE data streams have no impact on other
Subgroups in the Group or the subscription, although applications might cancel all
Subgroups in a Group at once.</t>
        </section>
        <section anchor="fetch-header">
          <name>Fetch Header</name>
          <t>When a stream begins with <tt>FETCH_HEADER</tt>, all objects on the stream belong to the
track requested in the Fetch message identified by <tt>Subscribe ID</tt>.</t>
          <figure anchor="fetch-header-format">
            <name>MOQT FETCH_HEADER</name>
            <artwork><![CDATA[
FETCH_HEADER {
  Subscribe ID (i),
}
]]></artwork>
          </figure>
          <t>Each object sent on a fetch stream after the FETCH_HEADER has the following format:</t>
          <figure anchor="object-fetch-format">
            <name>MOQT Fetch Object Fields</name>
            <artwork><![CDATA[
{
  Group ID (i),
  Subgroup ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <t>The Subgroup ID field of an object with a Forwarding Preference of "Datagram"
(see <xref target="object-fields"/>) is set to the Object ID.</t>
        </section>
      </section>
      <section anchor="examples">
        <name>Examples</name>
        <t>Sending a subgroup on one stream:</t>
        <artwork><![CDATA[
Stream = 2

SUBGROUP_HEADER {
  Track Alias = 2
  Group ID = 0
  Subgroup ID = 0
  Publisher Priority = 0
}
{
  Object ID = 0
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "efgh"
}
]]></artwork>
        <t>Sending a group on one stream, with the first object containing two
Extension Headers.</t>
        <artwork><![CDATA[
Stream = 2

STREAM_HEADER_GROUP {
  Subscribe ID = 2
  Track Alias = 2
  Group ID = 0
  Publisher Priority = 0
}
{
  Object ID = 0
  Extension Headers Length = 33
    { Type = 4
      Value = 2186796243
    },
    { Type = 77
      Length = 21
      Value = "traceID:123456"
    }
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Extension Headers Length = 0
  Object Payload Length = 4
  Payload = "efgh"
}

]]></artwork>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>TODO: Expand this section, including subscriptions.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Live content requires significant bandwidth and resources.  Failure to
set limits will quickly cause resource exhaustion.</t>
        <t>MOQT uses stream limits and flow control to impose resource limits at
the network layer.  Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the
anticipated bitrate.</t>
        <t>Endpoints <bcp14>MAY</bcp14> impose a MAX STREAM count limit which would restrict the
number of concurrent streams which a MOQT Streaming Format could have in
flight.</t>
        <t>The publisher prioritizes and transmits streams out of order.  Streams
might be starved indefinitely during congestion.  The publisher and
subscriber <bcp14>MUST</bcp14> cancel a stream, preferably the lowest priority, after
reaching a resource limit.</t>
      </section>
      <section anchor="timeouts">
        <name>Timeouts</name>
        <t>Implementations are advised to use timeouts to prevent resource
exhaustion attacks by a peer that does not send expected data within
an expected time.  Each implementation is expected to set its own limits.</t>
      </section>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>TODO: fill out currently missing registries:</t>
      <ul spacing="normal">
        <li>
          <t>MOQT version numbers</t>
        </li>
        <li>
          <t>Setup parameters</t>
        </li>
        <li>
          <t>Subscribe parameters</t>
        </li>
        <li>
          <t>Subscribe Error codes</t>
        </li>
        <li>
          <t>Subscribe Namespace Error codes</t>
        </li>
        <li>
          <t>Announce Error codes</t>
        </li>
        <li>
          <t>Announce Cancel Reason codes</t>
        </li>
        <li>
          <t>Message types</t>
        </li>
        <li>
          <t>MOQ Extension headers - we wish to reserve extension types 0-63 for
standards utilization where space is a premium, 64 - 16383 for
standards utilization where space is less of a concern, and 16384 and
above for first-come-first-served non-standardization usage.</t>
        </li>
      </ul>
      <t>TODO: register the URI scheme and the ALPN and grease the Extension types</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <ul spacing="normal">
        <li>
          <t>Alan Frindell</t>
        </li>
        <li>
          <t>Ali Begen</t>
        </li>
        <li>
          <t>Charles Krasic</t>
        </li>
        <li>
          <t>Christian Huitema</t>
        </li>
        <li>
          <t>Cullen Jennings</t>
        </li>
        <li>
          <t>James Hurley</t>
        </li>
        <li>
          <t>Jordi Cenzano</t>
        </li>
        <li>
          <t>Mike English</t>
        </li>
        <li>
          <t>Mo Zanaty</t>
        </li>
        <li>
          <t>Will Law</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="QUIC">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="WebTransport">
          <front>
            <title>WebTransport over HTTP/3</title>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Facebook</organization>
            </author>
            <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
              <organization>Apple Inc.</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="21" month="October" year="2024"/>
            <abstract>
              <t>   WebTransport [OVERVIEW] is a protocol framework that enables clients
   constrained by the Web security model to communicate with a remote
   server using a secure multiplexed transport.  This document describes
   a WebTransport protocol that is based on HTTP/3 [HTTP3] and provides
   support for unidirectional streams, bidirectional streams and
   datagrams, all multiplexed within the same HTTP/3 connection.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-http3-11"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
        <reference anchor="I-D.draft-ietf-quic-reliable-stream-reset">
          <front>
            <title>QUIC Stream Resets with Partial Delivery</title>
            <author fullname="Marten Seemann" initials="M." surname="Seemann">
         </author>
            <author fullname="Kazuho Oku" initials="K." surname="Oku">
              <organization>Fastly</organization>
            </author>
            <date day="28" month="February" year="2024"/>
            <abstract>
              <t>   QUIC defines a RESET_STREAM frame to abort sending on a stream.  When
   a sender resets a stream, it also stops retransmitting STREAM frames
   for this stream in the event of packet loss.  On the receiving side,
   there is no guarantee that any data sent on that stream is delivered.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-quic-reliable-stream-reset-06"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.ietf-webtrans-overview">
          <front>
            <title>The WebTransport Protocol Framework</title>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="25" month="February" year="2025"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with an abstract model that allows them to be used interchangeably.

   This document defines the overall requirements on the protocols used
   in WebTransport, as well as the common features of the protocols,
   support for some of which may be optional.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-09"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963bcyJUm+j+eAs36IalWZupWLlfJU+NmkZSKbYmURcrV
PW4fEcxEkmglgTSAJEXLOs9ynuU82dnXiB0BgJRUqh7PWa410xaRQFx37NjX
b0+nU9eV3ap4km29KBZlntWXRZP98fX+Tnbc5FW7rptuy+Wnp01x+SS7qP86
7fSxW9TzKr+ATxdNvuymZdEtp9Eb0wffu0XewRvvd7eP9z64OfxxVjfXT7K2
WzhXrpsnWdds2u7RgwffP3jk8qbIn2TZ1s/FaZZXi2y/6oqmKjo7lnZzelG2
bVlXx9draHp/7/ipu6qbt2dNvVn7eRzqPLbc2+Iafl88cdk0uwiT/OumnLvL
otoU8Es2+nWWddTP1s/QR1mdZc/wTXx+kZcreA5T/lec+6xuzvBx3szP4fF5
163bJ/fv41v4qLwsZvrafXxw/7Spr9riPnx/H787K7vzzSk3OL06ux8tJb6w
gtVrO9s0vTjjD2dlHX9yf2xbZufdxWrLubaDNX6Tr+oKpnddtK69yJvuzV83
NfTzJKtqty6fZH/u6vkka+G7pli28K/rC/4HbP9Fvl7DkvzFuXzTndcNLuQU
/n+WlRW08HyW7WyaVXFNj5hWnm/eFvYprEZelX/LO9jQJ9lu2c5hq+iXgtf3
bfmuwJkv/vUMH8zm9YWLu/nDLHu5OSsr08sfyqZcrczjuJsXRZfbPsq3ZfOv
F/BwoPWjWXYA65S/3cDqmC6ONud5m/4Ud7ODs7H9tBW//q9z/GWgsz/Nsj/l
bbkqi0vT1Z/KeVc38S9xT8/q+mxV2K4u8eXLy389o18GutqfZUdXRdeZfvbz
yjy7rYcSyAlftl3gz02N7ASOEYzZuapuLqCJSzpkeKKeZK+e7nz/4MED+BvO
uT/Z0P10l07I9Ko4JWKdIqE/Bj5RLUMrbjqdZvlpC2/MO+eOz8sWSXFzUVRd
tiiWZVW0WXdeZEBIRXZanOeXJSwetJCNcjh398XhH4/vTbJcGIQ/K9m6qeEA
1Ctoui3PqmKRdXVWr4sGSNI0Bfvq7Gwm2dV5OT/PoPcia8sL5AHZclPNcTXz
VdldzzLsM8tXK+AC0DF0tNjMob166WQQdbbenK7K9jwDLpoTR6T2yg4mV7Uw
5UV2CS8CS2znTbnGtrPT6yx3F5tVV65X5Rw6ggazolqs67Lq2lm238H7axxj
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

-->

</rfc>
