<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.3.6) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-transport-11" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.28.1 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-11"/>
    <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>
    <author initials="A." surname="Frindell" fullname="Alan Frindell" role="editor">
      <organization>Meta</organization>
      <address>
        <email>afrind@meta.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <abstract>
      <?line 59?>

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

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

<t>The following terms are used with the first letter capitalized.</t>
        <dl>
          <dt>Application:</dt>
          <dd>
            <t>The entity using MoQT to transmit and receive data.</t>
          </dd>
          <dt>Client:</dt>
          <dd>
            <t>The party initiating a Transport Session.</t>
          </dd>
          <dt>Server:</dt>
          <dd>
            <t>The party accepting an incoming Transport Session.</t>
          </dd>
          <dt>Endpoint:</dt>
          <dd>
            <t>A Client or Server.</t>
          </dd>
          <dt>Peer:</dt>
          <dd>
            <t>The other endpoint than the one being described</t>
          </dd>
          <dt>Publisher:</dt>
          <dd>
            <t>An endpoint that handles subscriptions by sending requested Objects from the requested track.</t>
          </dd>
          <dt>Subscriber:</dt>
          <dd>
            <t>An endpoint that subscribes to and receives tracks.</t>
          </dd>
          <dt>Original Publisher:</dt>
          <dd>
            <t>The initial publisher of a given track.</t>
          </dd>
          <dt>End Subscriber:</dt>
          <dd>
            <t>A subscriber that initiates a subscription and does not send the data on to other subscribers.</t>
          </dd>
          <dt>Relay:</dt>
          <dd>
            <t>An entity that is both a Publisher and a Subscriber, but not the Original
Publisher or End Subscriber.</t>
          </dd>
          <dt>Upstream:</dt>
          <dd>
            <t>In the direction of the Original Publisher</t>
          </dd>
          <dt>Downstream:</dt>
          <dd>
            <t>In the direction of the End Subscriber(s)</t>
          </dd>
          <dt>Transport Session:</dt>
          <dd>
            <t>A raw QUIC connection or a WebTransport session.</t>
          </dd>
          <dt>Congestion:</dt>
          <dd>
            <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>A temporal sequence of objects. A group represents a join point in a
track. See (<xref target="model-group"/>).</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>An object is an addressable unit whose payload is a sequence of
bytes. Objects form the base element in the MOQT data model. See
(<xref target="model-object"/>).</t>
          </dd>
          <dt>Track:</dt>
          <dd>
            <t>A track is a collection of groups. See (<xref target="model-track"/>).</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref section="1.3" sectionFormat="comma" target="RFC9000"/>)
when describing the binary encoding.</t>
        <t>As a quick reference, the following list provides a non normative summary
of the parts of RFC9000 field syntax that are used in this specification.</t>
        <dl>
          <dt>x (L):</dt>
          <dd>
            <t>Indicates that x is L bits long</t>
          </dd>
          <dt>x (i):</dt>
          <dd>
            <t>Indicates that x holds an integer value using the variable-length
encoding as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>)</t>
          </dd>
          <dt>x (..):</dt>
          <dd>
            <t>Indicates that x can be any length including zero bits long.  Values
 in this format always end on a byte boundary.</t>
          </dd>
          <dt>[x (L)]:</dt>
          <dd>
            <t>Indicates that x is optional and has a length of L</t>
          </dd>
          <dt>x (L) ...:</dt>
          <dd>
            <t>Indicates that x is repeated zero or more times and that each instance
has a length of L</t>
          </dd>
        </dl>
        <t>This document extends the RFC9000 syntax and with the additional field types:</t>
        <dl>
          <dt>x (b):</dt>
          <dd>
            <t>Indicates that x consists of a variable length integer encoding as
described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many bytes
of binary data</t>
          </dd>
          <dt>x (tuple):</dt>
          <dd>
            <t>Indicates that x is a tuple, consisting of a variable length integer encoded
as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>), followed by that many variable
length tuple fields, each of which are encoded as (b) above.</t>
          </dd>
        </dl>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
        <section anchor="location-structure">
          <name>Location Structure</name>
          <t>Location identifies a particular Object in a Group within a Track.</t>
          <figure anchor="moq-location">
            <name>Location structure</name>
            <artwork><![CDATA[
Location {
  Group (i),
  Object (i)
}
]]></artwork>
          </figure>
          <t>Location A &lt; Location B iff</t>
          <t><tt>A.Group &lt; B.Group || (A.Group == B.Group &amp;&amp; A.Object &lt; B.Object)</tt></t>
        </section>
        <section anchor="key-value-pair-structure">
          <name>Key-Value-Pair Structure</name>
          <t>Key-Value-Pair is a flexible structure designed to carry key/value
pairs in which the key is a variable length integer and the value
is either a variable length integer or a byte field of arbitrary
length.</t>
          <t>Key-Value-Pair is used in both the data plane and control plane, but
