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

<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>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Media Over QUIC Working Group mailing list (moq@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/moq-wg/moq-transport"/>.</t>
    </note>
  </front>
  <middle>
    <?line 65?>

<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 is designed to work in concert with multiple
MoQ Streaming Formats. These MoQ Streaming Formats define how content is
encoded, packaged, and mapped to MOQT objects, along with policies for
discovery and subscription.</t>
      <ul spacing="normal">
        <li>
          <t><xref target="model"/> describes the object model employed by MOQT.</t>
        </li>
        <li>
          <t><xref target="session"/> covers aspects of setting up a MOQT session.</t>
        </li>
        <li>
          <t><xref target="priority-congestion"/> covers protocol considerations on
prioritization schemes and congestion response overall.</t>
        </li>
        <li>
          <t><xref target="relays-moq"/> covers behavior at the relay entities.</t>
        </li>
        <li>
          <t><xref target="message"/> covers how 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 robustness of QUIC, workflow efficiency and
relay support.</t>
        <section anchor="latency">
          <name>Latency</name>
          <t>HTTP Adaptive Streaming (HAS) has been successful at achieving scale
although often at the cost of latency. Latency is necessary to correct
for variable network throughput. Ideally live content is consumed at the
same bitrate it is produced. End-to-end latency would be fixed and only
subject to encoding and transmission delays. Unfortunately, networks
have variable throughput, primarily due to congestion. Attempting to
deliver content encoded at a higher bitrate than the network can support
causes queuing along the path from producer to consumer. The speed at
which a protocol can detect and respond to queuing 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. Applying <xref target="QUIC"/> to HAS
via HTTP/3 has not yet yielded generalized improvements in
throughput. One reason for this is that sending segments down a single
QUIC stream still allows head-of-line blocking to occur.</t>
        </section>
        <section anchor="universal">
          <name>Universal</name>
          <t>Internet delivered media today has protocols optimized for ingest and
separate protocols optimized for distribution. This protocol switch in
the distribution chain necessitates intermediary origins which
re-package the media content. While specialization can have its
benefits, there are gains in efficiency to be had in not having to
re-package content. A goal of MOQT is to develop a single protocol which
can be used for transmission from contribution to distribution. A
related goal is the ability to support existing encoding and packaging
schemas, both for backwards compatibility and for interoperability with
the established content preparation ecosystem.</t>
        </section>
        <section anchor="relays">
          <name>Relays</name>
          <t>An integral feature of a protocol being successful is its ability to
deliver media at scale. Greatest scale is achieved when third-party
networks, independent of both the publisher and subscriber, can be
leveraged to relay the content. These relays must cache content for
distribution efficiency while simultaneously routing content and
deterministically responding to congestion in a multi-tenant network. A
goal of MOQT is to treat relays as first-class citizens of the protocol
and ensure that objects are structured such that information necessary
for distribution is available to relays while the media content itself
remains opaque and private.</t>
        </section>
      </section>
      <section anchor="terms-and-definitions">
        <name>Terms and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<dl>
          <dt>Client:</dt>
          <dd>
            <t>The party initiating a MoQ 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>Producer:</dt>
          <dd>
            <t>An endpoint sending media over the network.</t>
          </dd>
          <dt>Consumer:</dt>
          <dd>
            <t>An endpoint receiving media over the network.</t>
          </dd>
          <dt>Transport session:</dt>
          <dd>
            <t>A raw QUIC connection or a WebTransport session.</t>
          </dd>
          <dt>Congestion:</dt>
          <dd>
            <t>Packet loss and queuing caused by degraded or overloaded networks.</t>
          </dd>
          <dt>Group:</dt>
          <dd>
            <t>A temporal sequence of objects. A group represents a join point in a
track. See (<xref target="model-group"/>).</t>
          </dd>
          <dt>Object:</dt>
          <dd>
            <t>An object is an addressable unit whose payload is a sequence of
bytes. Objects form the base element in the MOQT model. See
(<xref target="model-object"/>).</t>
          </dd>
          <dt>Track:</dt>
          <dd>
            <t>An encoded bitstream. Tracks contain a sequential series of one or
more groups and are the subscribable entity with MOQT.</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>
        </dl>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
      </section>
    </section>
    <section anchor="model">
      <name>Object Model</name>
      <t>MOQT has a hierarchical object model for data, comprised of objects,
groups and tracks.</t>
      <section anchor="model-object">
        <name>Objects</name>
        <t>The basic data element of MOQT is an object.  An object is an
addressable unit whose payload is a sequence of bytes.  All objects
belong to a group, indicating ordering and potential
dependencies. <xref target="model-group"/>  An object is uniquely identified by
its track namespace, track name, group ID, and object ID, and must be an
identical sequence of bytes regardless of how or where it is retrieved.
An Object can become unavailable, but it's 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. The payload portion may be encrypted, in which case
it is only visible to the producer and consumer. The application 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>
      </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"/>).  Objects within a group <bcp14>SHOULD NOT</bcp14> depend on objects
in other groups.  A group behaves as a join point for subscriptions.
A new subscriber might not want to receive the entire track, and may
instead opt to receive only the latest group(s).  The sender then
selectively transmits objects based on their group membership.</t>
      </section>
      <section anchor="model-track">
        <name>Track</name>
        <t>A track is a sequence of groups (<xref target="model-group"/>). It is the entity
against which a consumer issues a subscription request.  A subscriber
can request to receive individual tracks starting at a group boundary,
including any new objects pushed by the producer while the track is
active.</t>
        <section anchor="track-name">
          <name>Track Naming and Scopes</name>
          <t>In MOQT, every track has a track name and a track namespace associated
with it.  A track name identifies an individual track within the
namespace.</t>
          <t>A MOQT scope is a set of servers (as identified by their connection
URIs) for which the tuple of Track Name and Track Namespace are
guaranteed to be unique and identify a specific track. It is up to
the application using MOQT to define how broad or narrow the scope is.
An application that deals with connections between devices
on a local network may limit the scope to a single connection; by
contrast, an application that uses multiple CDNs to serve media may
require the scope to include all of those CDNs.</t>
          <t>Because the tuple of Track Namespace and Track Name are unique within an
MOQT scope, they can be used as a cache key.
MOQT does not provide any in-band content negotiation methods similar to
the ones defined by HTTP (<xref section="10" sectionFormat="comma" target="RFC9110"/>); if, at a given
moment in time, two tracks within the same scope contain different data,
they have to have different names and/or namespaces.</t>
          <t>In this specification, both the Track Namespace and the Track Name are
not constrained to a specific encoding. They carry a sequence of
bytes and comparison between two Track Namespaces or Track Names is
done by exact comparison of the bytes. Specifications that use MoQ Transport
may constrain the information in these fields, for example by restricting
them to UTF-8. Any specification that does needs to specify the
canonicalization into the bytes in the Track Namespace or Track Name
such that exact comparison works.</t>
        </section>
        <section anchor="connection-url">
          <name>Connection URL</name>
          <t>Each track <bcp14>MAY</bcp14> have one or more associated connection URLs specifying
network hosts through which a track may be accessed. The syntax of the
Connection URL and the associated connection setup procedures are
specific to the underlying transport protocol usage <xref target="session"/>.</t>
        </section>
      </section>
    </section>
    <section anchor="session">
      <name>Sessions</name>
      <section anchor="session-establishment">
        <name>Session establishment</name>
        <t>This document defines a protocol that can be used interchangeably both
over a QUIC connection directly <xref target="QUIC"/>, and over WebTransport
<xref target="WebTransport"/>.  Both provide streams and datagrams with similar
semantics (see <xref section="4" sectionFormat="comma" target="I-D.ietf-webtrans-overview"/>); thus, the
main difference lies in how the servers are identified and how the
connection is established.  When using QUIC, datagrams <bcp14>MUST</bcp14> be
supported via the [QUIC-DATAGRAM] extension, which is already a
requirement for WebTransport over HTTP/3.</t>
        <t>There is no definition of the protocol over other transports,
such as TCP, and applications using MoQ might need to fallback to
another protocol when QUIC or WebTransport aren't available.</t>
        <section anchor="webtransport">
          <name>WebTransport</name>
          <t>A MOQT server that is accessible via WebTransport can be identified
using an HTTPS URI (<xref section="4.2.2" sectionFormat="comma" target="RFC9110"/>).  A MOQT session can be
established by sending an extended CONNECT request to the host and the
path indicated by the URI, as described in <xref section="3" sectionFormat="comma" target="WebTransport"/>.</t>
        </section>
        <section anchor="quic">
          <name>QUIC</name>
          <t>A MOQT server that is accessible via native QUIC can be identified by a
URI with a "moq" scheme.  The "moq" URI scheme is defined as follows,
using definitions from <xref target="RFC3986"/>:</t>
          <artwork><![CDATA[
moq-URI = "moqt" "://" authority path-abempty [ "?" query ]
]]></artwork>
          <t>The <tt>authority</tt> portion <bcp14>MUST NOT</bcp14> contain a non-empty <tt>host</tt> portion.
The <tt>moq</tt> URI scheme supports the <tt>/.well-known/</tt> path prefix defined in
<xref target="RFC8615"/>.</t>
          <t>This protocol does not specify any semantics on the <tt>path-abempty</tt> and
<tt>query</tt> portions of the URI.  The contents of those are left up to the
application.</t>
          <t>The client can establish a connection to a MoQ server identified by a
given URI by setting up a QUIC connection to the host and port
identified by the <tt>authority</tt> section of the URI.  The <tt>path-abempty</tt>
and <tt>query</tt> portions of the URI are communicated to the server using the
PATH parameter (<xref target="path"/>) which is sent in the CLIENT_SETUP message at the
start of the session.  The ALPN value <xref target="RFC7301"/> used by the protocol
is <tt>moq-00</tt>.</t>
        </section>
      </section>
      <section anchor="version-negotiation">
        <name>Version and Extension Negotiation</name>
        <t>Endpoints use the exchange of Setup messages to negotiate the MOQT version and
any extensions to use.</t>
        <t>The client indicates the MOQT versions it supports in the CLIENT_SETUP message
(see <xref target="message-setup"/>). It also includes the union of all Setup Parameters
<xref target="setup-params"/> required for a handshake by any of those versions.</t>
        <t>Within any MOQT version, clients request the use of extensions by adding Setup
parameters corresponding to that extension. No extensions are defined in this
document.</t>
        <t>The server replies with a SERVER_SETUP message that indicates the chosen
version, includes all parameters required for a handshake in that version, and
parameters for every extension requested by the client that it supports.</t>
        <t>New versions of MOQT <bcp14>MUST</bcp14> specify which existing extensions can be used with
that version. New extensions <bcp14>MUST</bcp14> specify the existing versions with which they
can be used.</t>
        <t>If a given parameter carries the same information in multiple versions,
but might have different optimal values in those versions, there <bcp14>SHOULD</bcp14> be
separate Setup parameters for that information in each version.</t>
      </section>
      <section anchor="session-init">
        <name>Session initialization</name>
        <t>The first stream opened is a client-initiated bidirectional control stream where
the peers exchange Setup messages (<xref target="message-setup"/>).  All messages defined in
this draft except OBJECT and OBJECT_WITH_LENGTH are sent on the control stream
after the Setup message. Control messages <bcp14>MUST NOT</bcp14> be sent on any other stream,
and a peer receiving a control message on a different stream closes the session
as a 'Protocol Violation'. Objects <bcp14>MUST NOT</bcp14> be sent on the control stream, and a
peer receiving an Object on the control stream closes the session as a 'Protocol
Violation'.</t>
        <t>This draft only specifies a single use of bidirectional streams. Objects are
sent on unidirectional streams.  Because there are no other uses of
bidirectional streams, a peer <bcp14>MAY</bcp14> currently close the session as a
'Protocol Violation' if it receives a second bidirectional stream.</t>
        <t>The control stream <bcp14>MUST NOT</bcp14> be abruptly closed at the underlying transport
layer.  Doing so results in the session being closed as a 'Protocol Violation'.</t>
      </section>
      <section anchor="stream-cancellation">
        <name>Stream Cancellation</name>
        <t>Streams aside from the control stream <bcp14>MAY</bcp14> be canceled due to congestion
or other reasons by either the sender or receiver. Early termination of a
stream does not affect the MoQ application state, and therefore has no
effect on outstanding subscriptions.</t>
      </section>
      <section anchor="session-termination">
        <name>Termination</name>
        <t>The transport session can be terminated at any point.  When native QUIC
is used, the session is closed using the CONNECTION_CLOSE frame
(<xref section="19.19" sectionFormat="comma" target="QUIC"/>).  When WebTransport is used, the session is
closed using the CLOSE_WEBTRANSPORT_SESSION capsule (<xref section="5" sectionFormat="comma" target="WebTransport"/>).</t>
        <t>The application <bcp14>MAY</bcp14> use any error message and <bcp14>SHOULD</bcp14> use a relevant
code, as defined below:</t>
        <table>
          <thead>
            <tr>
              <th align="right">Code</th>
              <th align="left">Reason</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="right">0x0</td>
              <td align="left">No Error</td>
            </tr>
            <tr>
              <td align="right">0x1</td>
              <td align="left">Internal Error</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Unauthorized</td>
            </tr>
            <tr>
              <td align="right">0x3</td>
              <td align="left">Protocol Violation</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Duplicate Track Alias</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Parameter Length Mismatch</td>
            </tr>
            <tr>
              <td align="right">0x10</td>
              <td align="left">GOAWAY Timeout</td>
            </tr>
          </tbody>
        </table>
        <ul spacing="normal">
          <li>
            <t>No Error: The session is being terminated without an error.</t>
          </li>
          <li>
            <t>Internal Error: An implementation specific error occurred.</t>
          </li>
          <li>
            <t>Unauthorized: The endpoint breached an agreement, which <bcp14>MAY</bcp14> have been
 pre-negotiated by the application.</t>
          </li>
          <li>
            <t>Protocol Violation: The remote endpoint performed an action that was
disallowed by the specification.</t>
          </li>
          <li>
            <t>Duplicate Track Alias: The endpoint attempted to use a Track Alias
that was already in use.</t>
          </li>
          <li>
            <t>GOAWAY Timeout: The session was closed because the client 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>
        </ul>
      </section>
      <section anchor="session-migration">
        <name>Migration</name>
        <t>MoqTransport 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.
MoqTransport avoids this via the GOAWAY message (<xref target="message-goaway"/>).</t>
        <t>The server sends a GOAWAY message, signaling that the client should establish a
new session and migrate any active subscriptions. The GOAWAY message may contain
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 on a connection.</t>
        <t>The GOAWAY message does not immediately impact subscription state. A subscriber
<bcp14>SHOULD</bcp14> individually UNSUBSCRIBE for each existing subscription, while a
publisher <bcp14>MAY</bcp14> reject new SUBSCRIBEs while in the draining state. When the server
is a subscriber, it <bcp14>SHOULD</bcp14> send a GOAWAY message prior to any UNSUBSCRIBE
messages.</t>
        <t>After the client receives a GOAWAY, it's <bcp14>RECOMMENDED</bcp14> that the client waits until
there are no more active subscriptions before closing the session with NO_ERROR.
Ideally this is transparent to the application using MOQT, which involves
establishing a new session in the background and migrating active subscriptions
and announcements. The client can choose to delay closing the session if it
expects more OBJECTs to be delivered. The server closes the session with a
'GOAWAY Timeout' if the client doesn't close the session quickly enough.</t>
      </section>
    </section>
    <section anchor="priority-congestion">
      <name>Prioritization and Congestion Response</name>
      <t>TODO: This is a placeholder section to capture details on how the MOQT
protocol deals with prioritization and congestion overall.</t>
      <t>This section is expected to cover details on:</t>
      <ul spacing="normal">
        <li>
          <t>Prioritization Schemes.</t>
        </li>
        <li>
          <t>Congestion Algorithms and impacts.</t>
        </li>
        <li>
          <t>Mapping considerations for one object per stream vs multiple objects
per stream.</t>
        </li>
        <li>
          <t>Considerations for merging multiple streams across domains onto single
connection and interactions with specific prioritization schemes.</t>
        </li>
      </ul>
      <section anchor="order-priorities-and-options">
        <name>Order Priorities and Options</name>
        <t>At the point of this writing, the working group has not reached
consensus on several important goals, such as:</t>
        <ul spacing="normal">
          <li>
            <t>Ensuring that objects are delivered in the order intended by the
emitter</t>
          </li>
          <li>
            <t>Allowing nodes and relays to skip or delay some objects to deal with
congestion</t>
          </li>
          <li>
            <t>Ensuring that emitters can accurately predict the behavior of relays</t>
          </li>
          <li>
            <t>Ensuring that when relays have to skip and delay objects belonging to
different tracks that they do it in a predictable way if tracks are
explicitly coordinated and in a fair way if they are not.</t>
          </li>
        </ul>
        <t>The working group has been considering two alternatives: marking objects
belonging to a track with an explicit "send order"; and, defining
algorithms combining tracks, priorities and object order within a
group. The two proposals are listed in <xref target="send-order"/> and
<xref target="ordering-by-priorities"/>.  We expect further work before a consensus
is reached.</t>
        <section anchor="send-order">
          <name>Proposal - Send Order</name>
          <t>Media is produced with an intended order, both in terms of when media
should be presented (PTS) and when media should be decoded (DTS).  As
stated in the introduction, the network is unable to maintain this
ordering during congestion without increasing latency.</t>
          <t>The encoder determines how to behave during congestion by assigning each
object a numeric send order.  The send order <bcp14>SHOULD</bcp14> be followed when
possible, to ensure that the most important media is delivered when
throughput is limited.  Note that the contents within each object are
still delivered in order; this send order only applies to the ordering
between objects.</t>
          <t>A sender <bcp14>MUST</bcp14> send each object over a dedicated stream.  The library
should support prioritization (<xref target="priority-congestion"/>) such that
streams are transmitted in send order.</t>
          <t>A receiver <bcp14>MUST NOT</bcp14> assume that objects will be received in send order,
for the following reasons:</t>
          <ul spacing="normal">
            <li>
              <t>Newly encoded objects can have a smaller send order than outstanding
objects.</t>
            </li>
            <li>
              <t>Packet loss or flow control can delay the send of individual streams.</t>
            </li>
            <li>
              <t>The sender might not support stream prioritization.</t>
            </li>
          </ul>
          <t>TODO: Refer to Congestion Response and Prioritization Section for
further details on various proposals.</t>
        </section>
        <section anchor="ordering-by-priorities">
          <name>Proposal - Ordering by Priorities</name>
          <t>Media is produced as a set of layers, such as for example low definition
and high definition, or low frame rate and high frame rate. Each object
belonging to a track and a group has two attributes: the object-id, and
the priority (or layer).</t>
          <t>When nodes or relays have to choose which object to send next, they
apply the following rules:</t>
          <ul spacing="normal">
            <li>
              <t>within the same group, objects with a lower priority number (e.g. P1)
are always sent before objects with a numerically greater priority
number (e.g., P2)</t>
            </li>
            <li>
              <t>within the same group, and the same priority level, objects with a
lower object-id are always sent before objects with a higher
object-id.</t>
            </li>
            <li>
              <t>objects from later groups are normally always sent before objects of
previous groups.</t>
            </li>
          </ul>
          <t>The latter rule is generally agreed as a way to ensure freshness, and to
recover quickly if queues and delays accumulate during a congestion
period. However, there may be cases when finishing the transmission of
an ongoing group results in better user experience than strict adherence
to the freshness rule. We expect that that the working group will
eventually reach consensus and define meta data that controls this
behavior.</t>
          <t>There have been proposals to allow emitters to coordinate the allocation
of layer priorities across multiple coordinated tracks. At this point,
these proposals have not reached consensus.</t>
        </section>
      </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>
      <section anchor="subscriber-interactions">
        <name>Subscriber Interactions</name>
        <t>Subscribers interact with the Relays by sending a SUBSCRIBE
(<xref target="message-subscribe-req"/>) control message for the tracks 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 subscriber making the subscribe request is notified of the result of
the subscription, via SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>) or the
SUBSCRIBE_ERROR <xref target="message-subscribe-error"/> control message.
The entity receiving the SUBSCRIBE <bcp14>MUST</bcp14> send only a single response to
a given SUBSCRIBE of either SUBSCRIBE_OK or SUBSCRIBE_ERROR.</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. A subscription
remains active until the publisher of the track terminates the
track with a SUBSCRIBE_DONE (see <xref target="message-subscribe-done"/>).</t>
        <t>Objects <bcp14>MUST NOT</bcp14> be sent for unsuccessful subscriptions, and if a subscriber
