<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<?rfc docmapping="yes"?>
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-gurel-moq-probing-00" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="moq-probing">Probe Tracks for Bandwidth Estimation in Media over QUIC Transport</title>
    <seriesInfo name="Internet-Draft" value="draft-gurel-moq-probing-00"/>
    <author initials="Z." surname="Gurel" fullname="Zafer Gurel">
      <organization>Ozyegin University</organization>
      <address>
        <email>zafer.gurel@ozu.edu.tr</email>
      </address>
    </author>
    <author initials="A. C." surname="Begen" fullname="Ali C. Begen">
      <organization>Networked Media</organization>
      <address>
        <email>ali.begen@networked.media</email>
      </address>
    </author>
    <author initials="D." surname="Ugur" fullname="Deniz Ugur">
      <organization>Ozyegin University</organization>
      <address>
        <email>deniz.ugur@ozu.edu.tr</email>
      </address>
    </author>
    <date/>
    <area>Applications and Real-Time</area>
    <workgroup>MOQ</workgroup>
    <keyword>Internet-Draft</keyword>
    <keyword>bandwidth estimation</keyword>
    <keyword>probing</keyword>
    <keyword>adaptive bitrate</keyword>
    <abstract>
      <?line 49?>

<t>This document defines probe tracks for Media over QUIC Transport (MOQT):
tracks of synthetic objects, generated on demand, that measure the
bandwidth of a single hop. Probe tracks live under reserved,
session-scoped Track Namespaces and are never forwarded or cached. The
track name selects the shape of the probe: target bitrate, duration or
size, object rate, object size, group structure and key-object bursts.
For a downlink probe, a subscriber subscribes to a probe track in the
namespace (<tt>.session</tt>, <tt>.probe</tt>), and the relay generates it, so the
subscriber can measure whether a higher bitrate is sustainable on the
relay-to-subscriber hop before it switches to a higher-quality track.
For an uplink probe, a publisher generates a probe track and publishes
it to its relay in the namespace (<tt>.session</tt>, <tt>.sink</tt>), to measure the
publisher-to-relay hop.</t>
    </abstract>
  </front>
  <middle>
    <?line 65?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>Endpoints of Media over QUIC Transport (MOQT) <xref target="MoQTransport"/> adapt to
the network on both sides of a relay. A subscriber runs adaptive bitrate
(ABR) logic and has to decide when it is safe to switch to a
higher-bitrate alternative of the track it is consuming. A publisher has
to tune its encoding parameters dynamically to the uplink network
conditions. Both need to estimate the bandwidth of their own hop, and
both face the same problem: throughput measured on the current media is
limited by the bitrate of that media. An endpoint that sends or
receives a 1 Mbps track at 1 Mbps learns only that at least 1 Mbps is
available. To learn whether 3 Mbps is sustainable, it has to make more
data flow over the hop.</t>
      <t>This document defines probe tracks: tracks of synthetic objects,
generated on demand in a shape described by the track name, that
measure the bandwidth of a single hop. Probe tracks are session-scoped:
they are never forwarded beyond the hop they measure, and never cached.
They come in two directions (<xref target="directions"/>):</t>
      <ul spacing="normal">
        <li>
          <t>In a downlink probe, a subscriber subscribes to a probe track and its
relay generates it, to measure the hop from the relay to the
subscriber.</t>
        </li>
        <li>
          <t>In an uplink probe, a publisher generates a probe track and publishes
it to its first relay, which consumes it, to measure the hop from the
publisher to the relay.</t>
        </li>
      </ul>
      <figure anchor="probe-overview">
        <name>Uplink and downlink probes.</name>
        <artwork><![CDATA[
Publisher                    Relay                    Subscriber
    |                          |                           |
    | PUBLISH                  |                           |
    | (.session, .sink)        |                           |
    |------------------------->|                           |
    | PUBLISH_OK (Forward=1)   |                           |
    |<-------------------------|                           |
    | uplink probe objects     |                           |
    |=========================>|                           |
    |                          |                 SUBSCRIBE |
    |                          |        (.session, .probe) |
    |                          |<--------------------------|
    |                          | downlink probe objects    |
    |                          |==========================>|
]]></artwork>
      </figure>
      <t>In both directions, a probe:</t>
      <ul spacing="normal">
        <li>
          <t>exercises exactly one hop, which is usually the bottleneck for the
decision at hand, and adds no load beyond it;</t>
        </li>
        <li>
          <t>runs on the same MOQT session and congestion controller as the media,
so it sees the same path conditions;</t>
        </li>
        <li>
          <t>can imitate a media track (paced objects, groups and key-object
bursts) or run as a greedy bulk transfer, depending on what the
endpoint needs to learn; and</t>
        </li>
        <li>
          <t>uses an object layout similar to the Low Overhead Media Container
(LOC) <xref target="LOC"/>, so receivers can reuse their LOC parsing logic, and
carries a send timestamp on every object, so the receiver can compute
throughput, delay variation and loss without clock synchronization.</t>
        </li>
      </ul>
      <t>The result of a probe is input to an adaptation decision: for a
subscriber, a switch to another track, for example with the mechanism
in <xref target="TrackSwitching"/>; for a publisher, a change of its encoding
parameters.</t>
      <section anchor="padding">
        <name>Relation to MOQT Padding</name>
        <t>MOQT <xref target="MoQTransport"/> already lets an endpoint send padding, on
unidirectional streams or in datagrams, to probe for additional
bandwidth at a lower priority than Object data, and notes that
publishers can use padding to probe without additional subscriptions.
Padding is started and shaped by its sender, carries no Objects and no
timing information, and is discarded by the receiver.</t>
        <t>For downlink probing, padding does not fit: the subscriber needs the
measurement, but the relay is the sender. The subscriber cannot request
padding, choose its rate, shape or duration, or compute delay trends
from it. Downlink probes fill this gap.</t>
        <t>For uplink probing, the publisher is both the sender and the endpoint
that needs the result, so padding, together with an estimate from the
publisher's own congestion controller, can be sufficient. Uplink probes
add the following over padding:</t>
        <ul spacing="normal">
          <li>
            <t>the relay accepts or refuses the probe before any data arrives;</t>
          </li>
          <li>
            <t>the probe has a declared shape that the relay can enforce;</t>
          </li>
          <li>
            <t>the probe consists of media-like objects that take the same path
through the relay as media; and</t>
          </li>
          <li>
            <t>every object carries a send timestamp, so the relay can measure the
probe, which pays off once the relay can report its result to the
publisher (<xref target="uplink"/>).</t>
          </li>
        </ul>
        <t>Whether these additions justify uplink probes is an open question
(<xref target="uplink"/>).</t>
      </section>
      <section anchor="terms-and-definitions">
        <name>Terms and Definitions</name>
        <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
        <?line -18?>

<t>This document uses the terms Track, Group, Subgroup, Object, Track
Namespace, Track Name, Full Track Name, Relay, Publisher and Subscriber
as defined in <xref target="MoQTransport"/>.</t>
        <dl>
          <dt>Probe Track:</dt>
          <dd>
            <t>A track of synthetic objects that the probe sender generates for a
single subscription, whether the subscription was initiated with
SUBSCRIBE or with PUBLISH.</t>
          </dd>
          <dt>Probe Sender:</dt>
          <dd>
            <t>The endpoint that generates and sends the objects of a probe track:
the relay for a downlink probe, the publisher for an uplink probe.</t>
          </dd>
          <dt>Probe Receiver:</dt>
          <dd>
            <t>The endpoint that receives the objects of a probe track: the
subscriber for a downlink probe, the relay for an uplink probe.</t>
          </dd>
          <dt>Probe Requester:</dt>
          <dd>
            <t>The endpoint that sends the request that starts a probe: the
