<?xml version="1.0" encoding="UTF-8"?>
  <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
  <!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.5.11 -->

<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.2119.xml">
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.8174.xml">
<!ENTITY RFC9000 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9000.xml">
<!ENTITY I-D.cardwell-iccrg-bbr-congestion-control SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.cardwell-iccrg-bbr-congestion-control.xml">
<!ENTITY I-D.ietf-quic-ack-frequency SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-quic-ack-frequency.xml">
<!ENTITY I-D.ietf-moq-transport SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference.I-D.ietf-moq-transport.xml">
<!ENTITY RFC9406 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/reference.RFC.9406.xml">
]>


<rfc ipr="trust200902" docName="draft-huitema-ccwg-bbr-realtime-00" category="info" consensus="true" submissionType="IETF">

  <front>
    <title abbrev="BBR-Realtime">BBR Improvements for Real-Time connections</title>

    <author initials="C." surname="Huitema" fullname="Christian Huitema">
      <organization>Private Octopus Inc.</organization>
      <address>
        <email>huitema@huitema.net</email>
      </address>
    </author>
    <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="2024" month="July" day="04"/>

    <area>Web and Internet Transport</area>
    
    <keyword>BBR</keyword> <keyword>Realtime Communication</keyword> <keyword>Media over QUIC</keyword>

    <abstract>


<t>We are studying the transmission of real-time Media over QUIC. There are
two priorities: maintain low transmission delays by avoiding building queues, and
use the available network capacity to provide the best possible
experience. We found through experiments that while the BBR algorithm
generally allow us to correctly and timely assess network capacity,
we still see "glitches" in specific conditions, in particular when
using wireless networks. We analyze these issues and
propose small changes in the BBR algorithm that could improve the quality
of experience delivered by the real-time media application.</t>



    </abstract>


  </front>

  <middle>


<section anchor="introduction"><name>Introduction</name>

<t>When designing real-time communication applications over QUIC, we want to
maintaining low transmission delays but provide the best possible
experience that the current transmission capacity allows. We elected
to use the version 3 of the BBR congestion control algorithm
(see <xref target="I-D.cardwell-iccrg-bbr-congestion-control"/> and
<xref target="BBRv3-Slides"/>).
We found through experiments that while the BBR algorithm
generally allow us to correctly and timely assess network capacity,
we still see "glitches" in specific conditions, during which the
BBR algorithm either allows the building of unnecessary queues or
unnecessarily restrict the transmission rate of the application.</t>

<t>The real-time application carries media over QUIC in a series of
QUIC streams <xref target="RFC9000"/>. Each of these streams is marked with a scheduling priority.
For example, in a "simulcast" service, audio packets may be sent as QUIC datagrams
scheduled at a high priority, then a low definition version of the video
stream in a QUIC stream marked at the next highest priority, then medium
definition video in another stream, then high definition video in the lowest
priority stream. At any given time, the sender would schedule data according
to the connection's capacity as evaluated by the congestion control algorithm.
If the path has a high capacity the receiver will receive all QUIC streams and
enjoy a high definition experience. If the capacity is lower, the higher
definition streams will be delayed but the receiver will reliably obtain
the medium or low definition version of the media.</t>

<t>This real-time retransmission strategy relies on timely assessment of the
path capacity by the congestion control algorithm. If the assessment is delayed,
the scheduling algorithm will make wrong decisions, such as wrongly believing that
the path does not have the capacity to send high definition media, or in contrast
sending high definition media and causing queues and maybe packet losses
because the lowering of the path capacity has not yet been detected.</t>

<t>Other real-time applications may use different categories of traffic than low
or high definition video, but they will follow the general principle of trying
to schedule just the right amount of transmission to obtain a good experience
without creating queues.</t>

<t>Real-time transmissions have a variable data rate. Different media codecs have
different behavior, but a common pattern is to periodically send "fully encoded"
frames, followed by series of "differentially encoded" frame. The fully encoded
frames serve as possible synchronization points at which a recipient can start
rendering data, while the differentially encoded frames can only be processed
if the previous frames have been received. This structure create periodic peaks
of traffic, during which the connection might experience some for of congestion,
followed by long periods of relatively low bandwidth demand, which the congestion
control algorithm may treat as "application limited". Of course, if the bandwidth
is too low, even the differentially encode frame may create some congestion. In the
simulcast structure, the application would react to congestion by delaying the higher definition
video channels.</t>

