<?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.30 (Ruby 3.4.8) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duke-moq-subscribe-rewind-01" category="std" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.31.0 -->
  <front>
    <title abbrev="moq-subscribe-rewind">The Rewind Subscription Filter</title>
    <seriesInfo name="Internet-Draft" value="draft-duke-moq-subscribe-rewind-01"/>
    <author fullname="Martin Duke">
      <organization>Google</organization>
      <address>
        <email>martin.h.duke@gmail.com</email>
      </address>
    </author>
    <date/>
    <area>Web and Internet Transport</area>
    <workgroup>Media Over QUIC</workgroup>
    <keyword>media over quic</keyword>
    <keyword>subscribe</keyword>
    <abstract>
      <?line 36?>

<t>This document proposes a Media Over Quic Transport (MOQT) extension that enables
a new Subscription Filter, so that a subscriber can request that a finite number
of past groups be delivered with SUBSCRIBE semantics (multiple streams,
potentially incomplete) rather than FETCH semantics (single stream, complete,
head-of-line-blocking). Service of this request is best-effort by the publisher,
and it intended to accelerate joining a track in some use cases.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://martinduke.github.io/draft-duke-moq-subscribe-rewind/draft-duke-moq-subscribe-rewind.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-duke-moq-subscribe-rewind/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Media Over QUIC Working Group mailing list (<eref target="mailto:moq@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/moq/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/martinduke/draft-duke-moq-subscribe-rewind"/>.</t>
    </note>
  </front>
  <middle>
    <?line 45?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In MOQT <xref target="MOQT"/>, tracks are delivered via atomic Objects that are organized
into Groups, which serve as join points, and Subgroups, that imply dependency
between Objects and serve as the units to be fed into QUIC or Webtransport
streams.</t>
      <t>Subscribers can send SUBSCRIBE messages to receive messages that arrive at, or
are created by, the publisher in the future. Such messages are delivered either
one stream per Subgroup, or in QUIC Datagrams, as dictated by the original
publisher. The stream mapping allows Objects that are no longer of use to the
subscriber to not be sent or retransmitted without blocking later Objects.</t>
      <t>Subscribers can also send FETCH messages to retrieve Objects from the past. The
requested Object range is delivered on a single stream and cannot omit Objects
that exist at the original pulbsher. If the entirely of the Object range is not
in cache, a relay will have to issue its own FETCH upstream to satisfy the
subscriber.</t>
      <t>Because the subscriber may not know the live edge at request time, a variant of
FETCH known as "Joining FETCH" instructs the publisher to use the current live
edge as the end of the Object range. A "Relative Joining FETCH" defines the
start of the Object range relative to the live edge. For instance, a Relative
Joining FETCH might request two Groups prior to the live edge, which would
deliver the two latest complete Groups as well as all Objects in the current
Group before the live edge. Joining FETCH uses the same delivery semantics as
other FETCH: all Objects are delivered in order on a single stream.</t>
      <t>In some use cases, this behavior is not optimal. The subscriber might not need
the delivery guarantees associated with FETCH if Objects will arrive too late
to be useful. Furthermore, if some of the FETCHed Objects are available in
cache, they might have to wait for other, blocking Objects to be delivered from
upstream.</t>
      <t>This document describes the Subscribe Rewind extension, which specifies a new
Subscription Filter type "Rewind", allowing the subscriber to request SUBSCRIBE
semantics for some groups before the live edge. The publisher only honors the
request if it is able to do so from cache.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

</section>
    <section anchor="overview">
      <name>Overview</name>
      <t>Each endpoint sends the MAX_REWIND option in its SETUP message. The MAX_REWIND
option contains an integer that indicates the maximum number of groups that
the peer might request in a Rewind subscription filter. If zero, the peer may
only request the current group. If absent, the peer <bcp14>MUST NOT</bcp14> send the Rewind
subscription filter. This option is half-duplex; if an endpoint does not send
the option, but receives it, it <bcp14>MAY</bcp14> use the Rewind Subscription Filter.</t>
      <t>An endpoint might populate the MAX_REWIND option by reporting how many Groups
it habitually stores in cache to answer FETCH or service subscribers that are
behind on delivery. Other heuristics are also possible, especially if Group IDs
do not increment by one.</t>
      <t>A subscriber sends a SUBSCRIBE message and can include a Rewind Subscription
Filter instead of some other Subscription filter type. A value of zero
indicates it would like to receive the entire current group; a larger value
indicates it would also like to receive the most recent complete groups as well.</t>
      <t>If the subscriber wants the Groups even if SUBSCRIBE delivery semantics are not
