<?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.21 (Ruby 3.3.6) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-lcurley-moq-use-cases-00" category="info" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.25.0 -->
  <front>
    <title abbrev="moqtf">Media over QUIC - Use Cases</title>
    <seriesInfo name="Internet-Draft" value="draft-lcurley-moq-use-cases-00"/>
    <author fullname="Luke Curley">
      <organization>Discord</organization>
      <address>
        <email>kixelated@gmail.com</email>
      </address>
    </author>
    <date year="2025" month="January" day="16"/>
    <area>wit</area>
    <workgroup>moq</workgroup>
    <abstract>
      <?line 22?>

<t>MoQ is designed to serve live tracks over a CDN to viewers with varying latency and quality targets: the entire spectrum between real-time and VOD.
However, it's difficult to understand how to use the transport given the layering and complexity of live media delivery.
This document outlines how an application could use MoQ to deliver video, audio, and metadata in a variety of scenarios.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    Media Over QUIC Working Group mailing list (moq@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/moq/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/kixelated/moq-drafts"/>.</t>
    </note>
  </front>
  <middle>
    <?line 28?>

<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="introduction">
      <name>Introduction</name>
      <t>Media over QUIC is still in the concept phase; a loose collection of ideas and drafts on how to utilize QUIC for live media delivery.
It's difficult to grasp how to utilize the various layers:</t>
      <ul spacing="normal">
        <li>
          <t>QUIC: A transport layer that provides reliable, ordered, and secure streams.</t>
        </li>
        <li>
          <t>MoqTransfork: A pub/sub layer that provides caching and fanout.</t>
        </li>
        <li>
          <t>MoqKarp: A proposed media layer on top of MoqTransfork that deals with encoding and containers.</t>
        </li>
        <li>
          <t>Application: Your application that utilizes any of the above layers.</t>
        </li>
      </ul>
      <t>This document briefly overviews how live media works and how you could use MoQ to deliver it.</t>
    </section>
    <section anchor="video">
      <name>Video</name>
      <t>Video encoding involves complex dependencies between frames/slices.
The terminology in this section stems from H.264 but is applicable to most modern codecs.</t>
      <t>Each frame of video is encoded as one or more slices but to simplify the discussion, we'll refer to a slice as a frame.
There are three types of frames:</t>
      <ul spacing="normal">
        <li>
          <t><strong>I-Frame</strong>: A frame that can be decoded independently.</t>
        </li>
        <li>
          <t><strong>P-Frame</strong>: A frame that depends on previous frames.</t>
        </li>
        <li>
          <t><strong>B-Frame</strong>: A frame that depends on previous or future frames.</t>
        </li>
      </ul>
      <section anchor="group-of-pictures">
        <name>Group of Pictures</name>
        <t>A simple application can ignore the complexity of P/B frames and focus on I-Frames.
This is the optimal approach for many encoding configurations.</t>
        <t>Each I-Frame begins a Group of Pictures (GoP).
A GoP is a set of frames that <bcp14>MAY</bcp14> depend on each other and <bcp14>MUST NOT</bcp14> depend on other GoPs.
Each frame has a decode order (DTS) and a frame <bcp14>MUST NOT</bcp14> depend on frames with a higher DTS.</t>
        <t>This perfectly maps to a QUIC stream, as they too are independent and ordered.
The easiest way to use MoqTransfork is to send each GoP as a GROUP with each frame as a FRAME, hence the names.</t>
        <t>Each SUBSCRIBE starts at a Group to ensure that it starts with an I-Frame.
Each Group is delivered in decode order ensuring that all frames are decodable (no artifacts).</t>
        <t>A subscriber can choose the Group Order based on the desired user experience:</t>
        <ul spacing="normal">
          <li>
            <t><tt>SUBSCRIBE order=DESC</tt>: Transmits new Groups first to allow skipping, intended for low-latency live streams.</t>
          </li>
          <li>
            <t><tt>SUBSCRIBE order=ASC</tt>: Transmits old Groups first to avoid skipping, intended for VOD and reliable live streams.</t>
          </li>
        </ul>
        <t>A publisher or subscriber can skip the remainder of a Group by resetting a Group Stream or by issuing a SUBSCRIBE_UPDATE.
A FETCH can be used to recover any partial groups.</t>
      </section>
      <section anchor="layers">
        <name>Layers</name>
        <t>An advanced application can subdivide a GoP into layers.</t>
        <t>The most comprehensive way to do this is with Scalable Video Coding (SVC).
There is a base layer and one or more enhancement layers that depend on lower layers.
For example, a 4K stream could be broken into 4K, 1080p, and 360p (base) layers.
However, SVC has limited support and is complex to encode.</t>
        <t>Another approach is to use temporal scalability via something like B-pyramids.
The frames within a GoP are sub-divided based on their dependencies, intentionally creating a hierarchy.
For example, even frames could be prevented from referencing odd frames, creating a base 30fps layer and an enhancement 60fps layer.
This is effectively a custom SVC scheme however it's limited to time and doesn't require special decoder support.</t>
        <t>The purpose of these layers is to support degrading the quality of the broadcast.
A subscriber could limit bandwidth usage by choose to only receive the base layer or a subset of the enhancements layers.
During congestion, the base layer can be prioritized while the enhancement layers can be deprioritized or dropped.
However, the cost is a small increase in bitrate (10%) as limiting potential references can only hurt the compression ratio.</t>
        <t>When using MoqTransfork, each layer is delivered as a separate Track.
This allows the subscriber to choose which layers to receive and how to prioritize them in SUBSCRIBE.
It also enables layers to be prioritized within the layer application, for example Alice's base layer is more important than Bob's enhancement layer.</t>
        <t>The application is responsible for determining the relationship between layers, since they're unrelated tracks as MoqTransport is concerned.
The application could use a catalog to advertise the layers and how to synchronize them, for example based on the Group Sequence.</t>
      </section>
      <section anchor="non-reference-frames">
        <name>Non-Reference Frames</name>
        <t>While not explicitly stated, I believe the complexity in MoqTransport stems almost entirely from a single use-case: the ability to drop individual non-reference frames in the middle of a group.</t>
        <t>In theory, transmitting enhancement layers as tracks like mentioned above could introduce head-of-line blocking depending on the encoding.
This would occur when enhancement layers are not self-referential, a rare configuration which also hurts the compression ratio.
And in practice, there's no discernible user impact given the disproportionate size difference between base and enhancement layers.</t>
        <t>The ability to drop individual non-reference frames in the middle of a group is an explicit non-goal for MoqTransfork.</t>
      </section>
    </section>
    <section anchor="audio">
      <name>Audio</name>
      <t>Unlike video, audio is simple and yet has perhaps more potential for optimization.</t>
      <section anchor="frames">
        <name>Frames</name>
        <t>Audio samples are very small and for the sake of compression, are grouped into a frame.
This depends on the codec and the sample rate but each frame is typically 10-50ms of audio.</t>
        <t>Audio frames are independent, which means they map nicely to MoqTransfork Groups.
Each audio frame can be transmitted as a GROUP with a single FRAME.</t>
      </section>
      <section anchor="groups">
        <name>Groups</name>
        <t>Audio FRAMEs can also be combined into periodic GROUPs to reduce overhead at the cost of some introducing head-of-line blocking.
This won't increase latency except under significant congestion as each FRAME is still streamed.</t>
        <t>For example, an application could then subscribe to video and audio starting at group X for both tracks, instead of trying to maintain a mapping between the two based on timestamp.
This is quite common in HLS/DASH as there's no reason to subdivide audio segments at frame boundaries.</t>
      </section>
      <section anchor="fec">
        <name>FEC</name>
        <t>Real-time audio applications often use Forward Error Correction (FEC) to conceal packet loss.
Audio frames are a good candidate for FEC given that they are small and independent.</t>
        <t>In an ideal world, FEC would be performed by QUIC based on the properties of the hop.
However this is not currently not supported and FEC is left to the application.</t>
        <t>In MoqTransfork, each FEC packet is transmitted as a separate GROUP with a single FRAME.
A real-time subscriber issues a <tt>SUBSCRIBE</tt> with an aggressive <tt>Group Expires</tt> value in the milliseconds range.
The publisher will drop any Groups that have not been transmitted or acknowledged within this time frame, potentially causing them to be lost.</t>
        <t>Normally, FEC is performed by transmitting individual packets once as datagrams.
However, QUIC streams are useful as they allow retransmissions when <tt>Group Expires</tt> is smaller than the RTT.
If the RTT is too high, then the RESET_STREAM frame adds some overhead but it's inconsequential (~10 more bytes).
This enables retransmitting lost packets on short hops and otherwise relying on FEC for long hops.</t>
      </section>
    </section>
    <section anchor="metadata">
      <name>Metadata</name>
      <t>There's a number of non-media use cases that can be served by MoqTransfork.</t>
      <section anchor="catalog">
        <name>Catalog</name>
        <t>Originally part of the transport itself, the catalog is a list of all tracks within a broadcast.
It's since been delegated to the application and is now just another track with a well-known name.</t>
        <t>The proposed MoQ catalog format supports live updates.
It does this by encoding a base JSON blob and then applying JSON patches over time.
If the number of deltas becomes too large, the producer can start over with a new base JSON blob.</t>
        <t>In MoqTransfork, the base and all deltas are a single GROUP.
The base is the first FRAME and all deltas are subsequent FRAMEs.
The producer can create a new GROUP to start over, repeating the process.</t>
      </section>
      <section anchor="timeline">
        <name>Timeline</name>
        <t>Another track that is commonly pitched is a timeline track.
This records the presentation timestamp of each Group, giving a VOD viewer to seek to a specific time.</t>
        <t>The <tt>timeline</tt> track is a single Group containing a Frame for each timestamp.
The live nature of the timeline track is great for DVR applications while being concise enough for VOD.
Timed metadata would use a similar approach or perhaps leverage this track.</t>
      </section>
      <section anchor="interaction">
        <name>Interaction</name>
        <t>Another common use-case is to transmit user interactions, such as controller inputs or chat messages.
It's up to the application to determine the format and encoding of these messages.</t>
        <t>Let's take controller input as an example.
The application needs to determine its loss vs latency tolerance, as reordering or dropping inputs will lead to a poor user experience.</t>
        <ul spacing="normal">
          <li>
            <t>If you don't want loss, then use a single GROUP with a FRAME per input.</t>
          </li>
          <li>
            <t>If you don't want latency, then use a GROUP per input with a single FRAME.</t>
          </li>
          <li>
            <t>If you want a hybrid, then use form of clustering inputs into GROUPs and FRAMEs based on time.</t>
          </li>
        </ul>
        <t>A publisher could monitor the session RTT or stream acknowledgements to get a sense of the latency and create Groups accordingly.
However, this only applies to the first hop and won't be applicable when relays are involved.</t>
      </section>
    </section>
    <section anchor="latency">
      <name>Latency</name>
      <t>One explicit goal of MoqTransfork is to support multiple latency targets.</t>
      <t>This is accomplished by using the same Tracks and Group for all viewers, but slightly changing the behavior based on the subscription.
This is driven by the subscriber, allowing them to choose the trade-off between latency and reliability.
This may be done on the fly via SUBSCRIBE_UPDATE, for example if a high-latency viewer wishes to join the stage and suddenly needs real-time latency.</t>
      <t>The below examples assume one audio and one video track.
See the next section for more complicated broadcasts.</t>
      <section anchor="real-time">
        <name>Real-Time</name>
        <t>Real-time latency is accomplished by prioritizing the most important media during congestion and skipping the rest.</t>
        <t>This is slightly different from other media protocols which instead opt to drop packets.
The end result is similar, but prioritization means utilizing all available bandwidth as determined by the congestion controller.
A subscriber or publisher can reset groups to avoid wasting bandwidth on old data.</t>
        <t>A real-time viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=DESC group_expires=100ms
SUBSCRIBE track=video priority=0 order=DESC group_expires=100ms
]]></artwork>
        <t>In this example, audio is higher priority than video, and newer groups are higher priority than older groups.
