<?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.1 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-seemann-quic-nat-traversal-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.18.2 -->
  <front>
    <title abbrev="QUIC NAT Traversal">Using QUIC to traverse NATs</title>
    <seriesInfo name="Internet-Draft" value="draft-seemann-quic-nat-traversal-01"/>
    <author fullname="Marten Seemann">
      <organization>Protocol Labs</organization>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <date year="2023" month="October" day="23"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>QUIC</keyword>
    <keyword>ICE</keyword>
    <keyword>NAT traversal</keyword>
    <keyword>hole punching</keyword>
    <abstract>
      <?line 31?>

<t>QUIC is well-suited to various NAT traversal techniques. As it operates over
UDP, and because the QUIC header was designed to be demultipexed from other
protocols, STUN can be used on the same UDP socket. This allows for using ICE
with QUIC. Furthermore, QUIC’s path validation mechanism can be used to test the
viability of an address candidate pair while at the same time creating the NAT
bindings required for a direction connection, after which QUIC connection
migration can be used to migrate the connection to a direct path.</t>
    </abstract>
    <note removeInRFC="true">
      <name>Discussion Venues</name>
      <t>Discussion of this document takes place on the
    QUIC Working Group mailing list (quic@ietf.org),
    which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/quic/"/>.</t>
      <t>Source for this draft and an issue tracker can be found at
    <eref target="https://github.com/marten-seemann/draft-seemann-quic-nat-traversal"/>.</t>
    </note>
  </front>
  <middle>
    <?line 41?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>This document describes two ways to use QUIC (<xref target="RFC9000"/>) to traverse NATs:</t>
      <ol spacing="normal" type="1"><li>
          <t>Using ICE (<xref target="RFC8445"/>) with an external signaling channel to select a pair
of UDP addresses. Once candidate nomination is completed, a new QUIC
connection between the two endpoints can be established.</t>
        </li>
        <li>
          <t>Using a (proxied) QUIC connection as the signaling channel.  QUIC's path
validation logic is used to test connectivity of possible paths.</t>
        </li>
      </ol>
      <t>The first option merely documents how NAT traversal can be achieved using
unmodified QUIC and ICE stacks. The only requirement is the ability to send and
receive non-QUIC (STUN (<xref target="RFC5389"/>)) packets on the UDP socket that a QUIC
server is listening on. However, it necessitates running a separate signaling
channel for the communication between the two ICE agents.</t>
      <t>The second option doesn't use ICE at all, although it makes use of some of the
concepts, in particular the address matching logic described in <xref target="RFC8445"/>. It
is assumed that the nodes are connected via a proxied QUIC connection, for
example using <xref target="CONNECT-UDP-LISTEN"/>. Using the QUIC extension defined in this
documents, the nodes coordinate QUIC path validation attempts that create the
necessary NAT bindings to achieve traversal of the NAT. This mechanism makes
extensive use of the path validation mechanism described in <xref target="RFC9000"/>. In
addition, the QUIC server needs the capability to initiate path validation,
which, as per <xref target="RFC9000"/>, is initiated by the client. Starting with a proxied
QUIC connection allows the nodes to start exchanging application data right
away, and switch to the direct connection once it has been established and
deemed suitable for the application's needs.</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="nat-traversal-using-an-external-signaling-channel">
      <name>NAT Traversal Using an External Signaling Channel</name>
      <t>When an external signaling channel is used, the QUIC connection is established
after the two ICE agents have agreed on a candidate pair. This mode doesn't
require any modification to existing QUIC stacks. In particular, it does not
necessitate the negotiation of the extension defined in this document.</t>
      <t>For address discovery to work, QUIC and ICE need to use the same UDP socket
Since this requires demultiplexing of QUIC and STUN packets, the QUIC bit cannot
be greased as described in <xref target="RFC9287"/>.</t>
      <t>Once ICE has completed, the client immediately initiates a normal QUIC handshake
using the server's address from the nominated address pair. The ICE connectivity
checks should have created the necessary NAT bindings for the client's first
flight to reach the server, and for the server's first flight to reach the
client.</t>
    </section>
    <section anchor="nat-traversal-using-the-nat-traversal-quic-extension">
      <name>NAT Traversal using the NAT Traversal QUIC Extension</name>
      <t>QUIC's path validation mechanism can be used to establish the required NAT