subscriber (SUBSCRIBE) for a downlink probe, the publisher (PUBLISH)
for an uplink probe.</t>
          </dd>
          <dt>Downlink Probe:</dt>
          <dd>
            <t>A probe that a subscriber requests with SUBSCRIBE in the (<tt>.session</tt>,
<tt>.probe</tt>) namespace, and that the relay generates and sends to the
subscriber (<xref target="downlink"/>).</t>
          </dd>
          <dt>Uplink Probe:</dt>
          <dd>
            <t>A probe that a publisher sends with PUBLISH in the (<tt>.session</tt>,
<tt>.sink</tt>) namespace to a relay, which consumes and discards it
(<xref target="uplink"/>).</t>
          </dd>
          <dt>Probe Name:</dt>
          <dd>
            <t>The Track Name of a probe track. It is either a Dynamic Probe Name or
a Preset Name.</t>
          </dd>
          <dt>Dynamic Probe Name:</dt>
          <dd>
            <t>A Probe Name that encodes the probe parameters directly, as defined in
<xref target="grammar"/>.</t>
          </dd>
          <dt>Preset Name:</dt>
          <dd>
            <t>A Probe Name that the relay maps to a set of probe parameters, as
advertised in the probe catalog (<xref target="catalog"/>). Preset Names are used
only for downlink probes.</t>
          </dd>
          <dt>Paced Probe:</dt>
          <dd>
            <t>A probe sent at a target rate, with objects released on a schedule.</t>
          </dd>
          <dt>Greedy Probe:</dt>
          <dd>
            <t>A probe sent as fast as the congestion controller and flow control
allow, up to the relay's maximum rate, bounded by its size and,
optionally, its duration.</t>
          </dd>
        </dl>
      </section>
      <section anchor="notational-conventions">
        <name>Notational Conventions</name>
        <t>This document uses the conventions detailed in (<xref section="1.3" sectionFormat="comma" target="RFC9000"/>)
when describing the binary encoding.</t>
        <t>As a quick reference, the following list provides a non-normative summary
of the parts of RFC9000 field syntax that are used in this specification.</t>
        <dl>
          <dt>x (L):</dt>
          <dd>
            <t>Indicates that x is L bits long</t>
          </dd>
          <dt>x (i):</dt>
          <dd>
            <t>Indicates that x holds an integer value using the variable-length
encoding as described in (<xref section="16" sectionFormat="comma" target="RFC9000"/>)</t>
          </dd>
          <dt>x (..):</dt>
          <dd>
            <t>Indicates that x can be any length including zero bits long.  Values
in this format always end on a byte boundary.</t>
          </dd>
        </dl>
        <t>To reduce unnecessary use of bandwidth, variable length integers <bcp14>SHOULD</bcp14>
be encoded using the least number of bytes possible to represent the
required value.</t>
      </section>
    </section>
    <section anchor="directions">
      <name>Probe Directions</name>
      <t>Downlink and uplink probes share the naming, parameter resolution,
validation, limits and object format defined in <xref target="session-ns"/> through
<xref target="payload"/>. They differ in who requests, generates and measures the
probe, as summarized below and specified in <xref target="downlink"/> and
<xref target="uplink"/>.</t>
      <table anchor="direction-table">
        <name>Downlink and uplink probes.</name>
        <thead>
          <tr>
            <th align="left"> </th>
            <th align="left">Downlink Probe</th>
            <th align="left">Uplink Probe</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Request</td>
            <td align="left">SUBSCRIBE</td>
            <td align="left">PUBLISH with FORWARD=0</td>
          </tr>
          <tr>
            <td align="left">Namespace</td>
            <td align="left">(<tt>.session</tt>, <tt>.probe</tt>)</td>
            <td align="left">(<tt>.session</tt>, <tt>.sink</tt>)</td>
          </tr>
          <tr>
            <td align="left">Probe requester</td>
            <td align="left">subscriber</td>
            <td align="left">publisher</td>
          </tr>
          <tr>
            <td align="left">Probe sender</td>
            <td align="left">relay</td>
            <td align="left">publisher</td>
          </tr>
          <tr>
            <td align="left">Probe receiver</td>
            <td align="left">subscriber</td>
            <td align="left">relay</td>
          </tr>
          <tr>
            <td align="left">Endpoint that uses the result</td>
            <td align="left">subscriber</td>
            <td align="left">publisher</td>
          </tr>
          <tr>
            <td align="left">Probe Names</td>
            <td align="left">Dynamic Probe Names and Preset Names</td>
            <td align="left">Dynamic Probe Names only</td>
          </tr>
          <tr>
            <td align="left">Support discovery</td>
            <td align="left">probe catalog</td>
            <td align="left">TBD</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="session-ns">
      <name>Session-Scoped Namespaces</name>
      <section anchor="session-namespace">
        <name>Session Namespace</name>
        <t>This document reserves the Track Namespace Field <tt>.session</tt> (eight
bytes) as the first field of a session-scoped namespace. A track whose
namespace starts with <tt>.session</tt> belongs to the MOQT session on which it
is requested, and is served by the peer at the other end of that
session. An endpoint that implements this specification:</t>
        <ul spacing="normal">
          <li>
            <t><bcp14>MUST</bcp14> answer a SUBSCRIBE, FETCH, TRACK_STATUS or SUBSCRIBE_NAMESPACE
for a namespace that starts with <tt>.session</tt> itself, and <bcp14>MUST NOT</bcp14>
forward it upstream or to any other session;</t>
          </li>
          <li>
            <t><bcp14>MUST</bcp14> consume a PUBLISH for a namespace that starts with <tt>.session</tt>
itself, and <bcp14>MUST NOT</bcp14> forward the track or its objects upstream, to any
subscriber, or to any other session;</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> share a session-scoped track between sessions or serve it
from a cache; and</t>
          </li>
          <li>
            <t><bcp14>MUST NOT</bcp14> announce a namespace that starts with <tt>.session</tt> to its
peers or upstream. A PUBLISH of a session-scoped track goes only to
the peer of the session and ends there.</t>
          </li>
        </ul>
        <t>Using a dedicated first field lets a relay recognize session-scoped
requests with the namespace prefix check it already performs for
routing, before any upstream lookup. The leading dot keeps the namespace
apart from application namespaces. Probing is the first use of the
session namespace; other session-scoped services can be defined in the
same way, each with its own second field.</t>
      </section>
      <section anchor="probe-namespaces">
        <name>Probe Namespaces</name>
        <t>This document defines two session-scoped namespaces, one per direction:</t>
        <dl>
          <dt>(<tt>.session</tt>, <tt>.probe</tt>):</dt>
          <dd>
            <t>Downlink probes. The second field is <tt>.probe</tt> (six bytes). The only
request a probe requester sends in this namespace is SUBSCRIBE
(<xref target="downlink"/>). A subscriber can subscribe to a probe track without
knowing any publisher namespace.</t>
          </dd>
          <dt>(<tt>.session</tt>, <tt>.sink</tt>):</dt>
          <dd>
            <t>Uplink probes. The second field is <tt>.sink</tt> (five bytes). Messages
except PUBLISH <bcp14>MUST NOT</bcp14> be used in this namespace; a relay rejects any
other request that names it with REQUEST_ERROR and error code
NOT_SUPPORTED. This does not restrict the messages of an established
PUBLISH-initiated subscription, such as PUBLISH_OK, REQUEST_UPDATE and
PUBLISH_DONE (<xref target="uplink"/>).</t>
          </dd>
        </dl>
        <t>Because the two directions use separate namespaces, the same Full Track