Suppose a viewer fell behind after a burst of congestion and has to decide which groups to deliver next.
This configuration would result in the transmission order:</t>
        <artwork><![CDATA[
GROUP track=audio sequence=102
GROUP track=audio sequence=101
GROUP track=audio sequence=100
GROUP track=video sequence=5
GROUP track=video sequence=4
]]></artwork>
        <t>The user experience depends on the amount of congestion:</t>
        <ul spacing="normal">
          <li>
            <t>If there's no congestion, all audio and video is delivered.</t>
          </li>
          <li>
            <t>If there's moderate congestion, the tail of the old video group is dropped.</t>
          </li>
          <li>
            <t>If there's severe congestion, all video will be late/dropped and some audio groups/frames will be dropped.</t>
          </li>
        </ul>
        <t>The value of <tt>group_expires</tt> is optional.
In this example it means that the publisher automatically resets each group 100ms after they are no longer the latest.
It's recommended to use the maximum jitter buffer size.</t>
      </section>
      <section anchor="unreliable-live">
        <name>Unreliable Live</name>
        <t>Unreliable live is a term I made up.
Basically we want low latency, but we don't need it at all costs and we're willing to skip some video to achieve it.
This is useful for broadcasts where latency is important but so is picture quality.</t>
        <t>An unreliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=ASC
