<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.29 (Ruby 3.4.9) -->


<!DOCTYPE rfc  [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">

]>


<rfc ipr="trust200902" docName="draft-lcurley-moq-lite-06" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="moql">Media over QUIC - Lite</title>

    <author fullname="Luke Curley">
      <organization></organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>

    <date year="2026" month="September" day="24"/>

    <area>wit</area>
    <workgroup>moq</workgroup>
    

    <abstract>


<?line 44?>

<t>moq-lite is designed to fanout live content 1-&gt;N across the internet.
It leverages QUIC to prioritize important content, avoiding head-of-line blocking while respecting encoding dependencies.
While primarily designed for media, the transport is payload agnostic and can be proxied by relays/CDNs without knowledge of codecs, containers, or encryption keys.</t>



    </abstract>



    <note title="Note to Readers">


<?line 50?>

<t>This document was generated by an AI model from the implementation at <eref target="https://github.com/moq-dev/moq">github.com/moq-dev/moq</eref> and is maintained alongside it.
Submit an <eref target="https://github.com/moq-dev/moq/issues">issue</eref> or <eref target="https://github.com/moq-dev/moq/pulls">PR</eref> if this spec sucks and you want to fix anything.</t>


    </note>


  </front>

  <middle>


<?line 55?>

<section anchor="conventions-and-definitions"><name>Conventions 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?>

</section>
<section anchor="rationale"><name>Rationale</name>
<t>This draft is based on MoqTransport <xref target="moqt"></xref>.
The concepts, motivations, and terminology are very similar and when in doubt, refer to existing MoqTransport literature.
A few things have been renamed (ex. object -&gt; frame) to better align with media terminology.</t>

<t>I absolutely believe in the motivation and potential of Media over QUIC.
The layering is phenomenal and addresses many of the problems with current live media protocols.
I fully support the goals of the working group and the IETF process.</t>

<t>But it's been difficult to design such an experimental protocol via committee.
MoqTransport has become too complicated.</t>

<t>There are too many messages, optional modes, and half-baked features.
Too many hypotheses, too many potential use-cases, too many diametrically opposed opinions.
This is expected (and even desired) as compromise gives birth to a standard.</t>

<t>But I believe the standardization process is hindering practical experimentation.
The ideas behind MoQ can be proven now before being cemented as an RFC.
We should spend more time building an <em>actual</em> application and less time arguing about a hypothetical one.</t>

<t>moq-lite is the bare minimum needed for a real-time application aiming to replace WebRTC.
Every feature from MoqTransport that is not necessary (or has not been implemented yet) has been removed for simplicity.
This includes many great ideas (ex. group order) that may be added as they are needed.
This draft is the current state, not the end state.</t>

</section>
<section anchor="concepts"><name>Concepts</name>
<t>moq-lite consists of:</t>

<t><list style="symbols">
  <t><strong>Session</strong>: An established QUIC connection between a client and server.</t>
  <t><strong>Broadcast</strong>: A collection of Tracks from a single publisher.</t>
  <t><strong>Track</strong>: A series of Groups, each of which can be delivered and decoded <em>out-of-order</em>.</t>
  <t><strong>Group</strong>: A series of Frames, each of which must be delivered and decoded <em>in-order</em>.</t>
  <t><strong>Frame</strong>: A sized payload of bytes within a Group.</t>
</list></t>

<t>The application determines how to split data into broadcast, tracks, groups, and frames.
The moq-lite layer provides fanout, prioritization, and caching even for latency sensitive applications.</t>

<section anchor="session"><name>Session</name>
<t>A Session consists of a connection between a client and a server.
There is currently no P2P support within QUIC so it's out of scope for moq-lite.</t>

<t>The moq-lite version identifier is <spanx style="verb">moq-lite-xx</spanx> where <spanx style="verb">xx</spanx> is the two-digit draft version.
The identifier for this draft is <spanx style="verb">moq-lite-06</spanx>.
For bare QUIC, this is negotiated as an ALPN token during the QUIC handshake.
For WebTransport over HTTP/3, the QUIC ALPN remains <spanx style="verb">h3</spanx> and the moq-lite version is advertised via the <spanx style="verb">WT-Available-Protocols</spanx> and <spanx style="verb">WT-Protocol</spanx> CONNECT headers.</t>

<t>When UDP is unavailable, moq-lite <bcp14>MAY</bcp14> also run over reliable byte-stream transports via Qmux <xref target="qmux"></xref>; see <xref target="transports"></xref> for the specific bindings.</t>

<t>The session is active immediately after the connection is established.
Both endpoints <bcp14>SHOULD</bcp14> begin sending and receiving streams right away to avoid an extra round-trip.</t>

<t>Optional capabilities and extensions are negotiated via a SETUP message (see <xref target="setup"></xref>).
Each endpoint <bcp14>MUST</bcp14> open a unidirectional Setup Stream at the start of the session, send a single SETUP message advertising what it supports, and immediately close the stream (FIN); an endpoint with no optional capabilities sends a SETUP with an empty parameter list.
Neither endpoint waits for the peer's SETUP before opening other streams.
An endpoint <bcp14>MUST</bcp14> buffer a stream whose behavior or encoding depends on a negotiated extension until the peer's SETUP arrives; everything else proceeds immediately.
As a fallback, an endpoint that opens an extension stream the peer does not support simply sees that stream reset (see <xref target="stream_type"></xref>).
A negotiated capability applies only to this hop; each session is negotiated independently and relays <bcp14>MUST NOT</bcp14> forward SETUP.</t>

<t>While moq-lite is a point-to-point protocol, it's intended to work end-to-end via relays.
Each client establishes a session with a CDN edge server, ideally the closest one.
Any broadcasts and subscriptions are transparently proxied by the CDN behind the scenes.</t>

</section>
<section anchor="broadcast"><name>Broadcast</name>
<t>A Broadcast is a collection of Tracks from a single publisher.
This corresponds to a MoqTransport's "track namespace".</t>

<t>A publisher advertises what it can serve via ANNOUNCE_START messages, each carrying a path prefix: a route covering every broadcast path beneath it.
A route is the only shape an advertisement takes: a publisher that serves only some of the paths beneath a prefix, such as a transcoder for any broadcast's derivative, advertises the covering prefix and refuses the requests it will not serve (see <xref target="resolution"></xref>); no message narrows a route.
The subscriber uses the ANNOUNCE_REQUEST message to discover these routes, then subscribes to specific paths under them; which paths name broadcasts is an application convention.
The common convention is that a publisher announces each broadcast's exact path as its own route, so subscribers can enumerate broadcasts, while a service announces one short prefix and serves whatever is requested beneath it.
Announcements are live and can change over time, allowing for dynamic origin discovery.</t>

<t>A broadcast consists of any number of Tracks.
The contents, relationships, and encoding of tracks are determined by the application.</t>

</section>
<section anchor="track"><name>Track</name>
<t>A Track is a series of Groups identified by a unique name within a Broadcast.</t>

<t>A track consists of a single active Group at any moment, called the "latest group".
When a new Group is started, the previous Group is closed and may be dropped for any reason.
The duration before an incomplete group is dropped is determined by the application and the publisher/subscriber's latency target.</t>

<t>Every subscription is scoped to a single Track.
A subscription starts at a configurable Group (defaulting to the latest) and continues until a configurable end Group or until either the publisher or subscriber cancels the subscription.
Both bounds may be refined to a Frame within their Group, so a subscription can start or stop partway through a Group rather than only on a Group boundary (see <xref target="positions"></xref>).</t>

<t>The subscriber and publisher both indicate their delivery preference:
- <spanx style="verb">Priority</spanx> indicates if Track A should be transmitted instead of Track B.
- <spanx style="verb">Subscriber Max Age</spanx> indicates the maximum age before a non-latest Group is dropped from live delivery; <spanx style="verb">Publisher Max Age</spanx> indicates the maximum age before a non-latest Group is dropped from the publisher's cache.</t>

<t>The combination of these preferences enables the most important content to arrive during network degradation while still respecting encoding dependencies.</t>

</section>
<section anchor="group"><name>Group</name>
<t>A Group is an ordered stream of Frames within a Track.</t>

<t>Each group consists of an append-only list of Frames.
A Group is normally served by a dedicated QUIC stream which is closed on completion, reset by the publisher, or cancelled by the subscriber.
This ensures that all Frames within a Group arrive reliably and in order.</t>

<t>In contrast, Groups may arrive out of order due to network congestion and prioritization.
The application <bcp14>SHOULD</bcp14> process or buffer groups out of order to avoid blocking on flow control.</t>

<t>A small single-frame Group <bcp14>MAY</bcp14> instead be transmitted as a QUIC datagram when reliability is not required (see <xref target="datagrams"></xref>).</t>

</section>
<section anchor="frame"><name>Frame</name>
<t>A Frame is a payload of bytes within a Group.</t>

<t>A frame is used to represent a chunk of data with an upfront size.
The contents are opaque to the moq-lite layer.</t>

<t>Frames within a Group are numbered from 0 in the order they were produced.
This index is not transmitted per frame; it is implied by position within the Group, anchored by the <xref target="group"></xref> message's <spanx style="verb">Frame Start</spanx>.
A Group Stream normally starts at frame 0, but <bcp14>MAY</bcp14> start later when the publisher only holds (or was only asked for) part of the Group.</t>

<t>Each frame carries a presentation timestamp expressed in the parent Track's <spanx style="verb">Timescale</spanx> (see <xref target="track-info">TRACK_INFO</xref>), used by the moq-lite layer for <xref target="expiration"></xref> decisions.</t>

</section>
<section anchor="positions"><name>Positions</name>
<t>A Position is a (Group Sequence, Frame Index) pair identifying one frame within a Track.
Positions order lexicographically: by group first, then by frame within the group.</t>

<t>SUBSCRIBE and FETCH bound their delivery by Position rather than by Group alone.
Each carries a <spanx style="verb">Frame Start</spanx> qualifying its start group and a <spanx style="verb">Frame End</spanx> qualifying its end group; both default to the whole group, which is the behavior of a draft that has no such field.</t>

<t>The bounds are chosen so that two subscriptions abut exactly.
<spanx style="verb">Frame Start</spanx> is the index of the first frame to deliver and <spanx style="verb">Frame End</spanx> is the index of the last (inclusive), so a subscriber that has received frames 0 through <spanx style="verb">N-1</spanx> of group <spanx style="verb">G</spanx> and wants the remainder asks for <spanx style="verb">Group Start</spanx> = <spanx style="verb">G</spanx>, <spanx style="verb">Frame Start</spanx> = <spanx style="verb">N</spanx>.
Capping the first subscription at <spanx style="verb">Group End</spanx> = <spanx style="verb">G</spanx>, <spanx style="verb">Frame End</spanx> = <spanx style="verb">N-1</spanx> covers exactly the complement with no gap and no overlap.
Because <spanx style="verb">Group End</spanx> and <spanx style="verb">Frame End</spanx> are both encoded as <spanx style="verb">absolute + 1</spanx> (see <xref target="subscribe"></xref>) while <spanx style="verb">Group Start</spanx> and <spanx style="verb">Frame Start</spanx> are not, the two requests carry the <em>same</em> numbers on the wire; the end bound is effectively exclusive once encoded.</t>

<t>This is what lets a subscriber move a Track to a different publisher partway through a Group instead of waiting for the next Group to start, which matters for Tracks whose current Group may stay open indefinitely.
A Group can therefore be assembled from more than one publisher: each contributes a disjoint run of frames, and the subscriber concatenates them in index order.</t>

<t>A partial Group is only ever delivered to a subscriber that asked for one.
A publisher that cannot serve a Group from the frame the subscription names <bcp14>MUST</bcp14> skip that Group entirely and resolve the subscription to a later one, rather than deliver the part it holds.
The resolved start is therefore always either exactly the requested Position or the beginning of a later Group, never some third Position the subscriber did not choose.</t>

<t>The asymmetry with Groups is deliberate.
A Group is the unit of decodability: dropping leading <em>Groups</em> leaves a stream the application can still decode, whereas dropping leading <em>Frames</em> often does not, whether because the Group opens with a keyframe the rest depends on or because its compression state lives in the frames that went missing.
Only the subscriber knows whether a partial Group is any use to it, so only the subscriber may ask for one.</t>

<t>Frame indices are only meaningful relative to a Group the subscriber has already begun receiving, so:</t>

<t><list style="symbols">
  <t>A <spanx style="verb">Frame Start</spanx> qualifies the group <spanx style="verb">Group Start</spanx> names, group 0 included.
A subscriber that has seen no such group <bcp14>MUST</bcp14> send <spanx style="verb">Frame Start</spanx> = 0, since it cannot number the frames of a group it has not received.</t>
  <t>A <spanx style="verb">Frame End</spanx> is meaningless without a <spanx style="verb">Group End</spanx>; an unbounded subscription (<spanx style="verb">Group End</spanx> = 0) <bcp14>MUST</bcp14> send <spanx style="verb">Frame End</spanx> = 0.</t>
</list></t>

<t>A publisher <bcp14>MUST</bcp14> treat a violation of either rule as a protocol violation and reset the stream.</t>

</section>
</section>
<section anchor="flow"><name>Flow</name>
<t>This section outlines the flow of messages within a moq-lite session.
See the Messages section for the specific encoding.</t>

<section anchor="connection"><name>Connection</name>
<t>moq-lite runs on top of any transport that provides ordered, multiplexed, bidirectional streams: bare QUIC, WebTransport over HTTP/3 (required for web support), or Qmux <xref target="qmux"></xref> when UDP is unavailable.
See <xref target="transports"></xref> for the bindings.</t>

<t>How the underlying connection is authenticated is out-of-scope for this draft.</t>

</section>
<section anchor="transports"><name>Transports</name>
<t>moq-lite defines four transport bindings.
All four carry the same control and data streams defined elsewhere in this document; they differ only in how QUIC streams are multiplexed onto the underlying connection.</t>

<texttable>
      <ttcol align='right'>&#160;</ttcol>
      <ttcol align='left'>Transport</ttcol>
      <ttcol align='left'>ALPN / Identifier</ttcol>
      <ttcol align='left'>Record framing</ttcol>
      <c>1</c>
      <c>QUIC</c>
      <c><spanx style="verb">moq-lite-xx</spanx></c>
      <c>Native QUIC streams</c>
      <c>2</c>
      <c>WebTransport / H3</c>
      <c><spanx style="verb">moq-lite-xx</spanx> (CONNECT header)</c>
      <c>Native WebTransport streams</c>
      <c>3</c>
      <c>Qmux over TCP/TLS</c>
      <c><spanx style="verb">moq-lite-xx</spanx> (ALPN over TLS)</c>
      <c>Qmux Record <xref target="qmux"></xref></c>
      <c>4</c>
      <c>Qmux over WebSocket</c>
      <c><spanx style="verb">moq-lite-xx</spanx> (Sec-WebSocket-Protocol)</c>
      <c>WebSocket message <xref target="qmuxws"></xref></c>
</texttable>

<t>For bindings 1 and 2, moq-lite uses the underlying QUIC/WebTransport stream APIs directly.
QUIC datagrams (see <xref target="datagrams"></xref>) are supported by bindings 1 and 2 only; a publisher <bcp14>MUST NOT</bcp14> emit datagrams on bindings 3 and 4.</t>

<t>For binding 3, a client opens a TCP connection, performs a TLS handshake, and negotiates the moq-lite version as the ALPN token.
Each direction of the TLS byte stream then carries Qmux Records as defined in <xref target="qmux"></xref>.</t>

<t>For binding 4, a client opens a WebSocket connection <xref target="RFC6455"></xref> offering the moq-lite version as the subprotocol, per <xref target="qmuxws"></xref>: each WebSocket binary message carries one Qmux Record's <spanx style="verb">Frames</spanx> payload, with the message boundary replacing the Record <spanx style="verb">Size</spanx> field.</t>

<t>All other moq-lite semantics (stream types, message encoding, flow control, etc.) are identical across bindings.</t>

</section>
<section anchor="termination"><name>Termination</name>
<t>QUIC bidirectional streams have an independent send and receive direction.
Rather than deal with half-open states, moq-lite combines both sides.
If an endpoint closes the send direction of a stream, the peer <bcp14>MUST</bcp14> also close their send direction.</t>

<t>moq-lite contains many long-lived transactions, such as subscriptions and announcements.
These are terminated when the underlying QUIC stream is terminated.</t>

<t>To terminate a stream, an endpoint may:
- close the send direction (STREAM with FIN) to gracefully terminate (all messages are flushed).
- reset the send direction (RESET_STREAM) to immediately terminate.</t>

<t>After resetting the send direction, an endpoint <bcp14>MAY</bcp14> close the recv direction (STOP_SENDING).
However, it is ultimately the other peer's responsibility to close their send direction.</t>