<t>In our experience, we see that BBR generally works well for these applications.
However, we see problems
in the early stage of the connection, when the path capacity is not yet
assessed, and during sudden transitions, such as experienced in Wi-Fi networks.
There are also details of the algorithm that work poorly when the traffic
alternate between periodic congestion and application limited periods.</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</bcp14>
NOT", "<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>

</section>
<section anchor="problem-statement"><name>Problem statement</name>

<t>With BBRv3, we see less than ideal "real-time" performance during the initial phase
of the connection, during Wi-Fi suspension events, or when the quality of the
wireless transmission changes suddenly. We also see anomalous behavior that may
be tied to the "application limited" nature of the application.</t>

<t>These issues are developed in the following sections.</t>

<section anchor="startup-queues"><name>Extra delays during initial startup</name>

<t>At the beginning of the connection, BBR is initially in Startup state.
In Startup BBR sets BBR.pacing_gain to BBRStartupPacingGain (2.77) and BBR.cwnd_gain to
BBRStartupCwndGain (2). BBR exits the end of the startup phase when the estimated bandwidth
does grow significantly (by at least 25%) for 3 consecutive rounds, or if packet losses
are detected. This results in
an algorithm that robustly discovers the bottleneck bandwidth. Inconveniently for
us, is also results in building significant queues.</t>

<t>Towards the end of the Startup phase, we reach a point when both the bottleneck bandwidth
and the min RTT have been correctly estimated. After that point, per specification, the
pacing rate will be set to 2.77 times the bottleneck bandwidth, and the CWND to
twice the product of estimated bandwidth and min RTT. Since the pacing rate is significantly
larger than the bottleneck capacity, packets will be queued at the bottleneck. If the
bottleneck has sufficient buffers, the queue
size will increase until the amount of bytes in transit matches the CWND value. The RTT
will increase to twice the min RTT, and will remain at that level for 3 roundtrips, which
means 6 times the minimum RTT.</t>

<t>The extra buffers and the extra delays do affect the performance of real time application.
The application will end up sending more "low priority" data than necessary, resulting in
a form of "priority inversion" as high priority data are queued and low priority data are
delivered during the "draining" phase that follows startup.</t>

</section>
<section anchor="early-sensitivity"><name>Sensitivity to early bandwidth estimation</name>

<t>After Startup and Drain, BBR will enter the ProbeBW state. BBRv2 organizes those as
series of epochs, each composed of a ProbeBW-Down rounds, a variable number of ProbeBW-Cruise
rounds, a ProbeBW-Refill round, and finally a series of ProbeBW-Up phases. The number of
ProbeBW-Cruise rounds is computed so that BBR competes fairly with other congestion
control algorithms like Reno or Cubic. In some conditions, there can be up to 60 rounds
of ProbeBW-Cruise, during which the pacing rate will never exceed the bandwidth
estimated previously.</t>

<t>If BBR exited the Startup state too soon for any reason, the large number of ProbeBW-Cruise
causes the connection to retain a very low pacing rate for a long time. In real time
applications, this could mean using a much lower video definition than actual bandwidth permits.</t>

</section>
<section anchor="suspension"><name>Wi-Fi suspension</name>