Name never names both a downlink and an uplink probe. A SUBSCRIBE in the
(<tt>.session</tt>, <tt>.probe</tt>) namespace is always served by the relay's own
probe generator. A relay <bcp14>MUST NOT</bcp14> treat it as a subscription to a track
that the same endpoint publishes.</t>
      </section>
    </section>
    <section anchor="shapes">
      <name>Probe Shapes</name>
      <t>Probes answer two different questions. This document supports both and
expresses them through one set of parameters.</t>
      <table anchor="shape-table">
        <name>Probe shapes.</name>
        <thead>
          <tr>
            <th align="left">Shape</th>
            <th align="left">Question it answers</th>
            <th align="left">Properties</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">Paced</td>
            <td align="left">Can the hop sustain X bps right now, alongside the media?</td>
            <td align="left">Low impact. The flow is application-limited, so it confirms X but does not reveal capacity above X.</td>
          </tr>
          <tr>
            <td align="left">Greedy</td>
            <td align="left">How much headroom does the hop have?</td>
            <td align="left">High impact and bursty. Capped at the relay's maximum rate. Slow start and congestion window growth affect short probes.</td>
          </tr>
        </tbody>
      </table>
      <t>A paced probe can be a smooth stream at a target rate, or it can imitate
a video track: objects at a frame rate, grouped into groups of pictures,
with a larger first object in each group that stands in for a key frame.
The idle time between objects is the same as for real media, so the
congestion controller and any pacing on the path behave as they would
for the media the probe stands in for.</t>
      <t>A greedy probe is closer to downloading a segment in HTTP adaptive
streaming. It sends a fixed number of bytes, or sends for a fixed time,
as fast as possible.</t>
    </section>
    <section anchor="naming">
      <name>Probe Names</name>
      <section anchor="grammar">
        <name>Dynamic Probe Names</name>
        <t>A Dynamic Probe Name consists of fields separated by <tt>-</tt>. Each field is
a single-letter parameter key followed by a decimal value. The grammar,
in ABNF <xref target="RFC5234"/>, is:</t>
        <figure anchor="probe-name-abnf">
          <name>Dynamic Probe Name grammar.</name>
          <sourcecode type="abnf"><![CDATA[
probe-name = field *( "-" field )
field      = key value
key        = %x61-7A                 ; a-z
value      = "0" / ( %x31-39 *DIGIT ) ; no leading zeros
]]></sourcecode>
        </figure>
        <t>The endpoint that receives the request parses a Dynamic Probe Name by
splitting it at each <tt>-</tt> and reading the first character of each field
as the parameter key and the rest as its value. Fields can appear in any
order. Probe requesters <bcp14>SHOULD</bcp14> order fields by key, because MOQT
compares Full Track Names byte by byte when it detects duplicate
subscriptions.</t>
        <t>The parameter keys are:</t>
        <table anchor="probe-keys">
          <name>Probe parameter keys.</name>
          <thead>
            <tr>
              <th align="center">Key</th>
              <th align="left">Name</th>
              <th align="left">Unit</th>
              <th align="left">Meaning</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="center">r</td>
              <td align="left">Rate</td>
              <td align="left">bits per second</td>
              <td align="left">Target payload rate. If absent, the probe is greedy.</td>
            </tr>
            <tr>
              <td align="center">d</td>
              <td align="left">Duration</td>
              <td align="left">milliseconds</td>
              <td align="left">Maximum duration of the probe.</td>
            </tr>
            <tr>
              <td align="center">b</td>
              <td align="left">Bytes</td>
              <td align="left">bytes</td>
              <td align="left">Maximum total payload bytes of the probe. Required for a greedy probe.</td>
            </tr>
            <tr>
              <td align="center">f</td>
              <td align="left">Object rate</td>
              <td align="left">objects per second</td>
              <td align="left">Pacing rate of objects; the frame rate of an imitated video track.</td>
            </tr>
            <tr>
              <td align="center">s</td>
              <td align="left">Object size</td>
              <td align="left">bytes</td>
              <td align="left">Base object payload size.</td>
            </tr>
            <tr>
              <td align="center">g</td>
              <td align="left">Group size</td>
              <td align="left">objects</td>
              <td align="left">Number of objects per group.</td>
            </tr>
            <tr>
              <td align="center">k</td>
              <td align="left">Key multiplier</td>
              <td align="left">factor</td>
              <td align="left">Size of the first object of each group, as a multiple of s.</td>
            </tr>
          </tbody>
        </table>
        <t>Examples:</t>
        <dl>
          <dt><tt>d2000-r300000</tt>:</dt>
          <dd>
            <t>A smooth 300 kbps stream for 2 seconds.</t>
          </dd>
          <dt><tt>b500000</tt>:</dt>
          <dd>
            <t>A greedy probe that sends 500,000 bytes as fast as possible.</t>
          </dd>
          <dt><tt>d2000-f30-g30-k5-r3000000</tt>:</dt>
          <dd>
            <t>An imitation of a 3 Mbps video track at 30 frames per second, with
one-second groups whose first object is five times the size of the
others, for 2 seconds.</t>
          </dd>
        </dl>
      </section>
      <section anchor="preset-names">
        <name>Preset Names</name>
        <t>A Probe Name that does not match the grammar in <xref target="grammar"/> is a Preset
Name. Preset Names are used only for downlink probes: the relay looks
them up in its table of presets, which it can advertise in the probe
catalog (<xref target="catalog"/>). A relay <bcp14>MUST NOT</bcp14> define a Preset Name that
matches the grammar in <xref target="grammar"/>. For example, <tt>hd-check</tt> is a valid
Preset Name, because <tt>hd</tt> is not a letter followed by digits.</t>
      </section>
    </section>
    <section anchor="resolve">
      <name>Resolving Probe Parameters</name>
      <t>The parameters depend on each other, so the probe requester usually
gives only some of them, and the rest are derived. The probe sender and
the probe receiver both resolve the parameters with the procedure in
this section, and get the same result. The endpoint that receives the
request resolves them before it accepts the request.</t>
      <t>Let s be the base object payload size. The first object of each group is
k<em>s bytes and the other objects are s bytes, so the mean object size is
s</em>(k+g-1)/g. A paced probe therefore has:</t>
      <figure anchor="probe-relations">
        <name>Relations between probe parameters.</name>
        <artwork><![CDATA[
r = 8 * f * s * (k + g - 1) / g     (bits per second)
b = r * d / 8000                    (bytes, with d in milliseconds)
]]></artwork>
      </figure>
      <t>The defaults for parameters a probe requester omits are fixed by this
document, so that both endpoints can resolve any Dynamic Probe Name
without asking the other. The default object rate (DEFAULT_F) is 50
objects per second, that is, one object every 20 ms. The default greedy
object size (DEFAULT_GREEDY_S) is 16384 bytes. The default key
multiplier is 1. When g is absent, the whole probe is one group.</t>
      <t>A greedy probe <bcp14>MUST</bcp14> give b. Bytes are the natural size of a greedy
transfer, like the download of a segment, and they are the resource
that the relay has to protect, so the relay can check every greedy
probe against its byte limit before it accepts it. A greedy probe <bcp14>MAY</bcp14>
also give d as a time bound. A greedy probe has no target rate: it is
sent as fast as the hop allows, but never faster than the relay's
maximum rate (<xref target="limits"/>). A greedy probe without d ends after b bytes,
or earlier if it reaches the relay's maximum duration, as described in
<xref target="downlink"/> and <xref target="uplink"/>.</t>
      <t>The resolution procedure is shown below. Divisions are real-valued
