<?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-cluster-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true">
  <front>
    <title abbrev="moq-cluster">MoQ Cluster Extension</title>

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

    <date year="2026" month="August" day="03"/>

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

    <abstract>


<?line 24?>

<t>This document defines a clustering extension for MoQ Transport <xref target="moqt"/>, used to build a mesh of relays.
Each namespace advertisement carries the ordered list of Hop IDs it has traversed, starting with the original publisher, plus the accumulated cost of that path.
A receiver uses the list to detect routing loops and to identify which advertisements come from the same publisher, and the cost to choose between paths.
Each endpoint declares its own Hop ID during setup, and the peer uses it to avoid advertising or serving a path that already passed through that endpoint.</t>



    </abstract>



  </front>

  <middle>


<?line 31?>

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

<t><strong>Upstream</strong> and <strong>downstream</strong> are relative to the flow of an advertisement, not to the endpoints: the peer that sends an advertisement is upstream, the one that receives it is downstream.
The same pair of relays can be upstream of each other for different namespaces.</t>

</section>
<section anchor="introduction"><name>Introduction</name>
<t><xref target="moqt"/> is designed to deliver content through a mesh of relays, but is deliberately vague about how that mesh is built, and the base transport does not carry enough information to build one.</t>

<t>Relays that gossip namespaces with PUBLISH_NAMESPACE quickly break down: advertisements loop between relays forever, and when two connections advertise the same namespace, a relay has no basis for deciding which one to route a SUBSCRIBE toward.</t>

<t>This extension adds the HOP_PATH parameter to PUBLISH_NAMESPACE and NAMESPACE.
It lists every node an advertisement has passed through, starting with the original publisher, which is enough to break loops and to compare paths.
Each connection also declares its own Hop ID at SETUP, so loops are avoided even across multiple connections between the same pair of relays.</t>

<t>Not every route is equal: one crossing a metered backbone costs more than one inside a datacenter.
The RELAY_COST Setup Option prices a link, defaulting to 1 so an unpriced mesh simply ranks by hop count.
The ROUTE_COST parameter carries the accumulated price per namespace, and a relay may lower it to advertise that it already has the content cached, steering subscribers toward a warm copy.</t>

</section>
<section anchor="setup-negotiation"><name>Setup Negotiation</name>

<section anchor="relay-hops"><name>Relay Hops</name>
<t>The extension is negotiated during the SETUP exchange (<xref target="moqt"/> Section 10.3).
An endpoint indicates support with the following Setup Option, whose value is its own Hop ID:</t>

<figure><artwork><![CDATA[
RELAY_HOPS Setup Option {
  Option Key (vi64) = 0x40B55
  Option Value Length (vi64)
  Hop ID (vi64)
}
]]></artwork></figure>

<t>Negotiation is per session; a relay <bcp14>MUST NOT</bcp14> assume that because one of its sessions negotiated Relay Hops, another did.
It also enables the extended NAMESPACE message (<xref target="namespace"/>), which is what lets a NAMESPACE carry these parameters at all.</t>

<t>On a session that negotiated the extension, an endpoint <bcp14>MUST</bcp14> include HOP_PATH on every PUBLISH_NAMESPACE and NAMESPACE it sends, and a receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if one arrives without it.</t>

</section>
<section anchor="relay-cost"><name>Relay Cost</name>
<t>The client <bcp14>MAY</bcp14> declare what this link costs to cross; a server <bcp14>MUST NOT</bcp14> send this option, so one side owns the price:</t>

<figure><artwork><![CDATA[
RELAY_COST Setup Option {
  Option Key (vi64) = 0x40B56
  Option Value (vi64)
}
]]></artwork></figure>

<t>Both endpoints add the client's value to the ROUTE_COST of every advertisement they receive over the connection, so the link is priced the same in both directions.
An absent option means 1, under which the accumulated cost equals the hop count.
0 is meaningful and distinct from absent: it makes the link free, which is how a deployment describes two relays in the same datacenter.</t>