available, it <bcp14>MAY</bcp14> also send a Joining FETCH message. The object range <bcp14>MAY</bcp14> be
larger or smaller than specified in the Rewind filter.</t>
      <t>Upon receipt of a Rewind filter, the publisher <bcp14>MAY</bcp14> treat it as a Largest Object
filter. It will typically do so if the track is not in cache. If it does not
do so, it sends a REWIND_GROUPS parameter in the SUBSCRIBE_OK. REWIND_GROUPS
is an integer that indicates the number of Groups before the LargestObject
parameter that will be served via SUBSCRIBE.</t>
      <t>Groups included in the Rewind Groups range will be delivered using SUBSCRIBE
semantics: datagrams or Subgroup streams, subject to the delivery timeout
and group order specified in the SUBSCRIBE negotiation. Groups serviced via
the Rewind filter are not delivered by any Joining FETCH associated with this
SUBSCRIBE, though they can be delivered by Standalone FETCH messages. In some
cases, this means the Joining FETCH delivers an empty range.</t>
      <t>If the Joining FETCH range exceeds the Rewind range, the EndLocation reported
in FETCH_OK is the highest Group ID outside the Rewind range.</t>
    </section>
    <section anchor="publisher-restrictions">
      <name>Publisher restrictions</name>
      <t>If the SUBSCRIBE message includes the FORWARD parameter with value 1, the
publisher <bcp14>MUST NOT</bcp14> send the REWIND_GROUPS parameter in SUBSCRIBE_OK.</t>
      <t>The publisher <bcp14>MUST NOT</bcp14> include a Group in a range defined by Rewind Groups
unless:</t>
      <ul spacing="normal">
        <li>
          <t>There are objects in cache for the Group, and</t>
        </li>
        <li>
          <t>Some objects in cache have either Datagram forwarding preference, or are
known to constitute the beginning of a Subgroup;</t>
        </li>
        <li>
          <t>The DELIVERY_TIMEOUT parameters for the SUBSCRIBE indicate the Group can
still be sent.</t>
        </li>
      </ul>
      <t>The publisher is not required to verify that it has all objects in the Group to
include it in Rewind Groups range. In particular, Groups delivered via SUBSCRIBE
might be missing objects and are still eligible for Rewind.</t>
      <t>The publisher <bcp14>MAY</bcp14> choose to report fewer groups than what meet these conditions.
It might do so because the volume of data implied would consume too many
resources, because it knows the current group is about to end, or due to any
other policy.</t>
      <t>As with any other SUBSCRIBE, if a publisher receives two streams for the same
Subgroup from upstream, and cannot account for all object IDs between the end
of one and the beginning of another, it <bcp14>MUST NOT</bcp14> deliver them on the same
stream. It <bcp14>MAY</bcp14> simply omit the stream with higher object IDs.</t>
      <t>The publisher <bcp14>MUST NOT</bcp14> send Rewind Groups &gt; 0 if it knows it is servicing a track
with Group IDs that are not strictly increasing.</t>
      <section anchor="relays-with-no-existing-upstream-subscription">
        <name>Relays with No Existing Upstream Subscription</name>
        <t>If a relay does not have an existing upstream subscription for the track,
it <bcp14>SHOULD</bcp14> use a Rewind Groups filter with the same or larger value in its upstream
SUBSCRIBE, subject to the upstream's MAX_REWIND Setup Option. When it receives
a SUBSCRIBE_OK from upstream, it <bcp14>SHOULD</bcp14> forward the REWIND_GROUPS parameter to
any Subscriber(s) that sent a Rewind Groups filter. It <bcp14>MAY</bcp14> supplement with
additional contiguous Groups in cache.</t>
        <t>However, the relay <bcp14>MUST NOT</bcp14> send a REWIND_GROUPS parameter larger than each