receives a SUBSCRIBE_ERROR after receiving objects, it <bcp14>MUST</bcp14> close the session
with a 'Protocol Violation'.</t>
        <t>A relay <bcp14>MUST</bcp14> not 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 forward subscription for the
track. The published content received from the forward subscription
request is cached and shared among the pending subscribers.</t>
        <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">Invalid Range</td>
            </tr>
            <tr>
              <td align="right">0x2</td>
              <td align="left">Retry Track Alias</td>
            </tr>
          </tbody>
        </table>
        <t>The applicaiton <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">Unsubscribed</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">Track Ended</td>
            </tr>
            <tr>
              <td align="right">0x4</td>
              <td align="left">Subscription Ended</td>
            </tr>
            <tr>
              <td align="right">0x5</td>
              <td align="left">Going Away</td>
            </tr>
            <tr>
              <td align="right">0x6</td>
              <td align="left">Expired</td>
            </tr>
          </tbody>
        </table>
      </section>
      <section anchor="publisher-interactions">
        <name>Publisher Interactions</name>
        <t>Publishing through the relay starts with publisher sending ANNOUNCE
control message with a <tt>Track Namespace</tt> (<xref target="model-track"/>).</t>
        <t>Relays <bcp14>MUST</bcp14> ensure that publishers are authorized by:</t>
        <ul spacing="normal">
          <li>
            <t>Verifying that the publisher is authorized to publish the content