SUBSCRIBE track=video priority=0 order=DESC group_expires=3s
]]></artwork>
        <t>This example is different from the real-time one in that audio is fully reliable and delivered in order.
Of course this is optional and up to the application, as it will result in buffering during significant congestion.
If the viewer goes through a tunnel and then comes back online, they won't miss any audio.</t>
        <t>A key difference is that our jitter buffer is much larger for video, 3s in this example.
The player will tolerate up to 3s of latency before it starts skipping past video frames.
Note that the <tt>group_expires</tt> value can be increased during buffering by issuing a SUBSCRIBE_UPDATE.</t>
      </section>
      <section anchor="reliable-live">
        <name>Reliable Live</name>
        <t>Reliable live is another term I made up.
This is when we have a live stream but primarily care about picture quality.
A good example is a sports game where you want to see every frame.</t>
        <t>A reliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC
SUBSCRIBE track=video priority=0 order=ASC
]]></artwork>
        <t>This will deliver both audio and video in order, and with the same priority.
The viewer won't miss any content unless the publisher resets a group.
However, this can result in buffering during congestion and provides a similar user experience to HLS/DASH.</t>
      </section>
      <section anchor="vod-dvr">
        <name>VOD / DVR</name>
        <t>Video on Demand (VOD) and Digital Video Recorder (DVR) both involve seeking backwards in a live stream.