subscriber's original request.</t>
      </section>
      <section anchor="pseudocode">
        <name>Pseudocode</name>
        <t>The following pseudocode illustrates this logic:</t>
        <artwork><![CDATA[
bool HasObjectInGroup(group_id) {
  for (object : cache.group[group_id]) {
    if (object.IsFirstInSubgroup()) {
      return true
    }
  }
  return false
}

void OnRewindFilterNeedUpstreamSubscribe(groups_to_rewind) {
  if (groups_to_rewind > kMyMaxRewind) {
    ProtocolError()
  }
  if (!Upstream.MaxRewind().exists()) {
    return
  }
  SetUpstreamSubscribeFilter(kRewind, min(groups_to_rewind,
                                          Upstream.MaxRewind())
}

void OnRewindFilterHaveSubscription(groups_to_rewind) {
  if (groups_to_rewind > kMyMaxRewind) {
    ProtocolError()
  }
  while (group = largest_observed_group;
         group >= largest_observed_group - groups_to_rewind;  --group) {
    if (!GroupExists(group) || !HasObjectInGroup(group)) {
      break
    }
  }
  if (group != largest_observed_group) {
    SetRewindGroupsParameter(largest_observed_group - group - 1)
  }
}

// called on SUBSCRIBE_OK at the relay.
void OnRewindGroupsParameterAtRelay(groups_to_rewind, largest_group) {
  // Supplement upstream response with any groups in cache
  for (group = largest_group - groups_to_rewind; group.exists(); --group) {
    if (HasObjectInGroup(group) {
      ++groups_to_rewind;
    }
  }
  for (subscriber : GetSubscribers()) {
    if (subscriber.HasRewindGroupsFilter() {
      SetRewindGroupsParameter(min(groups_to_rewind, subscriber.rewind_groups))
    }
  }
}
]]></artwork>
      </section>
    </section>
    <section anchor="options-and-parameters">
      <name>Options and Parameters</name>
      <section anchor="setup-option-maxrewind">
        <name>Setup Option MAX_REWIND</name>
        <t>In addition to the Setup Options in Sec 9.3.1 of <xref target="MOQT"/>, the Setup Option
MAX_REWIND (0x16) contains an integer that indicates the largest value that can
be used in a Rewind Subscription Filter. If it is missing, the peer <bcp14>MUST NOT</bcp14>
send a Rewind Subscription Filter.</t>
      </section>
      <section anchor="subscription-filter-rewind">
        <name>Subscription Filter Rewind</name>
        <t>In addition to the Subscription Filter Types in Sec 5.1.2. of <xref target="MOQT"/>, add
filter type Rewind (0x16). The format is as follows:</t>
        <artwork><![CDATA[
Subscription Filter {
  Filter Type (vi64) = 0x16,
  Rewind Groups (vi64),
}
]]></artwork>
        <t>A Rewind Groups of zero means that the subscriber requests SUBSCRIBE semantics
from the beginning of the current group. A larger integer value includes that
many past Groups in addition to the current Group.</t>
        <t>The Rewind Groups field <bcp14>MUST NOT</bcp14> exceed the value in the peer's MAX_REWIND Setup
Option and the filter type <bcp14>MUST NOT</bcp14> be sent if the Option was absent. In either,
case, the publisher should terminate the session with error PROTOCOL_VIOLATION.</t>
      </section>
      <section anchor="rewindgroups-message-parameter">
        <name>REWIND_GROUPS Message Parameter</name>
        <t>In addition to the MessageParameters in Sec 9.2 of <xref target="MOQT"/>, add REWIND_GROUPS
(0x16).</t>
        <t>It represents the number of groups before the LargestObject that will be
delivered via SUBSCRIBE semantics.</t>
        <t>If the parameter is sent in response to a Subscription Filter other than
Rewind, has a value greater than the Group ID of Largest Location, or exceeeds
with error PROTOCOL_VIOLATION.</t>
        <t>The publisher <bcp14>MUST</bcp14> truncate the end of any Joining FETCH related to this
SUBSCRIBE to end before Object zero of the Group encoded by REWIND_GROUPS. This
might result in empty object ranges. The Subscriber <bcp14>MUST</bcp14> close the session
with error PROTOCOL_VIOLATION if the ranges overlap.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>To the extent this reduces head-of-line-blocking and replaces upstream FETCHes
to satisfy Joining FETCH at the relay, it can reduce resource consumption at
publishers.</t>
      <t>However, SUBSCRIBE semantics consume more QUIC or Webtransport streams. Past
Groups might contain a lot of data, and FETCH delivery is contained on a
single stream to simplify the flow control of this data. Publishers, who are
aware of the content of their cache, <bcp14>SHOULD</bcp14> limit the range encoded by the
REWIND_GROUPS parameter when is likely to overwhelm the channel or the subscriber.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>Please add 0x16 (REWIND_GROUPS) to the Message Parameters registry.</t>
      <t>There is no Setup Option registry, but if one arises, please add 0x16
(MAX_REWIND) to it.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <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="13" month="January" year="2026"/>
          <abstract>
            <t>   This document defines the core behavior for Media over QUIC Transport
   (MOQT), a media transport protocol designed to operate over QUIC and
   WebTransport, which have similar functionality.  MOQT allows a
   producer of media to publish data and have it consumed via
   subscription by a multiplicity of endpoints.  It supports
   intermediate content distribution networks and is designed for high
   scale and low latency distribution.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-moq-transport-16"/>
      </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 313?>

<section numbered="false" anchor="acknowledgements">
      <name>Acknowledgements</name>
      <t>Ian Swett designed many components of this proposal. Numerous members of the
MOQ Working Group provided comments that refined our thinking.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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

-->

</rfc>