</section>
<section anchor="error-codes"><name>Error Codes</name>
<t>There are two independent error code spaces, one for terminating the session and one for resetting a stream.
The same numeric value means different things in each, so an endpoint <bcp14>MUST</bcp14> select the code from the space matching what it is terminating.</t>

<t>The shared codes match moq-transport draft-18 and later.
Earlier drafts differ: 0x4 denotes UNKNOWN_OBJECT_STATUS in draft-16/17 and is unassigned in draft-14/15; TOO_FAR_BEHIND was added in draft-17 and MALFORMED_TRACK in draft-16.
An endpoint bridging protocols <bcp14>MUST</bcp14> translate codes according to the negotiated version and error-code space; moq-lite's reserved, own, and application ranges have no corresponding moq-transport ranges.
The codes moq-lite uses are listed in full below; an endpoint <bcp14>MUST NOT</bcp14> assign a moq-lite specific meaning to any code below 32.</t>

<t>Codes 64 and above are the application's, opaque to moq-lite.
An endpoint <bcp14>MUST</bcp14> ignore a code it does not recognize, treating it as an unspecified error.
An endpoint <bcp14>MUST NOT</bcp14> infer a meaning for an unregistered code; in particular, it <bcp14>MUST NOT</bcp14> assume a code is an authorization failure unless it is UNAUTHORIZED.</t>

<t>Codes 32 through 47 are reserved for a future revision: nothing is assigned there and a value in it <bcp14>MUST NOT</bcp14> be interpreted.</t>

<t>Codes 48 through 63 are moq-lite's own, for conditions moq-transport has no code for, and are assigned by the tables below.
This is the one range that does not survive a bridge unchanged: an endpoint speaking both protocols <bcp14>MUST</bcp14> map a code here to the moq-transport code with the same meaning rather than forward the value, and <bcp14>MUST</bcp14> map an unmapped one to an unspecified error.</t>

<section anchor="session-error-codes"><name>Session Error Codes</name>
<t>Sent when terminating the session, via the transport's session close.</t>

<texttable>
      <ttcol align='left'>Code</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x0</c>
      <c>NO_ERROR</c>
      <c>The session was terminated without error.</c>
      <c>0x1</c>
      <c>INTERNAL_ERROR</c>
      <c>An implementation-specific error.</c>
      <c>0x2</c>
      <c>UNAUTHORIZED</c>
      <c>The endpoint is not authorized to establish the session, or to perform an operation on it.</c>
      <c>0x3</c>
      <c>PROTOCOL_VIOLATION</c>
      <c>The peer violated this specification.</c>
      <c>0x6</c>
      <c>KEY_VALUE_FORMATTING_ERROR</c>
      <c>A key-value pair was malformed, or repeated more than allowed.</c>
      <c>0x10</c>
      <c>GOAWAY_TIMEOUT</c>
      <c>The peer did not close within the GOAWAY drain deadline.</c>
      <c>0x11</c>
      <c>CONTROL_MESSAGE_TIMEOUT</c>
      <c>The peer took too long to respond to a control message.</c>
      <c>0x15</c>
      <c>VERSION_NEGOTIATION_FAILED</c>
      <c>No version could be negotiated.</c>
</texttable>

</section>
<section anchor="stream-error-codes"><name>Stream Error Codes</name>
<t>Sent when resetting a stream (RESET_STREAM), or when refusing to receive one (STOP_SENDING).</t>

<texttable>
      <ttcol align='left'>Code</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Description</ttcol>
      <c>0x0</c>
      <c>INTERNAL_ERROR</c>
      <c>An implementation-specific error.</c>
      <c>0x1</c>
      <c>CANCELLED</c>
      <c>The stream was cancelled by either endpoint. A routine unsubscribe.</c>
      <c>0x2</c>
      <c>DELIVERY_TIMEOUT</c>
      <c>The content missed its delivery deadline.</c>
      <c>0x3</c>
      <c>SESSION_CLOSED</c>
      <c>The session is closing, taking this stream with it.</c>
      <c>0x4</c>
      <c>GOING_AWAY</c>
      <c>A GOAWAY was sent or received.</c>
      <c>0x5</c>
      <c>TOO_FAR_BEHIND</c>
      <c>The reader fell too far behind and content was dropped to catch up.</c>
      <c>0x12</c>
      <c>MALFORMED_TRACK</c>
      <c>The track's content could not be parsed.</c>
      <c>0x30</c>
      <c>NO_CAPACITY</c>
      <c>The publisher could serve this request but has no capacity for it now. Permits one re-resolution (see <xref target="resolution"></xref>); elsewhere it is terminal like any refusal. Bridges to NO_CAPACITY in <xref target="I-D.lcurley-moq-pattern"/>.</c>
      <c>0x31</c>
      <c>CONTROL_TIMEOUT</c>
      <c>The peer took too long to answer a control request. Distinct from DELIVERY_TIMEOUT, which is content that missed its deadline; it has no moq-transport value and bridges to INTERNAL_ERROR.</c>
      <c>0x32</c>
      <c>GROUP_TOO_LARGE</c>
      <c>The group grew past the publisher's cache budget and was aborted.</c>
      <c>0x33</c>
      <c>NOT_FOUND</c>
      <c>The requested group, track, or broadcast is not here.</c>
      <c>0x34</c>
      <c>OLD</c>
      <c>The group was superseded by a newer group and dropped.</c>
      <c>0x35</c>
      <c>EVICTED</c>
      <c>The group was dropped under memory pressure. Unlike OLD it was still current, so it can be re-fetched.</c>
      <c>0x36</c>
      <c>UNROUTABLE</c>
      <c>The broadcast is neither announced nor served, so there is no route to it.</c>
      <c>0x37</c>
      <c>WRONG_SIZE</c>
      <c>A frame's payload length disagreed with its declared size.</c>
      <c>0x38</c>
      <c>FRAME_TOO_LARGE</c>
      <c>A frame declared a payload larger than the receiver accepts.</c>
      <c>0x39</c>
      <c>TIMESTAMP_MISMATCH</c>
      <c>A frame's timestamp does not match its track's timescale.</c>
</texttable>

<t>Note that CANCELLED is 0x1, not 0x0: a stream reset with 0x0 is an INTERNAL_ERROR, not a routine cancellation.
An endpoint terminating a stream because the session is ending <bcp14>SHOULD</bcp14> use SESSION_CLOSED rather than the session's own code, since the two spaces are disjoint.</t>

</section>
</section>
<section anchor="handshake"><name>Handshake</name>
<t>See the <xref target="session"></xref> section for ALPN negotiation and session activation details.</t>

</section>
</section>
<section anchor="streams"><name>Streams</name>
<t>moq-lite uses a bidirectional stream for each transaction.
If the stream is closed, potentially with an error, the transaction is terminated.</t>

<section anchor="bidirectional-streams"><name>Bidirectional Streams</name>
<t>Bidirectional streams are used for control streams.
There's a 1-byte STREAM_TYPE at the beginning of each stream.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Stream</ttcol>
      <ttcol align='left'>Creator</ttcol>
      <c>0x1</c>
      <c>Announce</c>
      <c>Subscriber</c>
      <c>0x2</c>
      <c>Subscribe</c>
      <c>Subscriber</c>
      <c>0x3</c>
      <c>Fetch</c>
      <c>Subscriber</c>
      <c>0x4</c>
      <c>Probe</c>
      <c>Subscriber</c>
      <c>0x5</c>
      <c>Goaway</c>
      <c>Either</c>
      <c>0x6</c>
      <c>Track</c>
      <c>Subscriber</c>
</texttable>

<section anchor="announce"><name>Announce</name>
<t>A subscriber can open an Announce Stream to discover routes matching a prefix.
A route is an advertisement that paths under its prefix can be served; it claims capability, not inventory, so it never asserts that any specific broadcast exists.</t>

<t>The subscriber creates the stream with an ANNOUNCE_REQUEST message.
The publisher replies with a single ANNOUNCE_OK message followed by announcements for any matching routes and any future changes:</t>

<t><list style="symbols">
  <t>ANNOUNCE_START: a matching route over a path prefix is available.</t>
  <t>ANNOUNCE_END: a previously started route is no longer advertised.</t>
  <t>ANNOUNCE_UPDATE: a previously started advertisement was atomically updated (new hops or cost).</t>
</list></t>

<t>ANNOUNCE_OK carries metadata that applies to every announcement on the stream: the publisher's own <spanx style="verb">Hop ID</spanx> (the implicit trailing entry of every announcement's path) and the number of initial announcements, which lets the subscriber deliver the initial set as a batch (see <xref target="announce-ok">ANNOUNCE_OK</xref>).</t>

<t>Each ANNOUNCE_START implicitly assigns the next Announce ID on the stream: a counter starting at 0 that increments by 1 per advertisement.
The id never appears on the wire; both endpoints derive it from the message order on the (reliable, ordered) stream.
ANNOUNCE_END and ANNOUNCE_UPDATE reference the Announce ID instead of repeating the route's prefix.</t>

<t>Each route has at most one current advertisement per stream.
A second ANNOUNCE_START for an already-advertised route is a protocol violation; an ANNOUNCE_UPDATE atomically updates the current advertisement's metadata while keeping its id live.</t>

<t>The subscriber <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if it receives an ANNOUNCE_END or ANNOUNCE_UPDATE referencing an Announce ID that was never assigned or already retired, an ANNOUNCE_START for a route that is already advertised, or any announcement before ANNOUNCE_OK.
When the stream is closed, the subscriber <bcp14>MUST</bcp14> assume that all routes are now unavailable.</t>

<t>A route covers a path when its prefix is a leading run of the path's segments; matching is per path segment, so a prefix never matches half a segment, and equality is byte-by-byte within each segment.
A publisher answering a request stream presents each of its routes clamped to the intersection with the requested prefix: a route above the request's prefix appears as the request prefix itself (an empty suffix), which is exactly the covered set the subscriber may see.
There <bcp14>MAY</bcp14> be multiple Announce Streams, potentially containing overlapping prefixes, that get their own ANNOUNCE_OK + announcements.</t>

<section anchor="routing"><name>Routing</name>
<t>Each advertisement carries the path of Hop IDs it traversed and an accumulated Warm and Cold Route Cost (see <xref target="announce-start">ANNOUNCE_START</xref>), which relays use to build a loop-free mesh.</t>

<t>A receiver <bcp14>MUST</bcp14> discard an announcement whose reconstructed path contains its own Hop ID: it has looped back, so forwarding it would extend the loop and subscribing through it would route the receiver back to itself.
This is the only loop defense moq-lite requires, and it catches loops of any length.
A conforming sender never sends one (see below), so a receiver <bcp14>MAY</bcp14> instead close the session with a protocol violation; discarding is what keeps a mesh working when one member does not conform.
A Hop ID of 0 means unknown and never matches anything; withholding an ID trades loop detection for privacy.
A receiver <bcp14>MAY</bcp14> assign an identity of its own to a peer that declared 0, as local selection state for filtering that session; it <bcp14>MUST NOT</bcp14> forward that identity as a Hop ID.</t>

<t>A publisher <bcp14>MUST NOT</bcp14> advertise a path whose entries contain the Hop ID the subscriber declared in its SETUP (see <xref target="hop-parameter">Hop Parameter</xref>).
The receiver can only discard it, and acting on it would form a loop, so sending one is never useful.
Of the paths that remain a publisher <bcp14>SHOULD</bcp14> advertise the best, and nothing when every known path contains that Hop ID.
Selection is per subscriber, so a subscriber that the serving path flows through still receives the best standby path, which is what lets it fail over if its own copy dies.
The per-subscriber winner changing travels as an ANNOUNCE_UPDATE; the last qualifying path appearing or disappearing travels as an ANNOUNCE_START or ANNOUNCE_END.</t>

<t>When serving a subscription, a publisher <bcp14>MUST</bcp14> select the source by that same exclusion; if only excluded sources remain, the subscription is unroutable.
Applying one rule to both advertisement and dispatch keeps advertised paths truthful, which is what prevents subscription cycles of any length.</t>

<t>When resolving a path covered by several routes (across any number of streams), the subscriber <bcp14>SHOULD</bcp14> prefer the most specific covering route (see <xref target="resolution"></xref>), then a path that contains no 0 Hop ID over one that does, then the lowest Warm Route Cost after adding each arriving link's cost (see <xref target="cost-parameter">Cost Parameter</xref>), breaking ties toward the lowest Cold Route Cost, then toward the shortest path, and then toward the most recently received, so a reconnecting publisher is not outranked by the stale session it replaced.</t>

<t>A route's identity is its first hop: the endpoint that originated it (see <xref target="announce-start">ANNOUNCE_START</xref>).
Two routes covering one path with the same non-zero first hop are the same origin reached different ways, and a relay <bcp14>MAY</bcp14> move a live subscription between them, resuming at a group boundary, so a route change the identity survives (a reconnect, a cheaper path, a draining session) is invisible to the subscriber.
Across differing first hops, or where either is 0, the routes promise nothing about each other's content: a relay <bcp14>MUST NOT</bcp14> splice a live subscription across them, and when the serving session ends, in-flight subscriptions end with it (a reset) and the subscriber re-requests through the best remaining route.
Equal first hops promise the same origin, not interchangeable bytes; what a resuming relay serves next is whatever that origin publishes next at the group boundary.</t>

</section>
<section anchor="resolution"><name>Resolution</name>
<t>A SUBSCRIBE, FETCH, or TRACK request names a path, and the receiver resolves it against the routes covering that path, after the per-subscriber exclusion above.</t>

<t>Only the most specific covering routes are consulted: those with the longest prefix.
A route strictly inside another's paths always ranks above it, and a broadcast's exact path is the most specific route there is, so a concrete announcement shadows every broader route covering it at any cost; routes over the same prefix form one tier.
The winning tier is the whole answer: a refusal from it never falls through to a less specific route, so a service refusing a path does not leak the request to a catch-all, and one unserved path costs one round trip rather than a walk down the candidates.</t>

<t>Within the tier, cost and the tie-breaks of <xref target="routing"></xref> order the routes.</t>

<t>A route resolved this way serves the request like any other, and the route is not consumed by it.
A relay <bcp14>MUST NOT</bcp14> announce a path merely because it resolved it: the covering route stays the only advertisement until the advertiser announces the concrete path, which it <bcp14>SHOULD</bcp14> do once it is producing, so a later request finds the running broadcast by its exact path instead of resolving a second producer.</t>

<t>Standby ordering is a deployment guarantee within one specificity tier, not a bound on every representable Route Cost.
A deployment relying on it <bcp14>MUST</bcp14> bound the number of charged links on an admitted path by H and each charged link cost by C, including the receiving link, and <bcp14>MUST</bcp14> enforce those bounds when admitting paths and links.
Already-producing origins in that deployment <bcp14>MUST</bcp14> seed their cost at 0; standby origins <bcp14>MUST</bcp14> choose a seed S satisfying <spanx style="verb">H * C &lt; S &lt; saturation ceiling</spanx>.
A seed of <spanx style="verb">2^32</spanx> is <bcp14>RECOMMENDED</bcp14> only when <spanx style="verb">H * C &lt; 2^32</spanx>; otherwise the deployment must choose a larger seed or tighter bounds.
Unknown, out-of-budget, and saturated routes are outside this guarantee; a receiver <bcp14>MUST NOT</bcp14> infer that they outrank standby capacity merely because they might already carry content.</t>

<t>An advertiser that will not serve a resolved request resets the request stream with a typed code (see <xref target="error-codes">Error Codes</xref>).
A NO_CAPACITY reset permits the receiver ONE re-resolution, within the same tier and excluding every route whose advertiser is the refusing one.
The exclusion is what makes the retry safe, not the retraction arriving first: an advertiser's capacity and a receiver's view of it are at least half a round trip apart, so a retraction and a request for the slot it gave away necessarily cross.
Re-resolution may find no other route, and the request is then unroutable; that is a correct outcome, not a fallback list.
A receiver that has spent its re-resolution, or has nothing to spend it on, <bcp14>MUST</bcp14> reset the downstream request with a code other than NO_CAPACITY, so the single retry cannot compound hop by hop.
Every other code, and any unrecognized one, is terminal and propagates without re-resolution, so probing unserved paths costs one round trip per path.
A receiver <bcp14>SHOULD NOT</bcp14> cache refusals; rate limiting is the advertiser's concern.</t>

</section>
</section>
<section anchor="subscribe"><name>Subscribe</name>
<t>A subscriber opens Subscribe Streams to request a Track.</t>