MoqTransfork can serve this use-case too, don't worry.</t>
        <t>A VOD viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC start=345 end=396
SUBSCRIBE track=video priority=0 order=ASC start=123 end=134
]]></artwork>
        <t>The application is responsible for determining the group sequence numbers based on the desired timestamp.
This could be done via a <tt>timeline</tt> track or out-of-band.</t>
        <t>A subscriber will need a specific <tt>end</tt> or else it will download too much data at once, as old media is transmitted at network speed and not encode speed.
It will need to issue an updated SUBSCRIBE to expand the range as playback continues and the buffer depletes.
A subscriber could use SUBSCRIBE_UPDATE, however there are race conditions involved.</t>
        <t>A DVR player does the same thing but can automatically support joining the live stream.
It's perfectly valid to specify a <tt>end</tt> in the future and it will behave like reliable live viewer once it reaches the live playhead.</t>
        <t>Alternatively, a DVR player could prefetch the live playhead by issuing a parallel SUBSCRIBE at a lower priority.
This would allow playback to immediately continue after clicking the "Go Live" button, canceling or deprioritizing the VOD subscription.</t>
        <artwork><![CDATA[
SUBSCRIBE track=video priority=1 order=ASC start=123 end=134
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
      </section>
      <section anchor="upstream">
        <name>Upstream</name>
        <t>All of these separate viewers could be watching the same broadcast.
How is a relay supposed to fetch the content from upstream?</t>
        <t>MoqTransfork addresses this by providing the publisher's Track Priority and Group Order in the INFO message.
This is the intended behavior for the first hop and dictates which viewers are preferred.</t>
        <t>For example, suppose the producer chooses:</t>
        <artwork><![CDATA[
INFO track=audio priority=1 order=DESC
INFO track=video priority=0 order=DESC
]]></artwork>
        <t>If Alice is watching a VOD and issues:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=0 order=ASC
SUBSCRIBE track=video priority=0 order=ASC
]]></artwork>
        <t>If Bob is watching real-time and issues:</t>
        <artwork><![CDATA[
SUBSCRIBE track=audio priority=1 order=DESC
SUBSCRIBE track=video priority=0 order=DESC
]]></artwork>
        <t>For any congestion on the first mile, then the relay will improve Bob's experience by following the producer's preference.