</section>
</section>
<section anchor="hop-ids"><name>Hop IDs</name>
<t>A <strong>Hop ID</strong> is a variable-length integer identifying one endpoint within an advertisement's path.</t>

<t>Hop IDs <bcp14>SHOULD</bcp14> be unique among the endpoints an advertisement can traverse.
An endpoint <bcp14>MAY</bcp14> generate one randomly, since collisions across a 64-bit space are unlikely, or use a stable configured identifier that survives restarts.</t>

<t>Loop detection and origin identification compare Hop IDs for equality, so two endpoints sharing a Hop ID are indistinguishable.
Redundant publishers producing interchangeable content <bcp14>MAY</bcp14> share one deliberately, so a receiver treats their paths as failover options for the same content (<xref target="selection"/>).</t>

<section anchor="zero"><name>The Reserved Hop ID 0</name>
<t><strong>0 means "no identity"</strong> and is reserved.
It is used for an endpoint that did not negotiate this extension, and an endpoint <bcp14>MAY</bcp14> also declare 0 to withhold its identity.</t>

<t>Because any number of endpoints can be 0, it identifies nothing, which constrains all three uses:</t>

<t><list style="symbols">
  <t><strong>Loop detection</strong>: 0 in a HOP_PATH is never a loop. A receiver whose own Hop ID is 0 cannot detect loops through itself, and <bcp14>MUST NOT</bcp14> discard an advertisement merely because the path contains 0.</t>
  <t><strong>Origin identity</strong>: an advertisement whose first entry is 0 has an unknown origin. A receiver <bcp14>MUST NOT</bcp14> treat two such advertisements as interchangeable (<xref target="selection"/>).</t>
  <t><strong>Filtering</strong>: a peer that declared 0 excludes nothing, so the sender applies no filter to that session.</t>
</list></t>

<t>Duplicate <em>non-zero</em> Hop IDs in one HOP_PATH are a loop; duplicate zeros are not.
Declaring 0 therefore trades loop detection, failover, and update continuity (<xref target="updating"/>) for anonymity.</t>

</section>
</section>
<section anchor="namespace"><name>Namespace Advertisements</name>
<t>This extension carries HOP_PATH and ROUTE_COST as Key-Value-Pair parameters (<xref target="moqt"/> Section 2.5).
PUBLISH_NAMESPACE (<xref target="moqt"/> Section 10.15) already has a Parameters field.</t>

<t>NAMESPACE (<xref target="moqt"/> Section 10.16) does not, and a subscriber-driven mesh propagates advertisements as NAMESPACE messages, so this extension defines an extended form used only on a session that negotiated Relay Hops:</t>

<figure><artwork><![CDATA[
NAMESPACE Message (Relay Hops) {
  Type (vi64) = 0x8,
  Length (16),
  Track Namespace Suffix (..),
  Number of Parameters (vi64),
  Parameters (..) ...
}
]]></artwork></figure>

<t>The appended fields are encoded exactly as in PUBLISH_NAMESPACE.
An endpoint <bcp14>MUST NOT</bcp14> append them on a session that did not negotiate the extension.</t>

<t>NAMESPACE_DONE (<xref target="moqt"/> Section 10.17) carries no state from this extension and is not extended.</t>

<section anchor="hoppath-parameter"><name>HOP_PATH Parameter</name>
<t>HOP_PATH is the ordered list of Hop IDs an advertisement has traversed, from the original publisher to the relay immediately upstream of the receiver:</t>

<figure><artwork><![CDATA[
HOP_PATH Parameter {
  Type (vi64) = 0x40B57
  Length (vi64)
  Hop ID (vi64) ...
}
]]></artwork></figure>

<t>The list always has at least one entry, the original publisher, which is 0 if that publisher is unknown (<xref target="zero"/>).
A receiver <bcp14>MUST</bcp14> close the session with a PROTOCOL_VIOLATION if the entries do not exactly fill <spanx style="verb">Length</spanx>, if the list is empty, or if a non-zero Hop ID appears twice.</t>

