<?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.35 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-duke-moq-subscribe-rewind-02" category="std" consensus="true" submissionType="IETF" version="3">
  <!-- xml2rfc v2v3 conversion 3.32.0 -->
  <front>
    <title abbrev="moq-subscribe-rewind">The Rewind Subscription Filter</title>
    <seriesInfo name="Internet-Draft" value="draft-duke-moq-subscribe-rewind-02"/>
    <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 objects that arrive at, or
are created by, the publisher in the future. These objects 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. A relay might omit
certain objects if they are not available in cache, but these are delivered
without regard for the dependencies represented by Subgroups.
If the entirety 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. The filter contains a
single argument. If this argument has a value of zero, it
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, as described below. 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 Next Group
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, which will not be greater than the
value in the Rewind filter.</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. For any Joining
FETCH(es) associated with this SUBSCRIBE, the Joining Location will be revised
to an Object prior to the groups serviced via Rewind. 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, which is expressed
as Location {Rewind.Lowest_Group - 1, 0}.</t>
      <t>Note that if the original publisher does not publish Groups with monotonically
increasing Group IDs, REWIND filters with values greater than zero will have
unpredictable results; like FETCH requests that request more than one group,
subscribers <bcp14>SHOULD NOT</bcp14> issue these requests.</t>
    </section>
    <section anchor="publisher-restrictions">
      <name>Publisher restrictions</name>
      <t>If the SUBSCRIBE message includes the FORWARD parameter with value 0, 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 (the Object was cached within the minimum of the two parameters),
and</t>
        </li>
        <li>
          <t>The MAX_CACHE_DURATION property for the track indicates 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>A simple way to implement a relay that supports Rewind is to begin with the
first full group in active subscription (i.e. where the subscription did not
start mid-Group).</t>
      <t>However, a relay <bcp14>MAY</bcp14> use data from previous subscriptions to the track,
but must take care to avoid incorrectly implying Subgroup continuity, as
described above. Furthermore, a relay <bcp14>MAY</bcp14> use FETCH to retrieve missing objects
and deliver them via subgroup streams and datagrams, since this will not block
objects that are already deliverable from cache.</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 (subgroup : cache.group[group_id].subgroups) {
    if (subgroup.HasFirstObject()) {
      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))
    }
  }
}

// Assemble the queue of objects to send.
void AssembleDataForTransmit(start_group, end_group) {
  for (group = start_group; group <= end_group; ++group) {
     for (datagram : group.datagrams) {
       Send(datagram)
     }
     for (subgroup : group.subgroups) {
       // The subgroup data structure implies that objects are in order. If
       // delivered over two streams, there will be two separate data
       // structures.
       OpenStreamForSubgroup(subgroup)
       for (object : subgroup.objects) {
         Send(object)
       }
     }
  }
}
]]></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="2" month="March" 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-17"/>
      </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 351?>

<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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
fGWI6HQgySdt4As4d4VfTMT/Abk0Hc3QNgAA

-->

</rfc>