However any congestion on the last mile will always use the viewer's preference.</t>
        <t>A relay should use the publisher's priority/order only when there's a conflict.
If viewers have the same priority/order, then the relay should use the viewer's preference and it can always issue a SUBSCRIBE_UPDATE when this changes.</t>
      </section>
    </section>
    <section anchor="broadcast">
      <name>Broadcast</name>
      <t>A broadcast is a collection of tracks from a single producer.
This usually includes an audio track and/or a video track, but there are reasons to have more than that.
This is transparent to moq-transfork, as the a higher level application is responsible for any grouping between tracks.</t>
      <section anchor="abr">
        <name>ABR</name>
        <t>Virtually all mass fan-out use-cases rely on Adaptive Bitrate (ABR) streaming.
The idea is to encode the same content at multiple bitrates and resolutions, allowing the viewer to choose based on their unique situation.</t>
        <t>MoqTransfork unsurprisingly supports this via multiple Tracks, but relies on the application to determine the relationship between them.
This is often done via a <tt>catalog</tt> track that details each track's name, bitrate, resolution, and codec.
This includes how a group in one track corresponds to a group in another track.
A common approach is to use the same Group Sequence number for all tracks, or perhaps utilize a <tt>timeline</tt> track to map between Group Sequences and presentation timestamps.</t>
        <t>The viewer may limit the available tracks based on capabilities or preferences.
For example, the device may not support the 4K track since it uses AV1, or the screen size may be too small to justify the bandwidth.
This is easy enough to support; just ignore these tracks in the catalog.</t>
        <t>The primary reason to use ABR is to adapt to changing network conditions.
The viewer learns about the estimated bandwidth via the SESSION_UPDATE message, or by measuring network traffic and can then choose the appropriate track based on bitrate.</t>
        <t>Transitioning between tracks can be done seamlessly by utilizing prioritization.
For example, suppose a viewer is watching the 360p track and wants to switch to 1080p at group 69.</t>
        <t>A real-time or unreliable live viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=360p  priority=0 order=DESC end=69
SUBSCRIBE        track=1080p priority=1 order=DESC start=69
]]></artwork>
        <t>A reliable live or VOD viewer could issue:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=360p  priority=1 order=ASC end=69
SUBSCRIBE        track=1080p priority=0 order=ASC start=69
]]></artwork>
        <t>The difference between them is whether to prioritize the old track or the new track.
In both scenarios, the subscription will seamlessly switch at group 69 even if it's seconds in the future.
The same behavior can be used to switch down.</t>
      </section>
      <section anchor="svc">
        <name>SVC</name>
        <t>We touched on SVC before, but it's worth mentioning as an alternative to ABR.
I want to see it used more often but I doubt it will be.</t>
        <t>Instead of choosing the track based on the bitrate, the viewer subscribes to them all:</t>
        <artwork><![CDATA[
SUBSCRIBE track=360p  priority=2 order=DESC
SUBSCRIBE track=1080p priority=1 order=DESC
SUBSCRIBE track=4k    priority=0 order=DESC
]]></artwork>
        <t>During congestion, the 4k enhancement layer will be deprioritized followed by the 1080p enhancement layer.
This is a more efficient use of bandwidth than ABR, but it requires more complex encoding.</t>
      </section>
    </section>
    <section anchor="conferences">
      <name>Conferences</name>
      <t>Some applications involve multiple producers, such as a conference calls or a live events.
Even though these are separate broadcasts from potentially separate origins, MoqTransfork can still serve them over the same session.</t>
      <section anchor="discovery">
        <name>Discovery</name>
        <t>The first step to joining a conference is to discover the available tracks.</t>
        <t>That's where <tt>ANNOUNCE</tt> comes in.
The subscriber indicates interest in any tracks that start with a prefix, such as <tt>["meeting", "1234"]</tt>.
As new participants join, new tracks are announced, and the subscriber can choose to subscribe to them.</t>
      </section>
      <section anchor="participants">
        <name>Participants</name>
        <t>Extending the idea that audio is more important than video, we can prioritize tracks regardless of the source.