</section>
<section anchor="routecost-parameter"><name>ROUTE_COST Parameter</name>
<t>ROUTE_COST is the marginal cost of subscribing via this advertisement: the price of the transfers a new subscription would actually cause.</t>

<figure><artwork><![CDATA[
ROUTE_COST Parameter {
  Type (vi64) = 0x40B58
  Value (vi64)
}
]]></artwork></figure>

<t>It is <bcp14>OPTIONAL</bcp14> and absent means 0, so an endpoint that prices nothing sends nothing.
Costs still accumulate across such a mesh, because each receiver adds its own link's price (<xref target="relay-cost"/>) regardless.</t>

<t>The original publisher seeds the value with its production cost: 0 for content it is already producing, higher for content it would have to spin up on demand, such as a standby transcoder advertising everything it <em>could</em> serve.</t>

</section>
</section>
<section anchor="relay-behavior"><name>Relay Behavior</name>
<t>When forwarding an advertisement downstream, a relay <bcp14>MUST</bcp14> append its own Hop ID to the HOP_PATH it received, so its own ID is always the last entry.
An advertisement arriving from an upstream that did not negotiate the extension has no HOP_PATH; the relay creates one containing a single 0 for that upstream (<xref target="zero"/>), then appends its own.</t>

<t>On receipt, a relay <bcp14>MUST</bcp14> discard an advertisement whose HOP_PATH already contains its own non-zero Hop ID: forwarding it would extend a loop, and subscribing through it would route the relay back to itself.
This receiver-side check catches loops of any length and is the only loop defense required.</t>

<section anchor="accumulating-cost"><name>Accumulating Cost</name>
<t>A relay <bcp14>MUST</bcp14> add the session's link cost (<xref target="relay-cost"/>) to the ROUTE_COST it received before forwarding or acting on an advertisement.
The addition <bcp14>MUST</bcp14> saturate rather than wrap, so an absurd upstream value ranks last instead of overflowing to best.</t>

<t>A relay actively carrying the namespace (a live subscription exists for at least one of its tracks) <bcp14>SHOULD</bcp14> advertise 0 instead of the accumulated value: its ingress is already paid for, so one more subscriber costs only the links below it.
This is what lets a cluster deduplicate onto a warm copy.
The discount applies only to the advertisement for the path it actually serves from; a standby path keeps its accumulated value, since serving from it means opening a fresh ingest.
When it stops carrying the namespace it <bcp14>SHOULD</bcp14> restore the accumulated value, optionally after a grace period so brief churn does not flap routing.</t>

<t>Two relays that independently begin carrying the same namespace would each see the other's 0 as cheaper than its own source, and both switching at once would leave the namespace with no source.
Before re-parenting onto a 0-cost advertisement from another actively-carrying relay (one whose HOP_PATH has two or more entries), a relay <bcp14>SHOULD</bcp14> apply a deterministic tie-break, such as comparing a hash of the namespace and each Hop ID, so exactly one side moves.
Equal Hop IDs (including two relays that both declared 0) cannot be ordered, and neither side <bcp14>SHOULD</bcp14> move.
Cheaper advertisements from anything else carry no such hazard and <bcp14>SHOULD</bcp14> be adopted immediately.</t>

</section>
<section anchor="updating"><name>Updating an Advertisement</name>
<t>An endpoint updates an advertisement by re-sending it with new parameters <strong>on the stream that already carries it</strong>: the original PUBLISH_NAMESPACE request stream, or the SUBSCRIBE_NAMESPACE response stream the NAMESPACE arrived on.
A receiver <bcp14>MUST NOT</bcp14> treat the repeat as a duplicate or a protocol violation.</t>

<t>In <xref target="moqt"/> an advertisement lives for the lifetime of its stream, so an update on a <em>new</em> stream would leave two streams claiming one namespace and let the superseded one retract its replacement.
An endpoint <bcp14>MUST NOT</bcp14> open a second stream for a namespace it already advertises on this session.</t>