unless floor() is applied. A failure is one of the outcomes INVALID,
PER_PROBE_LIMIT or LOAD_LIMIT, which map to error codes as described
in <xref target="errors"/>.</t>
      <figure anchor="probe-resolve">
        <name>Resolving probe parameters.</name>
        <sourcecode type="pseudocode"><![CDATA[
resolve(p):             // p: parsed keys, absent keys are null
  if p.d == null and p.b == null:  fail INVALID
  if p.f != null and p.s != null:  fail INVALID
  if p.k != null and p.g == null:  fail INVALID  // needs g
  k = p.k or 1
  g = p.g                 // null: the whole probe is one group
  ratio = (g != null) ? (k + g - 1) / g : 1

  if p.r == null:                  // greedy probe
    if p.f != null:  fail INVALID  // greedy is not paced
    if p.b == null:  fail INVALID  // greedy needs b
    s = p.s or DEFAULT_GREEDY_S
    b = p.b
    d = p.d          // null: within the relay's max duration
    schedule = as fast as possible, up to the max rate
  else:                            // paced probe
    r = p.r
    if p.f != null:
      f = p.f
      s = floor(r / (8 * f * ratio))
    else if p.s != null:
      s = p.s
      f = r / (8 * s * ratio)
    else:
      f = DEFAULT_F
      s = floor(r / (8 * f * ratio))
    if p.d != null and p.b != null:  // stop at first limit hit
      d = p.d;  b = p.b
    else if p.d != null:
      d = p.d;  b = r * d / 8000
    else:
      b = p.b;  d = 8000 * b / r
    schedule = object i is released at t0 + i / f

  if s < 1:  fail INVALID  // rate too low for f
  check s, k * s, r, f, b and d (if present) against the
    per-probe limits
                       else fail PER_PROBE_LIMIT
  check the session and relay-wide limits
                       else fail LOAD_LIMIT

  // Object i (i = 0, 1, ...) is in Group floor(i / g) (Group 0
  // if g is null), with Object ID i mod g (i if g is null). Its
  // payload size is k * s if its Object ID is 0, and s otherwise.
  // The probe sender stops after sending b bytes or after d ms,
  // whichever comes first, and truncates the last object so that
  // the total does not exceed b.
]]></sourcecode>
      </figure>
      <t>The following table resolves the examples from <xref target="grammar"/> with the
defaults.</t>
      <table anchor="probe-examples">
        <name>Resolved examples.</name>
        <thead>
          <tr>
            <th align="left">Probe Name</th>
            <th align="left">Shape</th>
            <th align="left">Resolved values</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">
              <tt>d2000-r300000</tt></td>
            <td align="left">paced</td>
            <td align="left">f = 50, s = 750, 100 objects, b = 75,000, one group</td>
          </tr>
          <tr>
            <td align="left">
              <tt>b500000</tt></td>
            <td align="left">greedy</td>
            <td align="left">s = 16,384, 31 objects (the last one truncated), one group, ends after b bytes</td>
          </tr>
          <tr>
            <td align="left">
              <tt>d2000-f30-g30-k5-r3000000</tt></td>
            <td align="left">paced</td>
            <td align="left">s = 11,029, first object of each group 55,145, 60 objects in 2 groups</td>
          </tr>
        </tbody>
      </table>
    </section>
    <section anchor="validation">
      <name>Validation, Limits and Errors</name>
      <section anchor="checks">
        <name>Validation Rules</name>
        <t>The endpoint that receives a probe request validates it before it
accepts the request with SUBSCRIBE_OK or PUBLISH_OK. The request is
invalid if:</t>
        <ul spacing="normal">
          <li>
            <t>the Probe Name matches neither the grammar in <xref target="grammar"/> nor, for a
downlink probe, a known Preset Name;</t>
          </li>
          <li>
            <t>the Probe Name is a Preset Name in an uplink probe;</t>
          </li>
          <li>
            <t>a key is not defined in <xref target="probe-keys"/>, or a key appears more than
once;</t>
          </li>
          <li>
            <t>a value has a leading zero, does not fit in 62 bits, or is zero for
any of r, d, b, f, s, g or k;</t>
          </li>
          <li>
            <t>neither d nor b is present, r is absent (a greedy probe) and b is
absent, both f and s are present, k is present without g, or f is
present without r; or</t>
          </li>
          <li>
            <t>a derived value is unusable, for example the resolved object size s
is zero because r is too low for the object rate f.</t>
          </li>
        </ul>
        <t>An invalid request <bcp14>MUST</bcp14> be rejected with the error code for invalid
probes in <xref target="errors"/>.</t>
      </section>
      <section anchor="limits">
        <name>Limits</name>
        <t>A relay <bcp14>MUST</bcp14> enforce limits on the resources a probe can use, in both
directions. At a minimum, a relay <bcp14>MUST</bcp14> limit the rate, the duration, the
total bytes and the object size of a single probe, the number of probes
running at the same time on a session, and the total probe bytes per
session over a period of time.</t>
        <t>Per-session limits do not protect the relay's capacity: many sessions,
each within its own limits, can still use up the relay's egress
capacity with downlink probes or its ingress capacity with uplink
probes. A relay <bcp14>MUST</bcp14> therefore also limit, across all sessions and
separately for each direction, the number of probes running at the same
time and the total rate of probe traffic.</t>
        <t>The maximum rate applies to every probe. A paced probe whose r exceeds
it is rejected. A greedy probe has no r, so the probe sender <bcp14>MUST NOT</bcp14>
send it faster than the maximum rate: the relay enforces this directly
for a downlink probe, and as part of the declared shape for an uplink
probe (<xref target="uplink"/>).</t>
        <t>A per-probe limit (rate, duration, total bytes or object size) that is
exceeded can never be met at this relay, so the relay <bcp14>MUST</bcp14> reject the
request with the per-probe limit error code in <xref target="errors"/> and a Retry
Interval of 0.</t>
        <t>A session limit (concurrent probes or the per-session byte budget) or a
relay-wide limit that is exceeded can be met later, so the relay <bcp14>MUST</bcp14> reject the request with
error code EXCESSIVE_LOAD and <bcp14>SHOULD</bcp14> set the Retry Interval to the time
after which the request is expected to succeed.</t>
        <t>The relay <bcp14>MUST NOT</bcp14> silently clamp the parameters, because an endpoint
that measures a different probe from the one it asked for draws the
wrong conclusion.</t>
        <t>Unless configured otherwise, a relay <bcp14>SHOULD</bcp14> apply the following default
limits. They apply to downlink and uplink probes alike, separately for
each direction.</t>
        <table anchor="default-limits">
          <name>Default probe limits.</name>
          <thead>
            <tr>
              <th align="left">Limit</th>
              <th align="left">Default</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Maximum duration (d)</td>
              <td align="left">5000 ms</td>
            </tr>
            <tr>
              <td align="left">Maximum total bytes (b)</td>
              <td align="left">10,000,000 bytes</td>
            </tr>
            <tr>
              <td align="left">Maximum rate (r)</td>
              <td align="left">50,000,000 bits per second</td>
            </tr>
            <tr>
              <td align="left">Maximum object size (k*s)</td>
              <td align="left">1,048,576 bytes</td>
            </tr>
            <tr>
              <td align="left">Concurrent probes per session</td>
              <td align="left">1</td>
            </tr>
            <tr>
              <td align="left">Minimum time between the end of one probe and the start of the next</td>
              <td align="left">1000 ms</td>
            </tr>
            <tr>
              <td align="left">Probe bytes per session</td>
              <td align="left">50,000,000 bytes per 60 s</td>
            </tr>
            <tr>
              <td align="left">Concurrent probes across all sessions</td>
              <td align="left">Set by the relay operator</td>
            </tr>
            <tr>
              <td align="left">Total probe rate across all sessions</td>
              <td align="left">Set by the relay operator</td>
            </tr>
          </tbody>
        </table>
        <t>The relay-wide limits depend on the relay's capacity, so this document
gives no default for them.</t>
      </section>
      <section anchor="errors">
        <name>Error Codes</name>
        <t>This document defines no new error codes. The endpoint that receives a
