<?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-08" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.26.0 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-08"/>
    <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 object 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?>

<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>An encoded bitstream. Tracks contain a sequential series of one or
more groups and are the subscribable entity with MOQT.
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 "Track" or
"Datagram", Objects are not sent in Subgroups, no Subgroup IDs are assigned, 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>Groups are ordered numerically by their Group ID.</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 has a track name and a track namespace associated
with it.  A track name identifies an individual track within the
namespace.</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. Track name is a sequence of bytes.
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>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-and-retrieval-track-discovery">
      <name>Track Discovery and Retrieval (#track-discovery}</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 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_NAMESPACES_OK or SUBSCRIBE_NAMESPACES_ERROR ought to
forward the result to the application, so that it can make decisions about
further publishers to contact.</t>
        <t>An UNSUBSCRIBE_NAMESPACES withdraws a previous SUBSCRIBE_NAMESPACES. 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 received through the same
subscription, <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 received through
the same subscription, 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-publisher-relay-switchover">
          <name>Graceful Publisher 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-1">
          <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.
The only objects prior to the current object that can be requested are those
in the current group.</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 4 types of filters:</t>
        <t>Latest Group (0x1) : Specifies an open-ended subscription with objects
from the beginning of the current group.  If no content has been delivered yet,
the subscription starts with the first published or received group.</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 EndObject 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.</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.  The subscriber can remove all subscription state
once the same number of streams have been processed.</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 Track, 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 Count: The number of Object Extensions present. A value of 0
indicates that no Object Extension Headers are present.</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. The payload is array of bytes and can be empty.</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 Count (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  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),
  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 Count (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 Count (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
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  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 Count  = 2
    { Type = 4
      Value = 2186796243
    },
    { Type = 77
      Length = 21
      Value = "traceID:123456"
    }
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  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="August" year="2024"/>
            <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-08"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y963Ycx5Uu+D+eIhv6QVKrUOJFlmX66LghAqTQJgmaAK3u
cXsRiaosIJuFynJlFkCY5jzLPMs82ex77IjMAkCK6u4zq7XOaRNZmXHdsWNf
v729vR26uptXj4utF9W0LovmoloVf3qz/6Q4WpWLdtmsuq1QnpysqovHxXnz
t+1OH4dpM1mU5/DpdFXOuu266mbbyRvb978P07KDNz7s7hztfQwT+OO0WV09
LtpuGkK9XD0uutW67R7ev/+7+w9DuarKx0Wx9XN1UpSLabG/6KrVour8WNr1
yXndtnWzOLpaQtP7e0dPw2Wzene6atZLm8eBzmMrvKuu4Pfp41BsF+dxkn9b
15NwUS3WFfxSbPy6KDrqZ+tn6KNenBbP8E18fl7Wc3gOU/5nnPu4WZ3i43I1
OYPHZ123bB9/8w2+hY/qi2qsr32DD745WTWXbfUNfP8Nfndad2frE25w+/L0
m2Qp8YU5rF7b+abpxTF/OK6b9JNvNm3L+Kw7n2+F0Hawxm/LebOA6V1VbWjP
y1X39m/rBvp5XCyasKwfF3/pmsmoaOG7VTVr4V9X5/wP2P7zcrmEJflrCOW6
O2tWuJDb8P+Lol5AC8/HxZP1al5d0SOmlefrd5V/CqtRLuq/lx1s6ONit24n
sFX0S8Xr+65+X+HMp/98ig/Gk+Y8pN38cVy8Wp/WC9fLH+tVPZ+7x2k3L6qu
9H3U7+rVP5/Dw4HWD8fFS1in8t0aVsd1cbg+K9v8p7SbJzgb30+74Nf/eYK/
DHT253Hx57Kt53V14br6cz3pmlX6S9rTs6Y5nVe+qwt8+eLin0/pl4Gu9sfF
4WXVda6f/XLhnt3UQw3khC/7LvDnVYPsBI4RjDmERbM6hyYu6JDhiXpcvH76
5Hf379+Hv+Gc28mG7rd36YRsX1YnRKzbSOiPgE8sZrGVsL29XZQnLbwx6UI4
OqtbJMX1ebXoimk1qxdVW3RnVQGEVBUn1Vl5UcPiQQvFRg4X7r44+NPRvVFR
CoOws1IsVw0cgGYOTbf16aKaFl1TNMtqBSTpmoJ9DX42o+LyrJ6cFdB7VbT1
OfKAYrZeTHA1y3ndXY0L7LMo53PgAtAxdDRdT6C9ZhZkEE2xXJ/M6/asAC5a
Ekek9uoOJrdoYcrT4gJeBJbYTlb1EtsuTq6KMpyv5129nNcT6AgaLKrFdNnU
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
fWoeow9k84E7yaoBAA==

-->

</rfc>