associated with the set of tracks whose Track Namespace matches the
announced namespace. Specifics of where the authorization happens,
either at the relays or forwarded for further processing, depends on
the way the relay is managed and is application specific (typically
based on prior business agreement).</t>
          </li>
        </ul>
        <t>Relays respond with an ANNOUNCE_OK or ANNOUNCE_ERROR control message
providing the result of announcement. The entity receiving the
ANNOUNCE <bcp14>MUST</bcp14> send only a single response to a given ANNOUNCE of
either ANNOUNCE_OK or ANNOUNCE_ERROR.  When a publisher wants to stop
new subscriptions for an announced namespace it sends an UNANNOUNCE.
A subscriber indicates it will no longer route subscriptions for a
namespace it previously responded ANNOUNCE_OK to by sending an
ANNOUNCE_CANCEL.</t>
        <t>A relay manages sessions from multiple publishers and subscribers,
connecting them based on the track namespace. This <bcp14>MUST</bcp14> use an exact
match on track namespace unless otherwise negotiated by the application.
For example, a SUBSCRIBE namespace=foobar message will be forwarded to
the session that sent ANNOUNCE namespace=foobar.</t>
        <t>OBJECT message headers carry a short hop-by-hop <tt>Track Alias</tt> that maps to
the Full Track Name (see <xref target="message-subscribe-ok"/>). Relays use the
<tt>Track Alias</tt> of an incoming OBJECT message to identify its track and find
the active subscribers for that track. Relays <bcp14>MUST NOT</bcp14> depend on OBJECT
payload content for making forwarding decisions and <bcp14>MUST</bcp14> only depend on the
fields, such as priority order and other metadata properties in the
OBJECT message header. Unless determined by congestion response, Relays
<bcp14>MUST</bcp14> forward the OBJECT message to the matching subscribers.</t>
      </section>
      <section anchor="congestion-response-at-relays">
        <name>Congestion Response at Relays</name>
        <t>TODO: Refer to <xref target="priority-congestion"/>. Add details to describe relay