This works because <tt>SUBSCRIBE priority</tt> is scoped to the session and not the broadcast.</t>
        <artwork><![CDATA[
SUBSCRIBE track=[alice, audio] priority=3
SUBSCRIBE track=[frank, audio] priority=3
SUBSCRIBE track=[alice, video] priority=1
SUBSCRIBE track=[frank, video] priority=1
]]></artwork>
        <t>When Alice starts talking or is focused, we can actually issue a SUBSCRIBE_UPDATE to increase her priority:</t>
        <artwork><![CDATA[
SUBSCRIBE_UPDATE track=[alice, audio] priority=2
SUBSCRIBE_UPDATE track=[frank, video] priority=0
]]></artwork>
        <t>Note that audio is still more important than video, but Alice is now more important than Frank. (poor Frank)</t>
        <t>This concept can further be extended to work with SVC or ABR:</t>
        <artwork><![CDATA[
SUBSCRIBE track=[alice, 360p] priority=4
SUBSCRIBE track=[frank, 360p] priority=3
SUBSCRIBE track=[alice, 720p] priority=2
SUBSCRIBE track=[frank, 720p] priority=1
]]></artwork>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>TODO Security</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <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 456?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA7Vc/3LcxpH+f58CR9eVJdeSIiXFiZk4OYqkLJ4lUiEp5VKp
VIQFZndhYjEwBuBqk4qf5Z7lnuz66+4ZDLBL+VTOpVK2uQvMj57+8fXXPbu/
vz9pi7Y0x8neG5MXaWLvTZP88d3FabKfvHMmOU2dcXuTdDZrzD09tbI/tvO9
SZa2ZmGbzXFSVHM7meQ2q9IVDZM36bzdL7OuKc1mn57e75zZzzDK/uHhxHWz
VeFcYat2U9PjF+e3L5PkiyQtnaXRiyo3taF/VO3eNNmjFbW2KdISf1ycvKB/
2Yb+6/r25d6k6lYz0xxPclrK8YTW9mySNiY9TtZFO1nb5m7R2K4+TmgNk0na
tUtLDyf7k4T+N+/KUtb7urujTfJq+RvbLNKq+Hva0hKPk7PCZbbJ+RuzSovy
OLkrPpqSpsz/Y4EPDjK7mkwghGZFL93TUib7+/tJOnNtk2btZPLG/jEpXJIb
VywqkyetTZxp7k1S0tMJHrpzIvY0OT27xPf3hVmbxmEny+Q+bTZFtUgwaZVt
krTKkx+7tCzaTdKmzcK07jhplyYhoRWNSVxtsrbpVsnMtGtjqoSEUu63xcrw
q++vzg4mr+za0IzTpGi/pKUV83mRdWWLuTuSfuNaPLq0a/6E1ADj01IrV9um
TRa08oo/K9ONabA6PE+iqEvzEQuzc9neipUqN/ij2RxMbpcQhc26Fa02sV1b
FpVxPFNaJWldl0XGsqfBujLnuSFAWoYOQsLJjZ0maZcX+BfNuzJtSlqQki6S
DElehZEluMxU9Jd1B3IoqyLPSzOZfJGc2uoe8rKV4yHOzLyoCv6b1miSO7NJ
SIdyR3bx7uYW+od/J5dX/N/X52Qi1+dn+O+bVyevX4f/mOgTN6+u3r0+6/+r
f/P06s2b88szeZk+TQYfTfbenPx5T/a1d/X29uLq8uT1HnbWDkRHqg6hzAx9
1ZqmbgypZJK6CelZ1hQz+oPeeXH69n/+++h58o9//Nv1y9OnR0ff/POf+sdv
jn79nP5YL00ls9mq3OifdLKbCR2GSRuWaVkmWVoXLVkpPesSR+dVJUvTGBLs
V3+BZP56nPxultVHz3+vH2DDgw+9zAYfssy2P9l6WYS446Md0wRpDj4fSXq4
3pM/D/72co8+/N0foKnJ/tFv/vD7yQQqdFG1jc27DEozGTtPOirXFiS3Quwk
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
D0+WeVpTAAA=

-->

</rfc>