probe request rejects it with REQUEST_ERROR <xref target="MoQTransport"/>, using
existing error codes. In a downlink probe the relay is the publisher of
the probe track, and in an uplink probe it is the subscriber, so the
codes differ by direction:</t>
        <table anchor="probe-errors">
          <name>Error codes for probe requests.</name>
          <thead>
            <tr>
              <th align="left">Outcome</th>
              <th align="left">Downlink (SUBSCRIBE)</th>
              <th align="left">Uplink (PUBLISH)</th>
              <th align="left">Retry Interval</th>
            </tr>
          </thead>
          <tbody>
            <tr>
              <td align="left">Invalid probe (<xref target="checks"/>)</td>
              <td align="left">DOES_NOT_EXIST</td>
              <td align="left">UNINTERESTED</td>
              <td align="left">0</td>
            </tr>
            <tr>
              <td align="left">PUBLISH with Forward State 1</td>
              <td align="left">-</td>
              <td align="left">UNINTERESTED</td>
              <td align="left">0</td>
            </tr>
            <tr>
              <td align="left">Per-probe limit exceeded</td>
              <td align="left">DOES_NOT_EXIST</td>
              <td align="left">UNINTERESTED</td>
              <td align="left">0</td>
            </tr>
            <tr>
              <td align="left">Session or relay-wide limit exceeded</td>
              <td align="left">EXCESSIVE_LOAD</td>
              <td align="left">EXCESSIVE_LOAD</td>
              <td align="left">time until the request can succeed</td>
            </tr>
            <tr>
              <td align="left">Session not allowed to use probes</td>
              <td align="left">UNAUTHORIZED</td>
              <td align="left">UNAUTHORIZED</td>
              <td align="left">0</td>
            </tr>
            <tr>
              <td align="left">Other request in the namespace, such as FETCH</td>
              <td align="left">NOT_SUPPORTED</td>
              <td align="left">NOT_SUPPORTED</td>
              <td align="left">0</td>
            </tr>
          </tbody>
        </table>
        <t>Because one code covers several outcomes, the Reason Phrase carries the
detail. It <bcp14>MAY</bcp14> name the field and the limit at fault, for example "r
exceeds 20000000". A relay that does not want to reveal its limits <bcp14>MAY</bcp14>
send a generic Reason Phrase instead, for example "probe rejected, use
a preset". A subscriber that receives DOES_NOT_EXIST for a Dynamic
Probe Name can switch to a Preset Name from the catalog, or retry with
smaller values; a publisher can retry an uplink probe with smaller
values.</t>
        <t>A relay that does not implement this specification also responds to a
SUBSCRIBE in the (<tt>.session</tt>, <tt>.probe</tt>) namespace with DOES_NOT_EXIST,
or forwards it to a publisher that does the same. A rejected probe
request alone therefore does not show whether the relay supports
probes; support is discovered separately for each direction
(<xref target="catalog"/>, <xref target="uplink-discovery"/>).</t>
      </section>
    </section>
    <section anchor="payload">
      <name>Probe Objects</name>
      <section anchor="streams-and-priority">
        <name>Streams and Priority</name>
        <t>The probe sender sends each group on its own subgroup stream with
Subgroup ID 0. A greedy probe, and a paced probe without g, is one group
on one stream.</t>
        <t>The probe sender <bcp14>MUST</bcp14> send probe objects with the lowest publisher
priority, so that the probe uses only the capacity that is left over
after the media on the same session, which is the capacity the probe is
meant to measure.</t>
      </section>
      <section anchor="object-format">
        <name>Object Format</name>
        <t>Probe objects are similar to objects in the Low Overhead Media
Container (LOC) <xref target="LOC"/>: they use the same layout and the same
properties, so developers can parse probe objects with the same logic
they use for LOC media objects. Probe objects are not LOC media,
however: their payload is padding, not an encoded audio or video frame.</t>
        <t>Each probe object carries the following LOC Public Properties in its
MOQT Object Properties:</t>
        <dl>
          <dt>Timestamp (0x10):</dt>
          <dd>
            <t>The wall-clock time, in microseconds since the Unix epoch, at which
the probe sender released the object for sending. The probe sender
<bcp14>MUST</bcp14> include it in every probe object. The probe sender <bcp14>MUST NOT</bcp14> send
a Timescale property, so that the Timestamp is interpreted as
wall-clock time. Probe receivers can use differences between
Timestamps without synchronized clocks. Probe receivers whose clock
is synchronized with the probe sender can also compute one-way delay.</t>
          </dd>
          <dt>Video Frame Marking (0x09):</dt>
          <dd>
            <t>For a paced probe with g present, the probe sender <bcp14>MAY</bcp14> include this
property and set the independent flag on the first object of each
group only, to imitate the key frames of a video track. The probe
sender <bcp14>MUST NOT</bcp14> include it otherwise.</t>
          </dd>
        </dl>
        <t>The payload of a probe object takes the place of the LOC Payload, and
consists of padding: bytes that bring the payload to its resolved size
(s, or k*s for the first object of a group). The probe sender <bcp14>MUST</bcp14> set
them to zero, consistent with the padding defined in <xref target="MoQTransport"/>,
and receivers <bcp14>MUST</bcp14> ignore their values. Probe objects
carry no LOC Private Properties. Because the payload is not media, a
receiver <bcp14>MUST NOT</bcp14> pass a probe payload to a media decoder, even if it
parses probe objects with a LOC parser.</t>
        <t>Probe objects carry no other per-object fields:</t>
        <ul spacing="normal">
          <li>
            <t>The position of an object in the probe follows from its Location.
Object i is Group floor(i / g), Object ID i mod g (<xref target="resolve"/>).
A gap in Locations shows objects that were not delivered.</t>
          </li>
          <li>
            <t>The rate and the number of objects follow from the Probe Name, which
both endpoints resolve with the procedure and the fixed defaults in
<xref target="resolve"/>. For a Preset Name, the subscriber resolves the Dynamic
Probe Name that the catalog gives for it (<xref target="catalog"/>).</t>
          </li>
          <li>
            <t>The end of the probe is signaled by PUBLISH_DONE.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="downlink">
      <name>Downlink Probes</name>
      <t>A downlink probe measures the hop from a relay to a subscriber. The
subscriber requests it with SUBSCRIBE in the (<tt>.session</tt>, <tt>.probe</tt>)
namespace, and the relay generates it.</t>
      <section anchor="requesting-a-downlink-probe">
        <name>Requesting a Downlink Probe</name>
        <t>A downlink probe is generated for a single subscription. A relay <bcp14>MUST
NOT</bcp14> aggregate two subscriptions to the same Probe Name into one
generated track, <bcp14>MUST NOT</bcp14> cache probe objects, and <bcp14>MUST NOT</bcp14> serve them
to another subscriber. Every probe starts at Group 0, Object 0,
whatever the subscription filter. A FETCH for a probe track is rejected
(<xref target="errors"/>).</t>
        <t>After SUBSCRIBE_OK, the relay sends the objects according to the
resolved schedule. When the probe ends, it ends the subscription with
PUBLISH_DONE. The relay sends a greedy probe as fast as the hop allows,
but never faster than its maximum rate; a greedy probe without d ends
early if it reaches the relay's maximum duration (<xref target="resolve"/>). A
subscriber can stop a probe early by terminating the subscription.</t>
        <t>Subscribers <bcp14>SHOULD</bcp14> subscribe to probe tracks with subscriber priority
255, so that, together with the lowest publisher priority
(<xref target="payload"/>), the probe measures only the capacity left over after the
subscriber's media.</t>
        <t>Relays <bcp14>SHOULD</bcp14> also accept the following equivalent form: an empty Track