behavior when merging or splitting streams and interactions with
congestion response.</t>
      </section>
      <section anchor="relay-object-handling">
        <name>Relay Object Handling</name>
        <t>MOQT encodes the delivery information for a stream via OBJECT headers
(<xref target="message-object"/>).  A relay <bcp14>MUST NOT</bcp14> modify Object properties when
forwarding.</t>
        <t>A relay <bcp14>MUST</bcp14> treat the object payload as opaque.  A relay <bcp14>MUST NOT</bcp14>
combine, split, or otherwise modify object payloads.  A relay <bcp14>SHOULD</bcp14>
prioritize streams (<xref target="priority-congestion"/>) based on the send
order/priority.</t>
        <t>A sender <bcp14>SHOULD</bcp14> begin sending incomplete objects when available to
avoid incurring additional latency.</t>
        <t>A relay that reads from a stream and writes to stream in order will
introduce head-of-line blocking.  Packet loss will cause stream data to
be buffered in the library, awaiting in order delivery, which will
increase latency over additional hops.  To mitigate this, a relay <bcp14>SHOULD</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>Messages</name>
      <t>Both unidirectional and bidirectional streams contain sequences of
length-delimited messages.</t>
      <t>An endpoint that receives an unknown message type <bcp14>MUST</bcp14> close the session.</t>
      <figure anchor="moq-transport-message-format">
        <name>MOQT Message</name>
        <artwork><![CDATA[
MOQT Message {
  Message Type (i),
  Message Payload (..),
}
]]></artwork>
      </figure>
      <table>
        <thead>
          <tr>
            <th align="right">ID</th>
            <th align="left">Messages</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="right">0x0</td>
            <td align="left">OBJECT_STREAM (<xref target="object-message-formats"/>)</td>
          </tr>
          <tr>
            <td align="right">0x1</td>
            <td align="left">OBJECT_DATAGRAM (<xref target="object-message-formats"/>)</td>
          </tr>
          <tr>
            <td align="right">0x3</td>
            <td align="left">SUBSCRIBE (<xref target="message-subscribe-req"/>)</td>
          </tr>
          <tr>
            <td align="right">0x4</td>
            <td align="left">SUBSCRIBE_OK (<xref target="message-subscribe-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x5</td>
            <td align="left">SUBSCRIBE_ERROR (<xref target="message-subscribe-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x6</td>
            <td align="left">ANNOUNCE  (<xref target="message-announce"/>)</td>
          </tr>
          <tr>
            <td align="right">0x7</td>
            <td align="left">ANNOUNCE_OK (<xref target="message-announce-ok"/>)</td>
          </tr>
          <tr>
            <td align="right">0x8</td>
            <td align="left">ANNOUNCE_ERROR (<xref target="message-announce-error"/>)</td>
          </tr>
          <tr>
            <td align="right">0x9</td>
            <td align="left">UNANNOUNCE  (<xref target="message-unannounce"/>)</td>
          </tr>
          <tr>
            <td align="right">0xA</td>
            <td align="left">UNSUBSCRIBE (<xref target="message-unsubscribe"/>)</td>
          </tr>
          <tr>
            <td align="right">0xB</td>
            <td align="left">SUBSCRIBE_DONE (<xref target="message-subscribe-done"/>)</td>
          </tr>
          <tr>
            <td align="right">0x10</td>
            <td align="left">GOAWAY (<xref target="message-goaway"/>)</td>
          </tr>
          <tr>
            <td align="right">0x40</td>
            <td align="left">CLIENT_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x41</td>
            <td align="left">SERVER_SETUP (<xref target="message-setup"/>)</td>
          </tr>
          <tr>
            <td align="right">0x50</td>
            <td align="left">STREAM_HEADER_TRACK (<xref target="multi-object-streams"/>)</td>
          </tr>
          <tr>
            <td align="right">0x51</td>
            <td align="left">STREAM_HEADER_GROUP (<xref target="multi-object-streams"/>)</td>
          </tr>
        </tbody>
      </table>
      <section anchor="params">
        <name>Parameters</name>
        <t>Some messages include a Parameters field that encode optional message
elements. They contain a type, length, and value.</t>
        <t>Senders <bcp14>MUST NOT</bcp14> repeat the same parameter type in a message. Receivers
<bcp14>SHOULD</bcp14> check that there are no duplicate parameters and close the session
as a 'Protocol Violation' if found.</t>
        <t>Receivers ignore unrecognized parameters.</t>
        <t>The format of Parameters is as follows:</t>
        <figure anchor="moq-param">
          <name>MOQT Parameter</name>
          <artwork><![CDATA[
Parameter {
  Parameter Type (i),
  Parameter Length (i),
  Parameter Value (..),
}
]]></artwork>
        </figure>
        <t>Parameter Type is an integer that indicates the semantic meaning of the
parameter. Setup message parameters use a namespace that is constant across all
MoQ Transport versions. All other messages use a version-specific namespace. For
example, the integer '1' can refer to different parameters for Setup messages
and for all other message types.</t>
        <t>SETUP message parameter types are defined in <xref target="setup-params"/>. Version-
specific parameter types are defined in <xref target="version-specific-params"/>.</t>
        <t>The Parameter Length field of the String Parameter encodes the length
of the Parameter Value field in bytes.</t>
        <t>Each parameter description will indicate the data type in the Parameter Value
field. If a receiver understands a parameter type, and the parameter length
implied by that type does not match the Parameter Length field, the receiver <bcp14>MUST</bcp14>
terminate the session with error code 'Parameter Length Mismatch'.</t>
        <section anchor="version-specific-params">
          <name>Version Specific Parameters</name>
          <t>Each version-specific parameter definition indicates the message types in which
it can appear. If it appears in some other type of message, it <bcp14>MUST</bcp14> be ignored.
Note that since Setup parameters use a separate namespace, it is impossible for
these parameters to appear in Setup messages.</t>
          <section anchor="authorization-info">
            <name>AUTHORIZATION INFO Parameter</name>
            <t>AUTHORIZATION INFO parameter (key 0x02) identifies a track's authorization
information in a SUBSCRIBE or ANNOUNCE message. This parameter is populated for
cases where the authorization is required at the track level. The value is an
ASCII string.</t>
          </section>
        </section>
      </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 allows the peers 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, the peers <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 Payload {
  Number of Supported Versions (i),
  Supported Version (i) ...,
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}

SERVER_SETUP Message Payload {
  Selected Version (i),
  Number of Parameters (i) ...,
  Setup Parameters (..) ...,
}
]]></artwork>
        </figure>
        <t>The available versions and Setup parameters are detailed in the next sections.</t>
        <section anchor="setup-versions">
          <name>Versions</name>
          <t>MoQ Transport versions are a 32-bit unsigned integer, encoded as a varint.
This version of the specification is identified by the number 0x00000001.
Versions with the most significant 16 bits of the version number cleared are
reserved for use in future IETF consensus documents.</t>
          <t>The client offers the list of the protocol versions it supports; the
server <bcp14>MUST</bcp14> reply with one of the versions offered by the client. If the
server does not support any of the versions offered by the client, or
the client receives a server version that it did not offer, the
corresponding peer <bcp14>MUST</bcp14> close the session.</t>
          <t>[[RFC editor: please remove the remainder of this section before
publication.]]</t>
          <t>The version number for the final version of this specification (0x00000001), is
