<?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.39 (Ruby 2.6.10) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-nandakumar-moq-tempo-00" category="std" consensus="true" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.0 -->
  <front>
    <title>TEMPO: Timing Extension for Media Playout Orchestration over MoQ</title>
    <seriesInfo name="Internet-Draft" value="draft-nandakumar-moq-tempo-00"/>
    <author initials="S." surname="Nandakumar" fullname="Suhas Nandakumar">
      <organization>Cisco</organization>
      <address>
        <email>snandaku@cisco.com</email>
      </address>
    </author>
    <author initials="C." surname="Jennings" fullname="Cullen Jennings">
      <organization>Cisco</organization>
      <address>
        <email>fluffy@iii.ca</email>
      </address>
    </author>
    <date year="2026" month="July" day="06"/>
    <area>Transport</area>
    <workgroup>MOQ</workgroup>
    <keyword>Internet-Draft</keyword>
    <abstract>
      <?line 54?>

<t>This document defines TEMPO (Timing Extension for Media Playout
Orchestration), a synchronized playout mechanism for media tracks
delivered over the Media over QUIC Transport (MoQT) protocol. The
Original Publisher stamps each object with when it should be played out
and when it was sent. Relays replace the send-time stamp with their own
clock as they forward, giving each subscriber a fresh timing reference
from its nearest relay. Subscribers use these timestamps to decide when
to render each object, and report their sync state directly to a
coordination server (PlaySyncServer) that can tell the media publisher
to adjust timing when subscribers fall behind.</t>
    </abstract>
  </front>
  <middle>
    <?line 67?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document specifies TEMPO (Timing Extension for Media Playout
Orchestration), a synchronization mechanism for the Media over QUIC
Transport (MoQT) protocol <xref target="MOQ-TRANSPORT"/>. MoQT enables distribution
of media content through relay networks. When multiple subscribers
receive the same track objects through different network paths,
achieving synchronized playback is challenging due to:</t>
      <ol spacing="normal" type="1"><li>
          <t>Clock skew between subscriber devices: Even with NTP
synchronization, consumer devices can drift by 10-100ms from
reference time.</t>
        </li>
        <li>
          <t>Variable network delays through different relay paths: Network
jitter and routing differences introduce additional delay variance
in delivery times.</t>
        </li>
        <li>
          <t>Lack of shared timing reference across the distribution network:
Publishers and relays operate on different clock domains without
coordination.</t>
        </li>
      </ol>
      <section anchor="motivation-and-use-cases">
        <name>Motivation and Use Cases</name>
        <section anchor="live-sports-event-synchronization">
          <name>Live Sports Event Synchronization</name>
          <t>Multiple viewers watching the same live sports event should see goals,
touchdowns, or key moments simultaneously to maintain the shared
experience and prevent spoilers through social media.</t>
          <t>Challenge: Viewers connected through different CDN nodes experience
50-300ms delivery variance, causing spoilers when some viewers see
goals before others.</t>
        </section>
        <section anchor="interactive-streaming-synchronization">
          <name>Interactive Streaming Synchronization</name>
          <t>Streamers conducting live Q&amp;A sessions or interactive games require
synchronized playback so that viewer reactions and comments align
temporally with the content. For example, Twitch-style interactive
streams with real-time polls and reactions.</t>
          <t>Challenge: Streamer asks question at T=0, but viewers see it at
T+100ms to T+400ms due to network variance, causing response timing
issues.</t>
        </section>
        <section anchor="multi-room-audio-system">
          <name>Multi-Room Audio System</name>
          <t>Distributed audio systems playing the same audio across multiple speakers
in the same room or adjacent rooms need precise synchronization to avoid audio artifacts and
maintain coherent sound.</t>
          <t>Challenge: Different network paths to each room cause echo effects.</t>
        </section>
        <section anchor="emergency-broadcasting">
          <name>Emergency Broadcasting</name>
          <t>Natural disaster alerts can play out on many devices at the same