<t>Replacement is atomic, so a receiver <bcp14>MUST NOT</bcp14> tear down subscriptions or drop cached state merely because an update arrived.
What it means for existing subscriptions follows the first HOP_PATH entry (<xref target="selection"/>): unchanged and non-zero, the content is continuous and subscriptions <bcp14>MAY</bcp14> resume on the new route at a group boundary; changed or 0 (<xref target="zero"/>), a different publisher may have taken over and they do not carry over.</t>

<t>The expected case is a ROUTE_COST-only change, which is how a relay signals that it started or stopped carrying the namespace.</t>

</section>
</section>
<section anchor="selection"><name>Path Selection</name>
<t>A receiver holding advertisements for the same namespace over several sessions <bcp14>SHOULD</bcp14> prefer the lowest ROUTE_COST, breaking ties toward the shorter HOP_PATH and then toward the most recently received.
This is advisory: a receiver <bcp14>MAY</bcp14> apply local policy such as measured RTT instead.</t>

<t>Two advertisements whose HOP_PATH begins with the same non-zero Hop ID share a publisher and carry interchangeable content, so a receiver <bcp14>MAY</bcp14> hold them as redundant paths and fail an active subscription over to the survivor.
If the first entries differ, or either is 0, they are distinct publishers reusing a namespace: a receiver <bcp14>MUST NOT</bcp14> treat them as interchangeable and <bcp14>SHOULD</bcp14> treat the later as replacing the earlier.</t>

<t>A publisher <bcp14>SHOULD</bcp14> advertise, per session, the best path whose HOP_PATH does not contain the Hop ID that peer declared, and <bcp14>SHOULD</bcp14> advertise nothing when every known path contains it.
Because selection is per session, a peer that the serving path flows through still receives the best standby, which is what lets it fail over if its own copy dies.</t>

<t>When serving a subscription, a publisher <bcp14>MUST</bcp14> select the source by that same rule.
If only excluded sources remain the subscription is unroutable, since serving it would hand the subscriber data that already flowed through itself.
Applying one rule to both advertisement and dispatch keeps advertised paths truthful and prevents subscription cycles of any length.</t>

</section>
<section anchor="security-considerations"><name>Security Considerations</name>
<t>A Hop ID reveals nothing beyond what its operator encodes in it, and a deployment that considers its identifiers sensitive can use random values or declare 0 (<xref target="zero"/>).
A HOP_PATH does expose how many hops an advertisement crossed, which hints at the size of a deployment; a relay <bcp14>MAY</bcp14> coalesce its internal hops into one entry, or strip HOP_PATH, before forwarding across a trust boundary.</t>

<t>Because a relay only appends to HOP_PATH, it cannot make a competing path look shorter than it is; the worst it can do is under-report its own upstream portion to win an advisory tie-break.
ROUTE_COST has no such structural protection: it is a single value the sender chooses, so a relay can advertise 0 for content it is not carrying and attract subscriptions it then has to fetch.
Both cost only a suboptimal path choice, and the latter is self-limiting, since the traffic won this way must then be served.</t>

<t>A receiver <bcp14>MUST NOT</bcp14> make security decisions based on Hop IDs, and a deployment spanning a trust boundary <bcp14>SHOULD</bcp14> treat a peer's ROUTE_COST as a hint to clamp or ignore rather than an accounting figure.</t>

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

<t>This document requests the following registrations.
High, distinctive values are requested to avoid the low ranges reserved by <xref target="moqt"/> and to minimize collisions with provisional registrations by other extensions.</t>

<section anchor="moqt-setup-options"><name>MOQT Setup Options</name>

<t>This document requests two registrations in the "MOQT Setup Options" registry (<xref target="moqt"/> Section 15.4), whose policy is Specification Required.</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x40B55</c>
      <c>RELAY_HOPS</c>
      <c>This Document</c>
      <c>0x40B56</c>
      <c>RELAY_COST</c>
      <c>This Document</c>
</texttable>

</section>
<section anchor="moqt-message-parameters"><name>MOQT Message Parameters</name>