<t>The subscriber <bcp14>MUST</bcp14> start a Subscribe Stream with a SUBSCRIBE message followed by any number of SUBSCRIBE_UPDATE messages.
The publisher replies with a SUBSCRIBE_OK message once the start group is resolved, followed by any number of SUBSCRIBE_END and SUBSCRIBE_DROP messages.
For a live track the publisher <bcp14>MAY</bcp14> withhold SUBSCRIBE_OK until the first matching group resolves the start; if the track has already ended with no matching groups, it sends SUBSCRIBE_END with no preceding SUBSCRIBE_OK.
A rejection is a stream reset: a publisher that cannot serve the subscription (no such track, an ended broadcast, or any other refusal) <bcp14>MUST</bcp14> promptly reset the stream rather than leave it pending, so a subscriber distinguishes "pending" from "refused" by the reset, not by a timeout.
A route claims capability rather than inventory, so a subscription for a covered path that names nothing is refused this way too.</t>

<t>The track's immutable publisher properties are not carried here; they are fetched once via a <xref target="track-stream">Track Stream</xref>.
The subscriber needs the track's TRACK_INFO (notably its timescale) to interpret FRAME messages, and <bcp14>MAY</bcp14> open the Track and Subscribe streams concurrently, buffering frames until it arrives.</t>

<t>The publisher sends SUBSCRIBE_OK once the absolute start position is resolved, and SUBSCRIBE_END once no further groups will be produced (see <xref target="subscribe-ok">SUBSCRIBE_OK</xref> and <xref target="subscribe-end">SUBSCRIBE_END</xref>).
The publisher closes the stream (FIN) only once every group from start to end has been accounted for, either via a Group Stream (completed or reset) or a SUBSCRIBE_DROP message.
This <bcp14>MAY</bcp14> occur after SUBSCRIBE_END, since stragglers within the range can still be dropped.
Unbounded subscriptions stay open until SUBSCRIBE_END, and either endpoint <bcp14>MAY</bcp14> reset the stream at any time.</t>

</section>
<section anchor="fetch"><name>Fetch</name>
<t>A subscriber opens a Fetch Stream (0x3) to request a single Group from a Track.</t>

<t>The subscriber sends a FETCH message containing the broadcast path, track name, priority, group sequence, and the frame range within that group.
Unlike SUBSCRIBE, FETCH works on both live and ended broadcasts; it is the only way to read an ended one.
The publisher responds with FRAME messages directly on the same bidirectional stream — there is no response header.
The Subscribe ID, Group Sequence, and index of the first returned frame are implicit, taken from the original FETCH request.
Because there is no response header, a publisher that cannot serve the requested frame range in full <bcp14>MUST</bcp14> reset the stream rather than return a shorter run; the subscriber has no way to learn where a truncated response actually started.
As with a subscription, the subscriber <bcp14>MUST</bcp14> already have the track's <xref target="track-info">TRACK_INFO</xref> to parse the returned frames; because the properties are immutable, a single Track Stream lookup is reused across every FETCH of that track (group-by-group fetches do not re-fetch it).
The publisher FINs the stream after the last frame, or resets the stream on error.</t>

<t>Fetch behaves like HTTP: a single request/response per stream.</t>

</section>
<section anchor="track-stream"><name>Track</name>
<t>A subscriber opens a Track Stream (0x6) to learn a Track's immutable publisher properties without subscribing or fetching.</t>

<t>The subscriber sends a TRACK message containing the broadcast path and track name.
The publisher replies with a single TRACK_INFO message and then FINs the stream, or resets the stream on error (e.g. the track does not exist).
The returned properties are fixed for the lifetime of the track, so the subscriber <bcp14>SHOULD</bcp14> cache TRACK_INFO keyed by broadcast path and track name, and reuse it across every SUBSCRIBE and FETCH of the same track over the session that served it.
The properties are fixed for one track, not for the path it arrived on: a path outlives the broadcast on it, and a different broadcast reaching the same path brings its own.
Anything cached against a path, on either side, is therefore scoped to the announcement that carried it and is discarded when that announcement is retracted.
If FRAME messages cannot be decoded against the cached TRACK_INFO, the subscriber <bcp14>MUST</bcp14> reset the affected stream with a protocol violation and re-request it.</t>

<t>Because a subscriber cannot parse buffered group frames until TRACK_INFO arrives, the publisher <bcp14>SHOULD</bcp14> prioritize TRACK_INFO ahead of group data on the connection.</t>

</section>
<section anchor="probe"><name>Probe</name>
<t>A subscriber opens a Probe Stream (0x4) to measure, and optionally increase, the available bitrate of the connection.
The publisher advertises its Probe level in SETUP (see <xref target="probe-parameter">Probe Parameter</xref>): None, Report (measure only), or Increase (measure and actively probe).</t>

<t>The subscriber sends a PROBE message with a target bitrate on the bidirectional stream.
The subscriber <bcp14>MAY</bcp14> send additional PROBE messages on the same stream to update the target bitrate; the publisher <bcp14>MUST</bcp14> treat each PROBE as a new target to attempt.
If the publisher advertised the Increase capability, it <bcp14>SHOULD</bcp14> pad the connection (or send redundant data) to achieve the most recent target bitrate, without exceeding the congestion window.
A publisher that advertised Report but not Increase ignores the target and only reports; it <bcp14>MUST NOT</bcp14> pad above its current sending rate.
In either case the publisher periodically replies with PROBE messages on the same bidirectional stream containing the current estimated bitrate and smoothed RTT.</t>

<t>If the publisher advertised no Probe capability (e.g., the congestion controller is not exposed), it <bcp14>MUST</bcp14> reset the stream.</t>

</section>
<section anchor="goaway"><name>Goaway</name>
<t>Either endpoint can open a Goaway Stream (0x5) to initiate a graceful session shutdown.</t>

<t>The sender sends a GOAWAY message containing an optional new session URI.
If the URI is non-empty, the peer <bcp14>SHOULD</bcp14> establish a new session at the provided URI and migrate any active subscriptions.
The peer <bcp14>MUST NOT</bcp14> open new streams on the current session after receiving a GOAWAY.</t>

<t>The sender closes the stream (FIN) when it is ready to terminate the session.
The peer <bcp14>SHOULD</bcp14> close all streams and the session after migrating or when it no longer needs the session.</t>

</section>
</section>
</section>
<section anchor="delivery"><name>Delivery</name>
<t>The most important concept in moq-lite is how to deliver a subscription.
QUIC can only improve the user experience if data is delivered out-of-order during congestion.
This is the sole reason why data is divided into Broadcasts, Tracks, Groups, and Frames.</t>

<t>moq-lite consists of multiple groups being transmitted in parallel across separate streams.
How these streams get transmitted over the network is very important, and yet has been distilled down into a few simple properties:</t>

<section anchor="prioritization"><name>Prioritization</name>
<t>The Publisher and Subscriber both exchange a <spanx style="verb">Priority</spanx> value, which determines which Track should be transmitted next.
Group order within a Track is fixed: newest first.</t>

<t>A publisher <bcp14>SHOULD</bcp14> attempt to transmit streams based on these rules.
This depends on the QUIC implementation and it may not be possible to get fine-grained control.</t>

<section anchor="priority"><name>Priority</name>
<t>The <spanx style="verb">Subscriber Priority</spanx> is scoped to the connection and <bcp14>MAY</bcp14> change over the life of the subscription via SUBSCRIBE_UPDATE.
The <spanx style="verb">Publisher Priority</spanx> is fixed for the lifetime of the Track (see <xref target="track-info">TRACK_INFO</xref>) and <bcp14>SHOULD</bcp14> be used only to resolve conflicts or ties.</t>

<t>A conflict can occur when a relay tries to serve multiple downstream subscriptions from a single upstream subscription.
The relay cannot pick any one subscriber's priority, so the upstream subscription <bcp14>SHOULD</bcp14> use the publisher priority instead of some combination of different subscriber priorities.
Publisher priority is therefore mostly relevant on the upstream (origin-facing) leg of a relay; closer to the subscriber, the subscriber priority dominates.</t>

<t>Rather than try to explain everything, here's an example:</t>

<t><strong>Example:</strong>
There are two people in a conference call, Ali and Bob.</t>

<t>We subscribe to both of their audio tracks with subscriber priority 2 and video tracks with subscriber priority 1.
Each publisher advertises a fixed publisher priority (here audio at 2 and video at 1) used only to break ties.
This results in equal priority for <spanx style="verb">Ali</spanx> and <spanx style="verb">Bob</spanx> while prioritizing audio.
<spanx style="verb">text
ali/audio + bob/audio: subscriber_priority=2 publisher_priority=2
ali/video + bob/video: subscriber_priority=1 publisher_priority=1
</spanx></t>

<t>Because publisher priority cannot change, dynamic adaptation is the subscriber's job.
If the subscriber detects that Bob is actively speaking, it raises the subscriber priority of Bob's tracks via SUBSCRIBE_UPDATE:
<spanx style="verb">text
bob/audio: subscriber_priority=4 publisher_priority=2
bob/video: subscriber_priority=3 publisher_priority=1
ali/audio: subscriber_priority=2 publisher_priority=2
ali/video: subscriber_priority=1 publisher_priority=1
</spanx></t>

<t>The subscriber priority takes precedence, so the subscriber can likewise full-screen Ali's window by raising the subscriber priority of Ali's tracks above Bob's.</t>

</section>
<section anchor="group-order"><name>Group Order</name>
<t>Within a Track, a publisher <bcp14>SHOULD</bcp14> transmit the newest Group first.
Under congestion this sheds the backlog rather than the live edge, which is what a Group boundary exists to make possible.</t>

<t>There is no field to invert it.
A subscriber that wants Groups in sequence order gets them by reading in sequence order: reordering is a local decision, it costs the network nothing, and encoding it on the wire only lets one subscriber's preference reach a Track that a relay is fanning out to many.
Such a subscriber <bcp14>SHOULD</bcp14> raise its <spanx style="verb">Subscriber Max Age</spanx> so the Groups it intends to read in order are still being delivered when it reaches them.</t>

<t>A subscriber <bcp14>MUST</bcp14> support gaps and out-of-order delivery regardless.</t>

</section>
</section>
<section anchor="expiration"><name>Expiration</name>
<t>Expiration governs when an older group is dropped.
The publisher <bcp14>SHOULD</bcp14> reset Group Streams for non-latest groups whose age relative to the latest group reaches <spanx style="verb">Subscriber Max Age</spanx> (see <xref target="subscribe"></xref>, and the age definition below); the subscriber <bcp14>MAY</bcp14> also locally drop such groups.
Expiration only removes the group from live delivery; the publisher <bcp14>MAY</bcp14> still retain it for FETCH or new subscriptions until its age exceeds <spanx style="verb">Publisher Max Age</spanx> (see <xref target="track-info">TRACK_INFO</xref>).</t>

<t>It is not crucial to aggressively expire groups thanks to <xref target="prioritization"></xref>, but a lower priority group still consumes RAM, bandwidth, and potentially flow control.
It is <bcp14>RECOMMENDED</bcp14> that an application set conservative limits and only resort to expiration when data is absolutely no longer needed.</t>

<t>A group is never expired until a later group (by sequence number) has presented a frame.
Once one has, the group's <strong>timestamp age</strong> is the difference between the <em>newest</em> frame timestamp of the latest group that has at least one frame, and this group's <strong>reach</strong>, defined below; the group is expired once that age meets the relevant <spanx style="verb">Max Age</spanx>.
Timestamps are the only measure: they are consistent across relays and unaffected by buffering or jitter.
Wall-clock reclamation of idle content is the retention cache's own policy (<spanx style="verb">Publisher Max Age</spanx>, or any implementation-defined bound), not part of this rule.</t>

<t>A group is expired only once it <strong>provably cannot overlap the Max Age window</strong>: every frame it could still present is older than the budget allows.
Being behind is not itself a reason to expire anything.
<xref target="prioritization"></xref> already transmits newer groups first, so an older group consumes only whatever capacity is left over; it therefore closes the gap faster than the live edge advances, and a receiver that is behind can converge without losing content.
What cannot be recovered is a group with nothing left worth delivering, and that is what expiration removes.</t>

<t>A group's <strong>reach</strong> is the first frame timestamp of the next group by sequence number, or unbounded when no later group has presented a frame.
A group cannot present past where its successor begins, so this is the furthest it could still reach.
Its own frames do not bound it: frame durations are not carried on the wire, so a group's last frame timestamp is where that frame <em>starts</em> presenting, not where the group ends.
A group whose successor has not presented a frame is therefore never expired, because nothing yet proves where it stops.
The group itself needs no timestamp: a zero-frame group (a keep-alive or gap marker) is bounded by its successor's first frame the same way.</t>

<t>Reach is an exclusive bound, so a timestamp age <strong>equal</strong> to Max Age already expires the group: the freshest frame it could still hold sits strictly below its reach, and is therefore strictly older than the budget.
A Max Age of zero follows from the same rule without a special case.</t>

<t>Measuring in timestamps rather than arrival means a burst of groups delivered together still reads as its true age, so catching up never resets the clock.</t>

<t>An expired group <bcp14>SHOULD</bcp14> be reset at the QUIC level to avoid consuming flow control.</t>

</section>
<section anchor="unidirectional-streams"><name>Unidirectional Streams</name>
<t>Unidirectional streams are used for data transmission.</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Stream</ttcol>
      <ttcol align='left'>Creator</ttcol>
      <c>0x0</c>
      <c>Group</c>
      <c>Publisher</c>
      <c>0x1</c>
      <c>Setup</c>
      <c>Either</c>
</texttable>

<section anchor="setup-stream"><name>Setup</name>
<t>Each endpoint <bcp14>MUST</bcp14> open a Setup Stream (0x1) at the start of the session to advertise the optional capabilities and extensions it supports.</t>

<t>The opener sends a single SETUP message and immediately closes the stream (FIN).
There is exactly one Setup Stream per direction; an endpoint that receives a second Setup Stream <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION.
An endpoint with no optional capabilities sends a SETUP with an empty parameter list rather than omitting the stream, giving the peer a deterministic signal that no capabilities are forthcoming.</t>

<t>See the <xref target="session"></xref> section for how an endpoint avoids waiting on the peer's SETUP before exchanging other streams.</t>

</section>
<section anchor="group-1"><name>Group</name>
<t>A publisher creates Group Streams in response to a Subscribe Stream.</t>

<t>A Group Stream <bcp14>MUST</bcp14> start with a GROUP message and <bcp14>MAY</bcp14> be followed by any number of FRAME messages.
A Group <bcp14>MAY</bcp14> contain zero FRAME messages, potentially indicating a gap in the track.
A frame <bcp14>MAY</bcp14> contain an empty payload, potentially indicating a gap in the group.</t>

<t>The GROUP message's <spanx style="verb">Frame Start</spanx> gives the index of the first FRAME on the stream, so a stream carrying only part of a Group is self-describing.
It is redundant with the subscription's own <spanx style="verb">Frame Start</spanx> in the steady state, and carried anyway because a SUBSCRIBE_UPDATE that moves the bound races the Group Streams already in flight: the two travel on different streams with no ordering between them, so the receiver would otherwise have to guess which bound a given Group Stream was opened under.</t>

<t>A publisher <bcp14>MUST NOT</bcp14> send two Group Streams for the same Group Sequence on one subscription.
A subscriber assembling a Group from more than one publisher does so across separate subscriptions, and is responsible for concatenating the runs in index order and for ignoring any frame it has already received.</t>

<t>Both the publisher and subscriber <bcp14>MAY</bcp14> reset the stream at any time.
This is not a fatal error and the session remains active.
The subscriber <bcp14>MAY</bcp14> cache the error and potentially retry later.</t>

</section>
</section>
<section anchor="datagrams"><name>Datagrams</name>
<t>QUIC datagrams provide unreliable, unordered delivery for latency-sensitive content that does not need retransmission.</t>

<t>A publisher <bcp14>MAY</bcp14> transmit a Group consisting of exactly one Frame as a single QUIC datagram, in addition to (or instead of) opening a Group Stream, based on application hints, group size, and network conditions; a multi-frame Group is delivered via a Group Stream only.
A datagram-delivered group is not cached or retransmitted; a publisher <bcp14>SHOULD</bcp14> only send a datagram if the congestion controller can transmit it immediately.
There is no separate subscription for datagram delivery: datagrams are routed to existing subscriptions via the Subscribe ID, and a subscriber receiving the same group via both a stream and a datagram <bcp14>MUST</bcp14> deduplicate by group sequence.</t>

<t>Each datagram body has the following encoding (note: there is no message length prefix; the QUIC datagram boundary delimits the payload):</t>

<figure><artwork><![CDATA[
DATAGRAM Body {
  Subscribe ID (i)
  Group Sequence (i)
  Timestamp (i)
  Payload (b)
}
]]></artwork></figure>