locations and if they are not synchronized, it can make it harder to
understand the alert.</t>
          <t>Challenge: Multiple unsynchronized playouts in the same room make it harder
to understand audio.</t>
        </section>
        <section anchor="collaborative-viewing">
          <name>Collaborative Viewing</name>
          <t>Watch parties, online classrooms, and virtual meetings benefit from
synchronized playback to enable meaningful real-time discussion.</t>
          <t>Challenge: When participants can discuss what they are seeing in real
time, even small timing differences become noticeable and disruptive.</t>
        </section>
      </section>
      <section anchor="solution-overview">
        <name>Solution Overview</name>
        <t>TEMPO addresses these challenges by adding timing metadata to each
MoQT object. The Original Publisher (OrigPub) attaches two kinds of
information: a capture timestamp indicating when the media was captured,
paired with a playout delay that tells the subscriber how long after
capture time to present the object, and a hop timestamp indicating when
the object was last forwarded. As relays forward the object through the
network, each relay that has accurate time overwrites the hop timestamp
with its own current clock value. This means the subscriber always
receives a fresh timestamp from its closest relay, which it can compare
against its own local receive time and transport delay to estimate if
its clock is accurate or use for determining playout time.</t>
        <t>Subscribers use the capture timestamp, playout delay, and hop timestamp
to compute exactly when to render each object. If a subscriber finds
itself consistently falling behind the target, it reports this directly
to a PlaySyncServer — a coordination entity that receives feedback from
all subscribers and decides whether the playout delay needs to be
adjusted. If most subscribers are struggling, the PlaySyncServer tells
the OrigPub to increase the delay on future objects, giving everyone
more time to buffer and catch up.</t>
        <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
document are to be interpreted as described in RFC 2119.</t>
      </section>
    </section>
    <section anchor="tempo-object-extension-properties">
      <name>TEMPO Object Extension Properties</name>
      <t>This section defines three TEMPO Object Extension properties that carry
timing information on each object as it flows through the relay network.
Together, they give end subscribers enough information to determine when
to present each object and to detect when they are falling out of sync.</t>
      <section anchor="capturetimestamp">
        <name>CaptureTimestamp</name>
        <artwork><![CDATA[
CaptureTimestamp {
  Extension Type (i) = TBD2,
  Length (i),
  Timestamp (vi64)      // ms since unix epoch
}
]]></artwork>
        <t>The CaptureTimestamp tells the end subscriber the time
at which the start of the media in the object was captured. If the object
contains 20 ms of audio, this time indicates the time of the first
sample.</t>
        <t>The Original Publisher sets this value when it creates the object.
It is an immutable object property. This property is more accurate
when NTP support is available at the original publisher.</t>
      </section>
      <section anchor="playoutdelay">
        <name>PlayoutDelay</name>
        <artwork><![CDATA[
PlayoutDelay {
  Extension Type (i) = TBD1,
  Length (i),
  Delay (32)              // milliseconds, unsigned
}
]]></artwork>
        <t>The PlayoutDelay tells the end subscriber how long to wait after
the capture time of an object before presenting it. For example, if the
PlayoutDelay is 200ms, the subscriber should buffer the object
until the current time is 200 ms greater than the capture time.</t>
        <t>The Original Publisher sets this value when it creates the object.  It
is an immutable object property. If it is omitted, the value is assumed to be
the same as the previous object on the same track.</t>
      </section>
      <section anchor="hoptime">
        <name>HopTime</name>
        <artwork><![CDATA[
HopTime {
  Extension Type (i) = TBD3,
  Length (i),
  Timestamp (vi64)      // ms since unix epoch
}
]]></artwork>
        <t>The HopTime records when the object was last forwarded. The Original
Publisher initially sets it to its own current time when creating the
object. As the object passes through each relay, that relay overwrites
the HopTime with its own current clock value before forwarding. This
means the end subscriber always sees the timestamp of its closest
relay — the last node that touched the object before it arrived.</t>
        <t>By comparing the HopTime to its own local receive time, an end subscriber