Namespace (zero Track Namespace Fields) and a Track Name that starts with
the bytes <tt>.probe/</tt>, followed by a Probe Name. For example, the empty
namespace with Track Name <tt>.probe/d1000-r300000</tt> is equivalent to the
namespace (<tt>.session</tt>, <tt>.probe</tt>) with Track Name <tt>d1000-r300000</tt>.</t>
      </section>
      <section anchor="catalog">
        <name>Probe Catalog</name>
        <t>A relay that implements this specification <bcp14>MUST</bcp14> serve a catalog track
named <tt>catalog</tt> in the (<tt>.session</tt>, <tt>.probe</tt>) namespace. The catalog
uses the Common Catalog Format <xref target="CommonCatalogFormat"/>.</t>
        <section anchor="catalog-as-proof-of-support">
          <name>Catalog as Proof of Support</name>
          <t>A subscriber learns whether a relay supports downlink probes by
subscribing to the probe catalog. If the subscription succeeds, the
relay supports downlink probes. If it fails with DOES_NOT_EXIST, the
relay does not, and the subscriber does not send probe requests to it.
A rejected probe request alone does not tell the two cases apart (see
<xref target="errors"/>).</t>
        </section>
        <section anchor="catalog-contents">
          <name>Catalog Contents</name>
          <t>The catalog lists the relay's presets as tracks. For each preset, the
catalog gives:</t>
          <ul spacing="normal">
            <li>
              <t><tt>name</tt>: the Preset Name, which is the Track Name to subscribe to;</t>
            </li>
            <li>
              <t><tt>selectionParams</tt>: the <tt>bitrate</tt> (r) and, for a paced probe with an
object rate, the <tt>framerate</tt> (f), so that subscribers can select a
preset the same way they select media tracks; and</t>
            </li>
            <li>
              <t><tt>probeName</tt>: the Dynamic Probe Name that the preset stands for, which
lets the subscriber resolve the preset with the procedure in
<xref target="resolve"/>.</t>
            </li>
          </ul>
          <t>The <tt>streamingFormat</tt> field is set to the custom value <tt>probe</tt>, and
<tt>streamingFormatVersion</tt> to <tt>1</tt>. The probe catalog is read only by
subscribers that implement this specification, so a custom value is
enough to identify it, and other subscribers never need to parse it.
<tt>probeName</tt> is likewise a custom field. The common track fields set the
packaging to <tt>loc</tt> (<xref target="payload"/>). The catalog does not set <tt>namespace</tt>,
so the tracks inherit the namespace of the catalog track itself. A
catalog with no presets has an empty <tt>tracks</tt> array; it still proves
support for Dynamic Probe Names.</t>
          <figure anchor="catalog-example">
            <name>Probe catalog example.</name>
            <sourcecode type="json"><![CDATA[
{
  "version": 1,
  "streamingFormat": "probe",
  "streamingFormatVersion": "1",
  "commonTrackFields": {
    "packaging": "loc"
  },
  "tracks": [
    {
      "name": "sd-check",
      "label": "1 Mbps video-like probe, 1 s",
      "selectionParams": { "bitrate": 1000000, "framerate": 30 },
      "probeName": "d1000-f30-g30-r1000000"
    },
    {
      "name": "hd-check",
      "label": "5 Mbps video-like probe with key frames, 1 s",
      "selectionParams": { "bitrate": 5000000, "framerate": 30 },
      "probeName": "d1000-f30-g30-k5-r5000000"
    },
    {
      "name": "burst",
      "label": "Greedy 1 MB burst",
      "probeName": "b1000000"
    }
  ]
}
]]></sourcecode>
          </figure>
          <t>The catalog <bcp14>MUST NOT</bcp14> carry the relay's limits. Session limits change
with the state of the session (<xref target="limits"/>), so limits in a catalog would
go stale, and a request that fits them can still be rejected. A
subscriber learns about limits only from the result of a probe request.
For the same reason, a preset in the catalog is not a promise: a relay
<bcp14>SHOULD</bcp14> list only presets that fit its per-probe limits, but a request
for a preset can still fail with EXCESSIVE_LOAD.</t>
          <t>When the presets change, the relay publishes the new catalog as a new
group.</t>
          <t>TODO: The Common Catalog Format expects <tt>streamingFormat</tt> values to be
registered, and recommends a reverse-domain prefix for custom fields
such as <tt>probeName</tt>. Discuss whether the custom <tt>probe</tt> value and the
unprefixed <tt>probeName</tt> field are acceptable, or whether they should be
registered.</t>
        </section>
      </section>
      <section anchor="publisher">
        <name>Downlink Probes Served by Publishers</name>
        <t>Any MOQT endpoint that acts as a publisher can serve probe tracks with
the same logic as a relay: the same Probe Names, parameter resolution,
validation, errors and object format. When a subscriber is connected
directly to a publisher, the publisher answers the (<tt>.session</tt>,
<tt>.probe</tt>) namespace like a relay (<xref target="session-ns"/>).</t>
        <t>A publisher <bcp14>MAY</bcp14> also offer probe tracks in its own namespace and list
them in its catalog, so that subscribers can reach them through relays
and measure the whole path from the publisher. A publisher <bcp14>MUST</bcp14> respond
to a FETCH for such a track with REQUEST_ERROR and error code
NOT_SUPPORTED.</t>
        <t>TODO: Relays do not read catalogs, so a relay cannot tell a publisher
probe track from a media track, and would cache and aggregate it like
any other track. Considerations:</t>
        <ul spacing="normal">
          <li>
            <t>Probe tracks must not be cached.</t>
          </li>
          <li>
            <t>Probe tracks must not be fetched.</t>
          </li>
          <li>
            <t>These constraints can be put in track properties, so that relays can
apply them without access to the catalog.</t>
          </li>
        </ul>
      </section>
    </section>
    <section anchor="uplink">
      <name>Uplink Probes</name>
      <t>An uplink probe measures the hop from a publisher to its first relay.
The publisher generates the probe and publishes it with PUBLISH in the
(<tt>.session</tt>, <tt>.sink</tt>) namespace, and the relay consumes it: the relay
never caches it and never forwards it upstream or to any subscriber,
including the publisher itself (<xref target="session-ns"/>).</t>
      <t>A publisher that only needs a sender-side estimate can use MOQT padding
instead (<xref target="padding"/>). Uplink probes are meant for the cases in which
the relay should approve, bound and measure the probe.</t>
      <t>TBD: Whether uplink probes are needed beyond MOQT padding. Their main
advantage over padding, a measurement made by the relay, depends on a
way for the relay to report its result (<xref target="uplink-result"/>), which is not
yet specified.</t>
      <section anchor="requesting-an-uplink-probe">
        <name>Requesting an Uplink Probe</name>
        <t>The Track Name of an uplink probe <bcp14>MUST</bcp14> be a Dynamic Probe Name
(<xref target="grammar"/>). Preset Names are not used for uplink probes, because the
publisher has to resolve the parameters (<xref target="resolve"/>) to generate the
probe anyway.</t>
        <t>The publisher sends PUBLISH for the uplink probe track with the FORWARD
parameter set to 0, and <bcp14>MUST NOT</bcp14> send any objects until the relay sets
the Forward State to 1. The relay validates the request with the rules
in <xref target="validation"/>. If the probe is acceptable, the relay sends
PUBLISH_OK with Forward State 1, and the publisher starts the probe.
Otherwise, the relay rejects the PUBLISH (<xref target="errors"/>).</t>
        <t>Waiting for the relay keeps it in control of what it receives: the
relay checks the request against its limits before any probe data
arrives. The time at which the publisher receives Forward State 1 is
also a clean start time for the measurement.</t>
        <t>A relay that receives a PUBLISH in the (<tt>.session</tt>, <tt>.sink</tt>) namespace