reserved for the version of the protocol that is published as an RFC.
Version numbers used to identify IETF drafts are created by adding the draft
number to 0xff000000. For example, draft-ietf-moq-transport-13 would be
identified as 0xff00000D.</t>
        </section>
        <section anchor="setup-params">
          <name>Setup Parameters</name>
          <section anchor="role">
            <name>ROLE parameter</name>
            <t>The ROLE parameter (key 0x00) allows each endpoint to independently specify what
funnctionality they support for the session. It has three possible values,
which are of type varint:</t>
            <dl>
              <dt>0x01: Publisher</dt>
              <dd>
                <t>The endpoint can process subscriptions and send objects, but not subscribe.
The endpoint <bcp14>MUST NOT</bcp14> send a SUBSCRIBE message and an ANNOUNCE <bcp14>MUST NOT</bcp14> be
sent to it.</t>
              </dd>
              <dt>0x02: Subscriber</dt>
              <dd>
                <t>The endpoint can send subscriptions and receive objects, but not publish.
The endpoint <bcp14>MUST NOT</bcp14> send an ANNOUNCE message and a SUBSCRIBE <bcp14>MUST NOT</bcp14> be
sent to it.</t>
              </dd>
              <dt>0x03: PubSub</dt>
              <dd>
                <t>The endpoint can act as a publisher or subscriber, and can send or process
any message type.</t>
              </dd>
            </dl>
            <t>Both endpoints <bcp14>MUST</bcp14> send a ROLE parameter with one of the three values
specified above. Both endpoints <bcp14>MUST</bcp14> close the session if the ROLE
parameter is missing or is not one of the three above-specified values.</t>
          </section>
          <section anchor="path">
            <name>PATH parameter</name>
            <t>The PATH parameter (key 0x01) allows the client to specify the path of
the MoQ URI when using native QUIC (<xref target="QUIC"/>).  It <bcp14>MUST NOT</bcp14> be used by
the server, or when WebTransport is used.  If the peer receives a PATH
parameter from the server, or when WebTransport is used, it <bcp14>MUST</bcp14> close
the connection. It follows the URI formatting rules <xref target="RFC3986"/>.</t>
            <t>When connecting to a server using a URI with the "moq" scheme, the
client <bcp14>MUST</bcp14> set the PATH parameter to the <tt>path-abempty</tt> portion of the
URI; if <tt>query</tt> is present, the client <bcp14>MUST</bcp14> concatenate <tt>?</tt>, followed by
the <tt>query</tt> portion of the URI to the parameter.</t>
          </section>
        </section>
      </section>
      <section anchor="message-object">
        <name>OBJECT</name>
        <t>An OBJECT message contains a range of contiguous bytes from from the
specified track, as well as associated metadata required to deliver,
cache, and forward it.</t>
        <section anchor="canonical-object-fields">
          <name>Canonical Object Fields</name>
          <t>A canonical MoQ Object has the following information:</t>
          <ul spacing="normal">
            <li>
              <t>Track Namespace and Track Name: The track this object belongs to.</t>
            </li>
            <li>
              <t>Group ID: The object is a member of the indicated group ID
<xref target="model-group"/> within the track.</t>
            </li>
            <li>
              <t>Object ID: The order of the object within the group.  The
IDs starts at 0, increasing sequentially for each object within the
group.</t>
            </li>
            <li>
              <t>Object Send Order: An integer indicating the object send order
<xref target="send-order"/> or priority <xref target="ordering-by-priorities"/> value.</t>
            </li>
            <li>
              <t>Object Forwarding Preference: An enumeration indicating how a sender sends an
object. The preferences are Track, Group, Object and Datagram.  An Object <bcp14>MUST</bcp14>
be sent according to its <tt>Object Forwarding Preference</tt>, described below.</t>
            </li>
            <li>
              <t>Object Payload: An opaque payload intended for the consumer and <bcp14>SHOULD
NOT</bcp14> be processed by a relay.</t>
            </li>
          </ul>
        </section>
        <section anchor="object-message-formats">
          <name>Object Message Formats</name>
          <t>Every Track has a single 'Object Forwarding Preference' and publishers
<bcp14>MUST NOT</bcp14> mix different forwarding preferences within a single track.
If a subscriber receives different forwarding preferences for a track, it
<bcp14>SHOULD</bcp14> close the session with an error of 'Protocol Violation'.</t>
          <t><strong>Object Stream Message</strong></t>
          <t>An <tt>OBJECT_STREAM</tt> message carries a single object on a stream.  There is no
explicit length of the payload; it is determined by the end of the stream.  An
<tt>OBJECT_STREAM</tt> message <bcp14>MUST</bcp14> be the first and only message on a unidirectional
stream.</t>
          <t>An Object received in an <tt>OBJECT_STREAM</tt> message has an <tt>Object Forwarding