can estimate the one-way network delay on the final hop. This is
valuable because it isolates the most variable part of the path
(the last mile to the subscriber) from the rest of the relay chain.
Comparing this to the QUIC RTT estimate can often allow a subscriber to
detect if its local clock is wrong.</t>
        <t>Unlike CaptureTimestamp and PlayoutDelay, HopTime is mutable. Every
relay that supports this extension MUST overwrite it with its own
current timestamp of approximately when it started sending the object.</t>
      </section>
      <section anchor="sync-support-parameter">
        <name>Sync Support Parameter</name>
        <t>Subscribers indicate their sync capabilities when they subscribe to a
track. This allows relays to know whether they need to perform HopTime
stamping.</t>
        <artwork><![CDATA[
Sync Support Parameter {
  Parameter Type (i) = TBD6,
  Parameter Length (i) = 0,
}
]]></artwork>
      </section>
    </section>
    <section anchor="architecture">
      <name>Architecture</name>
      <section anchor="topology">
        <name>Topology</name>
        <t>The system consists of an Original Publisher, a tree of relays, end
subscribers, and an optional application-defined PlaySyncServer. Media objects flow from the OrigPub down
through relays to subscribers. Subscribers report their sync state
directly to the PlaySyncServer (not through the relay network). The
PlaySyncServer communicates delay adjustments to the OrigPub which it uses to update the PlayoutDelay.</t>
        <artwork><![CDATA[
            ┌──────────────────┐
    ┌- ─ ──▶│  PlaySyncServer  │◀─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐
    │       └──────────────────┘                         │
               ▲ ▲ ▲   feedback (direct)                 │
    │          │ │ │                                     │
               │ │ │                                     │
┌───┴────┐     │ │ │                                     │
│OrigPub │     │ │ │                                     │
└───┬────┘     │ │ │                                     │
    │          │ │ │                                     │
    │ MOQ      │ │ │                                     │
    ▼          │ │ │                                     │
┌────────┐     │ │ │                                     │
│Relay A │     │ │ │                                     │
└┬──┬──┬─┘     │ │ │                                     │
 │  │  │       │ │ │                                     │
 │  │  └───────┼─┼─┼──────────-────────┐                 │
 │  │          │ │ │                   │                 │
 ▼  ▼          │ │ │                   ▼                 │
┌───────┐  ┌───────┐              ┌─────────┐            │
│Relay B│  │Relay C│              │  End    │─ ─ ─ ─ ─ ─ ┘
└───┬───┘  └───┬───┘              │  Sub-3  │
    │          │                  └─────────┘
    ▼          ▼
┌─────────┐ ┌─────────┐
│  End    │ │  End    │
│  Sub-2  │ │  Sub-1  │
└─────────┘ └─────────┘
]]></artwork>
        <t>─── Solid lines: media flow (OrigPub → Relays → Subscribers) via MOQ
─ ─ Dashed lines: subscriber feedback directly to PlaySyncServer
─ ─ PlaySyncServer → OrigPub: timing adjustments (signaling)</t>
      </section>
      <section anchor="scope">
        <name>Scope</name>
        <t>The mechanism by which end subscribers discover the PlaySyncServer is
out of scope for this specification. The signaling protocol used by
subscribers to report feedback directly to the PlaySyncServer (e.g.,
MoQ Metrics, HTTP, or other mechanism) is also out of scope. Similarly,
the specific signaling protocol between the PlaySyncServer and the OrigPub
is also out of scope.</t>
      </section>
      <section anchor="ntp-scenarios">
        <name>NTP Capability Scenarios</name>
        <t>Not all deployments have NTP available on every node. This specification
supports three scenarios depending on which nodes have synchronized
clocks:</t>
        <t>Scenario 1: OrigPub, Relays, and End Subscribers are all NTP
capable. This is the ideal case. The OrigPub sets a CaptureTimestamp and
PlayoutDelay on each object, and subscribers simply present the object
at the playout time which is the capture time plus the playout
delay. HopTime is still useful for monitoring delay and detecting that
the end subscriber has NTP synchronized time but is not strictly needed
for playout decisions.</t>
        <t>Scenario 2: OrigPub and Relays are NTP capable, but End Subscribers are