with Forward State 1, or without the FORWARD parameter (which defaults
to 1), <bcp14>MUST</bcp14> reject it with REQUEST_ERROR, <bcp14>MUST</bcp14> discard any objects
already received for it, and <bcp14>SHOULD</bcp14> count those bytes against the
session limits. The relay <bcp14>MUST NOT</bcp14> close the session for this reason: a
bad probe request affects only the probe, not the media on the same
session.</t>
      </section>
      <section anchor="sending-and-enforcement">
        <name>Sending and Enforcement</name>
        <t>The publisher sends the probe according to the resolved parameters,
with the object format in <xref target="payload"/>; the LOC Timestamp carries the
publisher's send time. The publisher ends the probe with PUBLISH_DONE.</t>
        <t>A relay <bcp14>MUST</bcp14> enforce the declared shape. If the publisher sends more
bytes than b, sends for longer than d, or sends faster than r by a
margin that the relay chooses, the relay <bcp14>SHOULD</bcp14> pause the probe by
sending REQUEST_UPDATE with Forward State 0, or end it by terminating
the subscription. A greedy probe has no r, so the relay applies its
maximum rate instead, and treats a greedy probe that exceeds it like
any other violation of the declared shape; the publisher then knows
only that the hop sustained at least the rate it reached. A greedy
probe without d that reaches the relay's maximum duration ends: the
relay terminates the subscription. The relay discards all probe objects
after it has measured their arrival.</t>
        <t>A relay <bcp14>SHOULD</bcp14> apply the same flow control that it applies to ordinary
(e.g., media) streams to uplink probe streams as long as the probe track
stays within its pre-defined limits, that is, the parameters in its
Probe Name. Flow control is then part of the path being measured, as it
will be for the publisher's media.</t>
      </section>
      <section anchor="uplink-discovery">
        <name>Support Discovery</name>
        <t>TBD: How a publisher learns whether a relay accepts uplink probes. The
probe catalog proves support for downlink probes only. Options include a
custom root field in the probe catalog, such as <tt>"acceptsPublish":
true</tt>, or a SETUP option that the relay sends when the session is
established. A SETUP option is likely the better fit, because it tells
the publisher before it sends any request, and it covers relays that do
not serve downlink probes.</t>
      </section>
      <section anchor="uplink-result">
        <name>Measurement Result</name>
        <t>The relay receives the probe, but the publisher needs the result. The
publisher can estimate the uplink capacity on its own side, from the
delivery rate that its congestion controller observes while it sends
the probe; a greedy probe is the most suitable shape for this. How much
of this information is available depends on the publisher's transport
API. MOQT padding (<xref target="padding"/>) supports the same estimate.</t>
        <t>TBD: A way for the relay to report what it measured, for example a
session-scoped result track, such as (<tt>.session</tt>, <tt>.probe</tt>, <tt>.result</tt>),
on which the relay publishes one object with the measured throughput and
delay for each uplink probe, and to which the publisher subscribes.</t>
      </section>
    </section>
    <section anchor="measurement">
      <name>Measuring with Probes</name>
      <t>This section is informative.</t>
      <t>The probe receiver measures a probe in the same way in both directions.
For a greedy probe, it can estimate throughput as the number of bytes
received between the arrival of the first and the last object, divided
by the time between those arrivals. Excluding the first object reduces
the effect of the request round trip.</t>
      <t>For a paced probe, the probe receiver compares, for each object, the gap
between arrivals with the gap between LOC Timestamps. If the arrival
gaps keep growing relative to the send gaps, queuing delay is building
up and the target rate is not sustainable. The probe receiver can also
compare the receive rate over the probe with r. Gaps in object
Locations show objects that were not delivered, for example because the
subscription ended early.</t>
      <section anchor="downlink-use">
        <name>Downlink Use</name>
        <t>A subscriber that wants to switch from a track at rate R1 to a track at
rate R2 can run a paced probe at r = R2 - R1 at the lowest priority
while it keeps receiving the current track. If the probe is delivered on
time, the path is likely to sustain R2, and the subscriber can switch
(see <xref target="TrackSwitching"/>).</t>
      </section>
      <section anchor="uplink-use">
        <name>Uplink Use</name>
        <t>In an uplink probe, the relay is the probe receiver, but the publisher
needs the result. A publisher that estimates from its own congestion
controller uses a greedy probe and reads the delivery rate at the end
of the probe; a publisher that wants to raise its encoding bitrate from
R1 to R2 can instead run a paced probe at r = R2 - R1 and use a result
reported by the relay (<xref target="uplink"/>).</t>
      </section>
    </section>
    <section anchor="security">
      <name>Security Considerations</name>
      <t>A probe request is small, but the probe it starts can carry a large
amount of data: from the relay for a downlink probe, and to the relay
for an uplink probe. Without limits, an endpoint could use probes to use
up relay bandwidth, CPU or memory. Relays <bcp14>MUST</bcp14> enforce the limits in
<xref target="limits"/> in both directions, and <bcp14>MAY</bcp14> require that a session be
authorized before it can use probes.</t>
      <t>Greedy probes are the main threat to relay capacity, because they use
all the capacity they can get, up to the relay's maximum rate. The
relay-wide limits (<xref target="limits"/>) keep many simultaneous greedy probes from
using up the relay's egress or ingress capacity. Lowest priority makes
a probe yield only to the media of its own session, not to other
sessions at a shared bottleneck. A relay <bcp14>MAY</bcp14> refuse greedy probes
entirely, or accept them only from authorized sessions.</t>
      <t>For uplink probes, the relay keeps control by requiring Forward State 0
in the PUBLISH and checking limits before it allows any probe data, by
enforcing the declared shape, and by counting rejected data against the
session limits (<xref target="uplink"/>). Relays <bcp14>MAY</bcp14> accept uplink probes only from
authorized publishers.</t>
      <t>Probe data only crosses the hop of the session that asked for it, over
a congestion-controlled QUIC connection. Probes therefore cannot be used
to reflect or amplify traffic toward a third party.</t>
      <t>Probe objects expose the probe sender's wall clock, at microsecond
resolution, through the LOC Timestamp property: the relay's clock to
subscribers, and the publisher's clock to the relay. Probe senders that
consider this a concern <bcp14>MAY</bcp14> reduce the clock precision; probe receivers
that use only differences between Timestamps are not affected by a
constant offset.</t>
      <t>A relay <bcp14>MAY</bcp14> keep its limits out of Reason Phrases, so that clients
cannot use them to fingerprint the relay or tune requests to sit just
below the limits. The catalog does not carry limits (<xref target="catalog"/>).</t>
    </section>
    <section anchor="iana">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions. It uses the existing REQUEST_ERROR
codes as described in <xref target="errors"/>.</t>
      <t>TODO: Discuss whether the probe parameter keys in <xref target="probe-keys"/> need an
IANA registry, so that new keys can be added later without updating
this document.</t>
    </section>
    <section anchor="open-issues">
      <name>Open Issues</name>
      <t>Common:</t>
      <ul spacing="normal">
        <li>
          <t>Whether the probe parameter keys need an IANA registry (see
<xref target="iana"/>).</t>
        </li>
        <li>
          <t>Whether the session namespace (<xref target="session-ns"/>) belongs in this
document or in a separate one, since it is useful beyond probing.</t>
        </li>
        <li>
          <t>Whether a relay should be allowed to clamp parameters to its limits
and report the values it actually uses in SUBSCRIBE_OK or PUBLISH_OK,
as an alternative to rejecting the request.</t>
        </li>
        <li>
          <t>Probes delivered as datagrams, which would let a probe receiver
measure loss directly.</t>
        </li>
      </ul>
      <t>Downlink probes:</t>
      <ul spacing="normal">
        <li>
          <t>Whether the custom <tt>probe</tt> streaming format value and the