is optimized for use in the data plane.</t>
          <figure anchor="moq-key-value-pair">
            <name>MOQT Key-Value-Pair</name>
            <artwork><![CDATA[
Key-Value-Pair {
  Type (i),
  [Length (i),]
  Value (..)
}
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>Type: an unsigned integer, encoded as a varint, identifying the
type of the value and also the subsequent serialization.</t>
            </li>
            <li>
              <t>Length: Only present when Type is odd. Specifies the length of the Value field.
The maximum length of a value is 2^16-1 bytes.  If an endpoint receives a
length larger than the maximum, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
            </li>
            <li>
              <t>Value: A single varint encoded value when Type is even, otherwise a
sequence of Length bytes.</t>
            </li>
          </ul>
          <t>If a receiver understands a Type, and the following Value or
Length/Value does not match the serialization defined by that Type,
the receiver <bcp14>MUST</bcp14> terminate the session with error code 'Key-Value
Formatting Error'.</t>
        </section>
        <section anchor="reason-phrase">
          <name>Reason Phrase Structure</name>
          <t>Reason Phrase provides a way for the sender to encode additional diagnostic
information about the error condition, where appropriate.</t>
          <artwork><![CDATA[
Reason Phrase {
  Reason Phrase Length (i),
  Reason Phrase Value (..)
}
]]></artwork>
          <ul spacing="normal">
            <li>
              <t>Reason Phrase Length: A variable-length integer specifying the length of the
reason phrase in bytes. The reason phrase length has a maximum length of
1024 bytes. If an endpoint receives a length exceeding the maximum, it <bcp14>MUST</bcp14>
close the session with a Protocol Violation</t>
            </li>
            <li>
              <t>Reason Phrase Value: Additional diagnostic information about the error condition.
The reason phrase value is encoded as UTF-8 string and does not carry information,
such as language tags, that would aid comprehension by any entity other than
the one that created the text.</t>
            </li>
          </ul>
        </section>
      </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-properties"/>) is
"Datagram", Objects are not sent in Subgroups and the
description in the remainder of this section does not apply.</t>
        <t>Streams offer in-order reliable delivery and the ability to cancel sending
and retransmission of data. Furthermore, many implementations offer the ability
to control the relative priority of streams, which allows control over the
scheduling of sending data on active streams.</t>
        <t>Every object within a Group belongs to exactly one Subgroup.</t>
        <t>Objects from two subgroups cannot be sent on the same stream. Objects from the
same Subgroup <bcp14>MUST NOT</bcp14> be sent on different streams, unless one of the streams
was reset prematurely, or upstream conditions have forced objects from a Subgroup
to be sent out of Object ID order.</t>
        <t>Original publishers assign each Subgroup a Subgroup ID, and do so as they see fit.  The
scope of a Subgroup ID is a Group, so Subgroups from different Groups <bcp14>MAY</bcp14> share a Subgroup
ID without implying any relationship between them. In general, publishers assign
objects to subgroups in order to leverage the features of streams as described
above.</t>
        <t>An example strategy for using stream properties follows. If object B is
dependent on object A, then delivery of B can follow A, i.e. A and B can be
usefully delivered over a single stream. Furthermore, in this example:</t>
        <ul spacing="normal">
          <li>
            <t>If an object is dependent on all previous objects in a Subgroup, it is added to
that Subgroup.</t>
          </li>
          <li>
            <t>If an object is not dependent on all of the objects in a Subgroup, it goes in
a different Subgroup.</t>
          </li>
          <li>
            <t>There are often many ways to compose Subgroups that meet these criteria. Where
possible, choose the composition that results in the fewest Subgroups in a group
to minimize the number of streams used.</t>
          </li>
        </ul>
      </section>
      <section anchor="model-group">
        <name>Groups</name>
        <t>A group is a collection of objects and is a sub-unit of a track (<xref target="model-track"/>).
Groups <bcp14>SHOULD</bcp14> be independently 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>
        <section anchor="group-ordering">
          <name>Group Ordering</name>
          <t>Within a track, the original publisher <bcp14>SHOULD</bcp14> publish Group IDs which increase
with time. In some cases, Groups will be produced in increasing order, but sent
to subscribers in a different order, for example when the subscription's Group
Order is Descending.  Due to network reordering and the partial reliability
features of MoQT, Groups can always be received out of order.</t>
          <t>As a result, subscribers cannot infer the existence of a Group until an object in
the Group is received. This can create gaps in a cache that can be filled
by doing a Fetch upstream, if necessary.</t>
          <t>Applications that cannot produce Group IDs that increase with time are limited
to the subset of MoQT that does not compare group IDs. Subscribers to these Tracks
<bcp14>SHOULD NOT</bcp14> use range filters which span multiple Groups in FETCH or SUBSCRIBE.
SUBSCRIBE and FETCH delivery use Group Order, so a FETCH cannot deliver Groups
out of order and a subscription could have unexpected delivery order if Group IDs
do not increase with time.</t>
        </section>
      </section>
      <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</name>
          <t>In MOQT, every track is identified by a Full Track Name, consisting of a Track
Namespace and a Track Name.</t>
          <t>Track Namespace is an ordered N-tuple of bytes where N can be between 1 and 32.
The structured nature of Track Namespace allows relays and applications to
manipulate prefixes of a namespace. If an endpoint receives a Track Namespace
tuple with an N of 0 or more than 32, it <bcp14>MUST</bcp14> close the session with a Protocol
Violation.</t>
          <t>Track Name is a sequence of bytes that identifies an individual track within the
namespace.</t>
          <t>The maximum total length of a Full Track Name is 4,096 bytes, computed as the
sum of the lengths of each Track Namespace tuple field and the Track Name length
field.  If an endpoint receives a Full Track Name exceeding this length, 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 for the track.
If, at a given moment in time, two tracks within the same scope contain
different data, they <bcp14>MUST</bcp14> have different names and/or namespaces.
MOQT provides subscribers with the ability to alter the specific manner in
which tracks are delivered via Subscribe Parameters, but the actual content of
the tracks does not depend on those parameters; this is in contrast to
protocols like HTTP, where request headers can alter the server response.</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. The RESET_STREAM_AT
<xref target="I-D.draft-ietf-quic-reliable-stream-reset"/> extension to QUIC
can be used by MoQT, but the protocol is also designed to work
correctly when the extension is not supported.</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 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 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"/>), followed by other
messages defined in <xref target="message"/>.</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="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">Invalid Request ID</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Duplicate Track Alias</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Key-Value Formatting Error</td>
            </tr>
            <tr>
              <td align="right">0x7</td>
              <td align="left">Too Many Requests</td>
            </tr>
            <tr>
              <td align="right">0x8</td>
              <td align="left">Invalid Path</td>
            </tr>
            <tr>
              <td align="right">0x9</td>
              <td align="left">Malformed Path</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>
            <tr>
              <td align="right">0x13</td>
              <td align="left">Auth Token Cache Overflow</td>
            </tr>
            <tr>
              <td align="right">0x14</td>
              <td align="left">Duplicate Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x15</td>
              <td align="left">Version Negotiation Failed</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>Invalid Request ID: The session was closed because the endpoint used a Request
ID that was smaller than or equal to a previously received request ID, or the
least-significant bit of the request ID was incorrect for the endpoint.</t>
          </li>
          <li>
            <t>Duplicate Track Alias: The endpoint attempted to use a Track Alias
that was already in use.</t>
          </li>
          <li>
            <t>Key-Value Formatting Error: the key-value pair has a formatting error.</t>
          </li>
          <li>
            <t>Too Many Requests: The session was closed because the endpoint used a
Request ID equal or larger than the current Maximum Request ID.</t>
          </li>
          <li>
            <t>Invalid Path: The PATH parameter was used by a server, on a WebTransport
session, or the server does not support the path.</t>
          </li>
          <li>
            <t>Malformed Path: The PATH parameter does not conform to the rules in <xref target="path"/>.</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 or
terminate the subscription.</t>
          </li>
          <li>
            <t>Auth Token Cache Overflow - the Session limit <xref target="max-auth-token-cache-size"/> of
the size of all registered Authorization tokens has been exceeded.</t>
          </li>
          <li>
            <t>Duplicate Auth Token Alias - Authorization Token attempted to register an
alias that was in use (see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Version Negotiation Failed: The client didn't offer a version supported
by the server.</t>
          </li>
        </ul>
        <t>An endpoint <bcp14>MAY</bcp14> choose to treat a subscription or request specific error as a
session error under certain circumstances, closing the entire session in
response to a condition with a single subscription or message. Implementations
need to consider the impact on other outstanding subscriptions before making this
choice.</t>
      </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 anchor="congestion-control">
        <name>Congestion Control</name>
        <t>MOQT does not specify a congestion controller, but there are important attributes
to consider when selecting a congestion controller for use with an application
built on top of MOQT.</t>
        <section anchor="bufferbloat">
          <name>Bufferbloat</name>
          <t>Traditional AIMD congestion controllers (ex. CUBIC <xref target="RFC9438"/> and Reno <xref target="RFC6582"/>)
are prone to Bufferbloat. Bufferbloat occurs when elements along the path build up
a substantial queue of packets, commonly more than doubling the round trip time.
These queued packets cause head-of-line blocking and latency, even when there is
no packet loss.</t>
        </section>
        <section anchor="application-limited">
          <name>Application-Limited</name>
          <t>The average bitrate for latency sensitive content needs to be less than the available
bandwidth, otherwise data will be queued and/or dropped. As such,
many MOQT applications will typically be limited by the available data to send, and
not the congestion controller. Many congestion control algorithms
only increase the congestion window or bandwidth estimate if fully utilized. This
combination can lead to underestimating the available network bandwidth. As a result,
applications might need to periodically ensure the congestion controller is not
app-limited for at least a full round trip to ensure the available bandwidth can be
measured.</t>
        </section>
        <section anchor="consistent-throughput">
          <name>Consistent Throughput</name>
          <t>Congestion control algorithms are commonly optimized for throughput, not consistency.
For example, BBR's PROBE_RTT state halves the sending rate for more than a round trip
in order to obtain an accurate minimum RTT. Similarly, Reno halves it's congestion
window upon detecting loss.  In both cases, the large reduction in sending rate might
cause issues with latency sensitive applications.</t>
        </section>
      </section>
    </section>
    <section anchor="retrieving-tracks-with-subscribe-and-fetch">
      <name>Retrieving Tracks with Subscribe and 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 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 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>
      <t>A FETCH_ERROR indicates that both endpoints can immediately destroy state.
Since a relay can start delivering FETCH objects from cache before determining
the result of the request, some objects could be received even if the FETCH results
in error.</t>
      <t>The Parameters in SUBSCRIBE and FETCH <bcp14>MUST NOT</bcp14> cause the publisher to alter the
payload of the objects it sends, as that would violate the track uniqueness
guarantee described in <xref target="track-scope"/>.</t>
    </section>
    <section anchor="track-discovery">
      <name>Namespace 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 publishers for a
namespace.</t>
      <t>The syntax of these messages is described in <xref target="message"/>.</t>
      <section anchor="subscribing-to-announcements">
        <name>Subscribing to Announcements</name>
        <t>If the subscriber is aware of a namespace of interest, it can send
SUBSCRIBE_ANNOUNCES to publishers/relays it has established a session with. The
recipient of this message will send any relevant ANNOUNCE or UNANNOUNCE messages
for that namespace, or more specific part of that namespace.</t>
        <t>A publisher <bcp14>MUST</bcp14> send exactly one SUBSCRIBE_ANNOUNCES_OK or
SUBSCRIBE_ANNOUNCES_ERROR in response to a SUBSCRIBE_ANNOUNCES. The subscriber
<bcp14>SHOULD</bcp14> close the session with a protocol error if it detects receiving more than
one.</t>
        <t>The receiver of a SUBSCRIBE_ANNOUNCES_OK or SUBSCRIBE_ANNOUNCES_ERROR ought to
forward the result to the application, so the application can decide which other
publishers to contact, if any.</t>
        <t>An UNSUBSCRIBE_ANNOUNCES withdraws a previous SUBSCRIBE_ANNOUNCES. It does
not prohibit the receiver (publisher) from sending further ANNOUNCE messages.</t>
      </section>
      <section anchor="announcements">
        <name>Announcements</name>
        <t>A publisher <bcp14>MAY</bcp14> send ANNOUNCE messages to any subscriber. An ANNOUNCE indicates
to the subscriber that the publisher has tracks available in 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 more generic set including 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 indicates to relays how to connect publishers and subscribers, 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>
        <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>
      </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 in response to a SUBSCRIBE that belongs to a subgroup where
that object is the next object in that subgroup.</t>
          </li>
          <li>
            <t>An object in response to a SUBSCRIBE that belongs to a track with
delivery preference Datagram.</t>
          </li>
          <li>
            <t>An object in response to a FETCH where that object is the next
object in the response.</t>
          </li>
        </ol>
        <t>A single subgroup or datagram has a single publisher priority. Within a
response to SUBSCRIBE, it can be useful to conceptualize this process as
scheduling subgroups or datagrams instead of individual objects on them.
FETCH responses however can contain objects with different publisher
priorities.</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
request.  It is specified in the SUBSCRIBE or FETCH message, and can be
updated via SUBSCRIBE_UPDATE message.  The subscriber priority of an individual
schedulable object is the subscriber priority of the request 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, or in each object in a FETCH response.</t>
        <t><em>Group Order</em> is a property of an individual 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 subscriber optionally
communicates its group order preference in the SUBSCRIBE message; the
publisher's preference is used if the subscriber did not express one (by
setting Group Order field to value 0x0).  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 in response to the same request have the same subscriber
and publisher priority, but belong to two different groups of the same track,
<strong>the group order</strong> of the associated subscription is used to
decide the one that is sent first.</t>
          </li>
          <li>
            <t>If two objects in response to the same request belong to the same group of
the same track, the one with <strong>the lowest Subgroup ID</strong> (for tracks
with delivery preference Subgroup), or <strong>the lowest Object ID</strong> (for tracks
with delivery preference Datagram) is sent first.</t>
          </li>
        </ol>
        <t>The definition of "sent first" in the algorithm is implementation dependent and
is constrained by the prioritization interface of the underlying transport.
For some implementations, it could mean that the object is serialized and
passed to the underlying transport first.  In other implementations, it can
control the order packets are initially transmitted.</t>
        <t>This algorithm does not provide a well-defined ordering for objects that belong
to different subscriptions or FETCH responses, 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 can receive subscriptions with conflicting subscriber priorities
or Group Order preferences.  Relays <bcp14>SHOULD NOT</bcp14> directly use Subscriber Priority
or Group Order from incoming subscriptions for upstream subscriptions. Relays
use of these fields 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>
      <section anchor="caching-relays">
        <name>Caching Relays</name>
        <t>Relays <bcp14>MAY</bcp14> cache Objects, but are not required to.</t>
        <t>A caching relay saves Objects to its cache identified by the Object's Full Track
Name, Group ID and Object ID. 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 certain cached fields. Implementations that
update the cache need to protect against cache poisoning.  The only Object
fields that can be updated are the following:</t>
        <ol spacing="normal" type="1"><li>
            <t>Object Status can transition from any status to Object Does Not Exist in
cases where the object is no longer available.  Transitions between Normal,
End of Group and End of Track are invalid.</t>
          </li>
          <li>
            <t>Object Header Extensions can be added, removed or updated, subject
to the constraints of the specific header extension.</t>
          </li>
        </ol>
        <t>An endpoint that receives a duplicate Object with an invalid Object Status
change, or a Forwarding Preference, Subgroup ID, Priority or Payload that
differ from a previous version <bcp14>MUST</bcp14> treat the track as Malformed.</t>
        <t>Note that due to reordering, an implementation can receive a duplicate Object
with a status of Normal, End of Group or End of Track after receiving a
previous status of Object Not Exists.  The endpoint <bcp14>SHOULD NOT</bcp14> cache or
forward the duplicate object in this case.</t>
        <t>A cache <bcp14>MUST</bcp14> store all properties of an Object defined in
<xref target="object-properties"/>, with the exception of any extensions
(<xref target="object-extensions"/>) that specify otherwise.</t>
      </section>
      <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>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.  The
same object <bcp14>SHOULD NOT</bcp14> be forwarded more than once on the same subscription.</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.
Because SUBSCRIBE_UPDATE only allows narrowing a subscription, relays that
aggregate upstream subscriptions can subscribe using the Latest Object
filter to avoid churn as downstream subscribers with disparate filters
subscribe and unsubscribe from a track.</t>
        <section anchor="graceful-subscriber-relay-switchover">
          <name>Graceful Subscriber Relay Switchover</name>
          <t>This section describes behavior a subscriber <bcp14>MAY</bcp14> implement
to allow for a better user experience when a relay sends a GOAWAY.</t>
          <t>When a subscriber receives the GOAWAY message, it starts the process
of connecting to a new relay and sending the SUBSCRIBE requests for
all active subscriptions to the new relay. The new relay will send a
response to the subscribes and if they are successful, the subscriptions
to the old relay can be stopped with an UNSUBSCRIBE.</t>
        </section>
      </section>
      <section anchor="publisher-interactions">
        <name>Publisher Interactions</name>
        <t>Publishing through the relay starts with publisher sending ANNOUNCE
control message with a <tt>Track Namespace</tt> (<xref target="model-track"/>).
The ANNOUNCE enables the relay to know which publisher to forward a
SUBSCRIBE to.</t>
        <t>Relays <bcp14>MUST</bcp14> verify that publishers are authorized to publish
the content associated with the set of
tracks whose Track Namespace matches the announced namespace. Where the
authorization and identification of the publisher occurs depends on the way the
relay is managed and is application specific.</t>
        <t>A Relay can receive announcements from multiple publishers for the same
Track Namespace and it <bcp14>SHOULD</bcp14> respond with the same response to each of the
publishers, as though it was responding to an ANNOUNCE
from a single publisher for a given track namespace.</t>
        <t>When a publisher wants to stop new subscriptions for an announced namespace it
sends an UNANNOUNCE. A subscriber indicates it will no longer subcribe to tracks
in 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 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 to identify its track and find
the active subscribers for that track. Relays <bcp14>MUST</bcp14> forward Objects to
matching subscribers in accordance to each subscription's priority, group order,
and delivery timeout.</t>
        <t>If an upstream session is closed due to an unknown or invalid control message
or Object, the relay <bcp14>MUST NOT</bcp14> continue to propagate that message or Object
downstream, because it would enable a single session to close unrelated
sessions.</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 ANNOUNCE. The relay will forward
matching subscribes and the publisher publishes objects on both sessions.
Once the subscriptions have migrated over to session on the new network,
the publisher can stop publishing objects on the old network. The relay
will drop duplicate objects received on both subscriptions.
Ideally, the subscriptions downstream from the relay do no observe this
change, and keep receiving the objects on the same subscription.</t>
        </section>
        <section anchor="graceful-publisher-relay-switchover">
          <name>Graceful Publisher Relay Switchover</name>
          <t>This section describes behavior that a publisher <bcp14>MAY</bcp14> choose to implement
to allow for a better user experience when a relay sends them a GOAWAY.</t>
          <t>When a publisher receives a GOAWAY, it starts the process of
connecting to a new relay and sends announces, but it does not immediately
stop publishing objects to the old relay. The new relay will send
subscribes and the publisher can start sending new objects to the new relay
instead of the old relay. Once objects are going to the new relay,
the announcement and subscription to the old relay can be stopped.</t>
        </section>
      </section>
      <section anchor="relay-object-handling">
        <name>Relay Object Handling</name>
        <t>MOQT encodes the delivery information 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 (16),
  Message Payload (..),
}
]]></artwork>
      </figure>
      <t>The following Message Types are defined:</t>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Messages</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x01</td>
            <td align="left">RESERVED (SETUP for version 00)</td>
          </tr>
          <tr>
            <td align="right">0x40</td>
            <td align="left">RESERVED (CLIENT_SETUP for versions &lt;= 10)</td>
          </tr>
          <tr>
            <td align="right">0x41</td>
            <td align="left">RESERVED (SERVER_SETUP for versions &lt;= 10)</td>
          </tr>
          <tr>
            <td align="right">0x20</td>
            <td align="left">CLIENT_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x21</td>
            <td align="left">SERVER_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x10</td>
            <td align="left">GOAWAY (<xref target="message-goaway"/>)</td>
          </tr>
          <tr>
            <td align="right">0x15</td>
            <td align="left">MAX_REQUEST_ID (<xref target="message-max-request-id"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1A</td>
            <td align="left">REQUESTS_BLOCKED (<xref target="message-requests-blocked"/>)</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">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0x2</td>
            <td align="left">SUBSCRIBE_UPDATE (<xref target="message-subscribe-update"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0x16</td>
            <td align="left">FETCH (<xref target="message-fetch"/>)</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">0x17</td>
            <td align="left">FETCH_CANCEL (<xref target="message-fetch-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">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">0xC</td>
            <td align="left">ANNOUNCE_CANCEL (<xref target="message-announce-cancel"/>)</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>
        </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. The length is set to the number of bytes in Message
Payload, which is defined by each message type.  If the length does not match
the length of the Message Payload, the receiver <bcp14>MUST</bcp14> close the session with
Protocol Violation.</t>
      <section anchor="request-id">
        <name>Request ID</name>
        <t>Most MoQT control messages contain a session specific Request ID.  The Request
ID correlates requests and responses, allows endpoints to update or terminate
ongoing requests, and supports the endpoint's ability to limit the concurrency
and frequency of requests.  There are independent Request IDs for each endpoint.
The client's Request ID starts at 0 and are even and the server's Request ID
starts at 1 and are odd.  The Request ID increments by 2 with ANNOUNCE, FETCH,
SUBSCRIBE, SUBSCRIBE_ANNOUNCES or TRACK_STATUS request.  If an endpoint receives
a Request ID that is not valid for the peer, or a new request with a Request ID
that is not expected, it <bcp14>MUST</bcp14> close the session with <tt>Invalid Request ID</tt>.</t>
      </section>
      <section anchor="params">
        <name>Parameters</name>
        <t>Some messages include a Parameters field that encode optional message
elements.</t>
        <t>Senders <bcp14>MUST NOT</bcp14> repeat the same parameter type in a message unless the
parameter definition explicitly allows multiple instances of that type to
be sent in a single message. Receivers <bcp14>SHOULD</bcp14> check that there are no
unauthorized duplicate parameters and close the session as a
'Protocol Violation' if found.  Receivers <bcp14>MUST</bcp14> allow duplicates of unknown
parameters.</t>
        <t>Receivers ignore unrecognized parameters.</t>
        <t>The number of parameters in a message is not specifically limited, but the
total length of a control message is limited to 2^16-1.</t>
        <t>Parameters are serialized as Key-Value-Pairs <xref target="moq-key-value-pair"/>.</t>
        <t>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. SETUP message parameter types
are defined in <xref target="setup-params"/>. Version-specific parameter types are defined
in <xref target="version-specific-params"/>.</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-token">
            <name>AUTHORIZATION TOKEN</name>
            <t>The AUTHORIZATION TOKEN parameter (Parameter Type 0x01) identifies a track's
authorization information in a SUBSCRIBE, SUBSCRIBE_ANNOUNCES, ANNOUNCE
TRACK_STATUS_REQUEST or FETCH message. This parameter is populated for
cases where the authorization is required at the track or namespace level.</t>
            <t>The AUTHORIZATION TOKEN parameter <bcp14>MAY</bcp14> be repeated within a message.</t>
            <t>The TOKEN value is a structured object containing an optional session-specific
alias. The Alias allows the client to reference a previously transmitted TOKEN
in future messages. The TOKEN value is serialized as follows:</t>
            <figure anchor="moq-token">
              <name>AUTHORIZATION TOKEN value</name>
              <artwork><![CDATA[
TOKEN {
  Alias Type (i),
  [Token Alias (i),]
  [Token Type (i),]
  [Token Value (..)]
}
]]></artwork>
            </figure>
            <ul spacing="normal">
              <li>
                <t>Alias Type - an integer defining both the serialization and the processing
behavior of the receiver. This Alias type has the following code points:</t>
              </li>
            </ul>
            <table>
              <thead>
                <tr>
                  <th align="right">Code</th>
                  <th align="left">Name</th>
                  <th align="left">Serialization and behavior</th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td align="right">0x0</td>
                  <td align="left">DELETE</td>
                  <td align="left">There is an Alias but no Type or Value. This Alias</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">and the Token Value it was previously associated with</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">
                    <bcp14>MUST</bcp14> be retired. Retiring removes them from the pool</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">of actively registered tokens.</td>
                </tr>
                <tr>
                  <td align="right">0x1</td>
                  <td align="left">REGISTER</td>
                  <td align="left">There is an Alias, a Type and a Value. This Alias</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">
                    <bcp14>MUST</bcp14> be associated with the Token Value for the</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">duration of the Session or it is deleted. This action</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">is termed "registering" the Token.</td>
                </tr>
                <tr>
                  <td align="right">0x2</td>
                  <td align="left">USE_ALIAS</td>
                  <td align="left">There is an Alias but no Type or Value. Use the Token</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">Type and Value previously registered with this Alias.</td>
                </tr>
                <tr>
                  <td align="right">0x3</td>
                  <td align="left">USE_VALUE</td>
                  <td align="left">There is no Alias and there is a Type and Value. Use</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">the Token Value as provided. The Token Value may be</td>
                </tr>
                <tr>
                  <td align="right"> </td>
                  <td align="left"> </td>
                  <td align="left">discarded after processing.</td>
                </tr>
              </tbody>
            </table>
            <ul spacing="normal">
              <li>
                <t>Token Alias - a session-specific integer identifier that references a Token
Value. The Token Alias <bcp14>MUST</bcp14> be unique within the Session. Once a Token Alias has
been registered, it cannot be re-registered within the Session without first
being deleted. Use of the Token Alias is optional.</t>
              </li>
              <li>
                <t>Token Type - a numeric identifier for the type of Token payload being
transmitted. This type is defined by the IANA table "MOQT Auth Token Type". See
<xref target="iana"/>. Type 0 is reserved to indicate that the type is not defined in the
table and must be negotiated out-of-band between client and receiver.</t>
              </li>
              <li>
                <t>Token Value - the payload of the Token. The contents and serialization of this
payload are defined by the Token Type.</t>
              </li>
            </ul>
            <t>The receiver of a message containing an invalid AUTHORIZATION TOKEN parameter
<bcp14>MUST</bcp14> reject that message with an <tt>Malformed Auth Token</tt> error. This can be due
to invalid serialization or providing a token value which does not match the
declared Token Type.  The receiver of a message referencing an alias that is
not currently registered <bcp14>MUST</bcp14> reject the message with <tt>Unknown Auth Token
Alias</tt>. The receiver of a message attempting to register an alias which is
already registered <bcp14>MUST</bcp14> close the session with <tt>Duplicate Auth Token Alias</tt>.</t>
            <t>Any message carrying an AUTHORIZATION TOKEN with Alias Type REGISTER that does
not result in <tt>Malformed Auth Token</tt> <bcp14>MUST</bcp14> effect the token registration, even
if the message fails for other reasons, including <tt>Unauthorized</tt>.  This allows
senders to pipeline messages that refer to previously registered tokens.</t>
            <t>If a receiver detects that an authorization token has expired, it <bcp14>MUST</bcp14> retain
the registered alias until it is deleted by the sender, though it <bcp14>MAY</bcp14> discard
other state associated with the token that is no longer needed.  Expiration does
not affect the size occupied by a token in the token cache.  Any message that
references the token with Alias Type USE_ALIAS fails with <tt>Expired Auth Token</tt>.</t>
            <t>Using an Alias to refer to a previously registered Token Value is for efficiency
only and has the same effect as if the Token Value was included directly.
Retiring an Alias that was previously used to authorize a message has no
retroactive effect on the original authorization, nor does it prevent that same
Token Value being re-registered.</t>
            <t>Clients <bcp14>SHOULD</bcp14> only register tokens which they intend to re-use during the session.
Client <bcp14>SHOULD</bcp14> retire previously registered tokens once their utility has passed.</t>
            <t>By registering a Token, the client is requiring the receiver to store the Token
Alias and Token Value until they are retired, or the Session ends. The receiver
can protect its resources by sending a SETUP parameter defining the
MAX_AUTH_TOKEN_CACHE_SIZE <xref target="max-auth-token-cache-size"/> limit it is willing to
accept. If a registration is attempted which would cause this limit to be
exceeded, the receiver <bcp14>MUST</bcp14> termiate the Session with a <tt>Auth Token Cache
Overflow</tt> error.</t>
          </section>
          <section anchor="delivery-timeout">
            <name>DELIVERY TIMEOUT Parameter</name>
            <t>The DELIVERY TIMEOUT parameter (Parameter Type 0x02) <bcp14>MAY</bcp14> appear in a
TRACK_STATUS, 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>The MAX_CACHE_DURATION parameter (Parameter Type 0x04) <bcp14>MAY</bcp14> appear in a
SUBSCRIBE_OK, FETCH_OK or TRACK_STATUS message.  It is an integer expressing
the number of milliseconds an object can be served from a cache. If present,
the relay <bcp14>MUST NOT</bcp14> start forwarding any individual Object received through
this subscription or fetch 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 from cache, their state becomes unknown, and
a relay that handles a downstream request 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) = 0x20,
  Length (i),
  Number of Supported Versions (i),
  Supported Versions (i) ...,
  Number of Parameters (i),
  Setup Parameters (..) ...,
}

SERVER_SETUP Message {
  Type (i) = 0x21,
  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 with <tt>Version Negotiation Failed</tt>.</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, when WebTransport is used, or one the server
does not support, it <bcp14>MUST</bcp14> close the session with Invalid Path.</t>
            <t>The PATH parameter follows the URI formatting rules <xref target="RFC3986"/>.
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. If a PATH does not conform to
these rules, the session <bcp14>MUST</bcp14> be closed with Malformed Path.</t>
          </section>
          <section anchor="max-request-id">
            <name>MAX_REQUEST_ID</name>
            <t>The MAX_REQUEST_ID parameter (Parameter Type 0x02) communicates an initial
value for the Maximum Request ID to the receiving endpoint. The default
value is 0, so if not specified, the peer <bcp14>MUST NOT</bcp14> send requests.</t>
          </section>
          <section anchor="max-auth-token-cache-size">
            <name>MAX_AUTH_TOKEN_CACHE_SIZE</name>
            <t>The MAX_AUTH_TOKEN_CACHE_SIZE parameter (Parameter Type 0x04) communicates the
maximum size in bytes of all actively registered Authorization tokens that the
server is willing to store per Session. This parameter is optional. The default
value is 0 which prohibits the use of token aliases.</t>
            <t>The token size is calculated as 8 bytes + the size of the Token value (see
<xref target="moq-token"/>). The total size as restricted by the MAX_AUTH_TOKEN_CACHE_SIZE
parameter is calculated as the sum of the token sizes for all registered tokens
(Alias Type value of 0x01) minus the sum of the token sizes for all deregistered
tokens (Alias Type value of 0x00), since Session initiation.</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 current URI is reused
instead. The new session URI <bcp14>SHOULD</bcp14> use the same scheme
as the current URL to ensure compatibility.  The maxmimum length of the New
Session URI is 8,192 bytes.  If an endpoint receives a length exceeding the
maximum, it <bcp14>MUST</bcp14> close the session with a Protocol Violation.  </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-max-request-id">
        <name>MAX_REQUEST_ID</name>
        <t>An endpoint sends a MAX_REQUEST_ID message to increase the number of requests
the peer can send within a session.</t>
        <t>The Maximum Request ID <bcp14>MUST</bcp14> only increase within a session, and
receipt of a MAX_REQUEST_ID message with an equal or smaller Request ID
value is a 'Protocol Violation'.</t>
        <figure anchor="moq-transport-max-request-id">
          <name>MOQT MAX_REQUEST_ID Message</name>
          <artwork><![CDATA[
MAX_REQUEST_ID Message {
  Type (i) = 0x15,
  Length (i),
  Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The new Maximum Request ID for the session. If a Request ID equal
or larger than this is received by the endpoint that sent the MAX_REQUEST_ID
in any request message (ANNOUNCE, FETCH, SUBSCRIBE, SUBSCRIBE_ANNOUNCES
or TRACK_STATUS_REQUEST), the endpoint <bcp14>MUST</bcp14> close the session with an error
of 'Too Many Requests'.</t>
          </li>
        </ul>
        <t>MAX_REQUEST_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_REQUEST_ID.
For example, implementations might choose to increase MAX_REQUEST_ID as
subscriptions close to keep the number of subscriptions available roughly
consistent.</t>
      </section>
      <section anchor="message-requests-blocked">
        <name>REQUESTS_BLOCKED</name>
        <t>The REQUESTS_BLOCKED message is sent when an endpoint would like to send a new
request, but cannot because the Request ID would exceed the Maximum Request ID
value sent by the peer.  The endpoint <bcp14>SHOULD</bcp14> send only one REQUESTS_BLOCKED for
a given Maximum Request ID.</t>
        <t>An endpoint <bcp14>MAY</bcp14> send a MAX_REQUEST_ID upon receipt of REQUESTS_BLOCKED, but it
<bcp14>MUST NOT</bcp14> rely on REQUESTS_BLOCKED to trigger sending a MAX_REQUEST_ID, because
sending REQUESTS_BLOCKED is not required.</t>
        <figure anchor="moq-transport-requests-blocked">
          <name>MOQT REQUESTS_BLOCKED Message</name>
          <artwork><![CDATA[
REQUESTS_BLOCKED Message {
  Type (i) = 0x1A,
  Length (i),
  Maximum Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Maximum Request ID: The Maximum Request ID for the session on which the
endpoint is blocked. More on Request ID in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-req">
        <name>SUBSCRIBE</name>
        <t>A subscription causes the publisher to send newly published objects for a track.
A subscriber <bcp14>MUST NOT</bcp14> make multiple active subscriptions for a track within a
single session and publishers <bcp14>SHOULD</bcp14> treat this as a protocol violation.</t>
        <t><strong>Filter Types</strong></t>
        <t>The subscriber specifies a filter on the subscription to allow
the publisher to identify which objects need to be delivered.</t>
        <t>All filters have a Start Location and an optional End Group.  Only objects
published or received via a subscription having Locations greater than or
equal to Start and strictly less than or equal to the End Group (when
present) pass the filter.</t>
        <t>The <tt>Largest Object</tt> is defined to be the object with the largest Location
(<xref target="location-structure"/>) in the track from the perspective of the endpoint
processing the SUBSCRIBE message.</t>
        <t>There are 4 types of filters:</t>
        <t>Latest Object (0x2): The filter Start Location is <tt>{Largest Object.Group,
Largest Object.Object + 1}</tt> and <tt>Largest Object</tt> is communicated in
SUBSCRIBE_OK. If no content has been delivered yet, the filter Start Location is
{0, 0}. There is no End Group - the subscription is open ended.  Note that due
to network reordering or prioritization, relays can receive Objects with
Locations smaller than  <tt>Largest Object</tt> after the SUBSCRIBE is processed, but
these Objects do not pass the Latest Object filter.</t>
        <t>Next Group Start (0x1): The filter start Location is <tt>{Largest Object.Group + 1,
0}</tt> and <tt>Largest Object</tt> is communicated in SUBSCRIBE_OK. If no content has been
delivered yet, the filter Start Location is {0, 0}.  There is no End Group -
the subscription is open ended. For scenarios where the subscriber intends to
start more than one group in the future, it can use an AbsoluteStart filter
instead.</t>
        <t>AbsoluteStart (0x3):  The filter Start Location is specified explicitly in the
SUBSCRIBE message. The <tt>Start</tt> specified in the SUBSCRIBE message <bcp14>MAY</bcp14> be less
than the <tt>Largest Object</tt> observed at the publisher. There is no End Group - the
subscription is open ended.  To receive all Objects that are published or are
received after this subscription is processed, a subscriber can use an
AbsoluteStart filter with <tt>Start</tt> = {0, 0}.</t>
        <t>AbsoluteRange (0x4):  The filer Start Location and End Group are specified
explicitly in the SUBSCRIBE message. The <tt>Start</tt> specified in the SUBSCRIBE
message <bcp14>MAY</bcp14> be less than the <tt>Largest Object</tt> observed at the publisher. If the
specified <tt>End Group</tt> is the same group specified in <tt>Start</tt>, the remainder of
that Group passes the filter. <tt>End Group</tt> <bcp14>MUST</bcp14> specify the same or a larger Group
than specified in <tt>Start</tt>.</t>
        <t>A filter type other than the above <bcp14>MUST</bcp14> be treated as error.</t>
        <t>Subscribe only delivers newly published or received Objects.  Objects from the
past are retrieved using FETCH (<xref target="message-fetch"/>).</t>
        <t>A Subscription can also request a publisher to not forward Objects for a given
track by setting the <tt>Forward</tt> field to 0. This allows the publisher or relay to
prepare to serve the subscription in advance, reducing the time to receive
objects in the future. Relays <bcp14>SHOULD</bcp14> set the <tt>Forward</tt> flag to 1 if a new
subscription needs to be sent upstream, regardless of the value of the <tt>Forward</tt>
field from the downstream subscription. Subscriptions that are not forwarded
consume resources from the publisher, so a publisher might deprioritize, reject,
or close those subscriptions to ensure other subscriptions can be delivered.
Control messages, such as SUBCRIBE_DONE (<xref target="message-subscribe-done"/>) are still
sent.</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),
  Request ID (i),
  Track Alias (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
  Subscriber Priority (8),
  Group Order (8),
  Forward (8),
  Filter Type (i),
  [Start Location (Location)],
  [End Group (i)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <li>
            <t>Track Alias: A session specific identifier for the track.
Data streams and datagrams specify the 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>Forward: If 1, Objects matching the subscription are forwarded
to the subscriber. If 0, Objects are not forwarded to the subscriber.
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>Filter Type: Identifies the type of filter, which also indicates whether
the Start and End Group fields will be present.</t>
          </li>
          <li>
            <t>Start Location: The starting location for this subscriptions. Only present for
"AbsoluteStart" and "AbsoluteRange" filter types.</t>
          </li>
          <li>
            <t>End Group: 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-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 Message {
  Type (i) = 0x4,
  Length (i),
  Request ID (i),
  Expires (i),
  Group Order (8),
  Content Exists (8),
  [Largest Location (Location)],
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE this message is replying to
<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>Content Exists: 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 Location: The location of the largest object available for this track. This
field is only present if Content Exists 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 Message {
  Type (i) = 0x5,
  Length (i),
  Request ID (i),
  Error Code (i),
  Error Reason (Reason Phrase),
  Track Alias (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE this message is replying to
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for subscription failure.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for subscription error. See <xref target="reason-phrase"/>.</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>
            <tr>
              <td align="right">0x10</td>
              <td align="left">Malformed Auth Token</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Unknown Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Expired Auth Token</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The subscriber is not authorized to subscribe to the given
track.</t>
          </li>
          <li>
            <t>Timeout - The subscription could not be completed before an implementation
specific timeout.  For example, a relay could not establish an upstream
subscription within the timeout.</t>
          </li>
          <li>
            <t>Not Supported - The endpoint does not support the SUBSCRIBE method.</t>
          </li>
          <li>
            <t>Track Does Not Exist - The requested track is not available at the publisher.</t>
          </li>
          <li>
            <t>Invalid Range - The end of the SUBSCRIBE range is earlier than the beginning,
or the end of the range has already been published.</t>
          </li>
          <li>
            <t>Retry Track Alias - The publisher requires the subscriber to use the given
Track Alias when subscribing.</t>
          </li>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Unknown Auth Token Alias - Authorization Token refers to an alias that is
not registered (see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Expired Auth Token - Authorization token has expired <xref target="authorization-token"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-update">
        <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 Request 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, End Group <bcp14>MUST</bcp14> be greater than or
equal to the Group specified in <tt>Start</tt>.</t>
        <t>If a parameter included in <tt>SUBSCRIBE</tt> is not present in
<tt>SUBSCRIBE_UPDATE</tt>, its value remains unchanged.  There is no mechanism to
remove a parameter from a subscription.</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),
  Request ID (i),
  Start Location (Location),
  End Group (i),
  Subscriber Priority (8),
  Forward (8),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE (<xref target="message-subscribe-req"/>) this
message is updating.  This <bcp14>MUST</bcp14> match an existing Request ID.</t>
          </li>
          <li>
            <t>Start Location : The starting location.</t>
          </li>
          <li>
            <t>End Group: 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>Forward: If 1, Objects matching the subscription are forwarded
to the subscriber. If 0, Objects are not forwarded to the subscriber.
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>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),
  Request ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the subscription that is being terminated. See
<xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </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),
  Request ID (i),
  Status Code (i),
  Stream Count (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the subscription that is being terminated. See
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Status Code: An integer status code indicating why the subscription ended.</t>
          </li>
          <li>
            <t>Stream Count: An integer indicating the number of data streams the publisher
opened for this subscription.  This helps the subscriber know if it has received
all of the data published in this subscription by comparing the number of
streams received.  The subscriber can immediately remove all subscription state
once the same number of streams have been processed.  If the track had
Forwarding Preference = Datagram, the publisher <bcp14>MUST</bcp14> set Stream Count to 0.  If
the publisher is unable to set Stream Count to the exact number of streams
opened for the subscription, it <bcp14>MUST</bcp14> set Stream Count to 2^62 - 1. Subscribers
<bcp14>SHOULD</bcp14> use a timeout or other mechanism to remove subscription state in case
the publisher set an incorrect value, reset a stream before the SUBGROUP_HEADER,
or set the maximum value.  If a subscriber receives more streams for a
subscription than specified in Stream Count, it <bcp14>MAY</bcp14> close the session with a
Protocol Violation.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for subscription error. See <xref target="reason-phrase"/>.</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>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The subscriber is no longer authorized to subscribe to the
given track.</t>
          </li>
          <li>
            <t>Track Ended - The track is no longer being published.</t>
          </li>
          <li>
            <t>Subscription Ended - The publisher reached the end of an associated
Subscribe filter.</t>
          </li>
          <li>
            <t>Going Away - The subscriber or publisher issued a GOAWAY message.</t>
          </li>
          <li>
            <t>Expired - The publisher reached the timeout specified in SUBSCRIBE_OK.</t>
          </li>
          <li>
            <t>Too Far Behind - The publisher's queue of objects to be sent to the given
subscriber exceeds its implementation defined limit.</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 delivering all available Objects in the requested range in the
requested order. The Objects in the response are delivered on a single
unidirectional stream. Any gaps in the Group and Object IDs in the response
stream indicate objects that do not exist (eg: they implicitly have status
<tt>Object Does Not Exist</tt>).  For Ascending Group Order this includes ranges
between the first requested object and the first object in the stream; between
objects in the stream; and between the last object in the stream and the Largest
Group/Object indicated in FETCH_OK, so long as the fetch stream is terminated by
a FIN.  If no Objects exist in the requested range, the publisher returns
FETCH_ERROR with code <tt>No Objects</tt>.</t>
        <t><strong>Fetch Types</strong></t>
        <t>There are three types of Fetch messages:</t>
        <t>Standalone Fetch (0x1) : A Fetch of Objects performed independently of any Subscribe.</t>
        <t>Relative Joining Fetch (0x2) : A Fetch joined together with a Subscribe by
specifying the Request ID of an active subscription and a relative starting
offset. A publisher receiving a Joining Fetch uses properties of the associated
Subscribe to determine the Track Namespace, Track, Start Group, Start Object,
End Group, and End Object such that it is contiguous with the associated
Subscribe. The Joining Fetch begins the Preceding Group Offset prior to the
associated subscription.</t>
        <t>Absolute Joining Fetch (0x3) : Identical to a Relative Joining Fetch except that the
Start Group is determined by an absolute Group value rather than a relative offset to
the 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, 0x2 or 0x3 <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.  The publisher creates a new unidirectional stream that is used to send the
Objects.  The FETCH_OK or FETCH_ERROR can come at any time relative to object
delivery.</t>
        <t>A relay that has cached objects from the beginning of the range <bcp14>MAY</bcp14> start
sending objects immediately in response to a FETCH.  If it encounters an object
in the requested range that is not cached and has unknown status, the relay <bcp14>MUST</bcp14>
pause subsequent delivery until it has confirmed the object's status upstream.
If the upstream FETCH fails, the relay sends a FETCH_ERROR and can reset the
unidirectional stream.  It can choose to do so immediately or wait until the
cached objects have been delivered before resetting the stream.</t>
        <t>The Object Forwarding Preference does not apply to fetches.</t>
        <t>Fetch specifies an inclusive range of Objects starting at Start Object
in Start Group and ending at End Object in End Group. End Group and End Object <bcp14>MUST</bcp14>
specify the same or a larger Location than Start Group and Start Object.</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),
  Request ID (i),
  Subscriber Priority (8),
  Group Order (8),
  Fetch Type (i),
  [Track Namespace (tuple),
   Track Name Length (i),
   Track Name (..),
   Start Group (i),
   Start Object (i),
   End Group (i),
   End Object (i),]
  [Joining Subscribe ID (i),
   Joining Start (i),]
  Number of Parameters (i),
  Parameters (..) ...
}
]]></artwork>
        </figure>
        <t>Fields common to all Fetch Types:</t>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</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 Standalone, Relative
Joining or Absolute Joining.</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>Start Group: The start Group ID.</t>
          </li>
          <li>
            <t>Start Object: The start Object ID.</t>
          </li>
          <li>
            <t>End Group: The end Group ID.</t>
          </li>
          <li>
            <t>End Object: The end Object ID, plus 1. A value of 0 means the entire group is
requested.</t>
          </li>
        </ul>
        <t>Fields present only for Relative Fetch (0x2) and Absolute Fetch (0x3):</t>
        <ul spacing="normal">
          <li>
            <t>Joining Subscribe ID: The Request ID of the existing subscription to be
joined. If a publisher receives a Joining Fetch with a Request ID that does
not correspond to an existing Subscribe in the same session, it <bcp14>MUST</bcp14> respond
with a Fetch Error with code Invalid Joining Subscribe ID.</t>
          </li>
          <li>
            <t>Joining Start : for a Relative Joining Fetch (0x2), this value represents 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. For an Absolute Joining Fetch (0x3), this value represents
the Starting Group ID.</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 End Group and End Object 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 Start Group/Start Object is greater than the latest published Object group,
the publisher <bcp14>MUST</bcp14> return FETCH_ERROR with error code 'Invalid Range'.</t>
        <section anchor="calculating-the-range-of-a-relative-joining-fetch">
          <name>Calculating the Range of a Relative 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 Relative 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
Content Exists value of 0, the publisher <bcp14>MUST</bcp14> respond with a FETCH_ERROR with
error code 'Invalid Range'.</t>
          <t>The publisher receiving a Relative Joining Fetch computes the range as follows:</t>
          <ul spacing="normal">
            <li>
              <t>Fetch Start Group: Subscribe Largest Group - Joining start</t>
            </li>
            <li>
              <t>Fetch Start Object: 0</t>
            </li>
            <li>
              <t>Fetch End Group: Subscribe Largest Group</t>
            </li>
            <li>
              <t>Fetch End Object: Subscribe Largest Object</t>
            </li>
          </ul>
          <t>A Fetch End Object 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 End Group if Fetch End Object is 0.</t>
        </section>
        <section anchor="calculating-the-range-of-an-absolute-joining-fetch">
          <name>Calculating the Range of an Absolute Joining Fetch</name>
          <t>Identical to the Relative Joining fetch except that Fetch Start Group is the
Joining Start value.</t>
        </section>
      </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 end group and object are known.</t>
        <figure anchor="moq-transport-fetch-ok">
          <name>MOQT FETCH_OK Message</name>
          <artwork><![CDATA[
FETCH_OK Message {
  Type (i) = 0x18,
  Length (i),
  Request ID (i),
  Group Order (8),
  End Of Track (8),
  End Location (Location),
  Number of Parameters (i),
  Subscribe Parameters (..) ...
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the FETCH this message is replying to
<xref target="message-subscribe-req"/>.</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 End Group ID and Object Id indicate the last Object in the track,
0 if not.</t>
          </li>
          <li>
            <t>End Location: The largest object covered by the FETCH response.
This is the minimum of the {End Group,End Object} specified in FETCH and the
largest known {group,object}.  If the relay is currently subscribed to the
track, the largest known {group,object} at the relay is used.  For tracks
with a requested end larger than what is cached without an active
subscription, the relay makes an upstream request in order to satisfy the
FETCH.</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 Message {
  Type (i) = 0x19,
  Length (i),
  Request ID (i),
  Error Code (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the FETCH this message is replying to
<xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for fetch failure.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for fetch error. See <xref target="reason-phrase"/>.</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>
            <tr>
              <td align="right">0x6</td>
              <td align="left">No Objects</td>
            </tr>
            <tr>
              <td align="right">0x7</td>
              <td align="left">Invalid Joining Subscribe ID</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">Malformed Auth Token</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Unknown Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Expired Auth Token</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The subscriber is not authorized to fetch from the given
track.</t>
          </li>
          <li>
            <t>Timeout - The fetch could not be completed before an implementation
specific timeout.  For example, a relay could not FETCH missing objects
within the timeout.</t>
          </li>
          <li>
            <t>Not supported - The endpoint does not support the FETCH method.</t>
          </li>
          <li>
            <t>Track Does Not Exist - The requested track is not available at the publisher.</t>
          </li>
          <li>
            <t>Invalid Range - The end of the requested range is earlier than the beginning,
the start of the requested range is beyond the Largest Object, or the track
has not published any Objects yet.</t>
          </li>
          <li>
            <t>No Objects - No Objects exist between the requested Start and End Locations.</t>
          </li>
          <li>
            <t>Invalid Joining Subscribe ID - The joining Fetch referenced a Request ID that
did not belong to an active Subscription.</t>
          </li>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Unknown Auth Token Alias - Authorization Token refers to an alias that is
not registered (see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Expired Auth Token - Authorization token has expired <xref target="authorization-token"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="message-fetch-cancel">
        <name>FETCH_CANCEL</name>
        <t>A subscriber sends a FETCH_CANCEL message to a publisher to indicate it is no
longer interested in receiving objects for the fetch identified by the 'Request
ID'. The publisher <bcp14>SHOULD</bcp14> promptly close the unidirectional stream, even if it
is in the middle of delivering an object.</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),
  Request ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the FETCH (<xref target="message-fetch"/>) this message is
cancelling.</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),
  Request ID (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</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>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</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),
  Request ID (i),
  Status Code (i),
  Largest Location (Location),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the TRACK_STATUS_REQUEST this message is
replying to <xref target="message-track-status"/>.</t>
          </li>
          <li>
            <t>Status Code: 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>
          </li>
        </ul>
        <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>TODO: Auth Failures</t>
        <ul spacing="normal">
          <li>
            <t>Largest Location: represents the largest Object location observed by the
Publisher for an active subscription. If the publisher is a relay without an
active subscription, it <bcp14>SHOULD</bcp14> send a TRACK_STATUS_REQUEST upstream or <bcp14>MAY</bcp14>
subscribe to the track, to obtain the same information. If neither is possible,
it should return the best available information with status code 0x04.</t>
          </li>
        </ul>
        <t>The <tt>Parameters</tt> are defined in <xref target="version-specific-params"/>.</t>
      </section>
      <section anchor="message-announce">
        <name>ANNOUNCE</name>
        <t>The publisher sends the ANNOUNCE control message to advertise that it has
tracks available 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),
  Request ID (i),
  Track Namespace (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <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-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),
  Request ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the ANNOUNCE this message is replying to
<xref target="message-announce"/>.</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),
  Request ID (i),
  Error Code (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the ANNOUNCE this message is replying to
<xref target="message-announce"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for announcement failure.</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for announcement error. See <xref target="reason-phrase"/>.</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>
            <tr>
              <td align="right">0x10</td>
              <td align="left">Malformed Auth Token</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Unknown Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Expired Auth Token</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The subscriber is not authorized to announce the given
namespace.</t>
          </li>
          <li>
            <t>Timeout - The announce could not be completed before an implementation
specific timeout.</t>
          </li>
          <li>
            <t>Not Supported - The endpoint does not support the ANNOUNCE method.</t>
          </li>
          <li>
            <t>Uninterested - The namespace is not of interest to the endpoint.</t>
          </li>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Unknown Auth Token Alias - Authorization Token refers to an alias that is
not registered (see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Expired Auth Token - Authorization token has expired <xref target="authorization-token"/>).</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-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),
  Error Reason (Reason Phrase),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for canceling the announcement.
ANNOUNCE_CANCEL uses the same error codes as ANNOUNCE_ERROR
(<xref target="message-announce-error"/>).</t>
          </li>
          <li>
            <t>Error Reason: Provides the reason for announcement cancelation. See <xref target="reason-phrase"/>.</t>
          </li>
        </ul>
      </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),
  Request ID (i),
  Track Namespace Prefix (tuple),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: See <xref target="request-id"/>.</t>
          </li>
          <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 Namespace Prefix 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-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 Message {
  Type (i) = 0x12,
  Length (i),
  Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE_ANNOUNCES this message is replying
to <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 Message {
  Type (i) = 0x13,
  Length (i),
  Request ID (i),
  Error Code (i),
  Error Reason (Reason Phrase)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the SUBSCRIBE_ANNOUNCES this message is replying
to <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>Error Reason: Provides the reason for the namespace subscription error.
See <xref target="reason-phrase"/>.</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>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Namespace Prefix Overlap</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">Malformed Auth Token</td>
            </tr>
            <tr>
              <td align="right">0x11</td>
              <td align="left">Unknown Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x12</td>
              <td align="left">Expired Auth Token</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The subscriber is not authorized to subscribe to the given
namespace prefix.</t>
          </li>
          <li>
            <t>Timeout - The operation could not be completed before an implementation
specific timeout.</t>
          </li>
          <li>
            <t>Not Supported - The endpoint does not support the SUBSCRIBE_ANNOUNCES method.</t>
          </li>
          <li>
            <t>Namespace Prefix Unknown - The namespace prefix is not available for
subscription.</t>
          </li>
          <li>
            <t>Namespace Prefix Overlap - The namespace prefix overlaps with another
SUBSCRIBE_ANNOUNCES in the same session.</t>
          </li>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Unknown Auth Token Alias - Authorization Token refers to an alias that is
not registered (see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Expired Auth Token - Authorization token has expired <xref target="authorization-token"/>).</t>
          </li>
        </ul>
      </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>
    <section anchor="data-streams">
      <name>Data Streams and Datagrams</name>
      <t>A publisher sends Objects matching a subscription on Data Streams or Datagrams.</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">0x08-0x0D</td>
            <td align="left">SUBGROUP_HEADER  (<xref target="subgroup-header"/>)</td>
          </tr>
          <tr>
            <td align="right">0x05</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">0x00-0x01</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-datagram"/>)</td>
          </tr>
          <tr>
            <td align="right">0x02-0x03</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 Objects via both Subgroup streams and Datagrams in
response to a SUBSCRIBE, it <bcp14>SHOULD</bcp14> close the session with an error of 'Protocol
Violation'</t>
      <section anchor="message-object">
        <name>Objects</name>
        <t>An Object contains a range of contiguous bytes 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-properties">
          <name>Canonical Object Properties</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.</t>
            </li>
            <li>
              <t>Publisher Priority: An 8 bit integer indicating the publisher's priority for
the Object <xref target="priorities"/>.</t>
            </li>
            <li>
              <t>Object Forwarding Preference: An enumeration indicating how a publisher sends
an object. The preferences are Subgroup and Datagram.  When in response to a
SUBSCRIBE, 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
Datagram.</t>
            </li>
            <li>
              <t>Object Status: As enumeration used to indicate missing
objects or mark the end of a group or track. See <xref target="object-status"/> below.</t>
            </li>
            <li>
              <t>Object Extension Length: The total length of the Object Extension Headers
block, in bytes.</t>
            </li>
            <li>
              <t>Object Extensions : A sequence of Object Extension Headers. See
<xref target="object-extensions"/> below.</t>
            </li>
            <li>
              <t>Object Payload: An opaque payload intended for an End Subscriber and <bcp14>SHOULD
NOT</bcp14> be processed by a relay. Only present when 'Object Status' is Normal (0x0).</t>
            </li>
          </ul>
          <section anchor="object-status">
            <name>Object Status</name>
            <t>The Object Status informs subscribers what objects will not be received
because they were never produced, are no longer available, or because they
are beyond the end of a group or track.</t>
            <t><tt>Status</tt> can have following values:</t>
            <ul spacing="normal">
              <li>
                <t>0x0 := Normal object. This status is implicit for any non-zero length object.
       Zero-length objects explicitly encode the Normal status.</t>
              </li>
              <li>
                <t>0x1 := Indicates Object does not exist. Indicates that this object
       does not exist at any publisher and it will not be published in
       the future. This <bcp14>SHOULD</bcp14> be cached.</t>
              </li>
              <li>
                <t>0x3 := Indicates end of Group. ObjectId is one greater that the
       largest object produced in the group identified by the
       GroupID. This is sent right after the last object in the
       group. If the ObjectID is 0, it indicates there are no Objects
       in this Group. This <bcp14>SHOULD</bcp14> be cached. A publisher <bcp14>MAY</bcp14> use an end of
       Group object to signal the end of all open Subgroups in a Group.</t>
              </li>
              <li>
                <t>0x4 := Indicates end of Track. GroupID is either the largest group produced
       in this track and the ObjectID is one greater than the largest object
       produced in that group, or GroupID is one greater than the largest
       group produced in this track and the ObjectID is zero. This status
       also indicates the last group has ended. An object with this status
       that has a Group ID less than any other GroupID, or an ObjectID less
       than or equal to the largest in the specified group, 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>
          </section>
          <section anchor="object-extensions">
            <name>Object Extension Header</name>
            <t>Any Object may have extension headers except those with Object Status 'Object
Does Not Exist'.  If an endpoint receives a non-existent Object containing
extension headers it <bcp14>MUST</bcp14> close the session with a Protocol Violation.</t>
            <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 Key-Value-Pairs <xref target="moq-key-value-pair"/>.</t>
            <t>Header types are registered in the IANA table 'MOQ Extension Headers'.
See <xref target="iana"/>.</t>
          </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 {
  Type (i),
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  [Extension Headers Length (i),
  Extension headers (...)],
  Object Payload (..),
}
]]></artwork>
        </figure>
        <t>The Type field takes the form 0b0000000X (or the set of values from 0x00 to
0x01). The LSB of the type determines if the Extensions Headers Length and
Extension headers are present. If an endpoint receives a datagram with Type
0x01 and Extension Headers Length is 0, it <bcp14>MUST</bcp14> close the session with Protocol
Violation.</t>
        <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 OBJECT_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 {
  Type (i),
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  [Extension Headers Length (i),
  Extension headers (...)],
  Object Status (i),
}
]]></artwork>
        </figure>
        <t>The Type field takes the form 0b0000001X (or the set of values from 0x02 to
0x03). The LSB of the type determines if the Extensions Headers Length and
Extension headers are present. If an endpoint receives a datagram with Type
0x03 and Extension Headers Length is 0, it <bcp14>MUST</bcp14> close the session with Protocol
Violation.</t>
      </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="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="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 {
  Type (i),
  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>There are 6 defined Type values for SUBGROUP_HEADER:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">Subgroup ID</th>
                <th align="left">Subgroup ID</th>
                <th align="left">Extensions</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left"> </td>
                <td align="left">Field Present</td>
                <td align="left">Value</td>
                <td align="left">Present</td>
              </tr>
              <tr>
                <td align="left">0x08</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x09</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x0A</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x0B</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x0C</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x0D</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
              </tr>
            </tbody>
          </table>
          <t>For Type values where Subgroup ID Field Present is No, there is no explicit
Subgroup ID field in the header and the Subgroup ID is either 0 (for Types
0x08-09) or the Object ID of the first object transmitted in this subgroup
(for Types 0x0A-0B).</t>
          <t>For Type values where Extensions Present is No, Extensions Headers Length is
not present and all Objects have no extensions.  When Extensions Present is
Yes, Extension Headers Length is present in all Objects in this subgroup.
Objects with no extensions set Extension Headers Length to 0.</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 Object Fields</name>
            <artwork><![CDATA[
{
  Object ID (i),
  [Extension Headers Length (i),
  Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>A publisher <bcp14>MUST NOT</bcp14> send an Object on a stream if its Object ID is less than a
previously sent Object ID within a given group in that stream.</t>
        </section>
        <section anchor="closing-subgroup-streams">
          <name>Closing Subgroup Streams</name>
          <t>Subscribers will often need to know if they have received all objects in a
Subgroup, particularly if they serve as a relay or cache. QUIC and Webtransport
streams provide signals that can be used for this purpose. Closing Subgroups
promptly frees system resources and often unlocks flow control credit to open
more streams.</t>
          <t>If a sender has delivered all objects in a Subgroup to the QUIC stream, except
any objects before the beginning of a subscription, it <bcp14>MUST</bcp14> close the
stream with a FIN.</t>
          <t>If a sender closes the stream before delivering all such objects to the QUIC
stream, it <bcp14>MUST</bcp14> use a RESET_STREAM or RESET_STREAM_AT
<xref target="I-D.draft-ietf-quic-reliable-stream-reset"/> frame. This includes an open
Subgroup exceeding its Delivery Timeout, early termination of subscription due to
an UNSUBSCRIBE message, a publisher's decision to end the subscription early, or a
SUBSCRIBE_UPDATE moving the end of the subscription to before the current Group
or the start after the current Group.  When RESET_STREAM_AT is used, the
reliable_size <bcp14>SHOULD</bcp14> include the stream header so the receiver can identify the
corresponding subscription and accurately account for reset data streams when
handling SUBSCRIBE_DONE (see <xref target="message-subscribe-done"/>).  Publishers that reset
data streams without using RESET_STREAM_AT with an appropriate reliable_size can
cause subscribers to hold on to subscription state until a timeout expires.</t>
          <t>A sender might send all objects in a Subgroup and the FIN on a QUIC stream,
and then reset the stream. In this case, the receiving application would receive
the FIN if and only if all objects were received. If the application receives
all data on the stream and the FIN, it can ignore any RESET_STREAM it receives.</t>
          <t>If a sender will not deliver any objects from a Subgroup, it <bcp14>MAY</bcp14> send
a SUBGROUP_HEADER on a new stream, with no objects, and then send RESET_STREAM_AT
with a reliable_size equal to the length of the stream header. This explicitly
tells the receiver there is an unsent Subgroup.</t>
          <t>A relay <bcp14>MUST NOT</bcp14> forward an Object on an existing Subgroup stream unless it is
the next Object in that Subgroup.  A relay knows that an Object is the next
Object in the Subgroup if at least one of the following is true:
 * the Object ID is one greater than the previous Object sent on this Subgroup
   stream.
 * the Object was received on the same upstream Subgroup stream as the
   previously sent Object on the downstream Subgroup stream, with no other
   Objects in between.
 * it knows all Object IDs between the current and previous Object IDs
   on the Subgroup stream belong to different Subgroups or do not exist.</t>
          <t>If the relay does not know if an Object is the next Object, it <bcp14>MUST</bcp14> reset the
Subgroup stream and open a new one to forward it.</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>
          <t>The application <bcp14>SHOULD</bcp14> use a relevant error code in RESET_STREAM or
RESET_STREAM_AT, 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">Cancelled</td>
              </tr>
              <tr>
                <td align="right">0x2</td>
                <td align="left">Delivery Timeout</td>
              </tr>
              <tr>
                <td align="right">0x3</td>
                <td align="left">Session Closed</td>
              </tr>
            </tbody>
          </table>
          <dl>
            <dt>Internal Error:</dt>
            <dd>
              <t>An implementation specific error</t>
            </dd>
            <dt>Cancelled:</dt>
            <dd>
              <t>The subscriber requested cancellation via UNSUBSCRIBE, FETCH_CANCEL or
STOP_SENDING, or the publisher ended the subscription, in which case
SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>) will have a more detailed
status code.</t>
            </dd>
            <dt>Delivery Timeout:</dt>
            <dd>
              <t>The DELIVERY TIMEOUT <xref target="delivery-timeout"/> was exceeded for this
stream</t>
            </dd>
            <dt>Session Closed:</dt>
            <dd>
              <t>The publisher session is being closed</t>
            </dd>
          </dl>
        </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>Request ID</tt>.</t>
          <figure anchor="fetch-header-format">
            <name>MOQT FETCH_HEADER</name>
            <artwork><![CDATA[
FETCH_HEADER {
  Request ID (i),
}
]]></artwork>
          </figure>
          <t>Each object sent on a fetch stream after the FETCH_HEADER has the following format:</t>
          <figure anchor="object-fetch-format">
            <name>MOQT Fetch Object Fields</name>
            <artwork><![CDATA[
{
  Group ID (i),
  Subgroup ID (i),
  Object ID (i),
  Publisher Priority (8),
  Extension Headers Length (i),
  [Extension headers (...)],
  Object Payload Length (i),
  [Object Status (i)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>The Object Status field is only sent if the Object Payload Length is zero.</t>
          <t>The Subgroup ID field of an object with a Forwarding Preference of "Datagram"
(see <xref target="object-properties"/>) 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 {
  Type = 0
  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

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

]]></artwork>
      </section>
    </section>
    <section anchor="extension-headers">
      <name>Extension Headers</name>
      <t>The following Object Extension Headers are defined in MoQT.</t>
      <section anchor="prior-group-id-gap">
        <name>Prior Group ID Gap</name>
        <t>Prior Group ID Gap (Extension Header Type 0x40) is a variable length integer
containing the number of Groups prior to the current Group that do not and will
never exist. For example, if the Original Publisher published an Object in Group
7 and knows it will never publish any Objects in Group 8 or Group 9, it can
include Prior Group ID Gap = 2 in any number of Objects in Group 10, as it sees
fit.  A track with a Group that contains more than one Object with different
values for Prior Group ID Gap or has a Prior Group ID Gap larger than the Group
ID is considered malformed.  If an endpoint receives an Object with a Group ID
within a previously communicated gap it also treats the track as malformed.</t>
        <t>This extension is optional, as publishers might not know the prior gap gize, or
there may not be a gap. If Prior Group ID Gap is not present, the receiver
cannot infer any information about the existence of prior groups (see
<xref target="group-ordering"/>).</t>
        <t>This extension can be added by the Original Publisher, but <bcp14>MUST NOT</bcp14> be added by
relays. This extension <bcp14>MUST NOT</bcp14> be modified or removed.</t>
      </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 an application 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>
        <li>
          <t>MOQT Auth Token Type</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>
      <t>The original design behind this protocol was inspired by three independent
proposals: WARP <xref target="I-D.draft-lcurley-warp"/> by Luke Curley, RUSH
<xref target="I-D.draft-kpugin-rush"/> by Kirill Pugin, Nitin Garg, Alan Frindell, Jordi
Cenzano and Jake Weissman, and QUICR <xref target="I-D.draft-jennings-moq-quicr-proto"/> by
Cullen Jennings, Suhas Nandakumar and Christian Huitema.  The authors of those
documents merged their proposals to create the first draft of moq-transport.
The IETF MoQ Working Group received an enormous amount of support from many
people. The following people provided substantive contributions to this
document:</t>
      <ul spacing="normal">
        <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>Kirill Pugin</t>
        </li>
        <li>
          <t>Luke Curley</t>
        </li>
        <li>
          <t>Martin Duke</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="3" month="March" year="2025"/>
            <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-12"/>
        </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="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>
        <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>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
        <reference anchor="I-D.ietf-webtrans-overview">
          <front>
            <title>The WebTransport Protocol Framework</title>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="25" month="February" year="2025"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with an abstract model that allows them to be used interchangeably.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-09"/>
        </reference>
        <reference anchor="RFC9438">
          <front>
            <title>CUBIC for Fast and Long-Distance Networks</title>
            <author fullname="L. Xu" initials="L." surname="Xu"/>
            <author fullname="S. Ha" initials="S." surname="Ha"/>
            <author fullname="I. Rhee" initials="I." surname="Rhee"/>
            <author fullname="V. Goel" initials="V." surname="Goel"/>
            <author fullname="L. Eggert" initials="L." role="editor" surname="Eggert"/>
            <date month="August" year="2023"/>
            <abstract>
              <t>CUBIC is a standard TCP congestion control algorithm that uses a cubic function instead of a linear congestion window increase function to improve scalability and stability over fast and long-distance networks. CUBIC has been adopted as the default TCP congestion control algorithm by the Linux, Windows, and Apple stacks.</t>
              <t>This document updates the specification of CUBIC to include algorithmic improvements based on these implementations and recent academic work. Based on the extensive deployment experience with CUBIC, this document also moves the specification to the Standards Track and obsoletes RFC 8312. This document also updates RFC 5681, to allow for CUBIC's occasionally more aggressive sending behavior.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9438"/>
          <seriesInfo name="DOI" value="10.17487/RFC9438"/>
        </reference>
        <reference anchor="RFC6582">
          <front>
            <title>The NewReno Modification to TCP's Fast Recovery Algorithm</title>
            <author fullname="T. Henderson" initials="T." surname="Henderson"/>
            <author fullname="S. Floyd" initials="S." surname="Floyd"/>
            <author fullname="A. Gurtov" initials="A." surname="Gurtov"/>
            <author fullname="Y. Nishida" initials="Y." surname="Nishida"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>RFC 5681 documents the following four intertwined TCP congestion control algorithms: slow start, congestion avoidance, fast retransmit, and fast recovery. RFC 5681 explicitly allows certain modifications of these algorithms, including modifications that use the TCP Selective Acknowledgment (SACK) option (RFC 2883), and modifications that respond to "partial acknowledgments" (ACKs that cover new data, but not all the data outstanding when loss was detected) in the absence of SACK. This document describes a specific algorithm for responding to partial acknowledgments, referred to as "NewReno". This response to partial acknowledgments was first proposed by Janey Hoe. This document obsoletes RFC 3782. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6582"/>
          <seriesInfo name="DOI" value="10.17487/RFC6582"/>
        </reference>
        <reference anchor="I-D.draft-lcurley-warp">
          <front>
            <title>Warp - Live Media Transport over QUIC</title>
            <author fullname="Luke Curley" initials="L." surname="Curley">
              <organization>Twitch</organization>
            </author>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
              <organization>Google</organization>
            </author>
            <date day="13" month="March" year="2023"/>
            <abstract>
              <t>   This document defines the core behavior for Warp, a live media
   transport protocol over QUIC.  Media is split into objects based on
   the underlying media encoding and transmitted independently over QUIC
   streams.  QUIC streams are prioritized based on the delivery order,
   allowing less important objects to be starved or dropped during
   congestion.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-lcurley-warp-04"/>
        </reference>
        <reference anchor="I-D.draft-kpugin-rush">
          <front>
            <title>RUSH - Reliable (unreliable) streaming protocol</title>
            <author fullname="Kirill Pugin" initials="K." surname="Pugin">
              <organization>Meta</organization>
            </author>
            <author fullname="Nitin Garg" initials="N." surname="Garg">
              <organization>Meta</organization>
            </author>
            <author fullname="Alan Frindell" initials="A." surname="Frindell">
              <organization>Meta</organization>
            </author>
            <author fullname="Jorge Cenzano Ferret" initials="J. C." surname="Ferret">
              <organization>Meta</organization>
            </author>
            <author fullname="Jake Weissman" initials="J." surname="Weissman">
              <organization>Meta</organization>
            </author>
            <date day="21" month="April" year="2025"/>
            <abstract>
              <t>   RUSH is an application-level protocol for ingesting live video.  This
   document describes the protocol and how it maps onto QUIC.

Discussion Venues

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

   Discussion of this document takes place on the mailing list (), which
   is archived at .

   Source for this draft and an issue tracker can be found at
   https://github.com/afrind/draft-rush.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-kpugin-rush-03"/>
        </reference>
        <reference anchor="I-D.draft-jennings-moq-quicr-proto">
          <front>
            <title>QuicR - Media Delivery Protocol over QUIC</title>
            <author fullname="Cullen Fluffy Jennings" initials="C. F." surname="Jennings">
              <organization>cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Christian Huitema" initials="C." surname="Huitema">
              <organization>Private Octopus Inc.</organization>
            </author>
            <date day="11" month="July" year="2022"/>
            <abstract>
              <t>   Recently new use cases have emerged requiring higher scalability of
   media delivery for interactive realtime applications and much lower
   latency for streaming applications and a combination thereof.

   draft-jennings-moq-arch specifies architectural aspects of QuicR, a
   media delivery protocol based on publish/subscribe metaphor and Relay
   based delivery tree, that enables a wide range of realtime
   applications with different resiliency and latency needs.

   This specification defines the protocol aspects of the QuicR media
   delivery architecture.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-jennings-moq-quicr-proto-01"/>
        </reference>
      </references>
    </references>
    <?line 3461?>

<section anchor="change-log">
      <name>Change Log</name>
      <t>RFC Editor's Note: Please remove this section prior to publication of a final version of this document.</t>
      <t>Issue and pull request numbers are listed with a leading octothorp.</t>
      <section anchor="since-draft-ietf-moq-transport-10">
        <name>Since draft-ietf-moq-transport-10</name>
        <ul spacing="normal">
          <li>
            <t>Added Common Structure definitions - Location, Key-Value-Pair and Reason
Phrase</t>
          </li>
          <li>
            <t>Limit lengths of all variable length fields, including Track Namespace and Name</t>
          </li>
          <li>
            <t>Control Message length is now 16 bits instead of variable length</t>
          </li>
          <li>
            <t>Subscribe ID became Request ID, and was added to most control messages. Request ID
is used to correlate OK/ERROR responses for ANNOUNCE, SUBSCRIBE_ANNOUNCES,
and TRACK_STATUS.  Like Subscribe ID, Request IDs are flow controlled.</t>
          </li>
          <li>
            <t>Explain rules for caching in more detail</t>
          </li>
          <li>
            <t>Changed the SETUP parameter format for even number parameters to match the
Object Header Extension format</t>
          </li>
          <li>
            <t>Rotated SETUP code points</t>
          </li>
          <li>
            <t>Added Parameters to TRACK_STATUS and TRACK_STATUS_REQUEST</t>
          </li>
          <li>
            <t>Clarified how subscribe filters work</t>
          </li>
          <li>
            <t>Added Next Group Filter to SUBSCRIBE</t>
          </li>
          <li>
            <t>Added Forward flag to SUBSCRIBE</t>
          </li>
          <li>
            <t>Renamed FETCH_OK field to End and clarified how to set it</t>
          </li>
          <li>
            <t>Added Absolute Joining Fetch</t>
          </li>
          <li>
            <t>Clarified No Error vs Invalid Range FETCH_ERROR cases</t>
          </li>
          <li>
            <t>Use bits in SUBGROUP_HEADER and DATAGRAM* types to compress subgroup ID and
extensions</t>
          </li>
          <li>
            <t>Coalesced END_OF_GROUP and END_OF_TRACK_AND_GROUP status</t>
          </li>
          <li>
            <t>Objects that Do Not Exist cannot have extensions when sent on the wire</t>
          </li>
          <li>
            <t>Specified error codes for resetting data streams</t>
          </li>
          <li>
            <t>Defined an Object Header Extension for communicating a known Group ID gap</t>
          </li>
          <li>
            <t>Replaced AUTHORIZATION_INFO with AUTHORIZATION_TOKEN, which has more structure,
compression, and additional Auth related error codes (#760)</t>
          </li>
        </ul>
      </section>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+y9/Xbc1pUn+v95CrS81uhjqkqi5Dg205k0JVE2JxKpiJRz
e9IeEaxCkWgXgWoAJYpR1M8yz3Kf7O7vsw+AoiRHzr2z7nit7ogo4Hzus8/+
/O3pdBq6slsVu9mtF8WizLP6bdFkf3p98CQ7afKqXddNdyvkZ2dN8XY3u6z/
Y9rp47Co51V+CZ8umnzZTcuiW06TN6Y7O2GRd/DG+6d7J/sfwhz+OK+b692s
7RYhlOtmN+uaTds9fPDguwcPQ94U+W6W3fpzcZbl1SI7qLqiqYrOj6XdnF2W
bVvW1cn1Gpo+2D95Fq7q5ufzpt6sbR5HOo9b4efiGn5f7IZsml3GSf7HppyH
t0W1KeCXbOvXWdZRP7f+DH2U1Xn2Pb6Jzy/zcgXPYcr/gnOf1c05Ps6b+QU8
vui6dbt7/z6+hY/Kt8VMX7uPD+6fNfVVW9yH7+/jd+dld7E54wanV+f3k6XE
F1awem3nm6YXZ/zhrKzTT+5v25bZRXe5uhVC28Eav8lXdQXTuy7a0F7mTffm
PzY19LObVXVYl7vZX7p6Psla+K4pli386/qS/wHbf5mv17AkP4WQb7qLusGF
nML/ZVlZQQvHs+wQush/3kDD9Jjp5Xhzkbf9n2BZ8qr8a97Bzu5mT8p2XtPz
gpe5rfj1f5njL7N5fRnSzn6cZT/mbbkqi7euqx/LeVc36S9pT9/X9fmq8F29
xZffvv2Xc/plpKuDWXZ8VXSd6+cgr9yzj/VQwk7gy74L/Lmp8SQCBcKYe33u
zbJnTVktitXKdbu3gn6T52nXL4ou9x3nS3z3Xy7h8ZZOq7q5hI/f0qHAE7Cb
vXr25LsHDx7A33Au7STCnKdPiaKnV8UZEdcUCfMRnOtqGVsJ0+k0y89aeGPe
hXByUbZIOpvLouqyRbEsq6LNuosim9dNkZ0VF/nbEnYMWsi2cqRw58XRn07u
TrJcDrTRdrZuaiDYegVNt+V5VSyyrs7qddHA4XFNATEFP5tJdnVRzi8y6L3I
2vISz2y23FRzXMd8VXbXswz7zPLVCk4tdAwdLTZzaK9eBhlEna03Z6uyvciA
6+XEwai9soPJVS1MeZG9hReBhbXzplxj29nZdZaHy82qK9ercg4dQYNZUS3W
dVl17Sw76OD9NY6xBUoAfkiddbhe8BeuYQlrW55tsLUAzBJ5YUud40rrKuB6
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
6LMvn29+7v4XrBW6xLcwAgA=

-->

</rfc>