<t>This document requests two registrations in the "MOQT Message Parameters" registry (<xref target="moqt"/> Section 15.7).
Both are carried in PUBLISH_NAMESPACE and in the extended NAMESPACE message (<xref target="namespace"/>).</t>

<texttable>
      <ttcol align='left'>Value</ttcol>
      <ttcol align='left'>Name</ttcol>
      <ttcol align='left'>Carried In</ttcol>
      <ttcol align='left'>Reference</ttcol>
      <c>0x40B57</c>
      <c>HOP_PATH</c>
      <c>PUBLISH_NAMESPACE, NAMESPACE</c>
      <c>This Document</c>
      <c>0x40B58</c>
      <c>ROUTE_COST</c>
      <c>PUBLISH_NAMESPACE, NAMESPACE</c>
      <c>This Document</c>
</texttable>

<t>The Key-Value-Pair parity is load-bearing: HOP_PATH and RELAY_HOPS are odd, so their values are length-prefixed byte strings, while ROUTE_COST and RELAY_COST are even, so their values are bare varints.</t>

</section>
</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="6" month="July" 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-19"/>
   
</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 267?>

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

<t>This document was drafted with the assistance of Claude, an AI assistant by Anthropic.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIAAAAAAAAA51b23IbR5J9x1fUUg8SGQCCmpElLzWXpSg6xBhKlElqNhwb
G55CdwGoYKOr3RdSsCR/y3zLfNmezKyqrm5AtmcZYQvoS13ycvJkZmE2m01a
2xbmRB28dd+rs6JrWlOr84+tKRvryoOJXixqc4/7G/fTLJP7B5NMt2bl6u2J
suXSTSa5y0q9wTB5rZftrMi6ujDbWfLO7Ph40nSLjW1o3HZb4eGL89vvlHqk
dNE4zGDL3FQG/yvbg6k6MLltXW11QV8uTl/hH1fj0/XtdweTstssTH0yybGQ
kwnW98eJro0+UQ+2nTy4+m5Vu646UVjBZKK7du3wsJpNFP6WXVHIai+7O6PO
eK18x2y0LU7Unf1oCgyc/9eKLswzt5lMSldvdGvvMZ2iYVusf/Z6bk275H22
tS6bytXtZEIyiQ9PZrOZ0osG9zPcu13bRkFc3QbbVLlZ2tI0SisvJluulAnS
VxhGkV5uw9jq0yea+suXqeoak6vWqUVnixwDbEyzVm6paix928wn5zpbK9pm
U+nMKJ3fm7q1jeF5M13XFvO2awOh5qbGWIVtWhrgjavUxetG2VatNR6pNd7E
ZFPVtBpDYIUQ8tq/a1e21IWqugXeX5t6qirshG/qDLvsWJAqczJ4u9atqnS7
nk9OsdTMQEY17UVe4TVgU7lpTdYq6JDnK5yrIKSSN2zJQOxyqx7WFlscbKzB
RBujlrXb8HgN9p+ujYfAdV4OxsrWzjVGLUz7YEzJCwuigyFWzrKOsgK2RQJp
lHsovYBU3rG2GtN2VT9yZcJ+LM+g753N4yLpBei0MfU9fdQ8owhFF7DffIsr
DWt2jc2v/L2wlrlY08bmeWEmk0fqzJX3JA1Xinhekz1Z/g5LM+rOQExQcAP/
/nBzS55E/6p3V/z5+vz7DxfX56/p882b08vL+GHin7h5c/Xh8nX/qX/z7Ort
2/N3r+VlXFWDS5ODt6c/HIhYDq7e315cvTu9PABaYEOpA0CwbMQGt2D+VW3I
WnQzyU2T1XaBL3jn1dn7f/3z6TNY/39cf3f2h6dP//PLF//l26cvnuHLw9qU
Mpsri63/Cn1sJ7qqjK5pFF0UMPzKtsAbPNuoZk3qhGEYCPbof0gy/3ui/rTI
qqfP/uIv0IYHF4PMBhdZZrtXdl4WIe65tGeaKM3B9ZGkh+s9/WHwPcg9ufin
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

-->

</rfc>