<tt>probeName</tt> catalog field should be registered (see <xref target="catalog"/>).</t>
        </li>
        <li>
          <t>Whether to keep the empty-namespace form of probe names, or to require
the (<tt>.session</tt>, <tt>.probe</tt>) namespace (see <xref target="downlink"/>).</t>
        </li>
        <li>
          <t>How relays learn that a publisher probe track must not be cached or
fetched (see <xref target="publisher"/>).</t>
        </li>
      </ul>
      <t>Uplink probes:</t>
      <ul spacing="normal">
        <li>
          <t>Whether uplink probes are needed beyond MOQT padding (see
<xref target="uplink"/>).</t>
        </li>
        <li>
          <t>How a publisher discovers support for uplink probes: a catalog field
or a SETUP option (see <xref target="uplink-discovery"/>).</t>
        </li>
        <li>
          <t>How a relay reports the result of an uplink probe to the publisher
(see <xref target="uplink"/>).</t>
        </li>
      </ul>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="MoQTransport">
          <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="1" month="October" 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-22"/>
        </reference>
        <reference anchor="LOC">
          <front>
            <title>Low Overhead Media Container</title>
            <author fullname="Mo Zanaty" initials="M." surname="Zanaty">
              <organization>Cisco</organization>
            </author>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Peter Thatcher" initials="P." surname="Thatcher">
              <organization>Microsoft</organization>
            </author>
            <date day="20" month="July" year="2026"/>
            <abstract>
              <t>   This specification describes a Low Overhead Media Container (LOC)
   format for encoded and encrypted audio and video media data to be
   used primarily for interactive Media over QUIC Transport (MOQT).  It
   may be used in the MOQT Streaming Format (MSF) specification, which
   defines a catalog format for publishers to declare and describe their
   LOC tracks and for subscribers to consume them.  Examples are also
   provided for building media applications using LOC and MOQT.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-loc-04"/>
        </reference>
        <reference anchor="CommonCatalogFormat">
          <front>
            <title>Common Catalog Format for moq-transport</title>
            <author fullname="Suhas Nandakumar" initials="S." surname="Nandakumar">
              <organization>Cisco</organization>
            </author>
            <author fullname="Will Law" initials="W." surname="Law">
              <organization>Akamai</organization>
            </author>
            <author fullname="Mo Zanaty" initials="M." surname="Zanaty">
              <organization>Cisco</organization>
            </author>
            <date day="8" month="July" year="2024"/>
            <abstract>
              <t>   This specification defines a Common Catalog specification for
   streaming formats implementing the MOQ Transport Protocol
   [MoQTransport].  Media over QUIC Transport (MOQT) defines a publish/
   subscribe based unified media delivery protocol for delivering media
   for streaming and interactive applications over QUIC.  The catalog
   describes the content made available by a publisher, including
   information necessary for subscribers to select, subscribe and
   initialize tracks.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-moq-catalogformat-01"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC5234">
          <front>
            <title>Augmented BNF for Syntax Specifications: ABNF</title>
            <author fullname="D. Crocker" initials="D." role="editor" surname="Crocker"/>
            <author fullname="P. Overell" initials="P." surname="Overell"/>
            <date month="January" year="2008"/>
            <abstract>
              <t>Internet technical specifications often need to define a formal syntax. Over the years, a modified version of Backus-Naur Form (BNF), called Augmented BNF (ABNF), has been popular among many Internet specifications. The current specification documents ABNF. It balances compactness and simplicity with reasonable representational power. The differences between standard BNF and ABNF involve naming rules, repetition, alternatives, order-independence, and value ranges. This specification also supplies additional rule definitions and encoding for a core lexical analyzer of the type common to several Internet specifications. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="68"/>
          <seriesInfo name="RFC" value="5234"/>
          <seriesInfo name="DOI" value="10.17487/RFC5234"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="TrackSwitching">
          <front>
            <title>Track Switching in Media over QUIC Transport</title>
            <author fullname="Zafer Gürel" initials="Z." surname="Gürel">
              <organization>Ozyegin University</organization>
            </author>
            <author fullname="Ali C. Begen" initials="A. C." surname="Begen">
              <organization>Networked Media</organization>
            </author>
            <date day="18" month="February" year="2025"/>
            <abstract>
              <t>   This document defines a solution for switching tracks in media.  More
   particularly, the solution provides a seamless switching that ensures
   there is no overlapping or gap between the download and/or
   transmission of two tracks when they are alternatives to each other.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-gurel-moq-track-switching-01"/>
        </reference>
        <reference anchor="RFC9000">
          <front>
            <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
            <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
            <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
            <date month="May" year="2021"/>
            <abstract>
              <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9000"/>
          <seriesInfo name="DOI" value="10.17487/RFC9000"/>
        </reference>
      </references>
    </references>
    <?line 1079?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
Vs9MV1gA0XivIG2nRfEl2Dh0jA4ZUt4rCq5KgKVC3mPndJElbCQ7DaRJiLHY
JDOTEYbJkS9aSdNzRhXap9VJqjPW5Au0J0w3vcFdAnkphoLMc8p+xqiv6tI+
XKg1LdPqT7HYOCRvgARVWakT2TOUSwh6V5Z45KMJTyy3SiPgg02kXCyRRMaD
pbNoaCdNLJstXqtX6KAZ52y6YsXqVO/bfIl3O1SYgxVuCH+ozSRvQqMLunsO
XUDQMJT7QBfKkkk5LablOpfoHQLWiLSrEAQ8jzdejvAOi6BFiAqONnF99wEe
eQmMp3ybJPpmkzk8uae7de0315PsukM82gOS+8ODtTy90Ki7YPH6DUyhhEa8
ZlylFhh1b7vjYqzj9PJ3t6HcuwqLNPG2kZRKsKz/uSNPu0UMltPuM/EH9qlA
a7iL0vupieCK/89IpBfrMHxtK+owl2nQds3leELUqxghCqnwb5R9mtkDoAuq
F3L1jm3TBOoXT+XLw33rb0lcro1ZcoCi3Lys501aVlFbZJcmG9/C3DK8tFbd
hdmjwxnuLYWm4zwJLPYXHVPqVWbu5KayuBa+NKV162PI8+jzA5LqgrUDDqBZ
oXrvbw9Zd6qUyfFgEbR11VXrlPiUtK7aj2gTDsmQXfc9IUmgymOTqgXimHDQ
6AtKfSGZDVWqEsM6tvPnj3uR47e6o3iD9KSy60DfYoB9J0tV5B3fyRUo8fJh
b7fYXXPrSCXYcH+BilVlt0VDJdVa4bfQ1Z72bsSMV/60lTdTYzItVztRKbef
gt0xOMW0BNVy3piYFdsZEBzpjoIcW8XV0aEIWU7XiP37yHCyxgmYW96ln7OC
0DDFdC72z0E2Ul4XEZHu/i5iHOe+Mn5yFHQCJl1HSFQOdeMAwwavmjVy1SwD
nnPQGpVaE9cdAkjbQdNYfnbGxqJZTjoBmkOpq1jjN5z9dkSnSnh+4JK7Dp5g
ujdMroKs5GJkwVolZW7z4ry/G2WbvZ1ekrjUGc0vTeTmPI3gxt/0IGsZi1u7
p9OaRkB8cUoYSSRZnqomRZpMqU9B1ISx6nGizTJ02crn8JLyzAyzNfM1lcJW
3iixsZBMdd0RiRiud5ErcbhSA6W4c+Ye5WB0khPF9FuO0Bhao5KsorKeXjrF
WdzeisfVSTFCJMaG6UBufZtzuHBYzKFhfq3paRHEhw905gPjJ2nCYaQvrcVj
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
9C3zgfl/9hz2G8itAAA=

-->

</rfc>