mappings that allow for a direct connection. Once the NAT mappings are
established, QUIC's connection migration can be used to migrate the connection
to a direct path. During the path validation phase, multiple different paths
might be established in parallel. When using QUIC Multipath <xref target="MULTIPATH"/>, these
paths may be used at the some time, however, the mechanism described in this
document does not require the use of QUIC multipath.</t>
      <t>ICE is not directly used, however, the logic run on the client makes use of
ICE's candidate pairing logic (see especially <xref section="6.1.2.2" sectionFormat="of" target="RFC8445"/>).
Implementations are free to implement different algorithms as they see fit.</t>
      <t>This mode needs be negotiated during the handshake, see <xref target="negotiate-extension"/>.</t>
      <section anchor="gathering-address-candidates">
        <name>Gathering Address Candidates</name>
        <t>The gathering of address candidates is out of scope for this document. Endpoints
<bcp14>MAY</bcp14> use the logic described in Sections <xref target="RFC8445" section="5.1.1" sectionFormat="bare"/> and <xref target="RFC8445" section="5.2" sectionFormat="bare"/> of <xref target="RFC8445"/>, or use
address candidates provided by the application.</t>
      </section>
      <section anchor="sending-address-candidates-to-the-client">
        <name>Sending Address Candidates to the Client</name>
        <t>The server sends its address candidates to the client using ADD_ADDRESS frames.
It <bcp14>SHOULD NOT</bcp14> wait until address candidate discovery has finished, instead, it
<bcp14>SHOULD</bcp14> send address candidates as soon as they become available. This allows
speeding up the NAT traversal, and is similar to Trickle ICE (<xref target="RFC8838"/>).</t>
        <t>Addresses sent to the client can be removed using the REMOVE_ADDRESS frame if
the address candidate becomes stale, e.g. because the network interface becomes
unavailable.</t>
        <t>Since address matching is run on the client side, address candidates are only
sent from the server to the client. The client does not send any addresses to
the server.</t>
      </section>
      <section anchor="address-matching">
        <name>Address Matching</name>
        <t>The client matches the address candidates sent by the server with its own
address candidates, forming candidate pairs. <xref section="5.1" sectionFormat="of" target="RFC8445"/>
describes an algorithm for pairing address candidates. Since the pairing
algorithm is only run on the client side, the endpoints do not need to agree on
the algorithm used, and the client is free to use a different algorithms.</t>
      </section>
      <section anchor="probing-paths">
        <name>Probing Paths</name>
        <t>The client sends candidate pairs to the server using PUNCH_ME_NOW frames. The
client <bcp14>SHOULD</bcp14> start path validation (see <xref section="8.2" sectionFormat="of" target="RFC9000"/>) for the
respective path immediately after sending the PUNCH_ME_NOW frame.</t>
        <t>On the server side, path validation <bcp14>SHOULD</bcp14> be started immediately when receiving
a PUNCH_ME_NOW frame. This document introduces the concept of path validation on
the server side, since <xref target="RFC9000"/> assumes that any QUIC server is able to
receive packets on a path without creating a NAT binding first. Path validation
on the server side works as described in <xref section="8.2.1" sectionFormat="of" target="RFC9000"/>, with
additional rate-limiting (see <xref target="amplification-attack"/>) to prevent amplification
attacks.</t>
        <t>Path probing happens in rounds, allowing the peers to limit the bandwidth
consumed by sending path validation packets. For every round, the client <bcp14>MUST
NOT</bcp14> send more PUNCH_ME_NOW frames than allowed by the server's transport
parameter. A new round is started when a PUNCH_ME_NOW frame with a higher Round
value is received. This immediately cancels all path probes in progress.</t>
        <t>To speed up NAT traversal, the client <bcp14>SHOULD</bcp14> send address pairs as soon as they
become available. However, for small concurrency limits, it <bcp14>MAY</bcp14> delay sending of
address pairs in order rank them first and only initiate path validation for the
highest-priority candidate pairs.</t>
        <section anchor="interaction-with-activeconnectionidlimit">
          <name>Interaction with active_connection_id_limit</name>
          <t>The active_connection_id_limit limits the number of connection IDs that are
active at any given time. Both endpoints need to use a previously unused
connection ID when validating a new path in order to avoid linkability.
Therefore, the active_connection_id_limit effectively places a limit on the
number of concurrent path validations.</t>
          <t>Endpoints <bcp14>SHOULD</bcp14> set an active_connection_id_limit that is high enough to allow