Preference</tt> = <tt>Object</tt>.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Object</tt>, open a stream,
serialize object fields below, and terminate the stream.</t>
          <figure anchor="moq-transport-object-stream-format">
            <name>MOQT OBJECT_STREAM Message</name>
            <artwork><![CDATA[
OBJECT_STREAM Message {
  Subscribe ID (i),
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Object Send Order (i),
  Object Payload (..),
}
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>Subscribe ID: Subscription Identifer as defined in <xref target="message-subscribe-req"/>.</t>
            </li>
            <li>
              <t>Track Alias: Identifies the Track Namespace and Track Name as defined in
<xref target="message-subscribe-req"/>.</t>
            </li>
          </ul>
          <t>If the Track Namespace and Track Name identified by the Track Alias are
different from those specified in the subscription identified by Subscribe ID,
the receiver <bcp14>MUST</bcp14> close the session with a Protocol Violation.</t>
          <ul spacing="normal">
            <li>
              <t>Other fields: As described in <xref target="canonical-object-fields"/>.</t>
            </li>
          </ul>
          <t><strong>Object Datagram Message</strong></t>
          <t>An <tt>OBJECT_DATAGRAM</tt> message carries a single object in a datagram.
There is no explicit length of the payload; it is determined by the
length of the datagram.</t>
          <t>An Object received in an <tt>OBJECT_DATAGRAM</tt> message has an <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>. To send an Object with <tt>Object
Forwarding Preference</tt> = <tt>Datagram</tt>, determine the length of the fields and
payload and send the Object as datagram. In certain scenarios where the object
size can be larger than maximum datagram size for the session, the Object
will be dropped.</t>
          <figure anchor="object-datagram-format">
            <name>MOQT OBJECT_DATAGRAM Message</name>
            <artwork><![CDATA[
OBJECT_DATAGRAM Message {
  Subscribe ID (i),
  Track Alias (i),
  Group ID (i),
  Object ID (i),
  Object Send Order (i),
  Object Payload (..),
}
]]></artwork>
          </figure>
        </section>
        <section anchor="multi-object-streams">
          <name>Multi-Object Streams</name>
          <t>When multiple objects are sent on a stream, the stream begins with a stream
header message and is followed by one or more sets of serialized object fields.
If a stream ends gracefully in the middle of a serialized Object, terminate the
session with a Protocol Violation.</t>
          <t>A sender <bcp14>SHOULD NOT</bcp14> open more than one multi-object stream at a time with the
same stream header message type and fields.</t>
          <t>TODO: figure out how a relay closes these streams</t>
          <t><strong>Stream Header Track</strong></t>
          <t>When a stream begins with <tt>STREAM_HEADER_TRACK</tt>, all objects on the stream
belong to the track requested in the Subscribe message identified by <tt>Subscribe
ID</tt>.  All objects on the stream have the <tt>Object Send Order</tt> specified in the
stream header.</t>
          <figure anchor="stream-header-track-format">
            <name>MOQT STREAM_HEADER_TRACK Message</name>
            <artwork><![CDATA[
STREAM_HEADER_TRACK Message {
  Subscribe ID (i)
  Track Alias (i),
  Object Send Order (i),
}
]]></artwork>
          </figure>
          <t>All Objects received on a stream opened with STREAM_HEADER_TRACK have an <tt>Object
Forwarding Preference</tt> = <tt>Track</tt>.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Track</tt>, find the open
stream that is associated with the subscription, or open a new one and send the
<tt>STREAM_HEADER_TRACK</tt> if needed, then serialize the the following object fields.</t>
          <figure anchor="object-track-format">
            <name>MOQT Track Stream Object Fields</name>
            <artwork><![CDATA[
{
  Group ID (i),
  Object ID (i),
  Object Payload Length (i),
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t><strong>Stream Header Group</strong></t>
          <t>A sender <bcp14>MUST NOT</bcp14> send an Object on a stream if its Group ID is less than a
previously sent Group ID on that stream, or if its Object ID is less than or
equal to a previously sent Object ID within a given group on that stream.</t>
          <t>When a stream begins with <tt>STREAM_HEADER_GROUP</tt>, all objects on the stream
belong to the track requested in the Subscribe message identified by <tt>Subscribe
ID</tt> and the group indicated by <tt>Group ID</tt>.  All objects on the stream
have the <tt>Object Send Order</tt> specified in the stream header.</t>
          <figure anchor="stream-header-group-format">
            <name>MOQT STREAM_HEADER_GROUP Message</name>
            <artwork><![CDATA[
STREAM_HEADER_GROUP Message {
  Subscribe ID (i),
  Track Alias (i),
  Group ID (i)
  Object Send Order (i)
}
]]></artwork>
          </figure>
          <t>All Objects received on a stream opened with <tt>STREAM_HEADER_GROUP</tt> have an
<tt>Object Forwarding Preference</tt> = <tt>Group</tt>.</t>
          <t>To send an Object with <tt>Object Forwarding Preference</tt> = <tt>Group</tt>, find the open
stream that is associated with the subscription, <tt>Group ID</tt> and <tt>Object
Send Order</tt>, or open a new one and send the <tt>STREAM_HEADER_GROUP</tt> if needed,
then serialize the following fields.</t>
          <figure anchor="object-group-format">
            <name>MOQT Group Stream Object Fields</name>
            <artwork><![CDATA[
{
  Object ID (i),
  Object Payload Length (i),
  Object Payload (..),
}
]]></artwork>
          </figure>
          <t>A sender <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="examples">
          <name>Examples:</name>
          <t>Sending a track on one stream:</t>
          <artwork><![CDATA[
STREAM_HEADER_TRACK {
  Subscribe ID = 1
  Track Alias = 1
  Object Send Order = 0
}
{
  Group ID = 0
  Object ID = 0
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Group ID = 1
  Object ID = 0
  Object Payload Length = 4
  Payload = "efgh"
}
]]></artwork>
          <t>Sending a group on one stream, with a unordered object in the group appearing
on its own stream.</t>
          <artwork><![CDATA[
Stream = 2

STREAM_HEADER_GROUP {
  Subscribe ID = 2
  Track Alias = 2
  Group ID = 0
  Object Send Order = 0
}
{
  Object ID = 0
  Object Payload Length = 4
  Payload = "abcd"
}
{
  Object ID = 1
  Object Payload Length = 4
  Payload = "efgh"
}

Stream = 6

OBJECT_STREAM {
  Subscribe ID = 2
  Track Alias = 2
  Group ID = 0
  Object ID = 1
  Payload = "moqrocks"
}
]]></artwork>
        </section>
      </section>
      <section anchor="message-subscribe-req">
        <name>SUBSCRIBE</name>
        <t>A receiver issues a SUBSCRIBE to a publisher to request a track.</t>
        <section anchor="subscribe-locations">
          <name>Subscribe Locations</name>
          <t>The receiver specifies a start and optional end <tt>Location</tt> for the subscription.
A location value may be an absolute group or object sequence, or it may be a
delta relative to the largest group or the largest object in a group.</t>
          <artwork><![CDATA[
Location {
  Mode (i),
  [Value (i)],
}
]]></artwork>
          <t>There are 4 modes:</t>
          <t>None (0x0): The Location is unspecified, Value is not present</t>
          <t>Absolute (0x1): Value is an absolute sequence</t>
          <t>RelativePrevious (0x2): Value is a delta from the largest sequence.  0 is the
largest sequence, 1 is the largest sequence - 1, and so on.</t>
          <t>RelativeNext (0x3): Value is a delta from the largest sequence.  0 is the largest
sequence + 1, 1 is the largest sequence + 2, and so on.</t>
          <t>The following table shows an example of how the RelativePrevious and RelativeNext
values are used to determine the absolute sequence.</t>
          <figure>
            <name>Relative Indexing</name>
            <artwork><![CDATA[
Sequence:                0    1    2    3    4   [5]  [6] ...
                                             ^
                                      Largest Sequence
RelativePrevious Value:  4    3    2    1    0
RelativeNext Value:                               0    1  ...
]]></artwork>
          </figure>
        </section>
        <section anchor="subscribe-format">
          <name>SUBSCRIBE Format</name>
          <t>The format of SUBSCRIBE is as follows:</t>
          <figure anchor="moq-transport-subscribe-format">
            <name>MOQT SUBSCRIBE Message</name>
            <artwork><![CDATA[
SUBSCRIBE Message {
  Subscribe ID (i),
  Track Alias (i),
  Track Namespace (b),
  Track Name (b),
  StartGroup (Location),
  StartObject (Location),
  EndGroup (Location),
  EndObject (Location),
  Number of Parameters (i),
  Track Request Parameters (..) ...
}
]]></artwork>
          </figure>
          <ul spacing="normal">
            <li>
              <t>Subscribe ID: The subscription identifier that is unique within the session.
<tt>Subscribe ID</tt> is a monotonically increasing variable length integer which
<bcp14>MUST</bcp14> not be reused within a session. <tt>Subscribe ID</tt> is used by subscribers and
the publishers to identify a given subscription. Subscribers specify the
<tt>Subscribe ID</tt> and it is included in the corresponding SUBSCRIBE_OK or
SUBSCRIBE_ERROR messages.</t>
            </li>
            <li>
              <t>Track Alias: A session specific identifier for the track.
Messages that reference a track, such as OBJECT (<xref target="message-object"/>),
reference this Track Alias instead of the Track Name and Track Namespace to
reduce overhead. If the Track Alias is already in use, the publisher <bcp14>MUST</bcp14>
close the session with a Duplicate Track Alias error (<xref target="session-termination"/>).</t>
            </li>
            <li>
              <t>Track Namespace: Identifies the namespace of the track as defined in
(<xref target="track-name"/>).</t>
            </li>
            <li>
              <t>Track Name: Identifies the track name as defined in (<xref target="track-name"/>).</t>
            </li>
            <li>
              <t>StartGroup: The Location of the requested group.  StartGroup's Mode <bcp14>MUST NOT</bcp14> be
None.</t>
            </li>
            <li>
              <t>StartObject: The Location of the requested object.  StartObject's Mode <bcp14>MUST NOT</bcp14>
be None.</t>
            </li>
            <li>
              <t>EndGroup: The last Group requested in the subscription, inclusive.  EndGroup's
Mode is None for an open-ended subscription.</t>
            </li>
            <li>
              <t>EndObject: The last Object requested in the subscription, exclusive.
EndObject's Mode <bcp14>MUST</bcp14> be None if EndGroup's Mode is None.  EndObject's Mode <bcp14>MUST
NOT</bcp14> be None if EndGroup's Mode is not None.</t>
            </li>
            <li>
              <t>Track Request Parameters: The parameters are defined in
<xref target="version-specific-params"/></t>
            </li>
          </ul>
          <t>On successful subscription, the publisher <bcp14>SHOULD</bcp14> start delivering
objects from the group ID and object ID described above.</t>
          <t>If a publisher cannot satisfy the requested start or end for the subscription it
<bcp14>MAY</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>
          <t>TODO: Define the flow where subscribe request matches an existing subscribe id
(subscription updates.)</t>
        </section>
        <section anchor="examples-1">
          <name>Examples</name>
          <artwork><![CDATA[
1. Now

Start Group: Mode=RelativePrevious, Value=0
Start Object: Mode=RelateiveNext, Value=0
End Group: Mode=None
End Object: Mode=None

StartGroup=Largest Group
StartObject=Largest Object + 1

2. Current

Start Group: Mode=RelativePrevious, Value=0
Start Object: Mode=Absolute, Value=0
End Group: Mode=None
End Object: Mode=None

StartGroup=Largest Group
StartObject=0

3. Previous

Start Group: Mode=RelativePrevious, Value=1
Start Object: Mode=Absolute, Value=0
End Group: Mode=None
End Object: Mode=None

StartGroup=Largest Group - 1
StartObject=0

4. Next

Start Group: Mode=RelativeNext, Value=0
Start Object: Mode=Absolute, Value=0
End Group: Mode=None
End Object: Mode=None
StartGroup=Largest Group + 1
StartObject=0

5. Range, All of group 3

Start Group: Mode=Absolute, Value=3
Start Object: Mode=Absolute, Value=0
End Group: Mode=Absolute, Value=4
End Object: Mode=Absolute, Value=0

Start = Group 3, Object 0
End = Group 3, Object <last>
]]></artwork>
        </section>
      </section>
      <section anchor="message-subscribe-ok">
        <name>SUBSCRIBE_OK</name>
        <t>A SUBSCRIBE_OK control message is sent for successful subscriptions.</t>
        <figure anchor="moq-transport-subscribe-ok">
          <name>MOQT SUBSCRIBE_OK Message</name>
          <artwork><![CDATA[
SUBSCRIBE_OK
{
  Subscribe ID (i),
  Expires (i),
  ContentExists (1),
  [Largest Group ID (i)],
  [Largest Object ID (i)]
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifer as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Expires: Time in milliseconds after which the subscription is no
longer valid. A value of 0 indicates that the subscription does not expire
or expires at an unknown time.  Expires is advisory and a subscription can
end prior to the expiry time or last longer.</t>
          </li>
          <li>
            <t>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.</t>
          </li>
          <li>
            <t>Largest Group ID: the largest Group ID available for this track. This field is only present if ContentExists has a value of 1.</t>
          </li>
          <li>
            <t>Largest Object ID: the largest Object ID available within the largest Group ID
for this track. This field is only present if ContentExists has a value of 1.</t>
          </li>
        </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
{
  Subscribe ID (i),
  Error Code (i),
  Reason Phrase (b),
  Track Alias (i),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifer as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for subscription failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
          <li>
            <t>Track Alias: When Error Code is 'Retry Track Alias', the subscriber <bcp14>SHOULD</bcp14> re-issue the
SUBSCRIBE with this Track Alias instead. If this Track Alias is already in use,
the receiver <bcp14>MUST</bcp14> close the connection with a Duplicate Track Alias error
(<xref target="session-termination"/>).</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 Objects
should stop being sent as soon as possible.  The publisher sends a
SUBSCRIBE_DONE to acknowledge the unsubscribe was successful and indicate
the final Object.</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 {
  Subscribe ID (i)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription Identifer as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-subscribe-done">
        <name>SUBSCRIBE_DONE</name>
        <t>A publisher issues 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.</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 {
  Subscribe ID (i),
  Status Code (i),
  Reason Phrase (b),
  ContentExists (1),
  [Final Group (i)],
  [Final Object (i)],
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Subscribe ID: Subscription identifier as defined in <xref target="message-subscribe-req"/>.</t>
          </li>
          <li>
            <t>Status Code: An integer status code indicating why the subscription ended.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for subscription error.</t>
          </li>
          <li>
            <t>ContentExists: 1 if an object has been published for this subscription, 0 if
not. If 0, then the Final Group and Final Object fields will not be present.</t>
          </li>
          <li>
            <t>Final Group: The largest Group ID sent by the publisher in an OBJECT
message in this track.</t>
          </li>
          <li>
            <t>Final Object: The largest Object ID sent by the publisher in an OBJECT
message in the <tt>Final Group</tt> for this track.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce">
        <name>ANNOUNCE</name>
        <t>The publisher sends the ANNOUNCE control message to advertise where the
receiver can route SUBSCRIBEs for tracks within the announced
Track Namespace. The receiver verifies the publisher is authorized to
publish tracks under this namespace.</t>
        <figure anchor="moq-transport-announce-format">
          <name>MOQT ANNOUNCE Message</name>
          <artwork><![CDATA[
ANNOUNCE Message {
  Track Namespace (b),
  Number of Parameters (i),
  Parameters (..) ...,
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies a track's namespace as defined in
(<xref target="track-name"/>)</t>
          </li>
          <li>
            <t>Parameters: The parameters are defined in <xref target="version-specific-params"/>.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-ok">
        <name>ANNOUNCE_OK</name>
        <t>The receiver 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
{
  Track Namespace (b),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
        </ul>
      </section>
      <section anchor="message-announce-error">
        <name>ANNOUNCE_ERROR</name>
        <t>The receiver 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
{
  Track Namespace (b),
  Error Code (i),
  Reason Phrase (b),
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>Track Namespace: Identifies the track namespace in the ANNOUNCE
message for which this response is provided.</t>
          </li>
          <li>
            <t>Error Code: Identifies an integer error code for announcement failure.</t>
          </li>
          <li>
            <t>Reason Phrase: Provides the reason for announcement error.</t>
          </li>
        </ul>
      </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 {
  Track Namespace (b),
}
]]></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>
        <t>If a publisher recieves new subscriptions for that namespace after
receiving an ANNOUNCE_CANCEL, it <bcp14>SHOULD</bcp14> close the session as a
'Protocol Violation'.</t>
        <figure anchor="moq-transport-announce-cancel-format">
          <name>MOQT ANNOUNCE_CANCEL Message</name>
          <artwork><![CDATA[
ANNOUNCE_CANCEL Message {
  Track Namespace (b),
}
]]></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-goaway">
        <name>GOAWAY</name>
        <t>The server sends a <tt>GOAWAY</tt> message to initiate session migration
(<xref target="session-migration"/>) with an optional URI.</t>
        <t>The server <bcp14>MUST</bcp14> terminate the session with a Protocol Violation
(<xref target="session-termination"/>) if it receives a GOAWAY message. The client <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 {
  New Session URI (b)
}
]]></artwork>
        </figure>
        <ul spacing="normal">
          <li>
            <t>New Session URI: The client <bcp14>MUST</bcp14> use this URI for the new session if provded.
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.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>TODO: Expand this section, including subscriptions.</t>
      <section anchor="resource-exhaustion">
        <name>Resource Exhaustion</name>
        <t>Live content requires significant bandwidth and resources.  Failure to
set limits will quickly cause resource exhaustion.</t>
        <t>MOQT uses stream limits and flow control to impose resource limits at
the network layer.  Endpoints <bcp14>SHOULD</bcp14> set flow control limits based on the
anticipated bitrate.</t>
        <t>Endpoints <bcp14>MAY</bcp14> impose a MAX STREAM count limit which would restrict the
number of concurrent streams which a MOQT Streaming Format could have in
flight.</t>
        <t>The producer prioritizes and transmits streams out of order.  Streams
might be starved indefinitely during congestion.  The producer and
consumer <bcp14>MUST</bcp14> cancel a stream, preferably the lowest priority, after
reaching a resource limit.</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>Track Request parameters</t>
        </li>
        <li>
          <t>Subscribe Error codes</t>
        </li>
        <li>
          <t>Announce Error codes</t>
        </li>
        <li>
          <t>Track format numbers</t>
        </li>
        <li>
          <t>Message types</t>
        </li>
        <li>
          <t>Object headers</t>
        </li>
      </ul>
      <t>TODO: register the URI scheme and the ALPN</t>
      <t>TODO: the MOQT spec should establish the IANA registration table for MoQ
Streaming Formats. Each MoQ streaming format can then register its type
in that table. The MoQ Streaming Format type <bcp14>MUST</bcp14> be carried as the
leading varint in catalog track objects.</t>
    </section>
    <section numbered="false" anchor="contributors">
      <name>Contributors</name>
      <ul spacing="normal">
        <li>
          <t>Alan Frindell</t>
        </li>
        <li>
          <t>Ali Begen</t>
        </li>
        <li>
          <t>Charles Krasic</t>
        </li>
        <li>
          <t>Christian Huitema</t>
        </li>
        <li>
          <t>Cullen Jennings</t>
        </li>
        <li>
          <t>James Hurley</t>
        </li>
        <li>
          <t>Jordi Cenzano</t>
        </li>
        <li>
          <t>Mike English</t>
        </li>
        <li>
          <t>Mo Zanaty</t>
        </li>
        <li>
          <t>Will Law</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references>
      <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="23" month="October" year="2023"/>
            <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-08"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC9110">
          <front>
            <title>HTTP Semantics</title>
            <author fullname="R. Fielding" initials="R." role="editor" surname="Fielding"/>
            <author fullname="M. Nottingham" initials="M." role="editor" surname="Nottingham"/>
            <author fullname="J. Reschke" initials="J." role="editor" surname="Reschke"/>
            <date month="June" year="2022"/>
            <abstract>
              <t>The Hypertext Transfer Protocol (HTTP) is a stateless application-level protocol for distributed, collaborative, hypertext information systems. This document describes the overall architecture of HTTP, establishes common terminology, and defines aspects of the protocol that are shared by all versions. In this definition are core protocol elements, extensibility mechanisms, and the "http" and "https" Uniform Resource Identifier (URI) schemes.</t>
              <t>This document updates RFC 3864 and obsoletes RFCs 2818, 7231, 7232, 7233, 7235, 7538, 7615, 7694, and portions of 7230.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="97"/>
          <seriesInfo name="RFC" value="9110"/>
          <seriesInfo name="DOI" value="10.17487/RFC9110"/>
        </reference>
        <reference anchor="RFC3986">
          <front>
            <title>Uniform Resource Identifier (URI): Generic Syntax</title>
            <author fullname="T. Berners-Lee" initials="T." surname="Berners-Lee"/>
            <author fullname="R. Fielding" initials="R." surname="Fielding"/>
            <author fullname="L. Masinter" initials="L." surname="Masinter"/>
            <date month="January" year="2005"/>
            <abstract>
              <t>A Uniform Resource Identifier (URI) is a compact sequence of characters that identifies an abstract or physical resource. This specification defines the generic URI syntax and a process for resolving URI references that might be in relative form, along with guidelines and security considerations for the use of URIs on the Internet. The URI syntax defines a grammar that is a superset of all valid URIs, allowing an implementation to parse the common components of a URI reference without knowing the scheme-specific requirements of every possible identifier. This specification does not define a generative grammar for URIs; that task is performed by the individual specifications of each URI scheme. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="66"/>
          <seriesInfo name="RFC" value="3986"/>
          <seriesInfo name="DOI" value="10.17487/RFC3986"/>
        </reference>
        <reference anchor="RFC8615">
          <front>
            <title>Well-Known Uniform Resource Identifiers (URIs)</title>
            <author fullname="M. Nottingham" initials="M." surname="Nottingham"/>
            <date month="May" year="2019"/>
            <abstract>
              <t>This memo defines a path prefix for "well-known locations", "/.well-known/", in selected Uniform Resource Identifier (URI) schemes.</t>
              <t>In doing so, it obsoletes RFC 5785 and updates the URI schemes defined in RFC 7230 to reserve that space. It also updates RFC 7595 to track URI schemes that support well-known URIs in their registry.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8615"/>
          <seriesInfo name="DOI" value="10.17487/RFC8615"/>
        </reference>
        <reference anchor="RFC7301">
          <front>
            <title>Transport Layer Security (TLS) Application-Layer Protocol Negotiation Extension</title>
            <author fullname="S. Friedl" initials="S." surname="Friedl"/>
            <author fullname="A. Popov" initials="A." surname="Popov"/>
            <author fullname="A. Langley" initials="A." surname="Langley"/>
            <author fullname="E. Stephan" initials="E." surname="Stephan"/>
            <date month="July" year="2014"/>
            <abstract>
              <t>This document describes a Transport Layer Security (TLS) extension for application-layer protocol negotiation within the TLS handshake. For instances in which multiple application protocols are supported on the same TCP or UDP port, this extension allows the application layer to negotiate which protocol will be used within the TLS connection.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7301"/>
          <seriesInfo name="DOI" value="10.17487/RFC7301"/>
        </reference>
      </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="4" month="March" year="2024"/>
            <abstract>
              <t>   The WebTransport Protocol Framework enables clients constrained by
   the Web security model to communicate with a remote server using a
   secure multiplexed transport.  It consists of a set of individual
   protocols that are safe to expose to untrusted applications, combined
   with an abstract model that allows them to be used interchangeably.

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

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-webtrans-overview-07"/>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA8197XrbRpLu/74KrPPDdpZkLDvJzmg2O6PIcqIdW/JYcnJ2
MzkRSEIS1iTAAKBkjcd7LedazpWdeuujP0BQthNnz+R5dscCge7q6ur6rurx
eOy6slsUu9mdZ8W8zLP6qmiyv7w83M9Om7xqV3XT3XH5dNoUV7vZsv553Nlj
N69nVb6kT+dNft6Ny6I7HydvjB88cvO8ozfePN47PXjrZvTHRd3c7GZtN3eu
XDW7Wdes2+7hgwe/f/DQ5U2R72Z7q9WipFfLumqzvJpnL4p8MT4tl4Vr19Nl
2bb0y+nNisY9PDh94q7r5tVFU69Xu9mz47+4V8UNPZnTj1VXNFXRjR8DPufa
jgb7KV/UFX15U7SuXeZN99PP67or2t2sqt2q3M1+6OrZKGsJ/KY4b+lfN0v5
By13ma9WZXXxo3P5urusm12XZWP6vywrKxrh6STbXzeL4oYfCW6erl8V8dO6
ucir8m+8ut3scdnOCFb+pVjm5WI3e1W+LhaEp/mfLvBgMquXLp3mz5Ps+fqi
rKJZ/lw25WIRPU6neVZ0eTxH+aps/rSkhwOjn0yyI8JT/mpN2ImmOFlf5m3/
p3Safawmnqet5PU/zfDLwGTfTbLv8rZclMVVNNV35ayrm/SXdKZv6vpiUcRT
XeHlq6s/XfAvA1MdTrKT66LronkO8yp69q4ZSqJqvBxPgZ+bGseHDg/B7FxV
N0sa4qoAbeAc7WYvnuz//sGDB/T398XUnyqafvx4wofmupjymRlfdt3qEZ2L
6jyM4sbjcZZPW3pjRkR8elm2IMX1sqi6bF6cl1XRZt1lkREhFdm0uMyvSkIe
jZBtPdHuHh2U0/ujLM+W/I4/stmqqekA1Asaui0vqmKedXVWr4qGSDIaivbV
xasZZdeX5ewyo9mLrC2X5SInGNbVDNjMF2V3M8HhPM3yxaK+pmONiebrGY1X
nzsFos5W6+mibC8z4ho5H30er+xocVVLS55nV/QicYF21pQrjJ1Nb7LcLdeL
rgTXoIlowKyo5qu6rLp2kh129P4KMLZECMQReLIO+KK/gMOScFtO1xjNEbsA
OxG+A0wbFoDPy/LiMmtn+aLgn2khGU5qNbtJBpnIni3L+ZwoyLlPwIl4tTyF
k2053tyWTLYF8+ZhI7rLvMOjmta7LP9WzB1gwY7z1/69N2/w99u3o6wo6deG
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

-->

</rfc>