not. The OrigPub still sets CaptureTimestamp and PlayoutDelay to
compute a playout time. The end subscriber estimates NTP time using
the HopTime and adding half of the RTT estimate from the QUIC transport
that provided the HopTime. These values can be smoothed and, along with
an unsynchronized local clock, can be used to get a close estimate of NTP
time.</t>
        <t>Scenario 3: Only Relays are NTP capable. The OrigPub itself has no
synchronized clock but it can subscribe to its own media to estimate NTP time
in the same way the end subscriber does in Scenario 2.</t>
      </section>
      <section anchor="original-publisher-origpub">
        <name>Original Publisher (OrigPub)</name>
        <t>The Original Publisher is responsible for creating media objects and
attaching the timing metadata that drives synchronization. When it
creates each object, it sets the CaptureTimestamp and
PlayoutDelay to indicate when the object should be presented. It also
sets the initial HopTime to its own current time.</t>
        <section anchor="steady-state-timing">
          <name>Steady-State Timing</name>
          <t>During normal operation, the OrigPub increments CaptureTimestamp on
each successive object by the media frame duration. For example, if
the track carries 20ms audio frames, each object's CaptureTimestamp is
20ms later than the previous one. The PlayoutDelay remains constant
unless adjusted by the PlaySyncServer. This produces a continuous,
evenly spaced playout schedule that subscribers follow.</t>
        </section>
        <section anchor="playoutdelay-updates-from-playsyncserver">
          <name>PlayoutDelay updates from PlaySyncServer</name>
          <t>The OrigPub receives timing adjustment instructions from the PlaySyncServer.
When the PlaySyncServer decides (based on subscriber feedback it
receives directly) that the playout target needs to change — for
example, increasing delay by 100ms — the OrigPub applies that correction
to the next object it produces and continues incrementing by the media
frame duration from the new baseline onward. The effect is a one-time
shift in the playout schedule; all subsequent objects maintain the same
spacing relative to the corrected point.</t>
          <artwork><![CDATA[
  Frame duration = 20ms, correction = +100ms at object N

  Object:   N-2      N-1       N        N+1      N+2
  Target:   T+40     T+60    T+180     T+200    T+220
                              ▲
                              │ correction applied here
                              │ (+100ms added to baseline)
]]></artwork>
        </section>
      </section>
      <section anchor="relays">
        <name>Relays</name>
        <t>When forwarding an object, a relay MUST replace the HopTime value
with its own current timestamp of approximately when it started sending the object.</t>
        <t>Relays MUST use NTP-synchronized clocks when generating HopTime
values.</t>
        <t>Relays SHOULD only perform HopTime stamping when at least one downstream
subscriber has indicated sync support in its SUBSCRIBE parameters, to
avoid unnecessary processing overhead.</t>
      </section>
      <section anchor="playsyncserver">
        <name>PlaySyncServer</name>
        <t>The PlaySyncServer is a logical service defined by the application
that receives feedback directly from all subscribers and
communicates with the OrigPub to issue timing adjustments. It is responsible
for observing the health of synchronization across all subscribers and making
decisions about whether timing needs to change.</t>
        <t>The PlaySyncServer MUST implement the following decision logic based
on aggregated subscriber feedback:</t>
        <ul spacing="normal">
          <li>
            <t>If all subscribers report sync state within acceptable bounds, the
PlaySyncServer MUST NOT issue any timing adjustments.</t>
          </li>
          <li>
            <t>If a majority of subscribers report falling behind by a consistent
amount, the PlaySyncServer SHOULD instruct the OrigPub to increase the
PlayoutDelay on subsequent objects by the reported deficit.</t>
          </li>
        </ul>
        <t>The PlaySyncServer SHOULD implement hysteresis to avoid oscillation.</t>
      </section>
    </section>
    <section anchor="optimized-forms">
      <name>Optimized Forms</name>
      <section anchor="short-timestamps">
        <name>Short Timestamps</name>
        <t>The timestamps will typically encode to about a 6 byte integer in MoQ.