for the desired number of concurrent path validation attempts.</t>
        </section>
        <section anchor="amplification-attack">
          <name>Amplification Attack Mitigation</name>
          <t>TODO describe exactly how to migitate amplification attacks</t>
        </section>
      </section>
      <section anchor="negotiate-extension">
        <name>Negotiating Extension Use</name>
        <t>Endpoints advertise their support of the extension by sending the nat_traversal
(0x3d7e9f0bca12fea6) transport parameter (<xref section="7.4" sectionFormat="of" target="RFC9000"/>).</t>
        <t>The client <bcp14>MUST</bcp14> send this transport parameter with an empty value. A server
implementation that understands this transport parameter <bcp14>MUST</bcp14> treat the receipt
of a non-empty value as a connection error of type TRANSPORT_PARAMETER_ERROR.</t>
        <t>For the server, the value of this transport parameter is a variable-length
integer, the concurrency limit. The concurrency limit limits the amount of
concurrent NAT traversal attempts, and can be used to limit the bandwith
required to execute the path validation. Any value larger than 0 is valid. A
client implementation that understands this transport parameter <bcp14>MUST</bcp14> treat the
receipt of a value that is not a variable-length integer, or the receipt of the
value 0, as a connection error of type TRANSPORT_PARAMETER_ERROR.</t>
        <t>In order to the use of this extension in 0-RTT packets, the client <bcp14>MUST</bcp14> remember
the value of this transport parameter. If 0-RTT data is accepted by the server,
the server <bcp14>MUST</bcp14> not disable this extension on the resumed connection.</t>
      </section>
      <section anchor="frames">
        <name>Frames</name>
        <section anchor="addaddress-frame">
          <name>ADD_ADDRESS Frame</name>
          <artwork><![CDATA[
ADD_ADDRESS Frame {
    Type (i) = 0x3d7e90..0x3d7e91,
    Sequence Number (i),
    [ IPv4 (32) ],
    [ IPv6 (128) ],
    Port (16),
}
]]></artwork>
          <t>The ADD_ADDRESS frame contains the following fields:</t>
          <dl>
            <dt>Sequence Number:</dt>
            <dd>
              <t>A variable-length integer encoding the sequence number of this address
 advertisement.</t>
            </dd>
            <dt>IPv4:</dt>
            <dd>
              <t>The IPv4 address. Only present if the least significant bit of the frame type
 is 0.</t>
            </dd>
            <dt>IPv6:</dt>
            <dd>
              <t>The IPv6 address. Only present if the least significant bit of the frame
type is 1.</t>
            </dd>
          </dl>
          <t>Port: The port number.</t>
          <t>ADD_ADDRESS frames are ack-eliciting. When lost, they <bcp14>SHOULD</bcp14> be retransmitted,
unless the address is not active anymore.</t>
          <t>This frame is only sent from the server to the client. Servers <bcp14>MUST</bcp14> treat
receipt of an ADD_ADDRESS frame as a connection error of type
PROTOCOL_VIOLATION.</t>
        </section>
        <section anchor="punchmenow-frame">
          <name>PUNCH_ME_NOW Frame</name>
          <artwork><![CDATA[
PUNCH_ME_NOW Frame {
    Type (i) = 0x3d7e92..0x3d7e93,
    Round (i),
    Paired With Sequence Number (i),
    [ IPv4 (32) ],
    [ IPv6 (128) ],
    Port (16),
}
]]></artwork>
          <t>The ADD_ADDRESS frame contains the following fields:</t>
          <dl>
            <dt>Round:</dt>
            <dd>
              <t>The sequence number of the NAT Traversal attempts.</t>
            </dd>
            <dt>Paired With Sequence Number:</dt>
            <dd>
              <t>A variable-length integer encoding the sequence number of the address that was
 paired with this address.</t>
            </dd>
            <dt>IPv4:</dt>
            <dd>
              <t>The IPv4 address. Only present if the least significant bit of the frame type
 is 0.</t>
            </dd>
            <dt>IPv6:</dt>
            <dd>
              <t>The IPv6 address. Only present if the least significant bit of the frame type
 is 1.</t>
            </dd>
            <dt>Port:</dt>
            <dd>
              <t>The port number.</t>
            </dd>
          </dl>
          <t>PUNCH_ME_NOW frames are ack-eliciting.</t>
          <t>This frame is only sent from the client to the server. Clients <bcp14>MUST</bcp14> treat
