<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.4) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-ietf-moq-transport-12" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.29.0 -->
  <front>
    <title abbrev="moq-transport">Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-12"/>
    <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 an 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>Stream:</dt>
          <dd>
            <t>A bidirectional or unidirectional bytestream provided by the
QUIC transport or WebTransport.</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>In this document, the constituent parts of any Location A can be referred to
using A.Group or A.Object.</t>
          <t>Location A &lt; Location B if:</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 media.
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 (see <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 Groups starting from a given Group ID.
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 (where "time" is defined according to the internal clock of the media
being sent). 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>
          <t>Note that the increase in time between two groups is not defined by the protocol.</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 MOQT 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>
      <section anchor="malformed-tracks">
        <name>Malformed Tracks</name>
        <t>There are multiple ways a publisher can transmit a Track that does not conform
to MoQT constraints. Such a Track is considered malformed.  Some example
conditions that constitute a malformed track when detected by a receiver
include:</t>
        <ol spacing="normal" type="1"><li>
            <t>An Object is received on a Subgroup stream whose Object ID is not strictly
larger than the previous Object received on the same Subgroup.</t>
          </li>
          <li>
            <t>An Object is received in a FETCH response with the same Group as the
previous Object, but whose Object ID is not strictly larger than the previous
object.</t>
          </li>
          <li>
            <t>An Object is received in an Ascending FETCH response whose Group ID is smaller
than the previous Object in the response.</t>
          </li>
          <li>
            <t>An Object is received in a Descending FETCH response whose Group ID is larger
than the previous Object in the resopnse.</t>
          </li>
          <li>
            <t>A Subgroup or FETCH response is terminated with a FIN in the middle of an
Object</t>
          </li>
          <li>
            <t>An Object is received whose Object ID is larger than the final Object in the
Subgroup.  The final Object in a Subgroup is the last Object received on a
Subgroup stream before a FIN.</t>
          </li>
          <li>
            <t>A Subgroup is received with two or more different final Objects.</t>
          </li>
          <li>
            <t>An Object is received in a Group whose Object ID is larger than the final
Object in the Group.  The final Object in a Group is the Object with Status
END_OF_GROUP or the last Object sent in a FETCH that requested the entire
Group.</t>
          </li>
          <li>
            <t>An Object is received on a Track whose Group and Object ID are larger than the
final Object in the Track.  The final Object in a Track is the Object with
Status END_OF_TRACK or the last Object sent in a FETCH whose response indicated
End of Track.</t>
          </li>
          <li>
            <t>The same Object is received more than once with different Payload or
other immutable properties.</t>
          </li>
          <li>
            <t>An Object is received with a different Forwarding Preference than previously
observed from the same Track.</t>
          </li>
        </ol>
        <t>The above list of conditions is not considered exhaustive.</t>
        <t>When a subscriber detects a Malformed Track, it <bcp14>MUST</bcp14> UNSUBSCRIBE from the
Track and <bcp14>SHOULD</bcp14> deliver an error to the application.  If a relay detects a
Malformed Track, it <bcp14>MUST</bcp14> immediately terminate downstream subscriptions with
SUBSCRIBE_DONE with Status Code <tt>Malformed Track</tt>.</t>
        <section anchor="track-scope">
          <name>Scope</name>
          <t>An 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. The [QUIC-DATAGRAM] extension
<bcp14>MUST</bcp14> be supported and negotiated in the QUIC connection used for MOQT,
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>An MOQT server that is accessible via WebTransport can be identified
using an HTTPS URI (<xref section="4.2.2" sectionFormat="comma" target="RFC9110"/>).  An 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>An 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 (see <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
(see <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>When terminating the Session, 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>
            <tr>
              <td align="right">0x16</td>
              <td align="left">Malformed Auth Token</td>
            </tr>
            <tr>
              <td align="right">0x17</td>
              <td align="left">Unknown Auth Token Alias</td>
            </tr>
            <tr>
              <td align="right">0x18</td>
              <td align="left">Expired Auth Token</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 client is not authorized to establish a session.</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 to 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 (see <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>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Unknown Auth Token Alias - No registered token found for the provided Alias
(see <xref target="authorization-token"/>).</t>
          </li>
          <li>
            <t>Expired Auth Token - Authorization token has expired <xref target="authorization-token"/>).</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="publishing-and-retrieving-tracks">
      <name>Publishing and Retrieving Tracks</name>
      <section anchor="subscriptions">
        <name>Subscriptions</name>
        <t>A subscription can be initiated by either a publisher or a subscriber.  A
publisher initiates a subscription to a track by sending the PUBLISH message.
The subscriber either accepts or rejects the subscription using PUBLISH_OK or
PUBLISH_ERROR.  A subscriber initiates a subscription to a track by sending the
SUBSCRIBE message.  The publisher either accepts or rejects the subscription
using SUBSCRIBE_OK or SUBSCRIBE_ERROR.  Once either of these sequences is
successful, the subscription can be updated by the subscriber using
SUBSCRIBE_UPDATE, terminated by the subscriber using UNSUBSCRIBE, or terminated
by the publisher using SUBSCRIBE_DONE.</t>
        <t>All subscriptions have a Forward State which is either 0 or 1.  If the Forward
State is 0, the publisher does not send objects for the subscription.  If the
Forward State is 1, the publisher sends objects.  The initiator of the
subscription sets the initial Forward State in either PUBLISH or SUBSCRIBE.  The
sender of PUBLISH_OK can update the Forward State based on its preference.  Once
the subscription is established, the subscriber can update the Forward State by
sending SUBSCRIBE_UPDATE.</t>
        <t>Either endpoint can initiate a subscription to a track without exchanging any
prior messages other than SETUP.  Relays <bcp14>MUST NOT</bcp14> send any PUBLISH messages
without knowing the client is interested in and authorized to receive the
content. The communication of intent and authorization can be accomplished by
the client sending SUBSCRIBE_ANNOUNCES, or conveyed in other mechanisms out of
band.</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. A subscriber <bcp14>MUST</bcp14> send exactly one PUBLISH_OK or PUBLISH_ERROR in
response to a PUBLISH. The peer <bcp14>SHOULD</bcp14> close the session with a protocol error
if it receives more than one.</t>
        <t>A subscriber keeps subscription 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 subscription 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, PUBLISH_OK 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>
    <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, PUBLISH 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-namespaces">
        <name>Subscribing to Namespaces</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, UNANNOUNCE or PUBLISH
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 original publishers from sending further ANNOUNCE or PUBLISH messages,
but relays <bcp14>MUST NOT</bcp14> send any further PUBLISH messages to a client without
knowing the client is interested in and authorized to receive the content.</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 tracks in 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 for a
track in a namespace 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 different subscriber priorities 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 different publisher
priorities, 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>For downstream subscriptions, 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 <bcp14>MUST</bcp14> have an established upstream subscription before sending
SUBSCRIBE_OK in response to a downstream SUBSCRIBE.  If a relay does not have
sufficient information to send a FETCH_OK immediately in response to a FETCH, it
<bcp14>MUST</bcp14> withhold sending FETCH_OK until it does.</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 Largest 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>There are two ways to publish through a relay:</t>
        <ol spacing="normal" type="1"><li>
            <t>Send a PUBLISH message for a specific Track to the relay. The relay <bcp14>MAY</bcp14>
respond with PUBLISH_OK in Forward State=0 until there are known subscribers for
new tracks.</t>
          </li>
          <li>
            <t>Send an ANNOUNCE message for a Track Namespace to the relay. This enables the
relay to send SUBSCRIBE messages to publishers for Tracks in this Namespace in
response to received SUBSCRIBE messages.</t>
          </li>
        </ol>
        <t>Relays <bcp14>MUST</bcp14> verify that publishers are authorized to publish the set of tracks
whose Track Namespace matches the namespace in
an ANNOUNCE, or the Full Track Name in PUBLISH. The authorization and
identification of the publisher depends on the way the relay is managed
and is application specific.</t>
        <t>A Relay can receive announcements for the same Track Namespace or PUBLISH
messages for the same Track from multiple publishers and is expected to treat
them uniformly.</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 or Full Track Name.  Prefix matching is used
to determine which publishers receive a SUBSCRIBE or which subscribers receive a
PUBLISH. For example, a SUBSCRIBE namespace=(foo,bar), track=x message will be
forwarded to the sessions that sent ANNOUNCE namespace=(foo) and ANNOUNCE
namespace=(foo, bar) respectively, but not one that sent ANNOUNCE
namespace=(foobar).  Relays <bcp14>MUST</bcp14> forward SUBSCRIBE messages to all publishers
and ANNOUNCE and PUBLISH messages to all subscribers that have a namespace
prefix match.</t>
        <t>When a relay receives an incoming SUBSCRIBE that triggers an upstream
subscription, it <bcp14>SHOULD</bcp14> send a SUBSCRIBE request to each publisher that has
announced the subscription's namespace or prefix thereof, unless it already has
an active subscription for the Objects requested by the incoming SUBSCRIBE
request from all available publishers.  If it already has a matching upstream
subscription in Forward State=0, it <bcp14>SHOULD</bcp14> send a SUBSCRIBE_UDPATE with
Forward=1 to all publishers.</t>
        <t>When a relay receives an incoming PUBLISH message, it <bcp14>MUST</bcp14> send a PUBLISH
request to each subscriber that has subscribed (via SUBSCRIBE_ANNOUNCES)
to the track's namespace or prefix thereof.</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.  When it receives an incoming
PUBLISH message for a track that has active subscribers, it <bcp14>SHOULD</bcp14> respond
with PUBLISH_OK with Forward State=1.</t>
        <t>Relays use the Track Alias (<xref target="track-alias"/>) of an incoming Object to identify
its track and find the active subscribers. 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 a behavior that a publisher <bcp14>MAY</bcp14>
choose to implement to allow for a better user 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 ANNOUNCE and/or PUBLISH messages. The relay will establish
subscriptions 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 a 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 ANNOUNCE and/or PUBLISH messages, but it does not immediately
stop publishing objects to the old relay. The new relay will establish
subscriptions 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
announcements and subscriptions to the old relay can be withdrawn or terminated.</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, except for Object Extension Headers as specified in
<xref target="object-extensions"/>.</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">0x2</td>
            <td align="left">SUBSCRIBE_UPDATE (<xref target="message-subscribe-update"/>)</td>
          </tr>
          <tr>
            <td align="right">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1D</td>
            <td align="left">PUBLISH  (<xref target="message-publish"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1E</td>
            <td align="left">PUBLISH_OK (<xref target="message-publish-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1F</td>
            <td align="left">PUBLISH_ERROR (<xref target="message-publish-error"/>)</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 encodes 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 bytes.</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 0x03) <bcp14>MAY</bcp14> appear in a
CLIENT_SETUP, SERVER_SETUP, SUBSCRIBE, SUBSCRIBE_ANNOUNCES, ANNOUNCE,
TRACK_STATUS_REQUEST or FETCH message. This parameter conveys information to
authorize the sender to perform the operation carrying the parameter.</t>
            <t>The AUTHORIZATION TOKEN parameter <bcp14>MAY</bcp14> be repeated within a message.</t>
            <t>The parameter value is a Token structure containing an optional Session-specific
Alias. The Alias allows the sender to reference a previously transmitted Token
Type and Token Value in future messages. The Token structure is serialized as
follows:</t>
            <figure anchor="moq-token">
              <name>Token structure</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. There are separate Alias spaces for the client and server (e.g.: they
can each register Alias=1). Once a Token Alias has been registered, it cannot
be re-registered by the same sender in 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 is 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>If the Token structure cannot be decoded, the receiver <bcp14>MUST</bcp14> close the Session
with Key-Value Formatting error.  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>. 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>.</t>
            <t>The receiver of a message containing a well-formed Token structure but otherwise
invalid AUTHORIZATION TOKEN parameter <bcp14>MUST</bcp14> reject that message with an
<tt>Malformed Auth Token</tt> error.</t>
            <t>The receiver of a message carrying an AUTHORIZATION TOKEN with Alias Type
REGISTER that does not result in a Session error <bcp14>MUST</bcp14> register the Token Alias,
in the token cache, even if the message fails for other reasons, including
<tt>Unauthorized</tt>.  This allows senders to pipeline messages that refer to
previously registered tokens without potentially terminating the entire Session.
A receiver <bcp14>MAY</bcp14> store an error code (eg: Unauthorized or Malformed Auth Token) in
place of the Token Type and Token Alias if any future message referencing the
Token Alias will result in that error. The size of a registered cache entry
includes the length of the Token Value, regardless of whether it is stored.</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 Type and Value is for
efficiency only and has the same effect as if the Token Type and 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 Type and Value from being re-registered.</t>
            <t>Senders of tokens <bcp14>SHOULD</bcp14> only register tokens which they intend to re-use during
the Session and <bcp14>SHOULD</bcp14> retire previously registered tokens once their utility
has passed.</t>
            <t>By registering a Token, the sender is requiring the receiver to store the Token
Alias and Token Value until they are deleted, or the Session ends. The receiver
can protect its resources by sending a SETUP parameter defining the
MAX_AUTH_TOKEN_CACHE_SIZE limit (see <xref target="max-auth-token-cache-size"/>) 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 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 Object with a smaller ID arrives later than subsequent
Objects, relays can consider its receipt time as that of the Object with the
next larger Location, with the assumption that the Objects were reordered.</t>
            <t>Publishers can, at their discretion, discontinue forwarding Objects earlier than
the negotiated DELIVERY TIMEOUT, subject to stream closure and ordering
constraints described in <xref target="closing-subgroup-streams"/>.  However, 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 fails to consume Objects at a sufficient rate,
causing the publisher to exceed its resource limits, 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 (16),
  Number of Supported Versions (i),
  Supported Versions (i) ...,
  Number of Parameters (i),
  Setup Parameters (..) ...,
}

SERVER_SETUP Message {
  Type (i) = 0x21,
  Length (16),
  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>MOQT 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.  When a PATH parameter is received
from a server, or when a PATH parameter is received while WebTransport is used,
or when a PATH parameter is received by a server but the server does not
support the specified path, the session <bcp14>MUST</bcp14> be closed 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 16 bytes + the size of the Token Value field
(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 anchor="setup-auth-token">
            <name>AUTHORIZATION TOKEN</name>
            <t>See <xref target="authorization-token"/>.  The endpoint can specify one or more tokens in
CLIENT_SETUP or SERVER_SETUP that the peer can use to authorize MOQT session
establishment.</t>
            <t>If a server receives an AUTHORIZATION TOKEN parameter in CLIENT_SETUP with Alias
Type REGISTER_TOKEN that exceeds its MAX_AUTH_TOKEN_CACHE_SIZE, it <bcp14>MUST NOT</bcp14> fail
the session with <tt>Auth Token Cache Overflow</tt>.  Instead, it <bcp14>MUST</bcp14> treat the
parameter as Alias Type USE_VALUE.  A client <bcp14>MUST</bcp14> handle registration failures
of this kind by purging any Token Aliases that failed to register based on the
MAX_AUTH_TOKEN_CACHE_SIZE parameter in SERVER_SETUP (or the default value of 0).</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, PUBLISH, 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 (16),
  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 (16),
  Request ID (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The new Maximum Request ID for the session plus 1. If a Request ID
equal to 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 (16),
  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. Largest Object updates when the first byte of
an Object with a larger Location than the previous value is published or
received through a subscription.</t>
        <t>There are 4 types of filters:</t>
        <t>Largest 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 Largest 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 (16),
  Request ID (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 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 (16),
  Request ID (i),
  Track Alias (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>Track Alias: The identifer used for this track in Subgroups or Datagrams (see
<xref target="track-alias"/>). The same Track Alias <bcp14>MUST NOT</bcp14> be used to refer to two
different Tracks simultaneously. If a subscriber receives a SUBSCRIBE_OK that
uses the same Track Alias as a different track with an active subscription, it
<bcp14>MUST</bcp14> close the session with error 'Duplicate Track Alias'.</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 (16),
  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 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>
        </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">0x10</td>
              <td align="left">Malformed Auth Token</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>Malformed Auth Token - Invalid Auth Token serialization during registration
(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 sends a SUBSCRIBE_UPDATE to a publisher to modify an existing
subscription. Subscriptions can only be narrowed, not widened, as an attempt to
widen could fail. If Objects with Locations smaller than the current
subscription's Start Location are required, FETCH can be used to retrieve
them. The Start Location <bcp14>MUST NOT</bcp14> decrease, and if it increases, there is no
guarantee that the publisher has not already sent Objects with Locations smaller
than the new Start Location. Similarly, the End Group <bcp14>MUST NOT</bcp14> increase, and if
it decreases, there is no guarantee that the publisher has not already sent
Objects with Locations larger than the new End Location.  A publisher <bcp14>MUST</bcp14>
terminate the session with a 'Protocol Violation' if the SUBSCRIBE_UPDATE
violates these rules 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 (16),
  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 (16),
  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 (16),
  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>
            <tr>
              <td align="right">0x7</td>
              <td align="left">Malformed Track</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>
          <li>
            <t>Malformed Track - A relay publisher detected the track was malformed (see
<xref target="malformed-tracks"/>).</t>
          </li>
        </ul>
      </section>
      <section anchor="message-publish">
        <name>PUBLISH</name>
        <t>The publisher sends the PUBLISH control message to initiate a subscription to a
track. The receiver verifies the publisher is authorized to publish this track.</t>
        <figure anchor="moq-transport-publish-format">
          <name>MOQT PUBLISH Message</name>
          <artwork><![CDATA[
PUBLISH Message {
  Type (i) = 0x1D,
  Length (i),
  Request ID (i),
  Track Namespace (tuple),
  Track Name Length (i),
  Track Name (..),
  Track Alias (i),
  Group Order (8),
  ContentExists (8),
  [Largest (Location),]
  Forward (8),
  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>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
          </li>
          <li>
            <t>Track Alias: The identifer used for this track in Subgroups or Datagrams (see
<xref target="track-alias"/>). The same Track Alias <bcp14>MUST NOT</bcp14> be used to refer to two
different Tracks simultaneously. If a subscriber receives a PUBLISH that
uses the same Track Alias as a different track with an active subscription, it
<bcp14>MUST</bcp14> close the session with error 'Duplicate Track Alias'.</t>
          </li>
          <li>
            <t>Group Order: Indicates the subscription will be delivered in
Ascending (0x1) or Descending (0x2) order by group. See <xref target="priorities"/>.
Values of 0x0 and those larger than 0x2 are a protocol error.</t>
          </li>
          <li>
            <t>ContentExists: 1 if an object has been published on this track, 0 if not.
If 0, then the Largest Group ID and Largest Object ID fields will not be
present. Any other value is a protocol error and <bcp14>MUST</bcp14> terminate the
session with a Protocol Violation (<xref target="session-termination"/>).</t>
          </li>
          <li>
            <t>Largest: The location of the largest object available for this track.</t>
          </li>
          <li>
            <t>Forward: The forward mode for this subscription.  Any value other than 0 or 1
is a Protocol Violation.  0 indicates the publisher will not transmit any
objects until the subscriber sets the Forward State to 1. 1 indicates the
publisher will start transmitting objects immediately, even before PUBLISH_OK.</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-publish-ok">
        <name>PUBLISH_OK</name>
        <t>The subscriber sends an PUBLISH_OK control message to acknowledge the successful
authorization and acceptance of a PUBLISH message, and establish a subscription.</t>
        <figure anchor="moq-transport-publish-ok">
          <name>MOQT PUBLISH_OK Message</name>
          <artwork><![CDATA[
PUBLISH_OK Message
{
  Type (i) = 0x1E,
  Length (i),
  Request ID (i),
  Forward (8),
  Subscriber Priority (8),
  Group Order (8),
  Filter Type (i),
  [Start (Location)],
  [EndGroup (i)],
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Request ID: The Request ID of the PUBLISH this message is replying to
<xref target="message-publish"/>.</t>
          </li>
          <li>
            <t>Forward: The Forward State for this subscription, either 0 (don't
forward) or 1 (forward).</t>
          </li>
          <li>
            <t>Subscriber Priority: The Subscriber Priority for this subscription.</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. This
overwrites the GroupOrder specified PUBLISH.</t>
          </li>
          <li>
            <t>Filter Type, Start, End Group: See <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Parameters: Parameters associated with this message.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-publish-error">
        <name>PUBLISH_ERROR</name>
        <t>The subscriber sends an PUBLISH_ERROR control message to reject
a subscription initiated by PUBLISH.</t>
        <figure anchor="moq-transport-publish-error">
          <name>MOQT PUBLISH_ERROR Message</name>
          <artwork><![CDATA[
PUBLISH_ERROR Message
{
  Type (i) = 0x1F,
  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 PUBLISH this message is replying to
<xref target="message-publish"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for failure.</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 error code in PUBLISH_ERROR, as defined
below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Timeout</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Not Supported</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Uninterested</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>Internal Error - An implementation specific or generic error occurred.</t>
          </li>
          <li>
            <t>Unauthorized - The publisher is not authorized to publish the given
namespace or track.</t>
          </li>
          <li>
            <t>Timeout - The subscription could not be established before an
implementation specific timeout.</t>
          </li>
          <li>
            <t>Not Supported - The endpoint does not support the PUBLISH method.</t>
          </li>
          <li>
            <t>Uninterested - The namespace or track is not of interest to the
endpoint.</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>If an Original Publisher receives a FETCH with a range that includes an object with
unknown status, it <bcp14>MUST</bcp14> return FETCH_ERROR with code Unknown Status in Range.</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 Location,
and End Location 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 Largest 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 Location and
ending at End Location. End Location <bcp14>MUST</bcp14> specify the same or a larger Location
than Start Location.</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 (16),
  Request ID (i),
  Subscriber Priority (8),
  Group Order (8),
  Fetch Type (i),
  [Track Namespace (tuple),
   Track Name Length (i),
   Track Name (..),
   Start Location (Location),
   End Location (Location),]
  [Joining Request 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 Location: The start Location.</t>
          </li>
          <li>
            <t>End Location: The end Location, plus 1 Object ID. An Object ID 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 Request 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 Request 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
Largest available Object in the requested range is indicated in the FETCH_OK,
and is the last Object a fetch will return if the End Location 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 Location is greater than the <tt>Largest Object</tt>
(<xref target="message-subscribe-req"/>) 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 Location value from the corresponding
subscription is 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 Location: {Subscribe Largest Location.Group - Joining Start, 0}</t>
            </li>
            <li>
              <t>Fetch End Location: Subscribe Largest Location</t>
            </li>
          </ul>
          <t>A Fetch End Location.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 Location.Group if Fetch End Location.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 Location.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 Location is known.</t>
        <figure anchor="moq-transport-fetch-ok">
          <name>MOQT FETCH_OK Message</name>
          <artwork><![CDATA[
FETCH_OK Message {
  Type (i) = 0x18,
  Length (16),
  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, and
the End Location is the final Object in the Track, 0 if not.</t>
          </li>
          <li>
            <t>End Location: The largest object covered by the FETCH response.
The End Location is determined as follows:
            </t>
            <ul spacing="normal">
              <li>
                <t>If the requested FETCH End Location was beyond the Largest known (possibly
final) Object, End Location is {Largest.Group, Largest.Object + 1}</t>
              </li>
              <li>
                <t>If End Location.Object in the FETCH request was 0 and the response covers
the last Object in the Group, End Location is {Fetch.End Location.Group, 0}</t>
              </li>
              <li>
                <t>Otherwise, End Location is Fetch.End Location</t>
              </li>
            </ul>
            <t>
If the relay is subscribed to the track, it uses its knowledge of the largest
{Group, Object} to set End Location.  If if is not subscribed and the
requested End Location exceeds its cached data, the relay makes an upstream
request to complete the FETCH, and uses the upstream response to set End
Location.  </t>
            <t>
If End is smaller than the Start Location in the corresponding FETCH the
receiver <bcp14>MUST</bcp14> close the session with <tt>Protocol Violation</tt></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 (16),
  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 Request ID</td>
            </tr>
            <tr>
              <td align="right">0x8</td>
              <td align="left">Unknown Status in Range</td>
            </tr>
            <tr>
              <td align="right">0x9</td>
              <td align="left">Malformed Track</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">Malformed Auth Token</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 Location, 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>Unknown Status in Range - The requested range contains objects with unknown
status.</t>
          </li>
          <li>
            <t>Malformed Track - A relay publisher detected the track was malformed (see
<xref target="malformed-tracks"/>).</t>
          </li>
          <li>
            <t>Malformed Auth Token - Invalid Auth Token serialization during registration
(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 (16),
  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 (16),
  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 (16),
  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 (16),
  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 (16),
  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 (16),
  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">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>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 (16),
  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 (16),
  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 and established subscriptions,
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 (16),
  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 immediately forward existing ANNOUNCE and PUBLISH messages that
match the Track Namespace Prefix that have not already been sent to this
subscriber.  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, suffix of, or equal to an active
SUBSCRIBE_ANNOUNCES, 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, UNANNOUNCE
or PUBLISH 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 and tracks.</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 (16),
  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 (16),
  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">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>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, UNANNOUNCE and PUBLISH 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_ANNOUNCES Message</name>
          <artwork><![CDATA[
UNSUBSCRIBE_ANNOUNCES Message {
  Type (i) = 0x14,
  Length (16),
  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-0x03</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-datagram"/>)</td>
          </tr>
          <tr>
            <td align="right">0x04-0x05</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
(see <xref target="malformed-tracks"/>).</t>
      <section anchor="track-alias">
        <name>Track Alias</name>
        <t>To optimize wire efficiency, Subgroups and Datagrams refer to a track by a
numeric identifier, rather than the Full Track Name.  Track Alias is chosen by
the publisher and included in SUBSCRIBE_OK (<xref target="message-subscribe-ok"/> or PUBLISH
(<xref target="message-publish"/>).</t>
      </section>
      <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. A
       non-zero-length Object can be the End of Group, as signaled in
       the DATAGRAM or SUBGROUP_HEADER Type field (see <xref target="object-datagram"/>
       and <xref target="subgroup-header"/>).</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 (see
<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="datagrams">
        <name>Datagrams</name>
        <t>A single object can be conveyed in a datagram.  The Track Alias field
<xref target="track-alias"/> indicates the track this Datagram belongs to.  If an endpoint
receives a datagram with an unknown Track Alias, it <bcp14>MAY</bcp14> drop the datagram or
choose to buffer it for a brief period to handle reordering with the control
message that establishes the Track Alias.</t>
        <t>An Object received in an <tt>OBJECT_DATAGRAM</tt> or <tt>OBJECT_DATAGRAM_STATUS</tt> message
has an <tt>Object Forwarding Preference</tt> = <tt>Datagram</tt>.</t>
        <t>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.  When the
total size is larger than maximum datagram size for the session, the Object will
be dropped without any explicit notification.</t>
        <t>Each session along the path between the Original Publisher and End Subscriber
might have different maximum datagram sizes. Additionally, Object Extension
Headers (<xref target="object-extensions"/>) can be added to Objects as they pass through
the MOQT network, increasing the size of the Object and the chances it will
exceed the maximum datagram size of a downstream session and be dropped.</t>
        <section anchor="object-datagram">
          <name>Object Datagram</name>
          <t>An <tt>OBJECT_DATAGRAM</tt> carries a single object in a datagram.</t>
          <figure anchor="object-datagram-format">
            <name>MOQT OBJECT_DATAGRAM</name>
            <artwork><![CDATA[
OBJECT_DATAGRAM {
  Type (i) = 0x0-0x4,
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Publisher Priority (8),
  [Extension Headers Length (i),
  Extension headers (...)],
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>There are 4 defined Type values for OBJECT_DATAGRAM:</t>
          <table>
            <thead>
              <tr>
                <th align="left">Type</th>
                <th align="left">End Of Group</th>
                <th align="left">Extensions</th>
              </tr>
            </thead>
            <tbody>
              <tr>
                <td align="left"> </td>
                <td align="left"> </td>
                <td align="left">Present</td>
              </tr>
              <tr>
                <td align="left">0x00</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x01</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x02</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x03</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
            </tbody>
          </table>
          <t>For Type values where End of Group is Yes, the Object is the last Object in the
Group.</t>
          <t>For Type values where Extensions Present is No, Extensions Headers Length is not
present and the Object has no extensions.  When Extensions Present is Yes,
Extension Headers Length is 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>
      <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>All Objects on a Subgroup stream belong to the track identified by <tt>Track Alias</tt>
(see <xref target="track-alias"/>) and the Subgroup indicated by 'Group ID' and <tt>Subgroup
ID</tt> in the SUBGROUP_HEADER.</t>
          <t>If an endpoint receives a subgroup with an unknown Track Alias, it <bcp14>MAY</bcp14> abandon
the stream, or choose to buffer it for a brief period to handle reordering with
the control message that establishes the Track Alias.  The endpoint <bcp14>MAY</bcp14> withhold
stream flow control beyond the SUBGROUP_HEADER until the Track Alias has been
established.  To prevent deadlocks, the publisher <bcp14>MUST</bcp14> allocate connection flow
control to the control stream before allocating it any data streams. Otherwise,
a receiver might wait for a control message containing a Track Alias to release
flow control, while the sender waits for flow control to send the message.</t>
          <figure anchor="object-header-format">
            <name>MOQT SUBGROUP_HEADER</name>
            <artwork><![CDATA[
SUBGROUP_HEADER {
  Type (i) = 0x8..0xD,
  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 12 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>
                <th align="left">Contains End</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>
                <td align="left">of Group</td>
              </tr>
              <tr>
                <td align="left">0x10</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x11</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x12</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x13</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x14</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x15</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">No</td>
              </tr>
              <tr>
                <td align="left">0x18</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x19</td>
                <td align="left">No</td>
                <td align="left">0</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1A</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1B</td>
                <td align="left">No</td>
                <td align="left">First Object ID</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1C</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">No</td>
                <td align="left">Yes</td>
              </tr>
              <tr>
                <td align="left">0x1D</td>
                <td align="left">Yes</td>
                <td align="left">N/A</td>
                <td align="left">Yes</td>
                <td align="left">Yes</td>
              </tr>
            </tbody>
          </table>
          <t>For Type values where Contains End of Group is Yes, the last Object in this
Subgroup stream before a FIN is the last Object in the Group.  If the Subgroup
stream is terminated with a RESET_STREAM or RESET_STREAM_AT, the receiver cannot
determine the End of Group Object ID.</t>
          <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
0x10-11 and 0x18-19) or the Object ID of the first object transmitted in this
subgroup (for Types 0x12-13 and 0x1A-1B).</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 with Locations smaller than the subscription's Start Location, 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 subscription's End Group to a smaller Group or
the Start Location to a larger Location.  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 {
  Type (i) = 0x5,
  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
(see <xref target="malformed-tracks"/>.</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 - List which params can be repeated in the table.</t>
        </li>
        <li>
          <t>Subscribe Error codes</t>
        </li>
        <li>
          <t>Subscribe Namespace Error codes</t>
        </li>
        <li>
          <t>Publish 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.
List which headers can be repeated in the table.</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="14" month="June" year="2025"/>
            <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-07"/>
        </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 3817?>

<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-11">
        <name>Since draft-ietf-moq-transport-11</name>
        <ul spacing="normal">
          <li>
            <t>Move Track Alias from SUBSCRIBE to SUBSCRIBE_OK (#977)</t>
          </li>
          <li>
            <t>Expand cases FETCH_OK returns Invalid Range (#946) and clarify fields (#936)</t>
          </li>
          <li>
            <t>Add an error code to FETCH_ERROR when an Object status is unknown (#825)</t>
          </li>
          <li>
            <t>Rename Latest Object to Largest Object (#1024) and clarify what to
do when it's incomplete (#937)</t>
          </li>
          <li>
            <t>Explain Malformed Tracks and what to do with them (#938)</t>
          </li>
          <li>
            <t>Allow End of Group to be indicated in a normal Object (#1011)</t>
          </li>
          <li>
            <t>Relays <bcp14>MUST</bcp14> have an upstream subscription to send SUBSCRIBE_OK (#1017)</t>
          </li>
          <li>
            <t>Allow AUTHORIZATION TOKEN in CLIENT_SETUP, SERVER_SETUP and
other fixes (#1013)</t>
          </li>
          <li>
            <t>Add PUBLISH for publisher initiated subscriptions (#995) and
fix the PUBLISH codepoints (#1048, #1051)</t>
          </li>
        </ul>
      </section>
      <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/XbUWJYv+P95Cl1yrQvkjYjE5EdlUp232oAhPQU2ZZus
6VudjeUIha0mLEVJCoyLop5lnmWebPb32UdSGMgi+65ZM7lWd2GFdD732Wd/
/vZ0Og1d2a2KB9mt58WizLP6TdFkf3q5/yg7afKqXddNdyvkZ2dN8eZBdln/
ddrp47Co51V+CZ8umnzZTcuiW06TN6Y798Mi7+CNd493T/behzn8cV431w+y
tluEUK6bB1nXbNru/r17P9y7H/KmyB9k2a0/F2dZXi2y/aormqro/Fjazdll
2bZlXZ1cr6Hp/b2TJ+Gqbl6fN/VmbfM41HncCq+La/h98SBk0+wyTvKvm3Ie
3hTVpoBfsq1fZ1lH/dz6M/RRVufZU3wTn1/m5Qqew5T/Fec+q5tzfJw38wt4
fNF16/bBV1/hW/iofFPM9LWv8MFXZ0191RZfwfdf4XfnZXexOeMGp1fnXyVL
iS+sYPXazjdNL874w1lZp598tW1bZhfd5epWCG0Ha/wqX9UVTO+6aEN7mTfd
q79uaujnQVbVYV0+yP7S1fNJ1sJ3TbFs4V/Xl/wP2P7LfL2GJfklhHzTXdQN
LuQU/i/LygpaOJ5lB9BF/noDDdNjppfjzUXe9n+CZcmr8m95Bzv7IHtUtvOa
nhe8zG3Fr//rHH+ZzevLkHb28yz7OW/LVVm8cV39XM67ukl/SXt6Wtfnq8J3
9QZffvPmX8/pl5Gu9mfZ8VXRda6f/bxyzz7UQwk7gS/7LvDnpsaTCBQIY+71
uTvLnjRltShWK9ft7gr6TZ6nXT8vutx3nC/x3X+9hMdbOq3q5hI+fkOHAk/A
g+zoyaMf7t27B3/DubSTCHOePiaKnl4VZ0RcUyTMr+FcV8vYSphOp1l+1sIb
8y6Ek4uyRdLZXBZVly2KZVkVbdZdFNm8borsrLjI35SwY9BCtpUjhTvPD/90
cneS5XKgjbazdVMDwdYraLotz6tikXV1Vq+LBg6PawqIKfjZTLKri3J+kUHv
RdaWl3hms+WmmuM65quyu55l2GeWr1ZwaqFj6GixmUN79TLIIOpsvTlble1F
BlwvJw5G7ZUdTK5qYcqL7A28CCysnTflGtvOzq6zPFxuVl25XpVz6AgazIpq
sa7Lqmtn2X4H769xjC1QAvBD6qzD9YK/cA1LWNvybIOtBWCWyAtb6hxXWlcB
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
yUiyibtxg0UpXnERU/8ZokOYrR6kZU4xAsJ/U4MkNr/YNJQOODQGxpKZoMxK
TQ7+vA2p2rep4t8ie0lVUIL5eAr/plAPd08ToWXH0Pz8AjVcMUtrLSpNO0Eh
GYOp+xYeUldUEgum5jNBglzdESwAiawIfkKehysuLCzaWoLANlp22ARaXMY+
UlvZcWqamOaYQwU2AVcC2UHMH1ms3JFVZPmpV9bUZQwjQxlrFLFL5HRrkCk7
tu9yWMLAoaTTYj7Irt1r9jnfAPFgEfZ4XcWkPHSFdoTeY5K9y46Q1KAYTJDK
ZCeGRIVOsCs53Go50JBA2SdW2I75tu0lMKjdTznZiYb7dSpMzDInV+z+W1DA
WRq0S9CDCy7BGfjxnlzFnY2VMTF7F2rAxWdREiZ9XwdaDVIaZKj9krz9saJh
zsWqSoR/3U9E8HkSveSuE0tLIDErdtXLVjfuN2y1dw9j2uVS8gz8bTqQXeMO
FpmUnxZ3IBdF709+PJASxpnEAGsedu+Whwkm6fZpJDB5/8TmEsERevG3JJJY
PcCr/DruBTL7y7xCkx5hzJXjdyfd5Ud2KkwN9DkvqbDSX4PtqWTJB8RTt8k0
PWsuqbeBTDObqsS7fXUd2Vuc/1VesQCEJ5mh+IZ3e2WTWfg96oKwzyT2u4+B
s7D4FGZN0SACr/U0sdCLMi+7FLadzq1LZ8FTi8ZbXzk09CKunajFm9lG5M4b
VzQRoSI/50U1lw3u0ch+9igVJMgXXL/SJEwJGSC/qSQrazKaG0g0KiQBdvxe
KljJi8FORAJ15RuwBf7xzrKuJ2d5c3fCO/Dj2zQX8qwIiWTfxRwHsbWRR8MY
XdryXVpHC2judZthvwmkANtZUe+ysImk+V4L+H0Pf0Ul+3EuSXYLW9vgB0cj
HU2NW6WZLt5NYcMJa7e58Zgx1UWLWBVdi70g4K4pz8+Z8MZ9jCOwpAPBwVQv
F+KteWHxAPcv99utz8FttM4q3Xn10isPGkfI7Y1JJ8a1Dk136ZXLGy6AidYs
MqLYY+l5DiI143h9PwjUhvQ0jS7ayI1+0zq+evn4BYrlFH4t3/24MyScj9rg
Hi0xGEhMpTOG39+7D2TU3UkDZy2x9K6KaHSMb97Tjxp/kjE4kn9IWTlRz9+i
g9EU4hWfZv/1d8Ll3ctkeoTccqXFwuVjcXxuUhQuTiKMi4qSEKKrm9KxZsv4
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
o6T8EDOJ5/vg3rOnGw/d/wd8DMo+33MCAA==

-->

</rfc>