In many applications, there is no requirement to sync media that
is delivered more than a few seconds outside of the desired playout
time. These applications can send just the low order 14 bits of the
timestamps which are referred to as short timestamps.</t>
        <t>If the application receives a timestamp less than 16384, it is assumed
to be a short timestamp. The receiver computes the full timestamp by
taking its current time, replacing the lower 14 bits with the received
short timestamp, then if that result is greater than the current time,
subtracting 16384.</t>
      </section>
      <section anchor="periodic-marking">
        <name>Periodic Marking</name>
        <t>There is no need to send markings with every object for applications that
send objects at a constant rate. Receivers can look at two existing
timestamps and extrapolate the timestamps of other objects that are near
the same time. Typically these applications also know the rate of the
objects.</t>
        <t>An original publisher that uses periodic marking needs to consider:</t>
        <ul spacing="normal">
          <li>
            <t>If the objects are over datagrams, consider sending information in multiple
objects in case one is lost.</t>
          </li>
          <li>
            <t>If subscribers join mid track, how quickly will they discover the
synchronization information.</t>
          </li>
        </ul>
        <t>A typical strategy might be to send the timestamp and playout delay
information once every 200ms.</t>
      </section>
      <section anchor="time-aligned-groups">
        <name>Time Aligned Groups</name>
        <t>Many applications can have a direct linear function between the MoQ
group ID and the capture timestamps. The relationship is defined by an
object rate per 720 seconds and the time offset of the first object in
the first group.</t>
        <t><tt>
  CaptureTimestamp = GroupID * 720000 / objectsPer720s + startTime
</tt></t>
        <t>Where:</t>
        <ul spacing="normal">
          <li>
            <t><tt>objectsPer720s</tt> is the number of objects produced in 720 seconds
(e.g., for 30 fps video: 30 × 720 = 21600).</t>
          </li>
          <li>
            <t><tt>startTime</tt> is the capture timestamp of the first object in group 0,
expressed in milliseconds since the NTP epoch.</t>
          </li>
          <li>
            <t><tt>CaptureTimestamp</tt> is the resulting capture time in the same units as
<tt>startTime</tt>.</t>
          </li>
        </ul>
        <t>The constant 720000 (= 2^7 × 3^2 × 5^4) was chosen to allow a wide
range of common frame rates to be exactly represented as integer
divisors. RTP often uses 90000 but high frame rates for slow motion
video such as 480 fps do not evenly divide into 90000, whereas they
do divide evenly into 720000.</t>
        <t>The <tt>objectsPer720s</tt> and <tt>startTime</tt> can be communicated out of band,
for example, in the catalog.</t>
        <t>If the publisher uses Time Aligned Groups, it MUST choose the group
number to correctly represent the capture time of the first object in
the group based on the out of band rate and start time. End Subscribers
can use the group ID to recreate the capture time of the first object in
the group. The capture times for subsequent objects within a group can
be derived by adding <tt>720000 / objectsPer720s</tt> for each object offset.</t>
        <t>If end subscribers are aware that groups are time-aligned, there
is no need to include the CaptureTimestamp property.</t>
        <t>TODO - add extension to catalog to carry this information</t>
      </section>
      <section anchor="catalog-based-playout-delay">
        <name>Catalog Based Playout Delay</name>
        <t>For many applications the Catalog can be used to deliver the
PlayoutDelay for a track. If the logical PlaySyncServer wants to update
the PlayoutDelay, a new version of the catalog can be pushed with delta
encoding on a catalog track that all the clients subscribe to.</t>
        <t>TODO - define extension to catalog to carry PlayoutDelay.</t>
      </section>
    </section>
    <section anchor="end-subscribers">
      <name>End Subscribers</name>
      <t>End subscribers compute playout times from the timing metadata and