receipt of a PUNCH_ME_NOW frame as a connection error of type
PROTOCOL_VIOLATION.</t>
        </section>
        <section anchor="removeaddress-frame">
          <name>REMOVE_ADDRESS Frame</name>
          <artwork><![CDATA[
REMOVE_ADDRESS Frame {
    Type (i) = 0x3d7e94,
    Sequence Number (i),
}
]]></artwork>
          <t>The REMOVE_ADDRESS frame contains the following fields:</t>
          <dl>
            <dt>Sequence Number:</dt>
            <dd>
              <t>A variable-length integer encoding the sequence number of the address
 advertisement to be removed.</t>
            </dd>
          </dl>
          <t>REMOVE_ADDRESS frames are ack-eliciting. When lost, they <bcp14>SHOULD</bcp14> be
retransmitted.</t>
          <t>This frame is only sent from the server to the client. Servers <bcp14>MUST</bcp14> treat
receipt of an REMOVE_ADDRESS frame as a connection error of type
PROTOCOL_VIOLATION.</t>
        </section>
      </section>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>This document expands QUIC's path validation logic to the server side, allowing
the client to request sending of path validation packets on unverified paths. A
malicious client can direct traffic to a target IP. This attack is similar to
the IP address spoofing attack that address validation during connection
establishment (see <xref section="8.1" sectionFormat="of" target="RFC9000"/>) is designed to prevent. In
practice however, IP address spoofing is often additionally mitigated by both
the ingress and egress network at the IP layer, which is not possible when using
this extension. The server therefore needs to carefully limit the amount of data
it sends on unverified paths.</t>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>TODO: fill out registration request for the transport parameter and frame types</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-normative-references">
      <name>Normative References</name>
      <reference anchor="MULTIPATH">
        <front>
          <title>Multipath Extension for QUIC</title>
          <author fullname="Yanmei Liu" initials="Y." surname="Liu">
            <organization>Alibaba Inc.</organization>
          </author>
          <author fullname="Yunfei Ma" initials="Y." surname="Ma">
            <organization>Alibaba Inc.</organization>
          </author>
          <author fullname="Quentin De Coninck" initials="Q." surname="De Coninck">
            <organization>UCLouvain</organization>
          </author>
          <author fullname="Olivier Bonaventure" initials="O." surname="Bonaventure">
            <organization>UCLouvain and Tessares</organization>
          </author>
          <author fullname="Christian Huitema" initials="C." surname="Huitema">
            <organization>Private Octopus Inc.</organization>
          </author>
          <author fullname="Mirja Kühlewind" initials="M." surname="Kühlewind">
            <organization>Ericsson</organization>
          </author>
          <date day="10" month="July" year="2023"/>
          <abstract>
            <t>   This document specifies a multipath extension for the QUIC protocol
   to enable the simultaneous usage of multiple paths for a single
   connection.