<t><strong>Subscribe ID</strong>:
The Subscribe ID of an active subscription on the same session.
A subscriber receiving a datagram with an unknown Subscribe ID <bcp14>MUST</bcp14> silently drop it.</t>

<t><strong>Group Sequence</strong>:
The absolute sequence number of the group carried by this datagram.</t>

<t><strong>Timestamp</strong>:
The absolute timestamp of the single frame in the group, expressed in the Track's <spanx style="verb">Timescale</spanx>.
Any varint value (including 0) is valid.</t>

<t><strong>Payload</strong>:
The frame payload, extending to the end of the datagram.
The total datagram body <bcp14>MUST NOT</bcp14> exceed 1200 bytes, ensuring it fits within the minimum QUIC path MTU without IP-layer fragmentation; a publisher <bcp14>MUST NOT</bcp14> send a larger one and a receiver <bcp14>MUST</bcp14> silently drop it.
A group whose frame does not fit is simply not eligible for datagram delivery.</t>

</section>
</section>
<section anchor="encoding"><name>Encoding</name>
<t>This section covers the encoding of each message.</t>

<section anchor="message-length"><name>Message Length</name>
<t>Most messages are prefixed with a variable-length integer indicating the number of bytes in the message payload that follows.
This length field does not include the length of the varint length itself.</t>

<t>An implementation <bcp14>SHOULD</bcp14> close the connection with a PROTOCOL_VIOLATION if it receives a message with an unexpected length.
The version and extensions should be used to support new fields, not the message length.</t>

</section>
<section anchor="stream_type"><name>STREAM_TYPE</name>
<t>All streams start with a short header indicating the stream type.</t>

<figure><artwork><![CDATA[
STREAM_TYPE {
  Stream Type (i)
}
]]></artwork></figure>

<t>The stream ID depends on if it's a bidirectional or unidirectional stream, as indicated in the Streams section.
A receiver <bcp14>MUST</bcp14> reset the stream if it receives an unknown stream type.
Unknown stream types <bcp14>MUST NOT</bcp14> be treated as fatal; this is the fallback when an extension stream is opened against a peer that did not negotiate it.</t>

</section>
<section anchor="setup"><name>SETUP</name>
<t>A SETUP message advertises the optional capabilities and extensions the sender supports for this session.
It is sent exactly once, as the only message on a <xref target="setup-stream">Setup Stream</xref>.</t>

<figure><artwork><![CDATA[
SETUP Message {
  Message Length (i)
  Parameter Count (i)
  Setup Parameter (..) ...
}

Setup Parameter {
  Parameter ID (i)
  Parameter Length (i)
  Parameter Value (..)
}
]]></artwork></figure>

<t><strong>Parameter Count</strong>:
The number of Setup Parameters that follow.</t>

<t><strong>Parameter ID</strong>:
Identifies the capability or extension.
A receiver <bcp14>MUST</bcp14> ignore unknown Parameter IDs, allowing new capabilities to be added without breaking older implementations.
A Parameter ID <bcp14>MUST NOT</bcp14> appear more than once; a receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if it does.</t>

<t><strong>Parameter Length</strong>:
The length of Parameter Value in bytes.</t>

<t><strong>Parameter Value</strong>:
The parameter-specific value, interpreted according to Parameter ID.</t>

<t>A capability is available for the session only if the relevant endpoint advertises it; an absent parameter means the sender does not support that capability.
The following Setup Parameters are defined:</t>

<texttable>
      <ttcol align='right'>ID</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Value</ttcol>
      <c>0x1</c>
      <c>Probe</c>
      <c>Level (i)</c>
      <c>0x2</c>
      <c>Path</c>
      <c>Path (s)</c>
      <c>0x3</c>
      <c>Role</c>
      <c>Role (i)</c>
      <c>0x4</c>
      <c>Cost</c>
      <c>Cost (i)</c>
      <c>0x5</c>
      <c>Hop</c>
      <c>Hop ID (i)</c>
</texttable>

<section anchor="probe-parameter"><name>Probe Parameter</name>
<t>The Probe Parameter advertises the sender's capability level when acting as a publisher on a <xref target="probe">Probe Stream</xref>.
The Parameter Value is a variable-length integer level, where each level includes the one below it:</t>

<t><list style="symbols">
  <t><spanx style="verb">0</spanx> <strong>None</strong>: The publisher does not support probing. Equivalent to omitting the parameter.</t>
  <t><spanx style="verb">1</spanx> <strong>Report</strong>: The publisher can measure and periodically report its estimated bitrate.</t>
  <t><spanx style="verb">2</spanx> <strong>Increase</strong>: The publisher can additionally pad the connection (or send redundant data) to probe for bandwidth above its current sending rate, up to the subscriber's target.</t>
</list></t>

<t>A subscriber <bcp14>MUST</bcp14> consult the publisher's advertised level before relying on a Probe Stream:</t>

<t><list style="symbols">
  <t>At <spanx style="verb">None</spanx>, the subscriber <bcp14>SHOULD NOT</bcp14> open a Probe Stream; if it does, the publisher <bcp14>MUST</bcp14> reset it.</t>
  <t>At <spanx style="verb">Report</spanx>, the subscriber <bcp14>MAY</bcp14> open a Probe Stream to monitor the estimated bitrate but <bcp14>MUST NOT</bcp14> expect the publisher to pad above its current sending rate. A subscriber that needs to probe for additional bandwidth <bcp14>MUST</bcp14> use an alternative (e.g. speculatively switching to a higher rendition).</t>
  <t>At <spanx style="verb">Increase</spanx>, the subscriber <bcp14>MAY</bcp14> request a target bitrate and expect the publisher to actively probe up to it.</t>
</list></t>

</section>
<section anchor="path-parameter"><name>Path Parameter</name>
<t>The Path Parameter carries the request target the client wishes to reach, equivalent to the path and query components of a moq-lite URI.
A server uses it to route the session before any broadcasts are exchanged; its interpretation is otherwise application-defined and opaque to moq-lite.</t>

<t>The Parameter Value is a UTF-8 string holding the <spanx style="verb">path-abempty</spanx> component of the URI <xref target="RFC3986"></xref>; when the URI carries a query, the client <bcp14>MUST</bcp14> append <spanx style="verb">?</spanx> followed by the <spanx style="verb">query</spanx> component, since a deployment commonly puts the session credential there.
The value <bcp14>MAY</bcp14> be empty, which is equivalent to omitting the parameter: both request the server's default path.
A server that receives an invalid value <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION, and one that does not recognize the requested path <bcp14>MUST</bcp14> close the session.</t>

<t>This parameter exists for the bindings that negotiate only an ALPN token and have no request URI of their own (bindings 1 and 3 in <xref target="transports"></xref>); a client using one of them <bcp14>SHOULD</bcp14> send it.
It <bcp14>MUST NOT</bcp14> be sent on a binding whose handshake carries a request URI (bindings 2 and 4), and only the client sends it; a receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION on either violation.
A relay <bcp14>MUST NOT</bcp14> forward it; like other per-hop setup metadata it applies only to this hop.</t>

</section>
<section anchor="role-parameter"><name>Role Parameter</name>
<t>The Role Parameter advertises the direction the client intends to use the session for.
A moq-lite session is bidirectional, but a client's authorization (e.g. the credential in the <xref target="path-parameter">Path</xref>) may grant only one direction; the hint lets a server reject a mismatched session during SETUP instead of accepting it and silently carrying no data.</t>

<t>The Parameter Value is a variable-length integer:</t>

<t><list style="symbols">
  <t><spanx style="verb">0</spanx> <strong>Both</strong>: The client may publish and/or subscribe. The default, and equivalent to omitting the parameter.</t>
  <t><spanx style="verb">1</spanx> <strong>Publisher</strong>: The client intends to publish (and not subscribe).</t>
  <t><spanx style="verb">2</spanx> <strong>Subscriber</strong>: The client intends to subscribe (and not publish).</t>
</list></t>

<t>A receiver that does not recognize the value <bcp14>MUST</bcp14> treat it as <spanx style="verb">Both</spanx>, so a newer client cannot break an older server.
The role is a hint that only ever narrows the session: a server <bcp14>MUST</bcp14> still enforce the client's authorization on every publish and subscribe, and <bcp14>MAY</bcp14> close a session whose advertised role requires a direction the authorization does not grant.</t>

<t>Only the client sends it; a client that receives one <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION. A relay <bcp14>MUST NOT</bcp14> forward it.</t>

</section>
<section anchor="cost-parameter"><name>Cost Parameter</name>
<t>The Cost Parameter declares what subscribing from this endpoint costs: a receiver adds the value the sender declared to both Route Costs of every announcement that sender forwards (see <xref target="routing"></xref>).</t>

<t>The Parameter Value is a variable-length integer in deployment-chosen units, the same units as the Route Costs.
An absent parameter means the default cost of 1, under which the accumulated Route Costs equal the hop count and routing degenerates to shortest-path.
A value of 0 is meaningful and distinct from absent: it makes that direction free, e.g. between two relays in the same datacenter.</t>

<t>Both endpoints send it and the two values need not match: the parameter prices the sender's own egress. A relay <bcp14>MUST NOT</bcp14> forward it.</t>

<t>A declared cost is an assertion, not an instruction: a receiver <bcp14>MAY</bcp14> charge a locally configured value instead, so a peer cannot reprice its neighbours by declaring itself cheap.</t>

</section>
<section anchor="hop-parameter"><name>Hop Parameter</name>
<t>The Hop Parameter declares the sender's Hop ID: the identity it stamps onto announcements it forwards.
The Parameter Value is a variable-length integer; a value of 0 carries no identity and is equivalent to omitting the parameter.</t>

<t>Declaring it at setup gives the receiver the peer's identity before any other stream arrives, so route selection applies the same exclusion to the peer's subscriptions as to its announcements (see <xref target="routing"></xref>), even on a session that never opens an Announce Stream.
Either endpoint <bcp14>MAY</bcp14> send it; a subscriber-only endpoint with no identity <bcp14>MAY</bcp14> omit it, but a publisher <bcp14>SHOULD</bcp14> have a Hop ID regardless (see <xref target="announce-ok">ANNOUNCE_OK</xref>).
A relay <bcp14>MUST NOT</bcp14> forward it.</t>

</section>
</section>
<section anchor="announce-request"><name>ANNOUNCE_REQUEST</name>
<t>A subscriber sends an ANNOUNCE_REQUEST message to indicate it wants to receive announcements for any broadcasts with a path that starts with the requested prefix.</t>

<figure><artwork><![CDATA[
ANNOUNCE_REQUEST Message {
  Message Length (i)
  Broadcast Path Prefix (s),
}
]]></artwork></figure>

<t><strong>Broadcast Path Prefix</strong>:
Indicate interest for any broadcasts with a path that starts with this prefix.</t>

<t>The publisher <bcp14>MUST</bcp14> respond with an ANNOUNCE_OK message followed by ANNOUNCE_START messages for any matching routes, followed by ANNOUNCE_START, ANNOUNCE_END, and ANNOUNCE_UPDATE messages for any future updates, subject to <xref target="routing"></xref>.
Implementations <bcp14>SHOULD</bcp14> consider reasonable limits on the number of matching broadcasts to prevent resource exhaustion.</t>

</section>
<section anchor="announce-ok"><name>ANNOUNCE_OK</name>
<t>A publisher sends an ANNOUNCE_OK message exactly once, as the first message on the response side of an Announce Stream.
It carries metadata that is constant for the lifetime of the stream and applies to every announcement that follows.</t>

<figure><artwork><![CDATA[
ANNOUNCE_OK Message {
  Message Length (i)
  Hop ID (i)
  Active Count (i)
}
]]></artwork></figure>

<t><strong>Hop ID</strong>:
The publisher's own Hop ID.
This is treated as the implicit trailing entry of every ANNOUNCE_START and ANNOUNCE_UPDATE Hop ID list on this stream; those messages <bcp14>MUST NOT</bcp14> repeat this value as the last entry of their <spanx style="verb">Hop ID</spanx> list.
The value 0 is reserved to mean "unknown": either no Hop ID was assigned (e.g. when bridging from an older protocol version) or the endpoint deliberately withholds it to obscure the underlying routing.
A publisher that assigns a Hop ID <bcp14>MUST</bcp14> choose a non-zero value, and <bcp14>SHOULD</bcp14> assign itself one (a fresh random value per session suffices), so downstream receivers can detect loops through it.
Receivers reconstruct the full path as <spanx style="verb">Hop IDs ++ [ANNOUNCE_OK.Hop ID]</spanx>.</t>

<t><strong>Active Count</strong>:
The number of ANNOUNCE_START messages that the publisher will send immediately as the initial set.
The subscriber <bcp14>MAY</bcp14> block reporting any announcement to the application until all <spanx style="verb">Active Count</spanx> initial announcements have arrived, then deliver the initial set as a batch.
Any announcements beyond <spanx style="verb">Active Count</spanx> are live updates and <bcp14>SHOULD</bcp14> be reported as they arrive.
A value of <spanx style="verb">0</spanx> is valid and means the publisher is offering no initial available broadcasts; all subsequent announcements (if any) are live updates.</t>

</section>
<section anchor="announce-start"><name>ANNOUNCE_START</name>
<t>A publisher sends an ANNOUNCE_START message to advertise a route: a claim that paths under a prefix can be served.
Each ANNOUNCE_START implicitly assigns the next Announce ID on the stream, later referenced by ANNOUNCE_END and ANNOUNCE_UPDATE (see <xref target="announce"></xref>).</t>

<t>Only the suffix is encoded on the wire, as the full route prefix can be constructed by prepending the requested prefix.</t>

