<?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.7 (Ruby 3.2.2) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-seemann-quic-nat-traversal-02" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.20.0 -->
  <front>
    <title abbrev="QUIC NAT Traversal">Using QUIC to traverse NATs</title>
    <seriesInfo name="Internet-Draft" value="draft-seemann-quic-nat-traversal-02"/>
    <author fullname="Marten Seemann">
      <organization/>
      <address>
        <email>martenseemann@gmail.com</email>
      </address>
    </author>
    <author fullname="Eric Kinnear">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino, California 95014</city>
          <country>United States of America</country>
        </postal>
        <email>ekinnear@apple.com</email>
      </address>
    </author>
    <date year="2024" month="March" day="04"/>
    <area>Transport</area>
    <workgroup>QUIC</workgroup>
    <keyword>QUIC</keyword>
    <keyword>ICE</keyword>
    <keyword>NAT traversal</keyword>
    <keyword>hole punching</keyword>
    <abstract>
      <?line 38?>

<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, enabling ICE to be used
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 48?>

<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 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
document, 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>Although ICE is not directly used, 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 they
<bcp14>MAY</bcp14> 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 speeds 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 algorithm.</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>The server <bcp14>SHOULD</bcp14> start path validation immediately upon receipt of 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 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>
            <dt>Port:</dt>
            <dd>
              <t>The port number.</t>
            </dd>
          </dl>
          <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 PUNCH_ME_NOW 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 QUIC servers, allowing a
QUIC 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>Uber Technologies Inc.</organization>
          </author>
          <author fullname="Quentin De Coninck" initials="Q." surname="De Coninck">
            <organization>University of Mons (UMONS)</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="23" month="October" 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-06"/>
      </reference>
      <reference anchor="CONNECT-UDP-LISTEN">
        <front>
          <title>Proxying Bound 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="29" month="February" year="2024"/>
          <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-02"/>
      </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 351?>

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

-->

</rfc>