<t>We observed that Wi-Fi networks often go into "suspension" for brief intervals
(see <xref target="Wi-Fi-Suspension-Blog"/>, typically of 100 to 200ms. During the transmission,
the Wi-Fi radio appears to be turned off, or maybe switched to a different channel.
Packets sent by the application during the interval are kept in a queue for the Wi-Fi driver.
Packets sent by remote nodes are at the Wi-Fi router. After the suspension, queued
packets are sent. There is generally no packet loss, merely an added delay. We have
observed this behavior on multiple Wi-Fi networks, using different brands of Wi-Fi
equipment and different operating systems. We can speculate about the cause of the
suspension, such as exploring alternative Wi-Fi channels or saving energy.</t>

<t>When Wi-Fi suspension happens, the sender, using BBR, keeps sending at the computed
pacing rate as long as the congestion window allows -- these packets will be queued.
The suspension often lasts longer than 1 PTO, at which point no new data will be sent
but some queued packets maybe repeated. Then, at the end of the suspension,
the sender starts receiving ACK from the peer that were queued at the router.
BBR refreshes the congestion parameters, and start polling the application.
New data will be sent in order of priority, ending with the 1080p frames.</t>

<t>We can describe this process as a succession of phases:</t>

<t><list style="symbols">
  <t>Normal transmission, at the application "nominal" rate when all quality
levels are sent, with no queue.</t>
  <t>Undetected suspension, during which queues are building up with a mix of
data of various priority levels</t>
  <t>Detected suspension, during which no more data is sent and new audio or
video frames are kept in application queues.</t>
  <t>End of suspension, during which the Wi-Fi driver sent the queued packets,</t>
  <t>Resumption, during which the sender using BBR progressively ramps up the
sending rate and dequeues the frames stuck in application queues, in order of priority</t>
  <t>and back to normal state, when the application queues are emptied rapidly.</t>
</list></t>

<t>The driver queue fills during the "undetected suspension" state, which currently lasts one PTO,
i.e., a bit more than one RTT. So we get at least one RTT worth of audio, 360p, 720p and 1080p
frames in the pipe-line, typically queued in front of the Wi-Fi driver. These frames
will be delivered by the network before any other frame sent during the "resumption".
We will observe some kind of "priority inversion".</t>

<t>If new suspension happens shortly after the first one interval, it may catch the system
during the "resumption" state. During that state, the sender may have ramped up the data
rate to match the underlying network rate (maybe 100 Mbps) and empty the application
queues quickly. The transmission rate may be several times the normal rate. The amount
of frames queued in front of the Wi-Fi driver will be several times more than during
the first suspension. The "priority inversion" effect will be much larger. Depending
on random events, we may see the 360p video freezing while the 1080p video is still animating.</t>

</section>
<section anchor="spotty-or-bad-wi-fi-transmission"><name>Spotty or Bad Wi-Fi Transmission</name>

<t>Wi-Fi bandwidth can drop suddenly due to small changes in the position or orientation
of the device, or if a mobile obstacle like a human body moves into the path of
transmission. We see small events causing a drastic reduction in bandwidth, and
sometimes a marked increase in packet loss rates. We expect that the congestion
control algorithm will quickly detect the bandwidth reduction, and inform the
application, but in practice the detection always lag the event.</t>

<t>As in the Wi-Fi suspension scenario, the delay in detecting the bandwidth reduction
causes priority inversions. The application will continue sending data at the previously
allowed rate for some time, which will cause less important packets (say 1080p)
to be enqueued for transmission. These packets will likely be queued in front of
the Wi-Fi driver, and will be transmitted before any more urgent data can be sent.</t>

<t>BBRv3 will reduce the CWND quickly if packet losses are detected, but these losses
will typically only be detected after a couple of RTT -- or maybe more if the
packet queues are allowed to grow to large sizes. The effect is amplified if the
pacing rate or the CWND was over estimated before the event, maybe because the
connection was application limited.</t>

<t>The bandwidth will be restored when the position or orientation of the device
changes again, or if the obstacles are removed. When that happens, we expect
that the congestion control algorithm will find out rapidly and let the application
resume full transmission, but this will only happen after when BBR reaches the
ProbeBW UP state, which may take a large number of RTTs with BBR v3.</t>

</section>
<section anchor="downward-drift"><name>Downward drift</name>

<t>In addition to suspension, we also observe that the congestion control API tends to gradually drop the packing rate over the long run.</t>

<t>It seems that the application never fully uses the available rate, and that successive queuing events cause the bandwidth to go down progressively. Maybe we have something systematic here? The application always stays within the limits posed by congestion control, which means that the measured rate will always be lower than the allowed rate. BBR sometimes move to a "probe BW UP" state, but the application does not appear to push much more transmission during that state, so the measured rate does not really increase.</t>

<t>The hypothesis is that the application never sends faster than pacing permits, so there is some kind of negative feedback loop.</t>

<t>The downward spiral may be compounded by the practice of resetting streams that have fallen behind.
A new stream will be restarted for the next block of frames,
starting with the next I-Frame, using the "stream per group" approach defined in
<xref target="I-D.ietf-moq-transport"/>.
The application will try to send more data at that point, but the
probing rate will stay low until until the next "probe BW UP" phase, which may be a few seconds away.
When BBR probes for more data, the high speed stream may have already been reset, and the offered
bandwidth will not really "push up" the data rate.</t>

</section>
<section anchor="lingering"><name>Lingering in Probe BW UP state</name>

<t>The offered rate of real-time application alternates between rare peaks during the
transmission of I-Frames, and a lower data rate between these frames. In a typical
setup, BBR will operate in "application limited" mode most of the time, except
maybe during the transmission of I-Frames, or if the network becomes congested.</t>

<t>If BBR reaches the Probe BW UP state while application limited, it will only exit
that state when the next I-Frames are sent, which may be seconds away, or if congestion
happens. When congestion or Wi-Fi suspension happens in that state, both the
pacing rate and the congestion window will be larger than the "cruise" value.
In the case of congestion, the connection will remain in
Probe BW UP state during three rounds. This
will exacerbate the building of queues and the occurrence of priority inversion
during congestion events.</t>

</section>
</section>
<section anchor="improv"><name>Proposed improvements</name>

<t>We implemented several improvements to BBR for handling real time applications:</t>

<t><list style="symbols">
  <t>implement an "early exit" from startup.</t>
  <t>add an option for rapid start of ProbeBW-Up,</t>
  <t>add explicit handling of "suspension" to BBR,</t>
  <t>add detection of feedback loss to minimize building of queues during suspension,</t>
  <t>exiting Probe BW UP on delay increase,</t>
  <t>entering Probe BW UP after new streams are started</t>
</list></t>

<section anchor="exit-startup-early-upon-rtt-increase"><name>Exit startup early upon RTT increase</name>

<t>BBR exits start up if packet losses are observed, or if the estimated bottleneck bandwidth
does not increase for 3 rounds. We added a third exit condition, exit the startup state if the RTT increases too much.</t>

<t>We defined too much as "the RTT measurement is at least 25% larger than the min RTT. However, there
can be significant jitter in RTT measurements, and we do not want to exit startup based
solely on an event caused by random circumstances. Instead, we exit Startup only if
7 consecutive measurements of the RTT are significantly larger than the Min RTT.</t>

<t>Even with the requirement of 7 measurements, there is still a risk that spurious events cause
early exit of startup while the bandwidth is not properly assessed. We mitigate these risks
by requiring an early entry in ProbeBW-Up state during the first ProbeBW epoch after StartUp.</t>

</section>
<section anchor="rapid-entry-into-probebw-up"><name>Rapid entry into ProbeBW-Up</name>

<t>We add to the BBR state a flag "bw_probe_quickly", to signal a desire to enter the ProbeBW-Up
state at the first opportunity. When that flag is set, instead of moving to the ProbeBW-Cruise
state at the end of the ProbeBW-Down round, BBR moves directly to ProbeBW-Refill and then ProbeBW-UP.
The flag is cleared after starting ProbeBW-UP.</t>

<t>During each round of ProbeBW-Up, BBR will increase the pacing rate to 25% more than the measured
value. The combination of exiting Startup after a delay test and then starting ProbeBW-UP quickly
is very similar to the two phases of Hystart++ <xref target="RFC9406"/>.</t>

</section>
<section anchor="explicit-handling-of-suspension"><name>Explicit handling of suspension</name>

<t>During Wi-Fi suspension, the BBR endpoint will not receive any acknowledgement. This
will cause the PTO and then RTO timers to expire. We handle that issue by adding a
"PTO recovery" flag to the BBR state. The flag is set if a PTO event occurs, at which
point BBR enters "packet conservation" mode, in which only a single packet is sent
after each PTO or RTO event.</t>

<t>The first acknowledgement receiver after setting the PTO recovery flag causes the flag
to be cleared, and BBR to reenter the "Startup" state.</t>

</section>
<section anchor="detection-of-feedback-loss"><name>Detection of feedback loss.</name>

<t>Detecting suspension by waiting for a PTO works, but still allows transmission of a full
CWND worth of packets between the start of the suspension and the PTO timer. We mitigate
that by adding a "feedback lost" event.</t>

<t>In normal operation, successive acknowledgements are received at short intervals.
These intervals can be predicted if the QUIC implementation supports the "ACK Frequency"
extension <xref target="I-D.ietf-quic-ack-frequency"/>, which directs the peer to acknowledge
packets before a maximum delay. The "feedback lost" event is set if expected
packet acknowledgements do not arrive after twice the predicted interval.</t>

<t>Our modified BBR code reacts to this event by resetting the CWND to the current "in-flight" value,
which effectively prevents adding new packets until a next acknowledgement is received.
The "feedback lost" event typically arrives sooner than the PTO event, and thus helps
avoiding queue building
during the "undetected" phase of suspension defined in <xref target="suspension"/>.</t>

</section>
<section anchor="exit-probebw-up-on-delay-increase"><name>Exit ProbeBW-Up on delay increase.</name>

<t>We added a test of delay increase when in ProbeBW-Up state. This helps avoiding build
excessive queues in ProbeBW-up state, and it also avoids lingering in ProbeBW-up state
(see <xref target="lingering"/>).</t>

</section>
<section anchor="entering-probebw-up-on-the-creation-of-new-streams"><name>Entering ProbeBW-UP on the creation of new streams</name>

<t>The bandwidth drift issue happens largely because there is no synchronization between
the increase of bandwidth demand and the probing cycle of BBR. We are considering adding
a mechanism to synchronize bandwidth probing with period of higher bandwidth demand,
characterized for example with the beginning of new streams.</t>

<t>At the time of this writing, this synchronization mechanism is not yet implemented.</t>

</section>
</section>
<section anchor="failed-experiments"><name>Failed experiments</name>

<t>In <xref target="improv"/>, we provide a list of improvements to BBR to better serve real-time applications.
We validated these improvements with a mix of simulations and real-life testing. We also considered
other improvements, which appeared logical at first sight but were not validated by simulations or
experience: pushing the bandwidth limit by injecting fake traffic; and,</t>

<section anchor="push-limits-with-fake-traffic"><name>Push limits with fake traffic</name>

<t>We were concerned that BBR did not exploit the full bandwidth of the connection. Real-time
applications often appear "bandwidth limited", and the bandwidth discovered by BBR is never
greater than the highest bandwidth previously used by the application. This can slow down the
transmission of data during peaks,
for example when the video codec decides to produce a "self referenced" frame (sometimes called I-Frame). To solve that, we tried an option to add "filler" traffic during the "probe BW UP" phases,
instructing the QUIC code to schedule redundant copies of the previously transmitted packets in order
to "fill the pipe".</t>

<t>This did not quite pan out. The various simulation did not show any particular improvement, and
in fact some test cases show worse results. Pushing the bandwidth limits increases the risk
of filling bottleneck buffers and causing queues or losses, and discovering a high bandwidth did not really compensate for that.</t>

<t>The theoretical case for injecting fake traffic during just a few segments of the connection is
also weak. Suppose that multiple connections competing for the same bottleneck do that. If they
probe the bandwidth at different times, they may all find that there is a lot of capacity available.
But if all the connection try to use that bandwidth, they will experience congestion.
Similarly, if a real time connection competes with an elastic connection, the elastic
connection may back off a little when the real-time connection is probing, but it will
quickly discover and consume the available bandwidth after that. If the application wanted
to "reserve" a higher bandwidth, it would probably need to inject filler traffic all the time, to
"defend" its share of bandwidth. We were not sure that this would be a good idea.</t>

</section>
<section anchor="flow-control-low-priority-streams"><name>Flow control low priority streams</name>

<t>We tested adding fewer packets in transit for low priority flows so there will be fewer "priority inversions" during events like Wifi Suspension. We implemented that using QUIC's flow control
functions. The results did not really confirm our hypothesis. The change appears to create two
competing effects:</t>

<t><list style="symbols">
  <t>having fewer packets in transit does limit the priority inversions, and some tests to show a (very
small) improvement,</t>
  <t>but when the low priority flows are rate limited, their load gets spread overtime, instead of
being dealt with immediately when plenty of bandwidth is available. This means more packets
lingering over time and thus more priority inversions during network events.</t>
</list></t>

<t>The measurements also show that any random change in scheduling does create random changes in
performance, which means that observing small effects can be very misleading. Given the lack of
compelling results, we did not push the idea further.</t>

</section>
</section>
<section anchor="security-considerations"><name>Security Considerations</name>

<t>We do not believe that changes in the BBR implementation introduce new security issues.</t>

</section>
<section anchor="iana-considerations"><name>IANA Considerations</name>

<t>This document has no IANA actions.</t>

</section>


  </middle>

  <back>

    <references title='Normative References'>

&RFC2119;
&RFC8174;


    </references>

    <references title='Informative References'>

&RFC9000;
&I-D.cardwell-iccrg-bbr-congestion-control;
&I-D.ietf-quic-ack-frequency;
&I-D.ietf-moq-transport;
<reference anchor="BBRv3-Slides" target="https://datatracker.ietf.org/meeting/117/materials/slides-117-ccwg-bbrv3-algorithm-bug-fixes-and-public-internet-deployment-00">
  <front>
    <title>BBRv3: Algorithm Bug Fixes and Public Internet Deployment</title>
    <author initials="N." surname="Cardwell">
      <organization></organization>
    </author>
    <author initials="Y." surname="Cheng">
      <organization></organization>
    </author>
    <author initials="K." surname="Yang">
      <organization></organization>
    </author>
    <author initials="D." surname="Morley">
      <organization></organization>
    </author>
    <author initials="S." surname="Hassas Yeganeh">
      <organization></organization>
    </author>
    <author initials="P." surname="Jha">
      <organization></organization>
    </author>
    <author initials="Y." surname="Seung">
      <organization></organization>
    </author>
    <author initials="V." surname="Jacobson">
      <organization></organization>
    </author>
    <author initials="I." surname="Swett">
      <organization></organization>
    </author>
    <author initials="B." surname="Wu">
      <organization></organization>
    </author>
    <author initials="V." surname="Vasiliev">
      <organization></organization>
    </author>
    <date year="2023" month="July"/>
  </front>
  <seriesInfo name="Materials for IETF 117 Meeting" value=""/>
</reference>
<reference anchor="Wi-Fi-Suspension-Blog" target="https://www.privateoctopus.com/2023/05/18/the-weird-case-of-wifi-latency-spikes.html">
  <front>
    <title>The weird case of the wifi latency spikes</title>
    <author initials="C." surname="Huitema">
      <organization></organization>
    </author>
    <date year="2023" month="May"/>
  </front>
  <seriesInfo name="Christian Huitema's blog" value=""/>
</reference>
&RFC9406;


    </references>


<section numbered="false" anchor="acknowledgments"><name>Acknowledgments</name>

<t>TODO acknowledge.</t>

</section>


  </back>

<!-- ##markdown-source:
H4sIADyDh2YAC9Vc2bIbx5F9r6+oAWNiJBkALylZkjmLzdWiLS5DXpmhmJhw
FLoLQOs2uqFeLggx+C/zLfNlkycza2kAlPU6irCJC3TXkpWVefJkVi0WCzNU
Q+0f2NmjR2/s892+a2/9zjdDb9dtZ994Vy+uq523Rds0vhiqtulnxq1Wnb+V
lxZ4ZqBHZqZwg9+03fGBrZp1a0zZFo3bUeNl59bDYjtWg9+5RVEcNgtqYdHp
m4urK9OPq13V99T+cNzTK8+fXj8zzbhb+e6BKanhB4aG0PumH/sHduhGb6p9
x5/64f7V1R+u7htHDdKg3vmVdU1pnzeD7xo/2OvONf2+7YaZufHHQ9uVD4xd
WBo8/gnjt4/b3W5sKpoFjQK/vPBl5SwJpLP/+cPzx8a4cdi2HV421tIkaSSP
l/Y7mRe+kuk+3nZVP1SuyX9qu80D+7qrbmku9lUxtPuxpyEWS/xIz1T1A6sS
+pP+u6TB5329XdqXNDF3M+5cl7p7O25df/IL9eaa6heeCg2o6os266dv5OE/
FfhhWbS7kyn9xTdN1Wz6bE5jXftm8sOv97Gux/X6+KeqqpaFM6Zpux09eUvr
COWIf9ALb549/sPV1RV/fr54Qo935cHX9aIqik40hZZ+43t0hI9D19bx6coP
68XPY1UsXHGzWHf+59E3xXH6+679eTEELeCfaPFvv1y8ravS9/yFHVy38QMt
wjDs+wd375LSOXqnuPEdN7Kk+d7deT/Q/O/eu/fNXZqC7ypX93d7bmZBX0bl
psZdTZuhGra7xWrcLNbVe3qE5L7Yj6uahlupei5Kv6/bIzYdNgIPJe3J2y8f
2IehIfto3NhnaIgV/DU3lPT8SWxoxs3wtrGzv4y1vf/13N6/uv+l/NDTuH2P
daCfX4Rp8I7HvrM0EVJ+nqm8EBWf/mNFCbrycmkf63Kd//gj/bj1zeb8l78u
7Y/u0g9PlvZF29X+eP4Taf93ru9J1X/0pHh+e/7Ia9Lcrbs4kLd+vNTf3+gN
V7SrHjv+9Mfn9NrBD8P5L4+W9t14sbW/ub6qK39r8P27avGsWrwd+z3ZLSjv
o7rdXNa2w+Gw3It1aMU4YFvexZrdvfr93Xvf3h22fnHwVVcuCtf7RbteHKp1
tajpDdL3Rb+vbny/3A67eqJD11tv+TWL12y7tgO+oVetvmrl1YnOvHBHe+/b
T+rMmYX7l96uaG7/QFsyY0n/LRYL61Y99thgzDtvyX7bfhjLI+kdj5K3rLoF
jBwOY8G2+sQ0Ly1Ns+MWzHBoLUkSO4YG/MCSOWoG+p+t28O0xdLX7kgDP1p3
21Ylel2NVc0fyIqMvp9jn5mR5IbhuFuybG5Ve0u7jdzIDYl074pqONoBfba3
ZAb4yRUZK7tvqRt62vj3ewivKTypjadtNtLmHbZdO262Vn4Ulzts3WAP26qW
VuCSoxExG9/4ztU1jbbGVMh9UK9F23Xkl/EtGqWG8LHvfd+fjXJuDhBwVde0
mt7ONnU1FFtaeVodUgJfkFIU8PRlxY5+ju/3rhuqYqxdRyPzDQkD4jlUna+z
PnqemWtcffyFB08iIymPYqkMyYakQZ3vaOy22DqYc7R+Nk2RQdGOdWkrgSP8
0M+jo9EeDWlBEidWkLxI50ssIh5LGrJjDXH7fa0efakqt6vKkhbF3IHh7Npy
ZFRDCkizowb7agMPl7VU5Lggb7FPCjinPWYPrhloTUzQODTzSaUbh9+kMSIP
PFGMtNLoIG8tKiDrhKwCLUwx+NKQdgTNpWHy41+G/Q+ZJ6dq1alm2vYZNOTD
h9/sjz9+5IX+8CF3rB8/fr40/780vhw71u9tVWwxJDPVTk//T0su0paFCxaD
JDsCI9M4XHdUA0IgyaRvKxppR3LrqmI4N3AdkKGuz1Rvryeanf1GE+1gllXb
ozpiek5NNjVp+Dvq17tdT6uqiOvjx6V96mie0in2pz5SUYuuu6F9daAJoymS
WjnWmKfa1uPSPCO84N+73b72c+lx1le7sSZHM8zQ+21V0C9uLCsyj0BSA9o9
krLTr6TK5Mt5ZIBam446NtoPdUx64ey2In0JHc4xSPQCXSj9mjYYyyAot4oO
W6o1MhMZVTb7MC3dU41/P3AnvPum/UCk487kHaFlbrJpWQ2kTX2ex3rpaXRE
Q6YuTOhC31zahzTL5mg3ZMUa1mVuDNIpqf0Dm8EgExaTdQVtACgc9jfbhRiZ
kRNO9qC3/tbVI+lUNI6/tuGX5rmIb+9owRFQqPSTi2MlLDwMLqkFbSn9C7vB
TjQMlsA3P7XH0EgmltwZapexC1I7CKoTIfC6dPkChPa595UXW4r5jcPF4dUV
eeujbVewxgZPyKLSrvwHSsT7iXcejSltvc5PdiywC4W8R+4KO62Z2iPYOG3R
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
6vkZqiNePXmVMxtL838Elf635l0AAA==

-->

</rfc>