Discussion Venues

   This note is to be removed before publishing as an RFC.

   Discussion of this document takes place on the QUIC Working Group
   mailing list (quic@ietf.org), which is archived at
   https://mailarchive.ietf.org/arch/browse/quic/.

   Source for this draft and an issue tracker can be found at
   https://github.com/mirjak/draft-lmbdhk-quic-multipath.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-quic-multipath-05"/>
      </reference>
      <reference anchor="CONNECT-UDP-LISTEN">
        <front>
          <title>Proxying Listener UDP in HTTP</title>
          <author fullname="David Schinazi" initials="D." surname="Schinazi">
            <organization>Google LLC</organization>
          </author>
          <author fullname="Abhijit Singh" initials="A." surname="Singh">
            <organization>Google LLC</organization>
          </author>
          <date day="8" month="September" year="2023"/>
          <abstract>
            <t>   The mechanism to proxy UDP in HTTP only allows each UDP Proxying
   request to transmit to a specific host and port.  This is well suited
   for UDP client-server protocols such as HTTP/3, but is not sufficient
   for some UDP peer-to-peer protocols like WebRTC.  This document
   proposes an extension to UDP Proxying in HTTP that enables such use-
   cases.

            </t>
          </abstract>
        </front>
        <seriesInfo name="Internet-Draft" value="draft-ietf-masque-connect-udp-listen-01"/>
      </reference>
      <reference anchor="RFC9000">
        <front>
          <title>QUIC: A UDP-Based Multiplexed and Secure Transport</title>
          <author fullname="J. Iyengar" initials="J." role="editor" surname="Iyengar"/>
          <author fullname="M. Thomson" initials="M." role="editor" surname="Thomson"/>
          <date month="May" year="2021"/>
          <abstract>
            <t>This document defines the core of the QUIC transport protocol. QUIC provides applications with flow-controlled streams for structured communication, low-latency connection establishment, and network path migration. QUIC includes security measures that ensure confidentiality, integrity, and availability in a range of deployment circumstances. Accompanying documents describe the integration of TLS for key negotiation, loss detection, and an exemplary congestion control algorithm.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9000"/>
        <seriesInfo name="DOI" value="10.17487/RFC9000"/>
      </reference>
      <reference anchor="RFC8445">
        <front>
          <title>Interactive Connectivity Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal</title>
          <author fullname="A. Keranen" initials="A." surname="Keranen"/>
          <author fullname="C. Holmberg" initials="C." surname="Holmberg"/>
          <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
          <date month="July" year="2018"/>
          <abstract>
            <t>This document describes a protocol for Network Address Translator (NAT) traversal for UDP-based communication. This protocol is called Interactive Connectivity Establishment (ICE). ICE makes use of the Session Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN).</t>
            <t>This document obsoletes RFC 5245.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8445"/>
        <seriesInfo name="DOI" value="10.17487/RFC8445"/>
      </reference>
      <reference anchor="RFC5389">
        <front>
          <title>Session Traversal Utilities for NAT (STUN)</title>
          <author fullname="J. Rosenberg" initials="J." surname="Rosenberg"/>
          <author fullname="R. Mahy" initials="R." surname="Mahy"/>
          <author fullname="P. Matthews" initials="P." surname="Matthews"/>
          <author fullname="D. Wing" initials="D." surname="Wing"/>
          <date month="October" year="2008"/>
          <abstract>
            <t>Session Traversal Utilities for NAT (STUN) is a protocol that serves as a tool for other protocols in dealing with Network Address Translator (NAT) traversal. It can be used by an endpoint to determine the IP address and port allocated to it by a NAT. It can also be used to check connectivity between two endpoints, and as a keep-alive protocol to maintain NAT bindings. STUN works with many existing NATs, and does not require any special behavior from them.</t>
            <t>STUN is not a NAT traversal solution by itself. Rather, it is a tool to be used in the context of a NAT traversal solution. This is an important change from the previous version of this specification (RFC 3489), which presented STUN as a complete solution.</t>
            <t>This document obsoletes RFC 3489. [STANDARDS-TRACK]</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="5389"/>
        <seriesInfo name="DOI" value="10.17487/RFC5389"/>
      </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>
      <reference anchor="RFC9287">
        <front>
          <title>Greasing the QUIC Bit</title>
          <author fullname="M. Thomson" initials="M." surname="Thomson"/>
          <date month="August" year="2022"/>
          <abstract>
            <t>This document describes a method for negotiating the ability to send an arbitrary value for the second-most significant bit in QUIC packets.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="9287"/>
        <seriesInfo name="DOI" value="10.17487/RFC9287"/>
      </reference>
      <reference anchor="RFC8838">
        <front>
          <title>Trickle ICE: Incremental Provisioning of Candidates for the Interactive Connectivity Establishment (ICE) Protocol</title>
          <author fullname="E. Ivov" initials="E." surname="Ivov"/>
          <author fullname="J. Uberti" initials="J." surname="Uberti"/>
          <author fullname="P. Saint-Andre" initials="P." surname="Saint-Andre"/>
          <date month="January" year="2021"/>
          <abstract>
            <t>This document describes "Trickle ICE", an extension to the Interactive Connectivity Establishment (ICE) protocol that enables ICE agents to begin connectivity checks while they are still gathering candidates, by incrementally exchanging candidates over time instead of all at once. This method can considerably accelerate the process of establishing a communication session.</t>
          </abstract>
        </front>
        <seriesInfo name="RFC" value="8838"/>
        <seriesInfo name="DOI" value="10.17487/RFC8838"/>
      </reference>
    </references>
    <?line 342?>

<section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO acknowledge.</t>
    </section>
  </back>
  <!-- ##markdown-source:
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
AAA=

-->

</rfc>