report sync state to the PlaySyncServer.</t>
      <section anchor="computing-playout-target">
        <name>Computing Playout Target</name>
        <t>The subscriber estimates one-way delay from its closest relay:</t>
        <artwork><![CDATA[
  D_oneway = ReceiveTime - HopTime
  D_baseline = min(D_oneway) over recent observations
]]></artwork>
        <t>The playout target depends on the NTP scenario (see <xref target="ntp-scenarios"/>):</t>
        <t>Scenario 1 (all nodes have NTP):</t>
        <artwork><![CDATA[
  T_playout = CaptureTimestamp + PlayoutDelay
]]></artwork>
        <t>Scenario 2 (subscribers lack NTP):</t>
        <artwork><![CDATA[
  T_playout = ReceiveTime + PlayoutDelay - (D_oneway - D_baseline)
]]></artwork>
        <t>Scenario 3 (only relays have NTP):</t>
        <artwork><![CDATA[
  T_playout = HopTime + PlayoutDelay + D_baseline
]]></artwork>
      </section>
      <section anchor="sync-feedback">
        <name>Sync Feedback</name>
        <t>Subscribers SHOULD periodically report their sync state to the
PlaySyncServer. The PlaySyncServer uses these reports to determine
whether a systemic issue exists and, if so, instructs the OrigPub to
adjust PlayoutDelay on future objects.</t>
      </section>
      <section anchor="drift-and-jump-handling">
        <name>Drift and Jump Handling</name>
        <t>End subscribers MUST be prepared to handle clock drift (gradual
divergence between local and relay clocks) and delay jumps (sudden
shifts from route changes or congestion events). Implementations
SHOULD apply local compensation to maintain playout continuity and
report persistent drift or jumps to the PlaySyncServer.</t>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Subscribers MAY implement
reasonableness checks — for example, verifying that HopTime values are
monotonically increasing and that the delta between consecutive objects'
HopTime values is bounded.</t>
      <t>The connection between the OrigPub and PlaySyncServer MUST be authenticated and
integrity-protected to prevent injection of false playout targets.</t>
      <t>Malicious subscribers could send fabricated feedback reports claiming to be
far behind, tricking the PlaySyncServer into unnecessarily increasing playout
delay for everyone. The PlaySyncServer SHOULD implement rate limiting on
reports and outlier detection to identify and filter anomalous feedback.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document requests the following IANA registrations:</t>
      <ul spacing="normal">
        <li>
          <t>TBD1: PlayoutDelay Object Extension Type</t>
        </li>
        <li>
          <t>TBD2: CaptureTimestamp Object Extension Type</t>
        </li>
        <li>
          <t>TBD3: HopTime Object Extension Type</t>
        </li>
        <li>
          <t>TBD6: Sync Support Subscribe Parameter Type</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="MOQ-TRANSPORT">
          <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="12" month="May" 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-18"/>
        </reference>
        <reference anchor="RFC2119" target="https://tools.ietf.org/rfc/rfc2119.txt">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author initials="S." surname="Bradner" fullname="S. Bradner">
              <organization/>
            </author>
            <date year="1997"/>
          </front>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="NTP" target="https://tools.ietf.org/rfc/rfc5905.txt">
          <front>
            <title>Network Time Protocol Version 4: Protocol and Algorithms Specification</title>
            <author initials="D." surname="Mills" fullname="D. Mills">
              <organization/>
            </author>
            <date year="2010"/>
          </front>
        </reference>
        <reference anchor="PTP" target="https://standards.ieee.org/standard/1588-2019.html">
          <front>
            <title>IEEE Standard for a Precision Clock Synchronization Protocol for Networked Measurement and Control Systems</title>
            <author initials="" surname="IEEE" fullname="IEEE">
              <organization/>
            </author>
            <date year="2020"/>
          </front>
        </reference>
      </references>
    </references>
  </back>
  <!-- ##markdown-source:
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
MMn6LU89POyf0knqNjjtov4fNrzCbntVAAA=

-->

</rfc>