<figure><artwork><![CDATA[
ANNOUNCE_START Message {
  Type (i) = 0x0
  Message Length (i)
  Route Prefix Suffix (s),
  Hop Count (i),
  Hop ID (i) ...,
  Warm Route Cost (i),
  Cold Route Cost (i),
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x0 to indicate an ANNOUNCE_START message.</t>

<t><strong>Route Prefix Suffix</strong>:
This is combined with the requested prefix to form the route's full prefix.
An empty suffix advertises the requested prefix itself, which is how a route covering more than the request presents (see <xref target="announce"></xref>).</t>

<t><strong>Hop Count</strong>:
The number of Hop ID entries that follow, NOT including the publisher's own <spanx style="verb">Hop ID</spanx> from ANNOUNCE_OK.
A value of 0 means no Hop ID entries are present, indicating either that the announcement originated locally on the publisher (the publisher itself is the origin) or that the upstream peer does not support hop tracking.
A receiver <bcp14>MUST</bcp14> close the stream with a PROTOCOL_VIOLATION if the Hop Count does not match the number of subsequent Hop ID entries.</t>

<t><strong>Hop ID</strong>:
A unique identifier for each relay in the path from the origin publisher, ordered from origin to the upstream of the responding publisher.
The responding publisher's own Hop ID is NOT included in this list; it is carried once in ANNOUNCE_OK, so the total path length is <spanx style="verb">Hop Count + 1</spanx>.
When forwarding an announcement received from an upstream peer, a relay <bcp14>MUST</bcp14> append the upstream peer's ANNOUNCE_OK <spanx style="verb">Hop ID</spanx> to this list, since that ID is no longer implicit downstream.
The first entry of the reconstructed path identifies the endpoint that originated the route.
A Hop ID value of 0 means the hop is unknown: either it was never assigned or a relay deliberately withholds it (see <xref target="routing"></xref>).
A received 0 is forwarded unchanged.
When bridging an announcement from an upstream that sent no hop list, a relay writes 0 for that hop.
An identity a receiver assigned that upstream is local selection state and <bcp14>MUST NOT</bcp14> be forwarded as a Hop ID.</t>

<t>A receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if a non-zero Hop ID appears twice in this list.
Duplicate values of 0 are not a violation, since 0 identifies nothing and any number of hops may be unknown.</t>

<t><strong>Warm Route Cost</strong> and <strong>Cold Route Cost</strong>:
What subscribing to content under this route costs, in units chosen by the deployment.
This document defines no rule that prices the two apart: the original publisher seeds both with its production cost (0 for content it is already producing, larger for content it would have to start producing on demand, e.g. a standby transcoder that advertises every broadcast it could serve, at a cost reflecting the work of actually serving it), and a forwarding relay adds the cost the upstream peer declared (see <xref target="cost-parameter">Cost Parameter</xref>) to both, saturating rather than wrapping so an absurd upstream value ranks last instead of overflowing to best.
The two fields exist for extensions that price a cached copy below the accumulated value: such a discount applies to the Warm cost only, which is what route selection minimizes, while the Cold cost keeps ranking the undiscounted path and breaks a Warm tie (see <xref target="routing"></xref>).
Saturation <bcp14>MUST</bcp14> cap each sum at the largest value a variable-length integer can carry, since the sums are re-encoded when forwarded: a peer may legally advertise that largest value, and a wider ceiling would leave the relay unable to encode what it just computed.</t>

<t>A relay whose wire cannot express a Cold cost (an endpoint bridging from another protocol, or a peer that predates this field) advertises nothing, and a receiver <bcp14>SHOULD</bcp14> treat the missing value as the saturation ceiling rather than as 0: an unknown path ranks last instead of impersonating the publisher's own.</t>

</section>
<section anchor="announce-end"><name>ANNOUNCE_END</name>
<t>A publisher sends an ANNOUNCE_END message to retract a previously started route, referencing its Announce ID.
The id is retired and <bcp14>MUST NOT</bcp14> be referenced again.
Retraction claims nothing about the content: a broadcast whose publisher stops advertising may remain readable by exact path, serving its stored groups over FETCH.
Retraction does not disturb subscriptions already in flight, which conclude normally with SUBSCRIBE_END.
How a subscriber learns the path of stored content is out of band, e.g. an application catalog.</t>

<figure><artwork><![CDATA[
ANNOUNCE_END Message {
  Type (i) = 0x1
  Message Length (i)
  Announce ID (i)
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x1 to indicate an ANNOUNCE_END message.</t>

<t><strong>Announce ID</strong>:
The ordinal implicitly assigned by a prior ANNOUNCE_START on this stream.
Referencing an id that was never assigned, or one already retired, is a protocol violation.
Announce IDs are never reused within a stream; a route that is announced again after an ANNOUNCE_END gets a fresh id from its next ANNOUNCE_START.</t>

</section>
<section anchor="announce-update"><name>ANNOUNCE_UPDATE</name>
<t>A publisher sends an ANNOUNCE_UPDATE message to atomically update a previously started advertisement's metadata, referencing its Announce ID.
The route's prefix is unchanged and the id stays live; the Hop ID list <bcp14>MAY</bcp14> differ from the original (e.g. after a relay failover or upstream restart).
An update carries no content claim: in-flight subscriptions under the route are undisturbed.</t>

<figure><artwork><![CDATA[
ANNOUNCE_UPDATE Message {
  Type (i) = 0x2
  Message Length (i)
  Announce ID (i),
  Hop Count (i),
  Hop ID (i) ...,
  Warm Route Cost (i),
  Cold Route Cost (i),
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x2 to indicate an ANNOUNCE_UPDATE message.</t>

<t><strong>Announce ID</strong>:
The ordinal implicitly assigned by a prior ANNOUNCE_START on this stream.
Referencing an id that was never assigned, or one already retired by an ANNOUNCE_END, is a protocol violation.</t>

<t><strong>Hop Count</strong>, <strong>Hop ID</strong>, <strong>Warm Route Cost</strong>, and <strong>Cold Route Cost</strong>:
As defined for <xref target="announce-start">ANNOUNCE_START</xref>.
An update whose only change is a Route Cost is valid: it is how a relay re-prices a route without disturbing it.</t>

</section>
<section anchor="subscribe-1"><name>SUBSCRIBE</name>
<t>SUBSCRIBE is sent by a subscriber to start a subscription.</t>

<figure><artwork><![CDATA[
SUBSCRIBE Message {
  Message Length (i)
  Subscribe ID (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Subscriber Max Age (i)
  Group Start (i)
  Group End (i)
  Frame Start (i)
  Frame End (i)
}
]]></artwork></figure>

<t><strong>Subscribe ID</strong>:
A unique identifier chosen by the subscriber.
A Subscribe ID <bcp14>MUST NOT</bcp14> be reused within the same session, even if the prior subscription has been closed.</t>

<t><strong>Subscriber Priority</strong>:
The priority of the subscription within the session, represented as a u8.
The publisher <bcp14>SHOULD</bcp14> transmit <em>higher</em> values first during congestion.
See the <xref target="prioritization"></xref> section for more information.</t>

<t><strong>Subscriber Max Age</strong>:
The subscriber's preference, in milliseconds, for how long a non-latest group may remain in flight before being considered stale and dropped from live delivery.
The publisher <bcp14>SHOULD</bcp14> reset (at the QUIC level) Group Streams for groups whose age relative to the latest group exceeds this duration.
Applies only to non-latest groups; the latest group is never dropped on staleness grounds.
A value of <spanx style="verb">0</spanx> means the subscriber wants only the latest group in live delivery (older groups are immediately stale once a newer group arrives).
This is a delivery-time preference, not a retention rule: the publisher <bcp14>MAY</bcp14> still hold these groups for FETCH or future subscriptions (see <spanx style="verb">Publisher Max Age</spanx> in <xref target="track-info">TRACK_INFO</xref>).
See the <xref target="expiration"></xref> section for more information.</t>

<t><strong>Group Start</strong>:
The minimum group sequence to deliver: an absolute floor, defaulting to 0 (no floor).</t>

<t>A floor is not a request; <spanx style="verb">Subscriber Max Age</spanx> is the only thing that asks for data.
The publisher <bcp14>SHOULD</bcp14> start at the oldest group at or above the floor that <xref target="expiration"></xref> has not expired, and <bcp14>MUST NOT</bcp14> deliver an older one.
A <spanx style="verb">Subscriber Max Age</spanx> of 0 therefore starts at the latest group, since every older group is already stale.
A subscriber that buffers is then handed the head of what it can still play instead of only the live edge, and is never sent history it would discard on arrival: the same bound decides what to start at and what to expire, so the two cannot disagree.
A floor above the latest group simply waits there: that is a resumed subscription naming where it left off.
Reaching back is best-effort, not a guarantee that the groups still exist; see <spanx style="verb">Publisher Max Age</spanx> in <xref target="track-info">TRACK_INFO</xref>.</t>

<t><strong>Group End</strong>:
The last group to deliver (inclusive).
A value of 0 means unbounded (default).
A non-zero value is the absolute group sequence + 1.</t>

<t><strong>Frame Start</strong>:
The index of the first frame to deliver within the <spanx style="verb">Group Start</spanx> group (see <xref target="positions"></xref>).
A value of 0 means from the start of that group (default), so the group is delivered whole.
Frames before this index are not delivered, even when delivery begins at that exact group; a start resolved at a later group is always delivered from frame 0.
A subscriber that has received no group <bcp14>MUST</bcp14> send 0, since it cannot number the frames of a group it has not seen.</t>

<t><strong>Frame End</strong>:
The last frame to deliver (inclusive) within the end group (see <xref target="positions"></xref>).
A value of 0 means the whole group (default).
A non-zero value is the absolute frame index + 1, matching <spanx style="verb">Group End</spanx>.
<bcp14>MUST</bcp14> be 0 when <spanx style="verb">Group End</spanx> is 0, since an unbounded subscription has no end group to qualify.</t>

<t><spanx style="verb">Group Start</spanx> and <spanx style="verb">Group End</spanx> are offset by 1 only so 0 can mean "absent"; every other group field in this document is a plain absolute sequence.</t>

</section>
<section anchor="subscribeupdate"><name>SUBSCRIBE_UPDATE</name>
<t>A subscriber can modify a subscription with a SUBSCRIBE_UPDATE message.
A subscriber <bcp14>MAY</bcp14> send multiple SUBSCRIBE_UPDATE messages to update the subscription.
The start and end group can be changed in either direction (growing or shrinking).</t>

<figure><artwork><![CDATA[
SUBSCRIBE_UPDATE Message {
  Message Length (i)
  Subscriber Priority (8)
  Subscriber Max Age (i)
  Group Start (i)
  Group End (i)
  Frame Start (i)
  Frame End (i)
}
]]></artwork></figure>

<t>See <xref target="subscribe"></xref> for information about each field.
Moving <spanx style="verb">Frame Start</spanx> forward within a group that is already being delivered does not retract frames the publisher has already sent; like <spanx style="verb">Group Start</spanx>, it only bounds what the publisher sends from here on.</t>

</section>
<section anchor="track-1"><name>TRACK</name>
<t>TRACK is sent by a subscriber to request a Track's immutable publisher properties.
It is the first message on a Track Stream (0x6).</t>

<figure><artwork><![CDATA[
TRACK Message {
  Message Length (i)
  Broadcast Path (s)
  Track Name (s)
}
]]></artwork></figure>

<t><strong>Broadcast Path</strong>:
The broadcast path of the track.</t>

<t><strong>Track Name</strong>:
The name of the track.</t>

</section>
<section anchor="track-info"><name>TRACK_INFO</name>
<t>TRACK_INFO is sent by the publisher in response to a TRACK message.
It is the sole message on the Track Stream; the publisher FINs immediately afterward, or resets the stream on error (e.g. the track does not exist).</t>

<figure><artwork><![CDATA[
TRACK_INFO Message {
  Message Length (i)
  Publisher Priority (8)
  Publisher Max Age (i)
  Timescale (i)
}
]]></artwork></figure>

<t>Every field is <strong>fixed for the lifetime of the Track</strong> and <bcp14>MUST NOT</bcp14> change; a change requires a new Track.
This is what lets the properties live on their own stream, fetched once and cached, instead of being echoed on every SUBSCRIBE and FETCH response.
Publisher properties fan <em>out</em> at a relay (one upstream subscription serving many downstreams), so a change would have to propagate everywhere; subscriber properties fan <em>in</em>, which the relay already merges, so they <bcp14>MAY</bcp14> change freely via SUBSCRIBE_UPDATE.</t>

<t><strong>Publisher Priority</strong>:
The publisher's priority for this Track, represented as a u8, used only to resolve ties between subscriptions of equal subscriber priority.
See the <xref target="prioritization"></xref> section for more information.</t>

<t><strong>Publisher Max Age</strong>:
The maximum age, in milliseconds, that the publisher caches a non-latest group past the arrival of a newer group.
Applies only to non-latest groups; the latest group is always retained.
It is an upper bound on retention, the inverse of an HTTP <spanx style="verb">Cache-Control: max-age</spanx> guarantee:</t>

<t><list style="symbols">
  <t>A subscriber <bcp14>MAY</bcp14> issue a SUBSCRIBE or FETCH with an older <spanx style="verb">Group Start</spanx>, but the publisher <bcp14>MAY</bcp14> have already dropped any group whose age exceeds <spanx style="verb">Publisher Max Age</spanx>.</t>
  <t>The publisher <bcp14>MAY</bcp14> drop groups sooner than <spanx style="verb">Publisher Max Age</spanx> under resource pressure; subscribers <bcp14>MUST NOT</bcp14> assume older groups within the bound are still available.</t>
</list></t>

<t>A value of <spanx style="verb">0</spanx> means the publisher caches only the latest group (older groups <bcp14>MAY</bcp14> be dropped as soon as a newer group arrives).
The unit is milliseconds, matching <spanx style="verb">Subscriber Max Age</spanx>.
See the <xref target="expiration"></xref> section for more information.</t>

<t><strong>Timescale</strong>:
The number of timestamp units per second for frame timestamps on this Track.
It <bcp14>MUST</bcp14> be non-zero; a subscriber that receives 0 <bcp14>MUST</bcp14> reset the stream with a protocol violation.
Common values include <spanx style="verb">1000</spanx> (milliseconds), <spanx style="verb">1000000</spanx> (microseconds), <spanx style="verb">48000</spanx> (audio sample rate), and <spanx style="verb">90000</spanx> (RTP video clock).</t>

</section>
<section anchor="subscribe-ok"><name>SUBSCRIBE_OK</name>
<t>A SUBSCRIBE_OK message confirms a subscription and resolves its absolute start position.
It is the first message the publisher sends on the Subscribe Stream, once the start position is known.</t>

<t>This is the trimmed-down counterpart of MoqTransport's SUBSCRIBE_OK: it retains the name and the role of the publisher's positive response, but carries only the resolved start position (all other per-track properties live in <xref target="track-info">TRACK_INFO</xref>).</t>

<figure><artwork><![CDATA[
SUBSCRIBE_OK Message {
  Type (i) = 0x0
  Message Length (i)
  Group (i)
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x0 to indicate a SUBSCRIBE_OK message.</t>

<t><strong>Group</strong>:
The absolute sequence number of the first group that will be delivered.
It <bcp14>MUST</bcp14> be greater than or equal to the requested start group; any groups in between are unavailable and implicitly dropped, with no separate SUBSCRIBE_DROP required.
A subscriber that requested the latest group learns the resolved sequence here.</t>

<t>There is no matching frame field, because the start frame is never in doubt: a partial group is only delivered when it was asked for, so the subscription starts either exactly where it asked or at the beginning of a later group (see <xref target="positions"></xref>).
The subscriber derives the start frame from <spanx style="verb">Group</spanx> and its own request:</t>

<t><list style="symbols">
  <t><spanx style="verb">Group</spanx> equals the requested start group: delivery begins at the requested <spanx style="verb">Frame Start</spanx>.</t>
  <t><spanx style="verb">Group</spanx> is greater: delivery begins at frame 0.</t>
</list></t>

<t>The second case is easy to get wrong, so to be explicit: a subscriber that requested group 5 frame 15 and receives <spanx style="verb">Group</spanx> = 6 starts at <strong>frame 0</strong> of group 6, not frame 15.
The frame offset belonged to group 5 and is gone along with the rest of it; it does not carry forward to whichever group the publisher resolved to.</t>

</section>
<section anchor="subscribe-end"><name>SUBSCRIBE_END</name>
<t>A SUBSCRIBE_END message is sent by the publisher to signal that no group at or after a given sequence will be produced.</t>

<figure><artwork><![CDATA[
SUBSCRIBE_END Message {
  Type (i) = 0x1
  Message Length (i)
  Group (i)
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x1 to indicate a SUBSCRIBE_END message.</t>

<t><strong>Group</strong>:
The exclusive end of the range: the absolute sequence number of the first group that will never be delivered.
A value of 0 means the track ended before producing any groups.
The subscriber <bcp14>MUST NOT</bcp14> wait for any group at or after this sequence.</t>

<t>SUBSCRIBE_END bounds the range but does not by itself end the stream: the publisher <bcp14>MAY</bcp14> still send SUBSCRIBE_DROP for groups below this sequence that it cannot deliver, and FINs the stream only once every group below this sequence has been accounted for.</t>

</section>
<section anchor="subscribedrop"><name>SUBSCRIBE_DROP</name>
<t>A SUBSCRIBE_DROP message is sent by the publisher on the Subscribe Stream when groups cannot be served.
It <bcp14>MAY</bcp14> arrive at any point after the subscription is opened, including after SUBSCRIBE_END for stragglers within the resolved range (a leading range is instead dropped implicitly by SUBSCRIBE_OK).</t>

<figure><artwork><![CDATA[
SUBSCRIBE_DROP Message {
  Type (i) = 0x2
  Message Length (i)
  Group Start (i)
  Group End (i)
  Error Code (i)
}
]]></artwork></figure>

<t><strong>Type</strong>:
Set to 0x2 to indicate a SUBSCRIBE_DROP message.</t>

<t><strong>Group Start</strong>:
The first absolute group sequence in the dropped range.</t>

<t><strong>Group End</strong>:
The last absolute group sequence in the dropped range (inclusive).</t>

<t><strong>Error Code</strong>:
An application-specific error code.
A value of 0 indicates no error; the groups are simply unavailable.</t>

</section>
<section anchor="fetch-1"><name>FETCH</name>
<t>FETCH is sent by a subscriber to request a single group from a track.</t>

<figure><artwork><![CDATA[
FETCH Message {
  Message Length (i)
  Broadcast Path (s)
  Track Name (s)
  Subscriber Priority (8)
  Group Sequence (i)
  Frame Start (i)
  Frame End (i)
}
]]></artwork></figure>

<t><strong>Broadcast Path</strong>:
The broadcast path of the track to fetch from.</t>

<t><strong>Track Name</strong>:
The name of the track to fetch from.</t>

<t><strong>Subscriber Priority</strong>:
The priority of the fetch within the session, represented as a u8.
See the <xref target="prioritization"></xref> section for more information.</t>

<t><strong>Group Sequence</strong>:
The sequence number of the group to fetch.</t>

<t><strong>Frame Start</strong>:
The index of the first frame to return within the group (see <xref target="positions"></xref>).
A plain absolute index; 0 means the start of the group (default).</t>

<t><strong>Frame End</strong>:
The last frame to return (inclusive), encoded as the absolute frame index + 1.
A value of 0 means through the end of the group (default).
A <spanx style="verb">Frame End</spanx> below <spanx style="verb">Frame Start</spanx> once decoded is a protocol violation; equal bounds are a legal single-frame range.</t>

<t>The publisher responds with FRAME messages directly on the same stream — there is no response header.
The subscriber parses them using the track's <xref target="track-info">TRACK_INFO</xref>, which it <bcp14>MUST</bcp14> already have (see the <xref target="track-stream">Track Stream</xref>); the group sequence and the index of the first frame are implicit from the FETCH request.
The publisher FINs the stream after the last frame, or resets on error.
There is no FETCH_ERROR message — the publisher signals failure by resetting the stream.
A publisher holding fewer frames than requested <bcp14>MUST</bcp14> reset rather than truncate, since a short response is indistinguishable from one that started elsewhere.
A group that ends before <spanx style="verb">Frame End</spanx> is not a truncation: the publisher FINs after the last frame it has, provided the group is complete and it served everything from <spanx style="verb">Frame Start</spanx> onward.</t>

</section>
<section anchor="probe-1"><name>PROBE</name>
<t>PROBE is used to measure the available bitrate of the connection.</t>

<figure><artwork><![CDATA[
PROBE Message {
  Message Length (i)
  Bitrate (i)
  RTT (i)
}
]]></artwork></figure>

<t><strong>Bitrate</strong>:
When sent by the subscriber (stream opener): the target bitrate in bits per second that the publisher should pad up to.
The publisher only honors a target above its current sending rate if it advertised the Increase capability (see <xref target="probe-parameter">Probe Parameter</xref>); otherwise the target is ignored and the publisher only reports.
When sent by the publisher (responder): the current estimated bitrate in bits per second.
A value of 0 means unknown.</t>

<t><strong>RTT</strong>:
The smoothed round-trip time in milliseconds, as defined in <xref target="RFC9002"></xref>.
A value of 0 means unknown.</t>

<ul empty="true"><li>
  <t>NOTE: RTT is included in the PROBE message because not all QUIC implementations and browser WebTransport APIs expose RTT statistics directly. This field may be deprecated once RTT is universally available via the underlying transport API.</t>
</li></ul>

</section>
<section anchor="goaway-message"><name>GOAWAY</name>
<t>A GOAWAY message is sent to initiate a graceful session shutdown with an optional redirect.</t>

<figure><artwork><![CDATA[
GOAWAY Message {
  Message Length (i)
  New Session URI (s)
}
]]></artwork></figure>

<t><strong>New Session URI</strong>:
A URI for the peer to reconnect to.
An empty string indicates no redirect; the peer should simply close the session.
The URI <bcp14>MUST NOT</bcp14> exceed 8,192 bytes; a receiver <bcp14>MUST</bcp14> treat a longer URI as a protocol violation and <bcp14>MAY</bcp14> reject it based on the length prefix alone.
A recipient <bcp14>MUST</bcp14> validate the URI against local policy before reconnecting, including verifying the scheme, authority, and port are permitted.
If validation fails, the recipient <bcp14>MUST</bcp14> close the session without reconnecting.</t>

<t>A client <bcp14>MUST</bcp14> send an empty New Session URI, as it cannot instruct a server to establish connections.
A server that receives a non-empty New Session URI <bcp14>MUST</bcp14> close the session with a protocol violation.</t>

<t>The new session URI <bcp14>SHOULD</bcp14> use the same scheme as the current session's URI.</t>

<t>An endpoint <bcp14>MUST</bcp14> close the session with a protocol violation if it receives more than one GOAWAY.</t>

<t>A peer that reconnects to a provided URI <bcp14>SHOULD</bcp14> keep using that URI for subsequent reconnects rather than reverting to the original.</t>

<t>A relay that receives a GOAWAY <bcp14>SHOULD</bcp14> treat the announcements that arrived on that session as the most expensive routes available, so a subscription it can serve from another session moves at the next Group boundary rather than when the draining session finally closes.
The routes stay usable: a broadcast reachable only over the draining session <bcp14>MUST</bcp14> keep being served until the session ends, which is what makes the sender's deadline a handover window rather than a cutoff.</t>

</section>
<section anchor="group-2"><name>GROUP</name>
<t>The GROUP message contains information about a Group, as well as a reference to the subscription being served.</t>

<figure><artwork><![CDATA[
GROUP Message {
  Message Length (i)
  Subscribe ID (i)
  Group Sequence (i)
  Frame Start (i)
}
]]></artwork></figure>

<t><strong>Subscribe ID</strong>:
The corresponding Subscribe ID.
This ID is used to distinguish between multiple subscriptions for the same track.</t>

<t><strong>Group Sequence</strong>:
The sequence number of the group.
This <bcp14>SHOULD</bcp14> increase by 1 for each new group.
A subscriber <bcp14>MUST</bcp14> handle gaps, potentially caused by congestion.</t>

<t><strong>Frame Start</strong>:
The index of the first FRAME message on this stream within the group (see <xref target="positions"></xref>).
A plain absolute index; 0 means the stream carries the group from its beginning, which is the common case.
A non-zero value means the leading frames are not on this stream, either because the subscription started partway into this group or because the publisher only holds part of it.
The subscriber <bcp14>MUST NOT</bcp14> assume it will receive the missing frames on another stream; they are a gap unless a separate subscription or FETCH covers them.</t>

</section>
<section anchor="frame-1"><name>FRAME</name>
<t>The FRAME message is a payload within a group.</t>

<figure><artwork><![CDATA[
FRAME Message {
  Timestamp Delta (i)
  Message Length (i)
  Payload (b)
}
]]></artwork></figure>

<t><strong>Timestamp Delta</strong>:
A signed delta from the previous frame's timestamp, in the Track's negotiated <spanx style="verb">Timescale</spanx>.
Encoded as a zigzag-mapped variable-length integer:</t>

<t><list style="symbols">
  <t>Encode: <spanx style="verb">unsigned = (signed &lt;&lt; 1) ^ (signed &gt;&gt; 63)</spanx> (arithmetic right shift).</t>
  <t>Decode: <spanx style="verb">signed = (unsigned &gt;&gt; 1) ^ -(unsigned &amp; 1)</spanx>.</t>
</list></t>

<t>Zigzag interleaves non-negative and negative values so small magnitudes of either sign fit in a 1-byte varint.
The first frame of a group is delta-encoded from <spanx style="verb">0</spanx>, so its <spanx style="verb">Timestamp Delta</spanx> is the zigzag encoding of the absolute timestamp.</t>

<t><strong>Payload</strong>:
An application-specific payload.
The <spanx style="verb">Message Length</spanx> describes the payload size on the wire.</t>

</section>
</section>
<section anchor="appendix-a-changelog"><name>Appendix A: Changelog</name>

<section anchor="moq-lite-06"><name>moq-lite-06</name>

<t><list style="symbols">
  <t>Assigned <spanx style="verb">moq-lite-06</spanx> as this draft's protocol identifier.</t>
  <t>Require error-code translation when bridging protocols and draft versions.</t>
  <t>Made a repeated non-zero Hop ID in one announcement's Hop ID list a PROTOCOL_VIOLATION, matching draft-lcurley-moq-cluster. Repeated 0 entries stay legal.</t>
  <t>Moved the Qmux-over-WebSocket binding details to draft-lcurley-qmux-websocket; the binding itself is unchanged.</t>
  <t>Extended the SETUP <spanx style="verb">Path</spanx> parameter to carry the URI query: a client appends <spanx style="verb">?</spanx> and the query component after the path, matching moq-transport's PATH option. The credential a deployment puts in the query was previously unrepresentable on a binding with no request URI.</t>
  <t>Allowed an empty SETUP <spanx style="verb">Path</spanx> parameter, equivalent to omitting it; both request the server's default path. Previously an empty value was a protocol violation, which made the two ways of asking for the default disagree.</t>
  <t>Corrected SUBSCRIBE_END <spanx style="verb">Group</spanx> to an exclusive bound: the first sequence that will never be delivered, with 0 meaning no groups were produced. It was previously specified as the inclusive last group, which could not distinguish an empty track from one whose only group was 0.</t>
  <t>Split ANNOUNCE_BROADCAST into three typed messages: ANNOUNCE_START (0x0), ANNOUNCE_END (0x1), and ANNOUNCE_UPDATE (0x2), each prefixed with a Type discriminator like the subscribe stream's responses.</t>
  <t>Specified resolution of a request against the routes covering its path: only the most specific tier, the longest prefix, is consulted, so a concrete path shadows every broader route; a refusal never falls through, and cost and the existing tie-breaks order the tier. A route is always a prefix, and no message narrows one: an advertiser that serves only some of the paths beneath its prefix refuses the rest. A relay never announces a path because it resolved it; the advertiser announces the concrete path once producing. Standby ordering requires enforced deployment bounds on charged link count and cost; 2^32 is a recommended seed only when it exceeds their product.</t>
  <t>Split the reserved stream error range: 32 through 47 stays reserved, and 48 through 63 is moq-lite's own, assigned by the tables and mapped rather than forwarded across a bridge. Assigned 0x30 NO_CAPACITY there: it permits one re-resolution within the tier excluding the refusing advertiser, and a receiver that has spent or lacks that retry resets downstream with another code. Assigned 0x32 GROUP_TOO_LARGE: a group that grew past the publisher's cache budget is aborted. Every other code is terminal.</t>
  <t>Assigned 0x33 NOT_FOUND, 0x34 OLD, and 0x35 EVICTED in the stream error table: a group the publisher cannot serve because it was never here, has been superseded, or was dropped under memory pressure.</t>
  <t>Assigned 0x36 UNROUTABLE, 0x37 WRONG_SIZE, 0x38 FRAME_TOO_LARGE, and 0x39 TIMESTAMP_MISMATCH in the stream error table, moving them out of the reserved 32 through 47 range, which no longer carries provisional placeholders.</t>
  <t>Assigned 0x31 CONTROL_TIMEOUT in the stream error table: a request stream torn down because the peer never answered, which DELIVERY_TIMEOUT described as late content. It has no moq-transport value and bridges to INTERNAL_ERROR.</t>
  <t>A disallowed stream type, a role mismatch, or a missing extension is a PROTOCOL_VIOLATION; the session table gains no code for them, so nothing is sent from the reserved 32 through 47 range in either registry.</t>
  <t>Added implicit Announce IDs: each ANNOUNCE_START assigns the next per-stream ordinal.</t>
  <t>ANNOUNCE_END and ANNOUNCE_UPDATE reference the Announce ID instead of repeating the broadcast path.</t>
  <t>Replaced the duplicate-<spanx style="verb">active</spanx> restart idiom with ANNOUNCE_UPDATE; a second ANNOUNCE_START for an already-advertised prefix is now a protocol violation.</t>
  <t>Made the Announce Stream violations close the session rather than reset the stream: an unknown or retired Announce ID, an ANNOUNCE_START for an already-advertised prefix, and any announcement before ANNOUNCE_OK.</t>
  <t>Redefined an announcement as a route: the advertised path is a prefix claiming that paths beneath it can be served, matching moq-transport's namespace semantics, rather than the exact path of one available broadcast. A route claims capability, not inventory; which covered paths name broadcasts is an application convention (announcing each broadcast's exact path keeps enumeration working). ANNOUNCE_UPDATE updates a route's metadata in place and carries no content claim. Because routes carry no content identity, a relay never splices a live subscription across sources reached through different routes: a serving session ending resets its subscriptions and the subscriber re-requests through the best remaining route.</t>
  <t>Stated the ended-broadcast lifecycle without a flag: a broadcast whose route is retracted with ANNOUNCE_END may remain readable by exact path, its stored groups read over FETCH, discovered out of band; retraction never disturbs in-flight subscriptions.</t>
  <t>Specified route matching as per path segment (a prefix never matches half a segment) and specified how a route broader than the requested prefix presents: clamped to the request, as an empty suffix.</t>
  <t>Added <spanx style="verb">Warm Route Cost</spanx> and <spanx style="verb">Cold Route Cost</spanx> fields to ANNOUNCE_START and ANNOUNCE_UPDATE: the same path priced against two cache states. Warm is the accumulated cost of the transfers a subscription via this advertisement would newly cause, and is what route selection minimizes; Cold prices the path as if nothing along it were carrying, and breaks a Warm tie before path length, with the most recently received advertisement below that. A wire that cannot express Cold is read as the saturation ceiling, not as 0.</t>
  <t>Added a SETUP <spanx style="verb">Cost</spanx> parameter (0x4) declaring what subscribing from the sender costs, added by the receiver to every announcement that sender forwards. Both endpoints send their own, so the two directions are priced independently, and a receiver <bcp14>MAY</bcp14> charge a locally configured value instead. Unpriced directions default to 1, degrading to shortest-path routing.</t>
  <t>Removed <spanx style="verb">Exclude Hop</spanx> from ANNOUNCE_REQUEST. The receiver's hop-based loop check already discards a looped announcement, so the field only saved the wasted send.</t>
  <t>Stated the receiver's loop check normatively in ANNOUNCE_START: an announcement whose reconstructed path contains the receiver's own Hop ID is neither forwarded nor selected as a route.</t>
  <t>Added a SETUP <spanx style="verb">Hop</spanx> parameter (0x5): each endpoint declares its Hop ID at session setup, carrying session-wide the identity <spanx style="verb">Exclude Hop</spanx> carried per announce stream, and filtering subscriptions as well as announcements (including sessions that never open an Announce Stream).</t>
  <t>Made advertisement selection per subscriber: a publisher <bcp14>MUST NOT</bcp14> advertise a path containing the subscriber's declared Hop ID and otherwise advertises the best remaining one (a subscriber the serving path flows through receives the best standby instead of nothing), <bcp14>MUST</bcp14> serve subscriptions by the same exclusion, and the actively-carrying cost discount applies only to the serving path. This is how redundant publishers fail over across a mesh.</t>
  <t>Added <spanx style="verb">Frame Start</spanx> and <spanx style="verb">Frame End</spanx> to SUBSCRIBE and SUBSCRIBE_UPDATE, qualifying the start and end group with a frame index so a subscription can begin or end partway through a group. <spanx style="verb">Frame Start</spanx> is a plain index qualifying the <spanx style="verb">Group Start</spanx> group; <spanx style="verb">Frame End</spanx> is the index + 1, matching <spanx style="verb">Group End</spanx>, and <bcp14>MUST</bcp14> be 0 when <spanx style="verb">Group End</spanx> is absent.</t>
  <t>Added <spanx style="verb">Frame Start</spanx> and <spanx style="verb">Frame End</spanx> to FETCH, bounding the returned frames within the group. A publisher that cannot serve the full range resets the stream.</t>
  <t>Added <spanx style="verb">Frame Start</spanx> to GROUP, giving the index of the first FRAME on the stream so a partial group is self-describing.</t>
  <t>Added the Positions section defining a (group, frame) position, its lexicographic ordering, and the rule that a partial group is only ever delivered to a subscriber that asked for one. A publisher that cannot serve a group from the requested frame skips it and resolves to a later group, so SUBSCRIBE_OK needs no frame field: the start frame follows from <spanx style="verb">Group</spanx> and the subscriber's own request.</t>
  <t>Capped the GOAWAY New Session URI at 8,192 bytes, matching moq-transport.</t>
  <t>Restricted the GOAWAY New Session URI to servers, specified a duplicate GOAWAY as a protocol violation, and recommended scheme continuity and sticky redirects.</t>
  <t>Exempted a ceiling-cost serving path from the actively-carrying cost discount: a relay whose serving path costs the saturation ceiling (primarily a session that received a GOAWAY) advertises the ceiling instead of 0, so the drain propagates downstream instead of being re-masked by each carrying hop. Keyed on the value, not the reason, which does not travel on the wire.</t>
  <t>Added the Error Codes section, defining separate session and stream code spaces and listing the codes moq-lite uses, reused unchanged from moq-transport. Codes 64+ are the application's; 32-63 are reserved and <bcp14>MUST NOT</bcp14> be interpreted, pending a future revision. Previously the codes were unspecified, so an endpoint could neither send one a peer would understand nor safely interpret one it received. Note this renumbers every code an existing implementation sent, and that a stream reset of 0x0 is now INTERNAL_ERROR rather than a cancellation (CANCELLED is 0x1).</t>
  <t>Renamed <spanx style="verb">Subscriber Max Latency</spanx> to <spanx style="verb">Subscriber Max Age</spanx> and <spanx style="verb">Publisher Max Latency</spanx> to <spanx style="verb">Publisher Max Age</spanx>.</t>
  <t>Redefined timestamp age so a group is expired only once it provably cannot overlap the Max Age window. Age is now measured from a group's <em>reach</em> (the first frame timestamp of its successor, which is the furthest it could still present) to the newest frame of the latest group, and an age equal to Max Age expires it, since reach is an exclusive bound. Previously age ran from the group's own first frame, which expired a group whose later frames were still well inside the budget. A group whose successor has not yet presented a frame is never expired, because frame durations are not on the wire and nothing else proves where it ends.</t>
  <t>Removed the wall-clock age measure from expiration: timestamps are the only input, and wall-clock reclamation of idle content is the retention cache's own policy (<spanx style="verb">Publisher Max Age</spanx>) rather than part of the subscription rule. A zero-frame group needs no measure of its own, since its reach is bounded by its successor's first frame like any other group.</t>
  <t>Removed <spanx style="verb">Subscriber Ordered</spanx> from SUBSCRIBE and SUBSCRIBE_UPDATE, and <spanx style="verb">Publisher Ordered</spanx> from TRACK_INFO and SUBSCRIBE_OK. Group order within a Track is now normatively newest-first, with no field to invert it: a subscriber that wants sequence order reads in sequence order, which costs the network nothing and does not let one subscriber's preference reach a Track a relay is fanning out to many. Note this removes a byte from the middle of each message, so a lite-06 peer cannot parse a lite-05 one's SUBSCRIBE (the earlier drafts keep the byte, and an implementation serving them <bcp14>SHOULD</bcp14> write 0 and ignore what it reads).</t>
  <t>Made <spanx style="verb">Group Start</spanx> an absolute floor (the raw minimum group sequence, default 0) rather than the sequence + 1 with 0 meaning the latest group. The start resolves from <spanx style="verb">Subscriber Max Age</spanx> instead: the oldest group at or above the floor within the budget, so a subscriber that buffers is handed the head of what it can still play. A zero budget still resolves to the latest group, which was the only start the old encoding could ask for by default.</t>
  <t>Removed the actively-carrying Warm discount, its ceiling exemption, and the <spanx style="verb">(Cold cost, hash)</spanx> adoption rank with its re-parenting delay: costs are forwarded accumulated only. The <spanx style="verb">Warm</spanx> and <spanx style="verb">Cold</spanx> fields and the selection order are unchanged.</t>
  <t>Replaced the no-splice rule with a first-hop identity: two routes covering one path with the same non-zero first hop are the same origin reached another way, and a relay <bcp14>MAY</bcp14> move a live subscription between them at a group boundary. Splicing across differing or unknown (0) first hops remains prohibited.</t>
  <t>Ranked a path that contains a 0 Hop ID below every fully identified path before comparing Route Cost. A received 0 is forwarded unchanged, and bridging an upstream that sent no hop list writes 0 for that hop. An assigned identity is local selection state and <bcp14>MUST NOT</bcp14> be forwarded.</t>
</list></t>

</section>
<section anchor="moq-lite-05"><name>moq-lite-05</name>
<t><list style="symbols">
  <t>Renamed ANNOUNCE_INTEREST to ANNOUNCE_REQUEST and ANNOUNCE to ANNOUNCE_BROADCAST.</t>
  <t>Added a SETUP message and Setup Stream (0x1).</t>
  <t>Added a SETUP <spanx style="verb">Probe</spanx> parameter.</t>
  <t>Added a SETUP <spanx style="verb">Path</spanx> parameter to convey the request path on bindings that have no request URI (native QUIC and Qmux-over-TCP/TLS).</t>
  <t>Added a SETUP <spanx style="verb">Role</spanx> parameter so a client can advertise its intended direction (Publisher/Subscriber/Both) and be rejected during SETUP when its authorization lacks that direction.</t>
  <t>Added Track Stream (0x6) and TRACK_INFO.</t>
  <t>Removed FETCH_OK.</t>
  <t>Trimmed SUBSCRIBE_OK to a single resolved start group.</t>
  <t>Split end-of-subscription signaling into SUBSCRIBE_END.</t>
  <t>Renamed <spanx style="verb">Start Group</spanx>/<spanx style="verb">End Group</spanx> to <spanx style="verb">Group Start</spanx>/<spanx style="verb">Group End</spanx> in SUBSCRIBE, SUBSCRIBE_UPDATE, and SUBSCRIBE_DROP.</t>
  <t>Allowed duplicate <spanx style="verb">active</spanx> ANNOUNCE_BROADCAST messages to atomically replace the prior advertisement.</t>
  <t>Added ANNOUNCE_OK with <spanx style="verb">Hop ID</spanx> and <spanx style="verb">Active Count</spanx>.</t>
  <t>Added mandatory <spanx style="verb">Timescale</spanx> to TRACK_INFO.</t>
  <t>Added <spanx style="verb">Timestamp Delta</spanx> to FRAME.</t>
  <t>Added <spanx style="verb">Timestamp</spanx> to the QUIC datagram body.</t>
  <t>Moved <spanx style="verb">Publisher Max Latency</spanx> to TRACK_INFO and redefined it as a maximum retention bound: the longest the publisher caches a non-latest group (the inverse of an HTTP <spanx style="verb">Cache-Control: max-age</spanx> guarantee). <spanx style="verb">Subscriber Max Latency</spanx> keeps its name and remains the subscriber's delivery-time expiration preference.</t>
  <t>Expire a group once <strong>either</strong> its timestamp age or its wall-clock arrival age exceeds Max Latency (the shorter lifetime wins), bounding both manipulated timestamps and delivery bursts.</t>
  <t>Added QUIC datagram delivery for groups. Datagrams and Group Streams are independent delivery modes with no conversion between them: an oversized (&gt;1200 byte) datagram <bcp14>MUST NOT</bcp14> be sent and is dropped on receipt, and bindings without a datagram channel do not fall back from datagrams to streams.</t>
  <t>Added Qmux <xref target="qmux"></xref> transport bindings for TCP/TLS and WebSocket.</t>
</list></t>

</section>
<section anchor="moq-lite-04"><name>moq-lite-04</name>
<t><list style="symbols">
  <t>Renamed ANNOUNCE_PLEASE to ANNOUNCE_SUBSCRIBE.</t>
  <t>ANNOUNCE_BROADCAST <spanx style="verb">Hops</spanx> count replaced with explicit <spanx style="verb">Hop ID</spanx> list for loop detection.</t>
  <t>Added <spanx style="verb">Exclude Hop</spanx> to ANNOUNCE_REQUEST for relay loop avoidance.</t>
  <t>Added GOAWAY stream for graceful session shutdown and migration.</t>
  <t>Added RTT to PROBE message. Bitrate and RTT use 0 for unknown.</t>
</list></t>

</section>
<section anchor="moq-lite-03"><name>moq-lite-03</name>
<t><list style="symbols">
  <t>Version negotiated via ALPN (<spanx style="verb">moq-lite-xx</spanx>) instead of SETUP messages.</t>
  <t>Removed Session, SessionCompat streams and SESSION_CLIENT/SESSION_SERVER/SESSION_UPDATE messages.</t>
  <t>Unknown stream types reset instead of fatal; enables extension negotiation via stream probing.</t>
  <t>Added FETCH stream for single group download.</t>
  <t>Added Start Group and End Group to SUBSCRIBE, SUBSCRIBE_UPDATE, and SUBSCRIBE_OK.</t>
  <t>Added SUBSCRIBE_DROP on Subscribe stream.</t>
  <t>Subscribe stream closed (FIN) when all groups accounted for.</t>
  <t>Added PROBE stream replacing SESSION_UPDATE bitrate.</t>
  <t>Removed ANNOUNCE_INIT message.</t>
  <t>Added <spanx style="verb">Hops</spanx> to ANNOUNCE_BROADCAST.</t>
  <t>Added <spanx style="verb">Subscriber Max Latency</spanx> and <spanx style="verb">Subscriber Ordered</spanx> to SUBSCRIBE and SUBSCRIBE_UPDATE.</t>
  <t>Added <spanx style="verb">Publisher Priority</spanx>, <spanx style="verb">Publisher Max Latency</spanx>, and <spanx style="verb">Publisher Ordered</spanx> to SUBSCRIBE_OK.</t>
  <t>SUBSCRIBE_OK may be sent multiple times.</t>
</list></t>

</section>
<section anchor="moq-lite-02"><name>moq-lite-02</name>
<t><list style="symbols">
  <t>Added SessionCompat stream.</t>
  <t>Editorial stuff.</t>
</list></t>

</section>
<section anchor="moq-lite-01"><name>moq-lite-01</name>
<t><list style="symbols">
  <t>Added Message Length (i) to all messages.</t>
</list></t>

</section>
</section>
<section anchor="appendix-b-upstream-differences"><name>Appendix B: Upstream Differences</name>
<t>A quick comparison of moq-lite and moq-transport-14:</t>

<t><list style="symbols">
  <t>Streams instead of request IDs.</t>
  <t>Pull only: No unsolicited publishing.</t>
  <t>FETCH is HTTP-like (single request/response) vs MoqTransport FETCH (multiple groups).</t>
  <t>Capabilities negotiated via a SETUP message on a unidirectional stream that does not block other streams, instead of MoqTransport's blocking CLIENT_SETUP/SERVER_SETUP handshake on the control stream.</t>
  <t>Both moq-lite and MoqTransport use ALPN for version identification.</t>
  <t>Names use utf-8 strings instead of byte arrays.</t>
  <t>Track Namespace is a string, not an array of any array of bytes.</t>
  <t>Subscriptions default to the latest group, not the latest object.</t>
  <t>No subgroups</t>
  <t>No group/object ID gaps</t>
  <t>No object properties</t>
  <t>No paused subscriptions (forward=0)</t>
</list></t>

<section anchor="deleted-messages"><name>Deleted Messages</name>
<t><list style="symbols">
  <t>MAX_SUBSCRIBE_ID</t>
  <t>REQUESTS_BLOCKED</t>
  <t>SUBSCRIBE_ERROR</t>
  <t>UNSUBSCRIBE</t>
  <t>PUBLISH_DONE</t>
  <t>PUBLISH</t>
  <t>PUBLISH_OK</t>
  <t>PUBLISH_ERROR</t>
  <t>FETCH_OK</t>
  <t>FETCH_ERROR</t>
  <t>FETCH_CANCEL</t>
  <t>FETCH_HEADER</t>
  <t>TRACK_STATUS</t>
  <t>TRACK_STATUS_OK</t>
  <t>TRACK_STATUS_ERROR</t>
  <t>PUBLISH_NAMESPACE</t>
  <t>PUBLISH_NAMESPACE_OK</t>
  <t>PUBLISH_NAMESPACE_ERROR</t>
  <t>PUBLISH_NAMESPACE_CANCEL</t>
  <t>SUBSCRIBE_NAMESPACE_OK</t>
  <t>SUBSCRIBE_NAMESPACE_ERROR</t>
  <t>UNSUBSCRIBE_NAMESPACE</t>
  <t>OBJECT_DATAGRAM</t>
</list></t>

</section>
<section anchor="renamed-messages"><name>Renamed Messages</name>
<t><list style="symbols">
  <t>SUBSCRIBE_NAMESPACE -&gt; ANNOUNCE_REQUEST</t>
  <t>SUBGROUP_HEADER -&gt; GROUP</t>
</list></t>

</section>
<section anchor="deleted-fields"><name>Deleted Fields</name>
<t>Some of these fields occur in multiple messages.</t>

<t><list style="symbols">
  <t>Request ID</t>
  <t>Track Alias</t>
  <t>Group Order</t>
  <t>Filter Type</t>
  <t>StartObject</t>
  <t>Expires</t>
  <t>ContentExists</t>
  <t>Largest Group ID</t>
  <t>Largest Object ID</t>
  <t>Parameters</t>
  <t>Subgroup ID</t>
  <t>Object ID</t>
  <t>Object Status</t>
  <t>Extension Headers</t>
</list></t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>
<t>moq-lite inherits the transport security of the underlying connection: QUIC and WebTransport provide confidentiality and integrity via TLS 1.3, and the Qmux bindings run over TLS (TCP) or a <spanx style="verb">wss://</spanx> WebSocket. How that connection is authenticated is out of scope (see <xref target="connection"></xref>). The considerations below are specific to moq-lite.</t>

<section anchor="bandwidth-probing"><name>Bandwidth Probing</name>
<t>The <spanx style="verb">Increase</spanx> Probe level (see <xref target="probe-parameter">Probe Parameter</xref>) lets a subscriber ask the publisher to pad the connection up to a target bitrate. A publisher <bcp14>MUST NOT</bcp14> treat the target as authorization to send beyond what congestion control allows: padding is bounded by the congestion window, so probing cannot be used to amplify traffic toward the subscriber or a spoofed address. A publisher that only advertised <spanx style="verb">Report</spanx> <bcp14>MUST NOT</bcp14> pad above its current sending rate. Because all data flows on an established, congestion-controlled session to the connecting peer, moq-lite offers no off-path amplification vector.</t>

</section>
<section anchor="session-redirection"><name>Session Redirection</name>
<t>GOAWAY carries an optional New Session URI that asks the peer to reconnect elsewhere. A malicious or compromised peer could use this to redirect a client to an attacker-controlled server. A recipient <bcp14>MUST</bcp14> validate the URI against local policy (scheme, authority, and port) before reconnecting, and <bcp14>MUST NOT</bcp14> reconnect if validation fails (see <xref target="goaway"></xref>). Migrated subscriptions carry no implicit trust from the prior session; the new session is authenticated independently.</t>

</section>
<section anchor="routing-metadata-and-privacy"><name>Routing Metadata and Privacy</name>
<t>Hop IDs (see <xref target="announce-ok">ANNOUNCE_OK</xref> and <xref target="announce-start">ANNOUNCE_START</xref>) expose the relay path of a broadcast, which may reveal internal topology. A relay that does not wish to disclose its position <bcp14>MAY</bcp14> use the reserved value 0 ("unknown") instead of a stable identifier, at the cost of losing loop detection through itself (see <xref target="routing"></xref>). The Hop ID announcement filter (see <xref target="hop-parameter">Hop Parameter</xref>) exists for loop avoidance, not access control: a subscriber cannot verify that a publisher honored it, so it <bcp14>MUST NOT</bcp14> be relied upon to hide a broadcast from a peer that declared its Hop ID.</t>

</section>
<section anchor="resource-exhaustion"><name>Resource Exhaustion</name>
<t>A peer can open many streams (subscriptions, announcements, fetches), request large announce prefixes, or advertise broad routes. Implementations <bcp14>SHOULD</bcp14> bound the number of concurrent subscriptions, announce matches, and cached groups, and <bcp14>SHOULD</bcp14> rely on QUIC flow control and stream limits to backpressure a misbehaving peer (see <xref target="announce-request">ANNOUNCE_REQUEST</xref>). Expiration (see <xref target="expiration"></xref>) bounds how long stale groups consume memory and flow control. A broad route invites a request for any covered path, each of which may start work: an advertiser <bcp14>SHOULD</bcp14> bound the work it starts and refuse beyond that with NO_CAPACITY, and a receiver re-resolves at most once per request, so a flood of requests costs the mesh one round trip each rather than a search (see <xref target="resolution"></xref>).</t>

</section>
<section anchor="datagram-injection"><name>Datagram Injection</name>
<t>Datagrams are routed to a subscription solely by Subscribe ID and carry no per-group authentication beyond that of the QUIC connection. On an unmodified QUIC/WebTransport connection this is sufficient, since datagrams are protected by the transport. A subscriber <bcp14>MUST</bcp14> silently drop any datagram with an unknown Subscribe ID and <bcp14>MUST</bcp14> deduplicate against groups received on streams (see <xref target="datagrams"></xref>).</t>

</section>
<section anchor="opaque-payloads"><name>Opaque Payloads</name>
<t>The moq-lite layer treats Frame payloads as opaque and performs no validation of their contents. Confidentiality or integrity of the media itself (e.g. end-to-end encryption transparent to relays) is an application concern and out of scope for this draft.</t>

</section>
</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>



    <references title='Normative References' anchor="sec-normative-references">




<reference anchor="moqt">
   <front>
      <title>Media over QUIC Transport</title>
      <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
         <organization>Cisco</organization>
      </author>
      <author fullname="Victor Vasiliev" initials="V." surname="Vasiliev">
         <organization>Google</organization>
      </author>
      <author fullname="Ian Swett" initials="I." surname="Swett">
         <organization>Google</organization>
      </author>
      <author fullname="Alan Frindell" initials="A." surname="Frindell">
         <organization>Meta</organization>
      </author>
      <date day="8" month="September" year="2026"/>
      <abstract>
	 <t>   This document defines Media over QUIC Transport (MOQT), a publish/
   subscribe protocol that runs over QUIC and WebTransport.  MOQT
   leverages the features of these transports, such as streams,
   datagrams, priorities, and partial reliability.  MOQT operates both
   point-to-point and through intermediate relays, enabling scalable
   low-latency delivery.  Despite its name, MOQT is media agnostic and
   can be used for a wide range of use cases.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-21"/>
   
</reference>

<reference anchor="I-D.lcurley-moq-pattern" target="https://datatracker.ietf.org/doc/draft-lcurley-moq-pattern/">
  <front>
    <title>MoQ Pattern Extension</title>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization></organization>
    </author>
    <date />
  </front>
</reference>



<reference anchor="qmux">
   <front>
      <title>QMux</title>
      <author fullname="Kazuho Oku" initials="K." surname="Oku">
         <organization>Fastly</organization>
      </author>
      <author fullname="Lucas Pardue" initials="L." surname="Pardue">
         <organization>Cloudflare</organization>
      </author>
      <author fullname="Jana Iyengar" initials="J." surname="Iyengar">
         <organization>Netflix</organization>
      </author>
      <author fullname="Eric Kinnear" initials="E." surname="Kinnear">
         <organization>Apple</organization>
      </author>
      <date day="6" month="July" year="2026"/>
      <abstract>
	 <t>   This document specifies QMux version 1.  QMux version 1 provides,
   over bi-directional streams such as TLS, the same set of stream and
   datagram operations that applications rely upon in QUIC version 1.

Discussion Venues

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

   Discussion of this document takes place on the QUIC Working Group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/quic/.

   Source for this draft and an issue tracker can be found at
   https://github.com/quicwg/qmux.

	 </t>
      </abstract>
   </front>
   <seriesInfo name="Internet-Draft" value="draft-ietf-quic-qmux-02"/>
   
</reference>

<reference anchor="qmuxws" target="https://datatracker.ietf.org/doc/draft-lcurley-qmux-websocket/">
  <front>
    <title>QMux over WebSocket</title>
    <author initials="L." surname="Curley" fullname="Luke Curley">
      <organization></organization>
    </author>
    <date />
  </front>
</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="RFC6455">
  <front>
    <title>The WebSocket Protocol</title>
    <author fullname="I. Fette" initials="I." surname="Fette"/>
    <author fullname="A. Melnikov" initials="A." surname="Melnikov"/>
    <date month="December" year="2011"/>
    <abstract>
      <t>The WebSocket Protocol enables two-way communication between a client running untrusted code in a controlled environment to a remote host that has opted-in to communications from that code. The security model used for this is the origin-based security model commonly used by web browsers. The protocol consists of an opening handshake followed by basic message framing, layered over TCP. The goal of this technology is to provide a mechanism for browser-based applications that need two-way communication with servers that does not rely on opening multiple HTTP connections (e.g., using XMLHttpRequest or s and long polling). [STANDARDS-TRACK]</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="6455"/>
  <seriesInfo name="DOI" value="10.17487/RFC6455"/>
</reference>
<reference anchor="RFC9002">
  <front>
    <title>QUIC Loss Detection and Congestion Control</title>
    <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
    <author fullname="I. Swett" initials="I." role="editor" surname="Swett"/>
    <date month="May" year="2021"/>
    <abstract>
      <t>This document describes loss detection and congestion control mechanisms for QUIC.</t>
    </abstract>
  </front>
  <seriesInfo name="RFC" value="9002"/>
  <seriesInfo name="DOI" value="10.17487/RFC9002"/>
</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>



    </references>




<?line 1529?>

<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA8y963Yc15Em+h9PkUda6xCAqyBeZFkGbPeAICThmCRoALSW
W8tNZFUlgDSrMsuZWQRhWb3mIeYBzrPMo8yTTMQXl713VhZBsrvnHK9eLaIq
a+e+xI57fDEej7e6spsX+9kXL4pZmWf1u6LJ/vT65CgbZ8/LrvhiK59MmuId
PbCo/z7/Ymuad8V13dztZ2V1VW9tzepplS9ogFmTX3Xj+XTVzIu7MT08ntPv
xw+/2WpXk0XZtmVddXdLevLk+OK7LPsyy+dtTeOW1axYFvT/qu6LUfYFTaOr
mzKf8x8nh0/pP3VD/zq7+O6LrWq1mBTN/taMZrG/RbN6spU3Rb6f3Zbd1m3d
vL1u6tVyP6PXb23lq+6mpoez8VZG/7tazecy1eert0V2hInim2KRl/P97G35
vpjTwLP/ds0f7E3rxdZWVTeLvCvf0esyHraj+Y+f7ZVFd4VFdk1etcu66ehr
/iLegGXedUVT7eMlvs/1n7JX8kV2/L4rKt6YL+SRvLku6AU3Xbds97/6ilaZ
0/jTt0WDF+7VzfVXtOFfre+1vuorjOMLx//G+t+MTqylxe/FS+f/DW8Ktji7
okMq6O+/L1bvo5X/fVVOx/yZfnXbpov804vVe6GlH4vJeU0r6P5DS+R3jG+L
SYuh/stWefbd0ZPffvvNvvzzm69//Wv9528fPny8v7XFJO/ksDUej7N80vL0
u60to/isbLNZ0ZbXVTHLuprGrupVl83pN9mUrgCRefZo/IeXWT5t6rbNuhv6
ScWHV3R7Wyf0ZEH7ll8XrdxDGmLZlHQjuvIf9OSCaS2nMXSsUZa/q8tZWV1n
N0U+G9dXNIuqyCZz2ir+9PamnBdZU7TLYtrxB0U1rfG8XbtpWbR7Wz/iOXrV
Im/K+V1YAy05WzBzGGGuTvC80GV+N6/zWZZfV3XbldMsr2bZNK+yCQ9Vvy/p
95M7evs8v2u/Onr2suWbesMb8raqb+fF7LrI6itazKyYtiMsKqfpNy1uPc2t
uVt2dEGyt8UdTRJ7XtVd8eYl/7+ufnNGi6bHt7Yubnjj6+lqwTt8m7fZdUED
8X3mKdCcDk/oAs+KeXbV1AvZ98VyXvDzOd6Rd9lP1zS91YTv/ld8orPiHf/3
r9tGsMPf72DhNAFiHLIC2pN5XV235YxeQwd7zkyw42n8RLxwVdw34ld4qt3h
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
c4xFBXQycbSgAI+VgmwYKUq60HjWl7ySHTrIvEs/D1lZpq9URYcWwHHnZxfw
cxUnG1oR6UHZukw/KoFQK4b4Cq4tRsJN5ZCWxEDLDHxhUc5mgsmHgTX3R3OV
NCVVRKGyXtTa+3e/5snGEIDCU4u8mXNaBxIxWylyAaO46wpneWuSrwmBfC17
QDdxbqbNLmAU0np7Emx38JL0ofR7HWhkWk1+u6F/jXeoyR7urAXX4s4W/SS+
PkMX91/SzMGMhsFeNqIzamfs+xvSxDCnYLppedRQn5ePbvFi/MPSWOSb2JJa
l15C27d51JJH1q7rCQnaIiVJHYbBN7mzDe+z5nWbAA55swnEPjUdvYC5kTh8
Lre9QzASWm52iBxmtbLJvHobWow3KOFmfiwI9vndvl5TZvZx7lOIbfAS5YwR
goniLh5scavQXXXCIAQpMcoyTgL7VT2WIKMY1+bPYfY0JmvB/ZX78J33cxSZ
ZcAs8gAFHGKexi28m8cxOYbvpdDPQ5aWGXWbR5535i/sducjGox/WkUULi50
1uuk1m4P6W2CSCYOMgmJaucFi/Vv083zabbqWkRGzk05KTvdMjpAqA5YrHgJ
zB2d07VUz6UEXkTjZkfNXcidn1lqIYI7nIktEZIQNZO0RDUToWwHUvDzs6CR
5tcDANqyZTQuAtg73nLkx4OVMfTtlfWVgg3I5QiWV+Qu6bLVguFAQoi5rZlG
PrG9/93Zte22kRzRd30F4byQhinaewECLXYBSuLGzGpJQZQXARYLkSYpaWyK
o3BIy9og/56uc6q6q2dIO8kbLzM9PX2prts5VcMXfO/U++joh70wEFh02Qhb
ZAHB7IKY99t01FumKM5icbi70gc0MWqOfTApONf+vkv2pNlLVoGFpJhIpbmd
lreuHnUQt+TZ6632mkAW0AdIRxOG4Prssnd9MdnX0aty5fupqbvM65/7XFgI
ErEEIWRdbZGowvSS3O9JcIxhY1Rz/MBYiJY75KM1V7QywDc5l3xyY3xI6nez
7gQektQlL2XJAcNMl2uy/OYeMTrrSNNVY9yNih4zVsNbd8vbbg6CA3kMPSje
t83a1t7qRIt0pfWmQrGV8u2z47yX+YDXqclXB/THnMXNAxiSDyymT+1JcPeF
Z1zR4w3lNaPLKK+ZxWbSdLh0IgrkKeWSnhZ9PJnVY6fprqCyLWYomebAZtKF
fBrVsdwARomvW/zG+66Z2umNXSAJM3dhZQcJvXhOAJsvWPQ1vXsTLflCU6KM
vD/ZNw4kYVnx9aTUQ/T9bbrF/w/G/M7xYWcGE41QNNsoqe2M2RMJ8+Uek0Xo
NHF6Ox+LTXJNw1vx8iVdSS9f4lm5q0Mq8YQfvfmpFQo8xb7rNseCcelNKgXy
FHrdcUENYGvC+ikeVU3xhivq6hmF7i4csFVaIvl6iJcl0s3j1rn+y5ZsX7Ks
KHisUsA+NfBA55taVRDgAJtlygJizoCVFn+GvrR/evPN69ewETqpT/64w6Gq
6SCuligO60e1x+OJkHKZYltydq+Xq2BtkZZXAI3vIxpmEV8UlQfxhm6kwrHR
+l2wZH84lpf4NBkxPU/QjYhPq5/M3+07mS8vBv1JfuxGGZYlmiYZJSKlmioU
YWOaJEbcSI6T2IEGIl1EOsAibNLaAZIHwffpB7fIxRRlEG3MPpXFYqb7gG1o
VEG1IC6hQ9Q1wBsUd5tZ3g2h2wkPz4iAjiMlldwkV4hriHpUohbKxvjb0OBv
uuAchldSjvoXl6NWOwEuP3+edrznPlNsMr/RxMgT9cOZqI6W0s3NMRlMJsPx
6ObsYjgYXffs62Rw9dvgKn6tVTeTZ7xTHdjlW1fq8nV9uw0LdPVDOHSJ2UgZ
1/aOllelzQhLVRYUJJLbTVDGxSkTQwisXe9OaLxfPKOzoPXXT2HqGtpmzrAa
ejypobegXtR+05LVrfbPw1GHOpJsXuMnzVl67VFcRtGBLluEelY2D0qd5afa
aczD60QCGzcLt95XlOSDBxF0gH3+sa9mArjGmzWDpq8OneCHnWrbsjFLeTkC
smJB7kbCC5wt9S33TZrgPdsDh+WiCMqNRIqr7c7oR1IDb2IDTdQ/9DABn8ct
42HWpyetd2Z7nWuy7XxZHfVb/9wV849m41X0ysYoFkSQj1Z133wHmL4dblmK
Pg2K4Tm266XE/sUTcNIalRJdKiFvxbbkGOuui6y4or504TNtR70aLfYMp9hp
faqyuhp6czsOO9d6R2PKzNtGknMu4Oq2GeC9u3URrQZMQDJUE1039BHPFVFl
xb1qRT9wuWwnCrsbPLVHUccv8DxV97OPESM/p+bmFgWyBbMpycZAJD0ktggr
UyHMlJ/Hw2OEAIVcvNvedv+qnGPZDMLrGZSt2XNFu8e4d5lajwwX3qZ5lmte
Tf3zOX1BkN6JqMdGVmHTS2ZBXf21fP9hSdxfWD1B7+TM8is+93iFeDKEvYX/
6G+pqgl/fiSZS61kuDoGfnzdwTYLJsJym7aW3Ppr/x9Jx7gZnov441E/uTm9
GJ/9MjjPpAFijHJUjeJvshPenV4MJ29vzscj99X9Mf7FfbE2zAKNH/M/GKyM
X98O+ucD+ZdWyOS6f/1uUvvKxrJfrE17+CjYRpPL/tlg3295P9PPBxtJnUxD
VGtt3x97RjHr2Pj074Oz65sg7Pt/C8YcJs+0RTd5e25udX9qKG28kphGjqJc
Rconvyx+huPyaJJAvNXSvJnlfL5D/ZMoiJwUJgsFJWPcVf1VMZNOUlPAWSNz
ibxJwLiZrLrZjrGiox1VAYqPcNlAouPy/UJSfSvTQfAQ+2lse0Smxxw1FTfm
XbrcX6afJVN2Vx0pzQNkylsQC1fg75gswxuLGy50RkKcGn08imKqWAcZqZXD
nS1Q2X0aoHO0kInv7iQ5ojK+SmV0Yy6zEjtYog04ZNCyCHixMN4cf5s83rBM
oiGy2dGmwnXtYJJ0iNObPlXVSa83dZZJUPafog9V+wdJuAvNCtAIh4pkdBF+
Uc3LRyVG/v0s3vFH+y/p9k5H2SmyoVN/LGjkI2i+jHKfqsBpeJ+nYhHOg0vq
rWRiMVrWaYs0rKulJMD818SsrHKZBUgkBpG7IqQY5GxhR5SNBNXcWY22Ns9T
i9ZpYsAzCtq6Bw9pWfD8PQsQ70nHXfm34tkI6GV1Ih1aKP7RxWS1i3YTcx4Q
A1Jl31WOMPYyqXEm5ZpD92858iwSk+OJsEjCWixvAWNYCDJhT04eQjwO9Ta9
AoHtNI2EjOSX+XcTDEuUOsC3mBuMjKREEyle9vSyXR2hFXLeNaWrzCZNcsOW
EnKNW7VkGGxdyiem9XM4DLH2KdwXK3toq1fLqCwZh6ohyjzbaiPvTnMaFX7S
oEVNzNRhWB9mojIKDRUqMjyE6XsgjBCxVqYdVRq83SbK1OSGJivJbLsNMne5
yUdHsv80jPG/05O2v0A52tlPXprFJdIbF01CUt25HNawYUmKK2LjV7gDGqpM
hOhF+O52s6scHpieWF0RP1jWTVwiTXnmASac+CsiPcIJq2hCeZ9LcczNn4/o
Q7GOO9du6L1l+nfLj/S4p/+BqvCXwIEeBJKSEjOaIf4UQ206sF1itHkGO+ds
xWwzFFQqwzyVd8+JPSPX45+E7YWkhUTegoHDKuVJJG8XH68Zd0TNvG61X6hD
5UXmExHNGBi+RED1yrg1DesVniQjmPuXYl650ixxCHW0w9gowsYOjQg7cCgU
wi30TrnAS3uB1nhZj6S6Kjm6opNKdXrkspikrSV2qNwk+W7MbXbs9qTxLrbK
TZY5JsM8SGRx90iZdF+ATSthJzX/LBG6RqhFQq/oUrQaqIPP90FEQgb1YwIG
0SKocmx+p3a2XV7l4BMr2yzOYrNhV0RPGdxEeXYqwvljWAt91zDzcWtYo93W
9AxWWsWOiwSWQr9iMn9/zwxOqQw2DD3TBlLHEVvfLFkdAgqTHBDpjExpq6sC
DCNS3S3IQeOjIC/B++X97JMdCvX9qyqy36E6QrIcU5VVve9Q2dWOccQIPATw
wrBXorVO9p+HpfFlAEDk3kT2sBtpCXoUCnDW2bLSXB6JrQxJSOQwKcHwnOQV
1bl6GnOF5KNiG2vXIRAizDymmiiLVZBKjtalAcUzQhcl2gUgkmw7+FNBrAic
Su6K96NULhtKoDIkiGEHhXMer5ens1bL2WZ+bxIkEsmIEIlfOlqk1SIWreH6
gx7jLoixURBzDkrQ2GW5WmrhKk87a5hynENCBaEpOulcYWgjjZ6aAFi6rhJD
a7wmvcFDuWAyglzRyywBp4FuFXoE9O+8ICIQOXuL7H0kh5+hZGP1SRnYTV7Y
qlgRtYoKzaiYbgNmjPKWk9EYBTQQdNEYRjUNIoK4NW+iXDsJJXMWZyBMWey9
zdj4cRYWhlF7VqwHbjpcOOJkHYiCXSnNrxIwAnVX8l5oKMuNkBVD33OKByej
2FgyZiV56bmZJYG5aGXp5AWbO5hbdnQtj++OEe/ellITURKbNs9cNRxtZBJR
VQs9rjr76RHm4RAnsM7bVLGkOxLmSCM57I/6dROUnMCLcr7D4ag8L7hyZnTq
wSrvdiEN4SWdy0wGrRCQ9eroXycU1cvFjy9uZ0EjffHv0Or4fBwasCuDQfYf
3fMW1MmUAQA=

-->

</rfc>

