rfc8838xml2.original.xml | rfc8838.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="std" conse | |||
nsus="true" docName="draft-ietf-ice-trickle-21" indexInclude="true" ipr="trust20 | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | 0902" number="8838" prepTime="2021-01-17T17:24:49" scripts="Common,Latin" sortRe | |||
fs="true" submissionType="IETF" symRefs="true" tocDepth="3" tocInclude="true" xm | ||||
<rfc category='std' ipr='trust200902' | l:lang="en"> | |||
docName='draft-ietf-ice-trickle-21'> | <link href="https://datatracker.ietf.org/doc/draft-ietf-ice-trickle-21" rel="p | |||
rev"/> | ||||
<?rfc toc='yes' ?> | <link href="https://dx.doi.org/10.17487/rfc8838" rel="alternate"/> | |||
<?rfc symrefs='yes' ?> | <link href="urn:issn:2070-1721" rel="alternate"/> | |||
<?rfc sortrefs='yes'?> | ||||
<?rfc iprnotified='no' ?> | ||||
<?rfc strict='yes' ?> | ||||
<?rfc compact='yes' ?> | ||||
<front> | <front> | |||
<title abbrev="Trickle ICE">Trickle ICE: Incremental Provisioning of Candida | ||||
<title abbrev='Trickle ICE'> | tes for the Interactive Connectivity Establishment (ICE) Protocol</title> | |||
Trickle ICE: Incremental Provisioning of Candidates for the Interactive | <seriesInfo name="RFC" value="8838" stream="IETF"/> | |||
Connectivity Establishment (ICE) Protocol | <author fullname="Emil Ivov" initials="E." surname="Ivov"> | |||
</title> | <organization abbrev="8x8 / Jitsi" showOnFrontPage="true">8x8, Inc. / Jits | |||
<author initials='E.' surname='Ivov' | i</organization> | |||
fullname='Emil Ivov'> | ||||
<organization abbrev='Atlassian'>Atlassian</organization> | ||||
<address> | ||||
<postal> | ||||
<street>303 Colorado Street, #1600</street> | ||||
<city>Austin</city> | ||||
<region>TX</region> | ||||
<code>78701</code> | ||||
<country>USA</country> | ||||
</postal> | ||||
<phone>+1-512-640-3000</phone> | ||||
<email>eivov@atlassian.com</email> | ||||
</address> | ||||
</author> | ||||
<author fullname="Eric Rescorla" initials="E.K." surname="Rescorla"> | ||||
<organization>RTFM, Inc.</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street>2064 Edgewood Drive</street> | <street>675 Creekside Way</street> | |||
<city>Palo Alto</city> | <city>Campbell</city> | |||
<region>CA</region> | <region>CA</region> | |||
<code>94303</code> | <code>95008</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1 650 678 2350</phone> | <phone>+1 512 420 6968</phone> | |||
<email>ekr@rtfm.com</email> | <email>emcho@jitsi.org</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<organization>Google</organization> | <organization showOnFrontPage="true">Google</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>747 6th St S</street> | <street>747 6th Street S</street> | |||
<city>Kirkland</city> | <city>Kirkland</city> | |||
<region>WA</region> | <region>WA</region> | |||
<code>98033</code> | <code>98033</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1 857 288 8888</phone> | <phone>+1 857 288 8888</phone> | |||
<email>justin@uberti.name</email> | <email>justin@uberti.name</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre"> | <author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre"> | |||
<organization>Mozilla</organization> | <organization showOnFrontPage="true">Mozilla</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>P.O. Box 787</street> | <street>P.O. Box 787</street> | |||
<city>Parker</city> | <city>Parker</city> | |||
<region>CO</region> | <region>CO</region> | |||
<code>80134</code> | <code>80134</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1 720 256 6756</phone> | <phone>+1 720 256 6756</phone> | |||
<email>stpeter@mozilla.com</email> | <email>stpeter@mozilla.com</email> | |||
<uri>https://www.mozilla.com/</uri> | <uri>https://www.mozilla.com/</uri> | |||
</address> | </address> | |||
</author> | </author> | |||
<date /> | <date month="01" year="2021"/> | |||
<abstract> | <abstract pn="section-abstract"> | |||
<t> | <t indent="0" pn="section-abstract-1"> | |||
This document describes "Trickle ICE", an extension to the Interactive | This document describes "Trickle ICE", an extension to the Interactive | |||
Connectivity Establishment (ICE) protocol that enables ICE agents | Connectivity Establishment (ICE) protocol that enables ICE agents | |||
to begin connectivity checks while they are still gathering | to begin connectivity checks while they are still gathering | |||
candidates, by incrementally exchanging candidates over time instead | candidates, by incrementally exchanging candidates over time instead | |||
of all at once. This method can considerably accelerate the process | of all at once. This method can considerably accelerate the process | |||
of establishing a communication session. | of establishing a communication session. | |||
</t> | </t> | |||
</abstract> | </abstract> | |||
<boilerplate> | ||||
<section anchor="status-of-memo" numbered="false" removeInRFC="false" toc= | ||||
"exclude" pn="section-boilerplate.1"> | ||||
<name slugifiedName="name-status-of-this-memo">Status of This Memo</name | ||||
> | ||||
<t indent="0" pn="section-boilerplate.1-1"> | ||||
This is an Internet Standards Track document. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.1-2"> | ||||
This document is a product of the Internet Engineering Task Force | ||||
(IETF). It represents the consensus of the IETF community. It has | ||||
received public review and has been approved for publication by | ||||
the Internet Engineering Steering Group (IESG). Further | ||||
information on Internet Standards is available in Section 2 of | ||||
RFC 7841. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.1-3"> | ||||
Information about the current status of this document, any | ||||
errata, and how to provide feedback on it may be obtained at | ||||
<eref target="https://www.rfc-editor.org/info/rfc8838" brackets="non | ||||
e"/>. | ||||
</t> | ||||
</section> | ||||
<section anchor="copyright" numbered="false" removeInRFC="false" toc="excl | ||||
ude" pn="section-boilerplate.2"> | ||||
<name slugifiedName="name-copyright-notice">Copyright Notice</name> | ||||
<t indent="0" pn="section-boilerplate.2-1"> | ||||
Copyright (c) 2021 IETF Trust and the persons identified as the | ||||
document authors. All rights reserved. | ||||
</t> | ||||
<t indent="0" pn="section-boilerplate.2-2"> | ||||
This document is subject to BCP 78 and the IETF Trust's Legal | ||||
Provisions Relating to IETF Documents | ||||
(<eref target="https://trustee.ietf.org/license-info" brackets="none | ||||
"/>) in effect on the date of | ||||
publication of this document. Please review these documents | ||||
carefully, as they describe your rights and restrictions with | ||||
respect to this document. Code Components extracted from this | ||||
document must include Simplified BSD License text as described in | ||||
Section 4.e of the Trust Legal Provisions and are provided without | ||||
warranty as described in the Simplified BSD License. | ||||
</t> | ||||
</section> | ||||
</boilerplate> | ||||
<toc> | ||||
<section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" p | ||||
n="section-toc.1"> | ||||
<name slugifiedName="name-table-of-contents">Table of Contents</name> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="section-to | ||||
c.1-1"> | ||||
<li pn="section-toc.1-1.1"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.1.1"><xref der | ||||
ivedContent="1" format="counter" sectionFormat="of" target="section-1"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-introduction"> | ||||
Introduction</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.2"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.2.1"><xref der | ||||
ivedContent="2" format="counter" sectionFormat="of" target="section-2"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-terminology">T | ||||
erminology</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.3"> | ||||
<t indent="0" keepWithNext="true" pn="section-toc.1-1.3.1"><xref der | ||||
ivedContent="3" format="counter" sectionFormat="of" target="section-3"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-determining-su | ||||
pport-for-tri">Determining Support for Trickle ICE</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.4"> | ||||
<t indent="0" pn="section-toc.1-1.4.1"><xref derivedContent="4" form | ||||
at="counter" sectionFormat="of" target="section-4"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-generating-the-initial-ice-">Gener | ||||
ating the Initial ICE Description</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.5"> | ||||
<t indent="0" pn="section-toc.1-1.5.1"><xref derivedContent="5" form | ||||
at="counter" sectionFormat="of" target="section-5"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-handling-the-initial-ice-de">Handl | ||||
ing the Initial ICE Description and Generating the Initial ICE Response</xref></ | ||||
t> | ||||
</li> | ||||
<li pn="section-toc.1-1.6"> | ||||
<t indent="0" pn="section-toc.1-1.6.1"><xref derivedContent="6" form | ||||
at="counter" sectionFormat="of" target="section-6"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-handling-the-initial-ice-re">Handl | ||||
ing the Initial ICE Response</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.7"> | ||||
<t indent="0" pn="section-toc.1-1.7.1"><xref derivedContent="7" form | ||||
at="counter" sectionFormat="of" target="section-7"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-forming-checklists">Forming Checkl | ||||
ists</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.8"> | ||||
<t indent="0" pn="section-toc.1-1.8.1"><xref derivedContent="8" form | ||||
at="counter" sectionFormat="of" target="section-8"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-performing-connectivity-che">Perfo | ||||
rming Connectivity Checks</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.9"> | ||||
<t indent="0" pn="section-toc.1-1.9.1"><xref derivedContent="9" form | ||||
at="counter" sectionFormat="of" target="section-9"/>. <xref derivedContent="" f | ||||
ormat="title" sectionFormat="of" target="name-gathering-and-conveying-new">Gathe | ||||
ring and Conveying Newly Gathered Local Candidates</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.10"> | ||||
<t indent="0" pn="section-toc.1-1.10.1"><xref derivedContent="10" fo | ||||
rmat="counter" sectionFormat="of" target="section-10"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-pairing-newly-gathered-loca">Pai | ||||
ring Newly Gathered Local Candidates</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.11"> | ||||
<t indent="0" pn="section-toc.1-1.11.1"><xref derivedContent="11" fo | ||||
rmat="counter" sectionFormat="of" target="section-11"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-receiving-trickled-candidat">Rec | ||||
eiving Trickled Candidates</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.12"> | ||||
<t indent="0" pn="section-toc.1-1.12.1"><xref derivedContent="12" fo | ||||
rmat="counter" sectionFormat="of" target="section-12"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-inserting-trickled-candidat">Ins | ||||
erting Trickled Candidate Pairs into a Checklist</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.13"> | ||||
<t indent="0" pn="section-toc.1-1.13.1"><xref derivedContent="13" fo | ||||
rmat="counter" sectionFormat="of" target="section-13"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-generating-an-end-of-candid">Gen | ||||
erating an End-of-Candidates Indication</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.14"> | ||||
<t indent="0" pn="section-toc.1-1.14.1"><xref derivedContent="14" fo | ||||
rmat="counter" sectionFormat="of" target="section-14"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-receiving-an-end-of-candida">Rec | ||||
eiving an End-of-Candidates Indication</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.15"> | ||||
<t indent="0" pn="section-toc.1-1.15.1"><xref derivedContent="15" fo | ||||
rmat="counter" sectionFormat="of" target="section-15"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-subsequent-exchanges-and-ic">Sub | ||||
sequent Exchanges and ICE Restarts</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.16"> | ||||
<t indent="0" pn="section-toc.1-1.16.1"><xref derivedContent="16" fo | ||||
rmat="counter" sectionFormat="of" target="section-16"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-half-trickle">Half Trickle</xref | ||||
></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.17"> | ||||
<t indent="0" pn="section-toc.1-1.17.1"><xref derivedContent="17" fo | ||||
rmat="counter" sectionFormat="of" target="section-17"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-preserving-candidate-order-">Pre | ||||
serving Candidate Order While Trickling</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.18"> | ||||
<t indent="0" pn="section-toc.1-1.18.1"><xref derivedContent="18" fo | ||||
rmat="counter" sectionFormat="of" target="section-18"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-requirements-for-using-prot">Req | ||||
uirements for Using Protocols</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.19"> | ||||
<t indent="0" pn="section-toc.1-1.19.1"><xref derivedContent="19" fo | ||||
rmat="counter" sectionFormat="of" target="section-19"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-iana-considerations">IANA Consid | ||||
erations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.20"> | ||||
<t indent="0" pn="section-toc.1-1.20.1"><xref derivedContent="20" fo | ||||
rmat="counter" sectionFormat="of" target="section-20"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-security-considerations">Securit | ||||
y Considerations</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.21"> | ||||
<t indent="0" pn="section-toc.1-1.21.1"><xref derivedContent="21" fo | ||||
rmat="counter" sectionFormat="of" target="section-21"/>. <xref derivedContent="" | ||||
format="title" sectionFormat="of" target="name-references">References</xref></t | ||||
> | ||||
<ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | ||||
n-toc.1-1.21.2"> | ||||
<li pn="section-toc.1-1.21.2.1"> | ||||
<t indent="0" pn="section-toc.1-1.21.2.1.1"><xref derivedContent | ||||
="21.1" format="counter" sectionFormat="of" target="section-21.1"/>. <xref deri | ||||
vedContent="" format="title" sectionFormat="of" target="name-normative-reference | ||||
s">Normative References</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.21.2.2"> | ||||
<t indent="0" pn="section-toc.1-1.21.2.2.1"><xref derivedContent | ||||
="21.2" format="counter" sectionFormat="of" target="section-21.2"/>. <xref deri | ||||
vedContent="" format="title" sectionFormat="of" target="name-informative-referen | ||||
ces">Informative References</xref></t> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-toc.1-1.22"> | ||||
<t indent="0" pn="section-toc.1-1.22.1"><xref derivedContent="Append | ||||
ix A" format="default" sectionFormat="of" target="section-appendix.a"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-interaction-wit | ||||
h-regular-ic">Interaction with Regular ICE</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.23"> | ||||
<t indent="0" pn="section-toc.1-1.23.1"><xref derivedContent="Append | ||||
ix B" format="default" sectionFormat="of" target="section-appendix.b"/>. <xref | ||||
derivedContent="" format="title" sectionFormat="of" target="name-interaction-wit | ||||
h-ice-lite">Interaction with ICE-Lite</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.24"> | ||||
<t indent="0" pn="section-toc.1-1.24.1"><xref derivedContent="" form | ||||
at="none" sectionFormat="of" target="section-appendix.c"/><xref derivedContent=" | ||||
" format="title" sectionFormat="of" target="name-acknowledgements">Acknowledgeme | ||||
nts</xref></t> | ||||
</li> | ||||
<li pn="section-toc.1-1.25"> | ||||
<t indent="0" pn="section-toc.1-1.25.1"><xref derivedContent="" form | ||||
at="none" sectionFormat="of" target="section-appendix.d"/><xref derivedContent=" | ||||
" format="title" sectionFormat="of" target="name-authors-addresses">Authors' Add | ||||
resses</xref></t> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
</toc> | ||||
</front> | </front> | |||
<middle> | <middle> | |||
<section title='Introduction'> | <section numbered="true" toc="include" removeInRFC="false" pn="section-1"> | |||
<t> | <name slugifiedName="name-introduction">Introduction</name> | |||
<t indent="0" pn="section-1-1"> | ||||
The Interactive Connectivity Establishment (ICE) protocol | The Interactive Connectivity Establishment (ICE) protocol | |||
<xref target="rfc5245bis"/> describes how an ICE agent | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/> describes how an ICE agent | |||
gathers candidates, exchanges candidates with a peer ICE | gathers candidates, exchanges candidates with a peer ICE | |||
agent, and creates candidate pairs. Once the pairs have been | agent, and creates candidate pairs. Once the pairs have been | |||
gathered, the ICE agent will perform connectivity checks, and | gathered, the ICE agent will perform connectivity checks and | |||
eventually nominate and select pairs that will be used for | eventually nominate and select pairs that will be used for | |||
sending and receiving data within a communication session. | sending and receiving data within a communication session. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-1-2"> | |||
Following the procedures in <xref target="rfc5245bis"/> can | Following the procedures in <xref target="RFC8445" format="default" sect | |||
lead to somewhat lengthy establishment times for communication sessions, | ionFormat="of" derivedContent="RFC8445"/> | |||
because candidate gathering often involves querying STUN servers | can lead to somewhat lengthy establishment times for communication | |||
<xref target="RFC5389"/> and allocating relayed candidates using | sessions, because candidate gathering often involves querying Session | |||
TURN servers <xref target="RFC5766"/>. Although many ICE procedures | Traversal Utilities for NAT (STUN) servers <xref target="RFC5389" format | |||
can be completed in parallel, the pacing requirements from | ="default" sectionFormat="of" derivedContent="RFC5389"/> and allocating relayed | |||
<xref target="rfc5245bis"/> still need to be followed. | candidates on Traversal | |||
Using Relay NAT (TURN) servers <xref target="RFC5766" format="default" s | ||||
ectionFormat="of" derivedContent="RFC5766"/>. Although many ICE procedures can b | ||||
e completed in | ||||
parallel, the pacing requirements from <xref target="RFC8445" format="de | ||||
fault" sectionFormat="of" derivedContent="RFC8445"/> still need to be followed. | ||||
</t> | </t> | |||
<t> | <t indent="0" pn="section-1-3"> | |||
This document defines "Trickle ICE", a supplementary mode of ICE | This document defines "Trickle ICE", a supplementary mode of ICE | |||
operation in which candidates can be exchanged | operation in which candidates can be exchanged | |||
incrementally as soon as they become available (and simultaneously | incrementally as soon as they become available (and simultaneously | |||
with the gathering of other candidates). Connectivity checks can | with the gathering of other candidates). Connectivity checks can | |||
also start as soon as candidate pairs have been created. Because | also start as soon as candidate pairs have been created. Because | |||
Trickle ICE enables candidate gathering and connectivity checks | Trickle ICE enables candidate gathering and connectivity checks | |||
to be done in parallel, the method can considerably accelerate | to be done in parallel, the method can considerably accelerate | |||
the process of establishing a communication session. | the process of establishing a communication session. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-1-4"> | |||
This document also defines how to discover support for | This document also defines how to discover support for | |||
Trickle ICE, how the procedures in <xref target="rfc5245bis"/> are | Trickle ICE, how the procedures in <xref target="RFC8445" format="defaul t" sectionFormat="of" derivedContent="RFC8445"/> are | |||
modified or supplemented when using Trickle ICE, and how a Trickle | modified or supplemented when using Trickle ICE, and how a Trickle | |||
ICE agent can interoperate with an ICE agent compliant to | ICE agent can interoperate with an ICE agent compliant to | |||
<xref target="rfc5245bis"/>. | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/>. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-1-5"> | |||
This document does not define any protocol-specific usage of Trickle | This document does not define any protocol-specific usage of Trickle | |||
ICE. Instead, protocol-specific details for Trickle ICE are defined | ICE. Instead, protocol-specific details for Trickle ICE are defined | |||
in separate usage documents. Examples of such documents are | in separate usage documents. | |||
<xref target="I-D.ietf-mmusic-trickle-ice-sip"/> (which defines usage | Examples of such documents are | |||
with the Session Initiation Protocol (SIP) <xref target='RFC3261'/> | <xref target="RFC8840" format="default" sectionFormat="of" derivedConten | |||
and the Session Description Protocol <xref target='RFC3261'/>) and | t="RFC8840"/> (which defines usage | |||
<xref target='XEP-0176'/> (which defines usage with XMPP | with the Session Initiation Protocol (SIP) <xref target="RFC3261" format | |||
<xref target='RFC6120'/>). However, some of the examples in the | ="default" sectionFormat="of" derivedContent="RFC3261"/> | |||
document use SDP and the offer/answer model <xref target='RFC3264'/> | and the Session Description Protocol (SDP) <xref target="RFC4566" format | |||
="default" sectionFormat="of" derivedContent="RFC4566"/>) and | ||||
<xref target="XEP-0176" format="default" sectionFormat="of" derivedConte | ||||
nt="XEP-0176"/> (which defines usage with the Extensible Messaging and Presence | ||||
Protocol (XMPP) | ||||
<xref target="RFC6120" format="default" sectionFormat="of" derivedConten | ||||
t="RFC6120"/>). However, some of the examples in the | ||||
document use SDP and the Offer/Answer model <xref target="RFC3264" forma | ||||
t="default" sectionFormat="of" derivedContent="RFC3264"/> | ||||
to explain the underlying concepts. | to explain the underlying concepts. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-1-6"> | |||
The following diagram illustrates a successful Trickle ICE exchange with a | The following diagram illustrates a successful Trickle ICE exchange with a | |||
using protocol that follows the offer/answer model: | using protocol that follows the Offer/Answer model: | |||
</t> | </t> | |||
<figure title="Flow" anchor="fig-flow"> | <figure anchor="fig-flow" align="left" suppress-title="false" pn="figure-1 | |||
<artwork> | "> | |||
<![CDATA[ | <name slugifiedName="name-flow">Flow</name> | |||
<artwork name="" type="" align="left" alt="" pn="section-1-7.1"> | ||||
Alice Bob | Alice Bob | |||
| Offer | | | Offer | | |||
|---------------------------------------------->| | |---------------------------------------------->| | |||
| Additional Candidates | | | Additional Candidates | | |||
|---------------------------------------------->| | |---------------------------------------------->| | |||
| Answer | | | Answer | | |||
|<----------------------------------------------| | |<----------------------------------------------| | |||
| Additional Candidates | | | Additional Candidates | | |||
|<----------------------------------------------| | |<----------------------------------------------| | |||
| Additional Candidates and Connectivity Checks | | | Additional Candidates and Connectivity Checks | | |||
|<--------------------------------------------->| | |<--------------------------------------------->| | |||
|<========== CONNECTION ESTABLISHED ===========>| | |<========== CONNECTION ESTABLISHED ===========>| | |||
]]> | ||||
</artwork> | </artwork> | |||
</figure> | </figure> | |||
<t> | <t indent="0" pn="section-1-8"> | |||
The main body of this document is structured to describe the behavior | The main body of this document is structured to describe the behavior | |||
of Trickle ICE agents in roughly the order of operations and interaction s | of Trickle ICE agents in roughly the order of operations and interaction s | |||
during an ICE session: | during an ICE session: | |||
<list style='numbers'> | ||||
<t>Determining support for trickle ICE</t> | ||||
<t>Generating the initial ICE description</t> | ||||
<t>Handling the initial ICE description and generating the initial ICE | ||||
response</t> | ||||
<t>Handling the initial ICE response</t> | ||||
<t>Forming check lists, pruning candidates, performing connectivity ch | ||||
ecks, etc.</t> | ||||
<t>Gathering and conveying candidates after the initial ICE descriptio | ||||
n and response</t> | ||||
<t>Handling inbound trickled candidates</t> | ||||
<t>Generating and handling the end-of-candidates indication</t> | ||||
<t>Handling ICE restarts</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-1-9" | |||
> | ||||
<li pn="section-1-9.1" derivedCounter="1.">Determining support for Trick | ||||
le ICE</li> | ||||
<li pn="section-1-9.2" derivedCounter="2.">Generating the initial ICE de | ||||
scription</li> | ||||
<li pn="section-1-9.3" derivedCounter="3.">Handling the initial ICE desc | ||||
ription and generating the initial ICE response</li> | ||||
<li pn="section-1-9.4" derivedCounter="4.">Handling the initial ICE resp | ||||
onse</li> | ||||
<li pn="section-1-9.5" derivedCounter="5.">Forming checklists, pruning c | ||||
andidates, performing connectivity checks, etc.</li> | ||||
<li pn="section-1-9.6" derivedCounter="6.">Gathering and conveying candi | ||||
dates after the initial ICE description and response</li> | ||||
<li pn="section-1-9.7" derivedCounter="7.">Handling inbound trickled can | ||||
didates</li> | ||||
<li pn="section-1-9.8" derivedCounter="8.">Generating and handling the e | ||||
nd-of-candidates indication</li> | ||||
<li pn="section-1-9.9" derivedCounter="9.">Handling ICE restarts</li> | ||||
</ol> | ||||
<t indent="0" pn="section-1-10"> | ||||
There is quite a bit of operational experience with the technique behind | There is quite a bit of operational experience with the technique behind | |||
Trickle ICE, going back as far as 2005 (when the XMPP Jingle extension | Trickle ICE, going back as far as 2005 (when the XMPP Jingle extension | |||
defined a "dribble mode" as specified in <xref target='XEP-0176'/>); thi s | defined a "dribble mode" as specified in <xref target="XEP-0176" format= "default" sectionFormat="of" derivedContent="XEP-0176"/>); this | |||
document incorporates feedback from those who have implemented and | document incorporates feedback from those who have implemented and | |||
deployed the technique over the years. | deployed the technique over the years. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Terminology"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-2"> | |||
<t> | <name slugifiedName="name-terminology">Terminology</name> | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <t indent="0" pn="section-2-1"> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
"OPTIONAL" in this document are to be interpreted as described | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14> | |||
in <xref target="RFC2119"/>. | ", | |||
"<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" format="default" s | ||||
ectionFormat="of" derivedContent="RFC2119"/> <xref target="RFC8174" format="defa | ||||
ult" sectionFormat="of" derivedContent="RFC8174"/> when, and only when, they app | ||||
ear in all capitals, as | ||||
shown here. | ||||
</t> | </t> | |||
<t> | <t indent="0" pn="section-2-2"> | |||
This specification makes use of all terminology defined | This specification makes use of all terminology defined | |||
for Interactive Connectivity Establishment in | for Interactive Connectivity Establishment in | |||
<xref target="rfc5245bis"/>. In addition, it defines the following terms : | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/>. In addition, it defines the following terms: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal" indent="3" pn="section-2-3"> | |||
<list style="hanging"> | <dt pn="section-2-3.1">Empty Checklist:</dt> | |||
<t hangText="Full Trickle:"> | <dd pn="section-2-3.2"> | |||
A checklist that initially does not contain any candidate pairs | ||||
because they will be incrementally added as they are trickled. | ||||
(This scenario does not arise with a regular ICE agent, because all | ||||
candidate pairs are known when the agent creates the checklist set.) | ||||
</dd> | ||||
<dt pn="section-2-3.3">Full Trickle:</dt> | ||||
<dd pn="section-2-3.4"> | ||||
The typical mode of operation for Trickle ICE agents, in which | The typical mode of operation for Trickle ICE agents, in which | |||
the initial ICE description can include any number of candidates (ev en | the initial ICE description can include any number of candidates (ev en | |||
zero candidates) and does not need to include a full generation | zero candidates) and does not need to include a full generation | |||
of candidates as in half trickle. | of candidates as in half trickle. | |||
</t> | </dd> | |||
<t hangText="Generation:"> | <dt pn="section-2-3.5">Generation:</dt> | |||
All of the candidates conveyed within an ICE session. | <dd pn="section-2-3.6"> | |||
</t> | All of the candidates conveyed within an ICE session (correlated | |||
<t hangText="Half Trickle:"> | with a particular Username Fragment and Password combination). | |||
</dd> | ||||
<dt pn="section-2-3.7">Half Trickle:</dt> | ||||
<dd pn="section-2-3.8"> | ||||
A Trickle ICE mode of operation in which the initiator gathers | A Trickle ICE mode of operation in which the initiator gathers | |||
a full generation of candidates strictly before creating | a full generation of candidates strictly before creating | |||
and conveying the initial ICE description. Once conveyed, | and conveying the initial ICE description. Once conveyed, | |||
this candidate information can be | this candidate information can be | |||
processed by regular ICE agents, which do not require support | processed by regular ICE agents, which do not require support | |||
for Trickle ICE. It also allows Trickle ICE capable | for Trickle ICE. It also allows Trickle-ICE-capable | |||
responders to still gather candidates and perform | responders to still gather candidates and perform | |||
connectivity checks in a non-blocking way, thus providing roughly | connectivity checks in a non-blocking way, thus providing roughly | |||
"half" the advantages of Trickle ICE. The half trickle mechanism | "half" the advantages of Trickle ICE. The half-trickle mechanism | |||
is mostly meant for use when the responder's support for Trickle | is mostly meant for use when the responder's support for Trickle | |||
ICE cannot be confirmed prior to conveying the initial ICE descripti on. | ICE cannot be confirmed prior to conveying the initial ICE descripti on. | |||
</t> | </dd> | |||
<t hangText="ICE Description:"> | <dt pn="section-2-3.9">ICE Description:</dt> | |||
Any attributes related to the ICE session (not candidates) | <dd pn="section-2-3.10"> | |||
Any attributes related to the ICE session (other than candidates) | ||||
required to configure an ICE agent. These include but are not | required to configure an ICE agent. These include but are not | |||
limited to the username fragment, password, and other attributes. | limited to the Username Fragment, the Password, and other attributes | |||
</t> | . | |||
<t hangText="Trickled Candidates:"> | </dd> | |||
Candidates that a Trickle ICE agent conveys after conveying the init | <dt pn="section-2-3.11">Trickled Candidates:</dt> | |||
ial | <dd pn="section-2-3.12"> | |||
ICE description or responding to the initial ICE description, but wi | Candidates that a Trickle ICE agent conveys after conveying or respo | |||
thin | nding to the initial | |||
ICE description, but within | ||||
the same ICE session. Trickled candidates can be conveyed in | the same ICE session. Trickled candidates can be conveyed in | |||
parallel with candidate gathering and connectivity checks. | parallel with candidate gathering and connectivity checks. | |||
</t> | </dd> | |||
<t hangText="Trickling:"> | <dt pn="section-2-3.13">Trickling:</dt> | |||
<dd pn="section-2-3.14"> | ||||
The act of incrementally conveying trickled candidates. | The act of incrementally conveying trickled candidates. | |||
</t> | </dd> | |||
<t hangText="Empty Check List:"> | </dl> | |||
A check list that initially does not contain any candidate pairs | ||||
because they will be incrementally added as they are trickled. | ||||
(This scenario does not arise with a regular ICE agent, because all | ||||
candidate pairs are known when the agent creates the check list set). | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | </section> | |||
<section title='Determining Support for Trickle ICE' anchor="support"> | <section anchor="support" numbered="true" toc="include" removeInRFC="false" | |||
<t> | pn="section-3"> | |||
<name slugifiedName="name-determining-support-for-tri">Determining Support | ||||
for Trickle ICE</name> | ||||
<t indent="0" pn="section-3-1"> | ||||
To fully support Trickle ICE, using protocols | To fully support Trickle ICE, using protocols | |||
SHOULD incorporate one of the following mechanisms so that implementatio ns | <bcp14>SHOULD</bcp14> incorporate one of the following mechanisms so tha t implementations | |||
can determine whether Trickle ICE is supported: | can determine whether Trickle ICE is supported: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-3-2" | |||
<list style='numbers'> | > | |||
<t> | <li pn="section-3-2.1" derivedCounter="1."> | |||
Provide a capabilities discovery method so that agents can verify | Provide a capabilities discovery method so that agents can verify | |||
support of Trickle ICE prior to initiating a session (XMPP's | support of Trickle ICE prior to initiating a session (XMPP's | |||
<xref target="XEP-0030">Service Discovery</xref> is | <xref target="XEP-0030" format="default" sectionFormat="of" derivedC ontent="XEP-0030">Service Discovery</xref> is | |||
one such mechanism). | one such mechanism). | |||
</t> | </li> | |||
<t> | <li pn="section-3-2.2" derivedCounter="2."> | |||
Make support for Trickle ICE mandatory so that user agents | Make support for Trickle ICE mandatory so that user agents | |||
can assume support. | can assume support. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t indent="0" pn="section-3-3"> | |||
<t> | ||||
If a using protocol does not provide a method of determining | If a using protocol does not provide a method of determining | |||
ahead of time whether Trickle ICE is supported, agents can make use of | ahead of time whether Trickle ICE is supported, agents can make use of | |||
the half trickle procedure described in <xref target="half-trickle"/>. | the half-trickle procedure described in <xref target="half-trickle" form at="default" sectionFormat="of" derivedContent="Section 16"/>. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-3-4"> | |||
Prior to conveying the initial ICE description, agents that implement us ing protocols | Prior to conveying the initial ICE description, agents that implement us ing protocols | |||
that support capabilities discovery can attempt to verify whether or | that support capabilities discovery can attempt to verify whether or | |||
not the remote party supports Trickle ICE. If an agent determines | not the remote party supports Trickle ICE. If an agent determines | |||
that the remote party does not support Trickle ICE, it MUST fall back | that the remote party does not support Trickle ICE, it <bcp14>MUST</bcp1 4> fall back | |||
to using regular ICE or abandon the entire session. | to using regular ICE or abandon the entire session. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-3-5"> | |||
Even if a using protocol does not include a capabilities discovery | Even if a using protocol does not include a capabilities discovery | |||
method, a user agent can provide an indication within the ICE descriptio n | method, a user agent can provide an indication within the ICE descriptio n | |||
that it supports Trickle ICE by communicating an ICE option of 'trickle' . | that it supports Trickle ICE by communicating an ICE option of 'trickle' . | |||
This token MUST be provided either at the session level or, if at the da | This token <bcp14>MUST</bcp14> be provided either at the session level o | |||
ta | r, if at the data | |||
stream level, for every data stream (an agent MUST NOT specify Trickle I | stream level, for every data stream (an agent <bcp14>MUST NOT</bcp14> sp | |||
CE | ecify Trickle ICE | |||
support for some data streams but not others). | support for some data streams but not others). | |||
Note: The encoding of the 'trickle' ICE option, and the message(s) used to | Note: The encoding of the 'trickle' ICE option, and the message(s) used to | |||
carry it to the peer, are protocol specific; for instance, the encoding for | carry it to the peer, are protocol specific; for instance, the encoding for | |||
the Session Description Protocol (SDP) <xref target='RFC4566'/> is defin | SDP <xref target="RFC4566" format="default" sectionFormat="of" derivedCo | |||
ed in | ntent="RFC4566"/> is defined in | |||
<xref target='I-D.ietf-mmusic-trickle-ice-sip'/>. | <xref target="RFC8840" format="default" sectionFormat="of" derivedConten | |||
t="RFC8840"/>. | ||||
</t> | </t> | |||
<t> | <t indent="0" pn="section-3-6"> | |||
Dedicated discovery semantics and half trickle are needed only prior | Dedicated discovery semantics and half trickle are needed only prior | |||
to initiation of an ICE session. After an ICE session is established | to initiation of an ICE session. After an ICE session is established | |||
and Trickle ICE support is confirmed for both parties, either | and Trickle ICE support is confirmed for both parties, either | |||
agent can use full trickle for subsequent exchanges (see also | agent can use full trickle for subsequent exchanges (see also | |||
<xref target='subsequent'/>). | <xref target="subsequent" format="default" sectionFormat="of" derivedCon tent="Section 15"/>). | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Generating the Initial ICE Description' anchor="initial"> | <section anchor="initial" numbered="true" toc="include" removeInRFC="false" | |||
<t> | pn="section-4"> | |||
<name slugifiedName="name-generating-the-initial-ice-">Generating the Init | ||||
ial ICE Description</name> | ||||
<t indent="0" pn="section-4-1"> | ||||
An ICE agent can start gathering candidates as soon as it has an | An ICE agent can start gathering candidates as soon as it has an | |||
indication that communication is imminent (e.g., a user interface | indication that communication is imminent (e.g., a user-interface | |||
cue or an explicit request to initiate a communication session). Unlike in | cue or an explicit request to initiate a communication session). Unlike in | |||
regular ICE, in Trickle ICE implementations do not need to | regular ICE, in Trickle ICE implementations do not need to | |||
gather candidates in a blocking manner. Therefore, unless half | gather candidates in a blocking manner. Therefore, unless half | |||
trickle is being used, the user experience is improved if the | trickle is being used, the user experience is improved if the | |||
initiating agent generates and transmits its initial ICE description | initiating agent generates and transmits its initial ICE description | |||
as early as possible (thus enabling the remote party to start | as early as possible (thus enabling the remote party to start | |||
gathering and trickling candidates). | gathering and trickling candidates). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-4-2"> | |||
An initiator MAY include any mix of candidates when conveying | An initiator <bcp14>MAY</bcp14> include any mix of candidates when conve | |||
ying | ||||
the initial ICE description. This includes the possibility of conveying | the initial ICE description. This includes the possibility of conveying | |||
all the candidates the initiator plans to use | all the candidates the initiator plans to use | |||
(as in half trickle), conveying only a | (as in half trickle), conveying only a | |||
publicly-reachable IP address (e.g., a candidate at a data | publicly reachable IP address (e.g., a candidate at a data | |||
relay that is known to not be behind a firewall), or conveying | relay that is known to not be behind a firewall), or conveying | |||
no candidates at all (in which case the initiator can obtain the | no candidates at all (in which case the initiator can obtain the | |||
responder's initial candidate list sooner and the responder can begin | responder's initial candidate list sooner, and the responder can begin | |||
candidate gathering more quickly). | candidate gathering more quickly). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-4-3"> | |||
For candidates included in the initial ICE description, the methods | For candidates included in the initial ICE description, the methods | |||
for calculating priorities and foundations, determining redundancy | for calculating priorities and foundations, determining redundancy | |||
of candidates, and the like work just as in regular ICE | of candidates, and the like work just as in regular ICE | |||
<xref target="rfc5245bis"/>. | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Handling the Initial ICE Description and Generating the Init | <section numbered="true" toc="include" removeInRFC="false" pn="section-5"> | |||
ial ICE Response' > | <name slugifiedName="name-handling-the-initial-ice-de">Handling the Initia | |||
<t> | l ICE Description and Generating the Initial ICE Response</name> | |||
<t indent="0" pn="section-5-1"> | ||||
When a responder receives the initial ICE description, it will first che ck if | When a responder receives the initial ICE description, it will first che ck if | |||
the ICE description or initiator indicates support for Trickle ICE as ex plained | the ICE description or initiator indicates support for Trickle ICE as ex plained | |||
in <xref target="support"/>. If not, the responder MUST | in <xref target="support" format="default" sectionFormat="of" derivedCon tent="Section 3"/>. If not, the responder <bcp14>MUST</bcp14> | |||
process the initial ICE description according to regular ICE procedures | process the initial ICE description according to regular ICE procedures | |||
<xref target="rfc5245bis"/> (or, if no ICE support is detected at all, | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/> (or, if no ICE support is detected at all, | |||
according to relevant processing rules for the using | according to relevant processing rules for the using | |||
protocol, such as offer/answer processing rules <xref target="RFC3264"/> ). | protocol, such as Offer/Answer processing rules <xref target="RFC3264" f ormat="default" sectionFormat="of" derivedContent="RFC3264"/>). | |||
However, if support for Trickle ICE is confirmed, a responder will | However, if support for Trickle ICE is confirmed, a responder will | |||
automatically assume support for regular ICE as well. | automatically assume support for regular ICE as well. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-5-2"> | |||
If the initial ICE description indicates support for Trickle ICE, the | If the initial ICE description indicates support for Trickle ICE, the | |||
responder will determine its role and start gathering and prioritizing | responder will determine its role and start gathering and prioritizing | |||
candidates; while doing so, it will also respond by conveying an | candidates; while doing so, it will also respond by conveying an | |||
initial ICE response, so that both the initiator | initial ICE response, so that both the initiator | |||
and the responder can form check lists and begin connectivity checks. | and the responder can form checklists and begin connectivity checks. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-5-3"> | |||
A responder can respond to the initial ICE description at any point whil e | A responder can respond to the initial ICE description at any point whil e | |||
gathering candidates. The initial ICE response MAY contain any set of | gathering candidates. The initial ICE response <bcp14>MAY</bcp14> contai n any set of | |||
candidates, including all candidates or no candidates. (The benefit of | candidates, including all candidates or no candidates. (The benefit of | |||
including no candidates is to convey the initial ICE response as | including no candidates is to convey the initial ICE response as | |||
quickly as possible, so that both parties can consider the | quickly as possible, so that both parties can consider the | |||
ICE session to be under active negotiation as soon as | ICE session to be under active negotiation as soon as | |||
possible.) | possible.) | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-5-4"> | |||
As noted in <xref target="support"/>, in using protocols that use | As noted in <xref target="support" format="default" sectionFormat="of" d | |||
SDP the initial ICE response can indicate support for Trickle ICE | erivedContent="Section 3"/>, in using protocols that use | |||
by including a token of "trickle" in the ice-options attribute. | SDP, the initial ICE response can indicate support for Trickle ICE | |||
by including a token of 'trickle' in the ice-options attribute. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title="Handling the Initial ICE Response"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-6"> | |||
<t> | <name slugifiedName="name-handling-the-initial-ice-re">Handling the Initia | |||
l ICE Response</name> | ||||
<t indent="0" pn="section-6-1"> | ||||
When processing the initial ICE response, the initiator follows regular ICE | When processing the initial ICE response, the initiator follows regular ICE | |||
procedures to determine its role, after which it | procedures to determine its role, after which it | |||
forms check lists (<xref target="checklists"/>) | forms checklists (<xref target="checklists" format="default" sectionForm | |||
and performs connectivity checks (<xref target='checks'/>). | at="of" derivedContent="Section 7"/>) | |||
and performs connectivity checks (<xref target="checks" format="default" | ||||
sectionFormat="of" derivedContent="Section 8"/>). | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Forming Check Lists' anchor='checklists'> | <section anchor="checklists" numbered="true" toc="include" removeInRFC="fals | |||
<t> | e" pn="section-7"> | |||
According to regular ICE procedures <xref target="rfc5245bis"/>, | <name slugifiedName="name-forming-checklists">Forming Checklists</name> | |||
<t indent="0" pn="section-7-1"> | ||||
According to regular ICE procedures <xref target="RFC8445" format="defau | ||||
lt" sectionFormat="of" derivedContent="RFC8445"/>, | ||||
in order for candidate pairing | in order for candidate pairing | |||
to be possible and for redundant candidates to be pruned, the | to be possible and for redundant candidates to be pruned, the | |||
candidates would need to be provided in the initial ICE description | candidates would need to be provided in the initial ICE description | |||
and initial ICE response. | and initial ICE response. | |||
By contrast, under Trickle ICE check lists can be empty until | By contrast, under Trickle ICE, checklists can be empty until | |||
candidates are conveyed or received. Therefore a Trickle ICE agent | candidates are conveyed or received. Therefore, a Trickle ICE agent | |||
handles check list formation and candidate pairing in a slightly differe | handles checklist formation and candidate pairing in a slightly differen | |||
nt | t | |||
way than a regular ICE agent: the agent still forms the check lists, but | way than a regular ICE agent: the agent still forms the checklists, but | |||
it populates a given check list only after it actually has candidate | it populates a given checklist only after it actually has candidate | |||
pairs for that check list. Every check list is initially placed in the | pairs for that checklist. Every checklist is initially placed in the | |||
Running state, even if the check list is empty (this is consistent | Running state, even if the checklist is empty (this is consistent | |||
with Section 6.1.2.1 of <xref target='rfc5245bis'/>). | with <xref target="RFC8445" sectionFormat="of" section="6.1.2.1" format= | |||
"default" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.1" deriv | ||||
edContent="RFC8445"/>). | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Performing Connectivity Checks' anchor='checks'> | <section anchor="checks" numbered="true" toc="include" removeInRFC="false" p | |||
<t> | n="section-8"> | |||
As specified in <xref target='rfc5245bis'/>, whenever timer | <name slugifiedName="name-performing-connectivity-che">Performing Connecti | |||
Ta fires, only check lists in the Running state will be picked | vity Checks</name> | |||
<t indent="0" pn="section-8-1"> | ||||
As specified in <xref target="RFC8445" format="default" sectionFormat="o | ||||
f" derivedContent="RFC8445"/>, whenever timer | ||||
Ta fires, only checklists in the Running state will be picked | ||||
when scheduling connectivity checks for candidate pairs. | when scheduling connectivity checks for candidate pairs. | |||
Therefore, a Trickle ICE agent MUST keep each check list in | Therefore, a Trickle ICE agent <bcp14>MUST</bcp14> keep each checklist i n | |||
the Running state as long as it expects candidate pairs to be | the Running state as long as it expects candidate pairs to be | |||
incrementally added to the check list. After that, the check | incrementally added to the checklist. After that, the checklist | |||
list state is set according to the procedures in | state is set according to the procedures in | |||
<xref target='rfc5245bis'/>. | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten | |||
t="RFC8445"/>. | ||||
</t> | </t> | |||
<t> | <t indent="0" pn="section-8-2"> | |||
Whenever timer Ta fires and an empty check list is picked, no action | Whenever timer Ta fires and an empty checklist is picked, no action | |||
is performed for the list. Without waiting for timer Ta to expire | is performed for the list. Without waiting for timer Ta to expire | |||
again, the agent selects the next check list in the Running state, | again, the agent selects the next checklist in the Running state, | |||
in accordance with Section 6.1.4.2 of <xref target='rfc5245bis'/>. | in accordance with <xref target="RFC8445" format="default" sectionFormat | |||
="of" section="6.1.4.2" derivedLink="https://rfc-editor.org/rfc/rfc8445#section- | ||||
6.1.4.2" derivedContent="RFC8445"/>. | ||||
</t> | </t> | |||
<t> | <t indent="0" pn="section-8-3"> | |||
Section 7.2.5.3.3 of <xref target='rfc5245bis'/> | <xref target="RFC8445" format="default" sectionFormat="of" section="7.2. | |||
requires that agents update check lists and timer states upon | 5.4" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-7.2.5.4" derivedCon | |||
tent="RFC8445"/> | ||||
requires that agents update checklists and timer states upon | ||||
completing a connectivity check transaction. During such an | completing a connectivity check transaction. During such an | |||
update, regular ICE agents would set the state of a check list | update, regular ICE agents would set the state of a checklist | |||
to Failed if both of the following two conditions are satisfied: | to Failed if both of the following two conditions are satisfied: | |||
</t> | </t> | |||
<t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8-4 | |||
<list style="symbols"> | "> | |||
<t> | <li pn="section-8-4.1"> | |||
all of the pairs in the check list are either in the | all of the pairs in the checklist are in either the | |||
Failed state or Succeeded state; and | Failed state or the Succeeded state; and | |||
</t> | </li> | |||
<t> | <li pn="section-8-4.2"> | |||
there is not a pair in the valid list for each component | there is not a pair in the valid list for each component | |||
of the data stream. | of the data stream. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t indent="0" pn="section-8-5"> | |||
<t> | ||||
With Trickle ICE, the above situation would often occur when | With Trickle ICE, the above situation would often occur when | |||
candidate gathering and trickling are still in progress, even | candidate gathering and trickling are still in progress, even | |||
though it is quite possible that future checks will succeed. For | though it is quite possible that future checks will succeed. For | |||
this reason, Trickle ICE agents add the following conditions to | this reason, Trickle ICE agents add the following conditions to | |||
the above list: | the above list: | |||
</t> | </t> | |||
<t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-8-6 | |||
<list style="symbols"> | "> | |||
<t> | <li pn="section-8-6.1"> | |||
all candidate gathering has completed and the agent | all candidate gathering has completed, and the agent | |||
is not expecting to discover any new local candidates; and | is not expecting to discover any new local candidates; and | |||
</t> | </li> | |||
<t> | <li pn="section-8-6.2"> | |||
the remote agent has conveyed an end-of-candidates indication | the remote agent has conveyed an end-of-candidates indication | |||
for that check list as described in | for that checklist as described in | |||
<xref target="end-of-candidates.send"/>. | <xref target="end-of-candidates.send" format="default" sectionFormat | |||
</t> | ="of" derivedContent="Section 13"/>. | |||
</list> | </li> | |||
</t> | </ul> | |||
</section> | </section> | |||
<section title='Gathering and Conveying Newly Gathered Local Candidates' | <section anchor="trickle-send" numbered="true" toc="include" removeInRFC="fa | |||
anchor="trickle-send"> | lse" pn="section-9"> | |||
<t> | <name slugifiedName="name-gathering-and-conveying-new">Gathering and Conve | |||
ying Newly Gathered Local Candidates</name> | ||||
<t indent="0" pn="section-9-1"> | ||||
After Trickle ICE agents have conveyed initial ICE descriptions | After Trickle ICE agents have conveyed initial ICE descriptions | |||
and initial ICE responses, they will most | and initial ICE responses, they will most | |||
likely continue gathering new local candidates as STUN, TURN, | likely continue gathering new local candidates as STUN, TURN, | |||
and other non-host candidate gathering mechanisms begin to | and other non-host candidate gathering mechanisms begin to | |||
yield results. Whenever an agent discovers such a new candidate | yield results. Whenever an agent discovers such a new candidate, | |||
it will compute its priority, type, foundation, and component ID | it will compute its priority, type, foundation, and component ID | |||
according to regular ICE procedures. | according to regular ICE procedures. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-2"> | |||
The new candidate is then checked for redundancy against the | The new candidate is then checked for redundancy against the | |||
existing list of local candidates. If its transport address and | existing list of local candidates. If its transport address and | |||
base match those of an existing candidate, it will be considered | base match those of an existing candidate, it will be considered | |||
redundant and will be ignored. This would often happen for | redundant and will be ignored. This would often happen for | |||
server reflexive candidates that match the host addresses they | server-reflexive candidates that match the host addresses they | |||
were obtained from (e.g., when the latter are public IPv4 | were obtained from (e.g., when the latter are public IPv4 | |||
addresses). Contrary to regular ICE, Trickle ICE agents will | addresses). Contrary to regular ICE, Trickle ICE agents will | |||
consider the new candidate redundant regardless of its priority. | consider the new candidate redundant regardless of its priority. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-3"> | |||
Next the agent "trickles" the newly discovered | Next, the agent "trickles" the newly discovered | |||
candidate(s) to the remote agent. The actual delivery of the new | candidate(s) to the remote agent. The actual delivery of the new | |||
candidates is handled by a using protocol such as SIP or XMPP. | candidates is handled by a using protocol such as SIP or XMPP. | |||
Trickle ICE imposes no restrictions on the way this is done | Trickle ICE imposes no restrictions on the way this is done | |||
(e.g., some using protocols might | (e.g., some using protocols might | |||
choose not to trickle updates for server reflexive | choose not to trickle updates for server-reflexive | |||
candidates and instead rely on the discovery of peer reflexive ones). | candidates and instead rely on the discovery of peer-reflexive ones). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-4"> | |||
When candidates are trickled, the using protocol MUST deliver each | When candidates are trickled, the using protocol <bcp14>MUST</bcp14> del | |||
iver each | ||||
candidate (and any end-of-candidates indication as described in | candidate (and any end-of-candidates indication as described in | |||
<xref target='end-of-candidates.send'/>) to the receiving Trickle ICE im plementation | <xref target="end-of-candidates.send" format="default" sectionFormat="of " derivedContent="Section 13"/>) to the receiving Trickle ICE implementation | |||
exactly once | exactly once | |||
and in the same order it was conveyed. If the using protocol | and in the same order it was conveyed. If the using protocol | |||
provides any candidate retransmissions, they need to be hidden | provides any candidate retransmissions, they need to be hidden | |||
from the ICE implementation. | from the ICE implementation. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-5"> | |||
Also, candidate trickling needs to be correlated to a specific | Also, candidate trickling needs to be correlated to a specific | |||
ICE session, so that if there is an ICE restart, any | ICE session, so that if there is an ICE restart, any | |||
delayed updates for a previous session can be recognized as such | delayed updates for a previous session can be recognized as such | |||
and ignored by the receiving party. For example, using protocols | and ignored by the receiving party. For example, using protocols | |||
that signal candidates via SDP might include a Username | that signal candidates via SDP might include a Username | |||
Fragment value in the corresponding a=candidate line, such as: | Fragment value in the corresponding a=candidate line, such as: | |||
<figure> | </t> | |||
<artwork> | <sourcecode type="sdp" markers="false" pn="section-9-6"> | |||
<![CDATA[ | ||||
a=candidate:1 1 UDP 2130706431 2001:db8::1 5000 typ host ufrag 8hhY | a=candidate:1 1 UDP 2130706431 2001:db8::1 5000 typ host ufrag 8hhY | |||
]]> | </sourcecode> | |||
</artwork> | <t indent="0" pn="section-9-7"> | |||
</figure> | ||||
Or, as another example, WebRTC implementations might include a Username | Or, as another example, WebRTC implementations might include a Username | |||
Fragment in the JavaScript objects that represent candidates. | Fragment in the JavaScript objects that represent candidates. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-8"> | |||
Note: The using protocol needs to provide a mechanism for both | Note: The using protocol needs to provide a mechanism for both | |||
parties to indicate and agree on the ICE session in force | parties to indicate and agree on the ICE session in force | |||
(as identified by the Username Fragment and Password combination) | (as identified by the Username Fragment and Password combination), | |||
so that they have a consistent view of which candidates are | so that they have a consistent view of which candidates are | |||
to be paired. This is especially important in the case of ICE | to be paired. This is especially important in the case of ICE | |||
restarts (see <xref target='subsequent'/>). | restarts (see <xref target="subsequent" format="default" sectionFormat=" of" derivedContent="Section 15"/>). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-9-9"> | |||
Note: A using protocol might prefer not to | Note: A using protocol might prefer not to | |||
trickle server reflexive candidates to entities that are known | trickle server-reflexive candidates to entities that are known | |||
to be publicly accessible and where sending a direct STUN | to be publicly accessible and where sending a direct STUN | |||
binding request is likely to reach the destination faster than | binding request is likely to reach the destination faster than | |||
the trickle update that travels through the signaling path. | the trickle update that travels through the signaling path. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Pairing Newly Gathered Local Candidates' anchor="local-pairi | <section anchor="local-pairing" numbered="true" toc="include" removeInRFC="f | |||
ng"> | alse" pn="section-10"> | |||
<t> | <name slugifiedName="name-pairing-newly-gathered-loca">Pairing Newly Gathe | |||
red Local Candidates</name> | ||||
<t indent="0" pn="section-10-1"> | ||||
As a Trickle ICE agent gathers local candidates, it needs | As a Trickle ICE agent gathers local candidates, it needs | |||
to form candidate pairs; this works as described in | to form candidate pairs; this works as described in | |||
the ICE specification <xref target='rfc5245bis'/>, with the | the ICE specification <xref target="RFC8445" format="default" sectionFor mat="of" derivedContent="RFC8445"/>, with the | |||
following provisos: | following provisos: | |||
<list style='numbers'> | </t> | |||
<t> | <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-10-2 | |||
A Trickle ICE agent MUST NOT pair a local candidate until it | "> | |||
<li pn="section-10-2.1" derivedCounter="1."> | ||||
A Trickle ICE agent <bcp14>MUST NOT</bcp14> pair a local candidate u | ||||
ntil it | ||||
has been trickled to the remote party. | has been trickled to the remote party. | |||
</t> | </li> | |||
<t> | <li pn="section-10-2.2" derivedCounter="2."> | |||
Once the agent has conveyed the local candidate to the remote | Once the agent has conveyed the local candidate to the remote | |||
party, the agent checks if any remote candidates are currently | party, the agent checks if any remote candidates are currently | |||
known for this same stream and component. If not, the agent | known for this same stream and component. If not, the agent | |||
merely adds the new candidate to the list of local candidates | merely adds the new candidate to the list of local candidates | |||
(without pairing it). | (without pairing it). | |||
</t> | </li> | |||
<t> | <li pn="section-10-2.3" derivedCounter="3."> | |||
Otherwise, if the agent has already learned of one or more | Otherwise, if the agent has already learned of one or more | |||
remote candidates for this stream and component, it attempts | remote candidates for this stream and component, it attempts | |||
to pair the new local candidate as described in the ICE | to pair the new local candidate as described in the ICE | |||
specification <xref target='rfc5245bis'/>. | specification <xref target="RFC8445" format="default" sectionFormat= | |||
</t> | "of" derivedContent="RFC8445"/>. | |||
<t> | </li> | |||
If a newly formed pair has a local candidate whose type is server | <li pn="section-10-2.4" derivedCounter="4."> | |||
reflexive, the agent MUST replace the local candidate with its | If a newly formed pair has a local candidate whose type is server-re | |||
flexive, | ||||
the agent <bcp14>MUST</bcp14> replace the local candidate with its | ||||
base before completing the relevant redundancy tests. | base before completing the relevant redundancy tests. | |||
</t> | </li> | |||
<t> | <li pn="section-10-2.5" derivedCounter="5."> | |||
The agent prunes redundant pairs by following the rules | The agent prunes redundant pairs by following the rules | |||
in Section 6.1.2.4 of <xref target='rfc5245bis'/>, but checks | in <xref target="RFC8445" format="default" sectionFormat="of" sectio n="6.1.2.4" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.4" der ivedContent="RFC8445"/> but checks | |||
existing pairs only if they have a state of Waiting or Frozen; | existing pairs only if they have a state of Waiting or Frozen; | |||
this avoids removal of pairs for which connectivity checks are | this avoids removal of pairs for which connectivity checks are | |||
in flight (a state of In-Progress) or for which connectivity | in flight (a state of In‑Progress) or for which connectivity | |||
checks have already yielded a definitive result (a state of | checks have already yielded a definitive result (a state of | |||
Succeeded or Failed). | Succeeded or Failed). | |||
</t> | </li> | |||
<t> | <li pn="section-10-2.6" derivedCounter="6."> | |||
If after the relevant redundancy tests the check list where the | If, after completing the relevant redundancy tests, the checklist wh | |||
ere the | ||||
pair is to be added already contains the maximum number of candidate | pair is to be added already contains the maximum number of candidate | |||
pairs (100 by default as per <xref target="rfc5245bis"/>), the agent | pairs (100 by default as per <xref target="RFC8445" format="default" | |||
SHOULD discard any pairs in the Failed state to make room for the | sectionFormat="of" derivedContent="RFC8445"/>), the agent | |||
new pair. If there are no such pairs, the agent SHOULD discard a | <bcp14>SHOULD</bcp14> discard any pairs in the Failed state to make | |||
room for the | ||||
new pair. If there are no such pairs, the agent <bcp14>SHOULD</bcp14 | ||||
> discard a | ||||
pair with a lower priority than the new pair in order to make room | pair with a lower priority than the new pair in order to make room | |||
for the new pair, until the number of pairs is equal to the maximum | for the new pair, until the number of pairs is equal to the maximum | |||
number of pairs. This processing is consistent with Section 6.1.2.5 | number of pairs. This processing is consistent with | |||
of <xref target='rfc5245bis'/>. | <xref target="RFC8445" format="default" sectionFormat="of" section=" | |||
</t> | 6.1.2.5" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.5" derive | |||
</list> | dContent="RFC8445"/>. | |||
</t> | </li> | |||
</ol> | ||||
</section> | </section> | |||
<section title='Receiving Trickled Candidates' anchor="trickle-recv"> | <section anchor="trickle-recv" numbered="true" toc="include" removeInRFC="fa | |||
<t> | lse" pn="section-11"> | |||
<name slugifiedName="name-receiving-trickled-candidat">Receiving Trickled | ||||
Candidates</name> | ||||
<t indent="0" pn="section-11-1"> | ||||
At any time during an ICE session, a Trickle ICE agent might receive | At any time during an ICE session, a Trickle ICE agent might receive | |||
new candidates from the remote agent, from which it will attempt to | new candidates from the remote agent, from which it will attempt to | |||
form a candidate pair; this works as described in the ICE specification | form a candidate pair; this works as described in the ICE specification | |||
<xref target='rfc5245bis'/>, with the following provisos: | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten | |||
<list style='numbers'> | t="RFC8445"/>, with the following provisos: | |||
<t> | </t> | |||
<ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-11-2 | ||||
"> | ||||
<li pn="section-11-2.1" derivedCounter="1."> | ||||
The agent checks if any local candidates are currently known for | The agent checks if any local candidates are currently known for | |||
this same stream and component. If not, the agent merely adds the | this same stream and component. If not, the agent merely adds the | |||
new candidate to the list of remote candidates (without pairing it). | new candidate to the list of remote candidates (without pairing it). | |||
</t> | </li> | |||
<t> | <li pn="section-11-2.2" derivedCounter="2."> | |||
Otherwise, if the agent has already gathered one or more | Otherwise, if the agent has already gathered one or more | |||
local candidates for this stream and component, it attempts | local candidates for this stream and component, it attempts | |||
to pair the new remote candidate as described in the ICE | to pair the new remote candidate as described in the ICE | |||
specification <xref target='rfc5245bis'/>. | specification <xref target="RFC8445" format="default" sectionFormat= | |||
</t> | "of" derivedContent="RFC8445"/>. | |||
<t> | </li> | |||
If a newly formed pair has a local candidate whose type is server | <li pn="section-11-2.3" derivedCounter="3."> | |||
reflexive, the agent MUST replace the local candidate with its | If a newly formed pair has a local candidate whose type is server-re | |||
flexive, the agent <bcp14>MUST</bcp14> replace the local candidate with its | ||||
base before completing the redundancy check in the next step. | base before completing the redundancy check in the next step. | |||
</t> | </li> | |||
<t> | <li pn="section-11-2.4" derivedCounter="4."> | |||
The agent prunes redundant pairs as described below, but checks | <t indent="0" pn="section-11-2.4.1"> | |||
The agent prunes redundant pairs as described below but checks | ||||
existing pairs only if they have a state of Waiting or Frozen; | existing pairs only if they have a state of Waiting or Frozen; | |||
this avoids removal of pairs for which connectivity checks are | this avoids removal of pairs for which connectivity checks are | |||
in flight (a state of In-Progress) or for which connectivity | in flight (a state of In-Progress) or for which connectivity | |||
checks have already yielded a definitive result (a state of | checks have already yielded a definitive result (a state of | |||
Succeeded or Failed). | Succeeded or Failed). | |||
<list style='letters'> | </t> | |||
<t> | <ol spacing="normal" type="A" indent="adaptive" start="1" pn="section- | |||
11-2.4.2"> | ||||
<li pn="section-11-2.4.2.1" derivedCounter="A."> | ||||
If the agent finds a redundancy between two pairs and one of | If the agent finds a redundancy between two pairs and one of | |||
those pairs contains a newly received remote candidate whose | those pairs contains a newly received remote candidate whose | |||
type is peer reflexive, the agent SHOULD discard the | type is peer-reflexive, the agent <bcp14>SHOULD</bcp14> discard the | |||
pair containing that candidate, set the priority of the | pair containing that candidate, set the priority of the | |||
existing pair to the priority of the discarded pair, and | existing pair to the priority of the discarded pair, and | |||
re-sort the check list. (This policy helps to eliminate | re-sort the checklist. | |||
problems with remote peer reflexive candidates for which | (This policy helps to eliminate | |||
a STUN binding request is received before signaling of the | problems with remote peer-reflexive candidates for which | |||
a STUN Binding request is received before signaling of the | ||||
candidate is trickled to the receiving agent, such as a | candidate is trickled to the receiving agent, such as a | |||
different view of pair priorities between the local agent | different view of pair priorities between the local agent | |||
and the remote agent, since the same candidate could be | and the remote agent, because the same candidate could be | |||
perceived as peer reflexive by one agent and as server | perceived as peer-reflexive by one agent and as server-reflexive | |||
reflexive by the other agent.) | by the other agent.) | |||
</t> | ||||
<t> | </li> | |||
<li pn="section-11-2.4.2.2" derivedCounter="B."> | ||||
The agent then applies the rules defined in | The agent then applies the rules defined in | |||
Section 6.1.2.4 of <xref target='rfc5245bis'/>. | <xref target="RFC8445" format="default" sectionFormat="of" sect | |||
</t> | ion="6.1.2.4" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.4" d | |||
</list> | erivedContent="RFC8445"/>. | |||
</t> | </li> | |||
<t> | </ol> | |||
If after the relevant redundancy tests the check list where the | </li> | |||
<li pn="section-11-2.5" derivedCounter="5."> | ||||
If, after completing the relevant redundancy tests, the checklist wh | ||||
ere the | ||||
pair is to be added already contains the maximum number of candidate | pair is to be added already contains the maximum number of candidate | |||
pairs (100 by default as per <xref target="rfc5245bis"/>), the agent | pairs (100 by default as per <xref target="RFC8445" format="default" | |||
SHOULD discard any pairs in the Failed state to make room for the | sectionFormat="of" derivedContent="RFC8445"/>), the agent | |||
new pair. If there are no such pairs, the agent SHOULD discard a | <bcp14>SHOULD</bcp14> discard any pairs in the Failed state to make | |||
room for the | ||||
new pair. If there are no such pairs, the agent <bcp14>SHOULD</bcp14 | ||||
> discard a | ||||
pair with a lower priority than the new pair in order to make room | pair with a lower priority than the new pair in order to make room | |||
for the new pair, until the number of pairs is equal to the maximum | for the new pair, until the number of pairs is equal to the maximum | |||
number of pairs. This processing is consistent with Section 6.1.2.5 | number of pairs. This processing is consistent with | |||
of <xref target='rfc5245bis'/>. | <xref target="RFC8445" format="default" sectionFormat="of" section=" | |||
</t> | 6.1.2.5" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.5" derive | |||
</list> | dContent="RFC8445"/>. | |||
</t> | </li> | |||
</ol> | ||||
</section> | </section> | |||
<section title='Inserting Trickled Candidate Pairs into a Check List' | <section anchor="trickle-insert" numbered="true" toc="include" removeInRFC=" | |||
anchor="trickle-insert"> | false" pn="section-12"> | |||
<t> | <name slugifiedName="name-inserting-trickled-candidat">Inserting Trickled | |||
Candidate Pairs into a Checklist</name> | ||||
<t indent="0" pn="section-12-1"> | ||||
After a local agent has trickled a candidate and formed a candidate | After a local agent has trickled a candidate and formed a candidate | |||
pair from that local candidate (<xref target='trickle-send'/>), or after | pair from that local candidate (<xref target="trickle-send" format="defa ult" sectionFormat="of" derivedContent="Section 9"/>), or after | |||
a remote agent has received a trickled candidate and formed a candidate | a remote agent has received a trickled candidate and formed a candidate | |||
pair from that remote candidate (<xref target='trickle-recv'/>), a Trick | pair from that remote candidate (<xref target="trickle-recv" format="def | |||
le | ault" sectionFormat="of" derivedContent="Section 11"/>), a Trickle | |||
ICE agent adds the new candidate pair to a check list as defined in | ICE agent adds the new candidate pair to a checklist as defined in | |||
this section. | this section. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-12-2"> | |||
As an aid to understanding the procedures defined in this section, | As an aid to understanding the procedures defined in this section, | |||
consider the following tabular representation of all check lists in | consider the following tabular representation of all checklists in | |||
an agent (note that initially for one of the foundations, i.e., f5, | an agent (note that initially for one of the foundations, i.e., f5, | |||
there are no candidate pairs): | there are no candidate pairs): | |||
</t> | </t> | |||
<t> | <table anchor="checklist_table" align="center" pn="table-1"> | |||
<figure title="Example of Check List State" anchor="fig-checklist-0"> | <name slugifiedName="name-example-of-checklist-state">Example of Checkli | |||
<artwork> | st State</name> | |||
<![CDATA[ | <thead> | |||
+-----------------+------+------+------+------+------+ | <tr> | |||
| | f1 | f2 | f3 | f4 | f5 | | <th align="left" colspan="1" rowspan="1"/> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f1</th> | |||
| s1 (Audio.RTP) | F | F | F | | | | <th align="left" colspan="1" rowspan="1">f2</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f3</th> | |||
| s2 (Audio.RTCP) | F | F | F | F | | | <th align="left" colspan="1" rowspan="1">f4</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f5</th> | |||
| s3 (Video.RTP) | F | | | | | | </tr> | |||
+-----------------+------+------+------+------+------+ | </thead> | |||
| s4 (Video.RTCP) | F | | | | | | <tbody> | |||
+-----------------+------+------+------+------+------+ | <tr> | |||
]]> | <td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | |||
</artwork> | <td align="left" colspan="1" rowspan="1">F</td> | |||
</figure> | <td align="left" colspan="1" rowspan="1">F</td> | |||
</t> | <td align="left" colspan="1" rowspan="1">F</td> | |||
<t> | <td align="left" colspan="1" rowspan="1"/> | |||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t indent="0" pn="section-12-4"> | ||||
Each row in the table represents a component for a given data | Each row in the table represents a component for a given data | |||
stream (e.g., s1 and s2 might be the RTP and RTCP components | stream (e.g., s1 and s2 might be the RTP and RTP Control Protocol (RTCP) | |||
for audio) and thus a single check list in the check list set. | components | |||
for audio) and thus a single checklist in the checklist set. | ||||
Each column represents one foundation. Each cell represents one | Each column represents one foundation. Each cell represents one | |||
candidate pair. In the tables shown in this section, "F" stands | candidate pair. In the tables shown in this section, "F" stands | |||
for "frozen", "W" stands for "waiting", and "S" stands for | for "frozen", "W" stands for "waiting", and "S" stands for | |||
"succeeded"; in addition, "^^" is used to notate newly-added | "succeeded"; in addition, "^^" is used to notate newly added | |||
candidate pairs. | candidate pairs. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-12-5"> | |||
When an agent commences ICE processing, in accordance with | When an agent commences ICE processing, in accordance with | |||
Section 6.1.2.6 of <xref target="rfc5245bis"/>, for each | <xref target="RFC8445" format="default" sectionFormat="of" section="6.1 .2.6" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-6.1.2.6" derivedCo ntent="RFC8445"/>, for each | |||
foundation it will unfreeze the pair with the lowest component | foundation it will unfreeze the pair with the lowest component | |||
ID and, if the component IDs are equal, with the highest priority | ID and, if the component IDs are equal, with the highest priority | |||
(this is the topmost candidate pair in every column). | (this is the topmost candidate pair in every column). | |||
This initial state is shown in the following table. | This initial state is shown in the following table. | |||
</t> | </t> | |||
<t> | <table anchor="fig-checklist-initial" align="center" pn="table-2"> | |||
<figure title="Initial Check List State" anchor="fig-checklist-initial"> | <name slugifiedName="name-initial-checklist-state">Initial Checklist Sta | |||
<artwork> | te</name> | |||
<![CDATA[ | <thead> | |||
+-----------------+------+------+------+------+------+ | <tr> | |||
| | f1 | f2 | f3 | f4 | f5 | | <th align="left" colspan="1" rowspan="1"/> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f1</th> | |||
| s1 (Audio.RTP) | W | W | W | | | | <th align="left" colspan="1" rowspan="1">f2</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f3</th> | |||
| s2 (Audio.RTCP) | F | F | F | W | | | <th align="left" colspan="1" rowspan="1">f4</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f5</th> | |||
| s3 (Video.RTP) | F | | | | | | </tr> | |||
+-----------------+------+------+------+------+------+ | </thead> | |||
| s4 (Video.RTCP) | F | | | | | | <tbody> | |||
+-----------------+------+------+------+------+------+ | <tr> | |||
]]> | <td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | |||
</artwork> | <td align="left" colspan="1" rowspan="1">W</td> | |||
</figure> | <td align="left" colspan="1" rowspan="1">W</td> | |||
</t> | <td align="left" colspan="1" rowspan="1">W</td> | |||
<t> | <td align="left" colspan="1" rowspan="1"/> | |||
Then, as the checks proceed (see Section 7.2.5.4 of | <td align="left" colspan="1" rowspan="1"/> | |||
<xref target="rfc5245bis"/>), for each pair | </tr> | |||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t indent="0" pn="section-12-7"> | ||||
Then, as the checks proceed (see | ||||
<xref target="RFC8445" format="default" sectionFormat="of" section="7.2. | ||||
5.4" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-7.2.5.4" derivedCon | ||||
tent="RFC8445"/>), for each pair | ||||
that enters the Succeeded state (denoted here by "S"), | that enters the Succeeded state (denoted here by "S"), | |||
the agent will unfreeze all pairs for all data streams with the same | the agent will unfreeze all pairs for all data streams with the same | |||
foundation (e.g., if the pair in column 1, row 1 succeeds then | foundation (e.g., if the pair in column 1, row 1 succeeds then | |||
the agent will unfreeze the pair in column 1, rows 2, 3, and 4). | the agent will unfreeze the pairs in column 1, rows 2, 3, and 4). | |||
</t> | ||||
<t> | ||||
<figure title="Check List State with Succeeded Candidate Pair" anchor="f | ||||
ig-checklist-succeeded"> | ||||
<artwork> | ||||
<![CDATA[ | ||||
+-----------------+------+------+------+------+------+ | ||||
| | f1 | f2 | f3 | f4 | f5 | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s1 (Audio.RTP) | S | W | W | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s2 (Audio.RTCP) | W | F | F | W | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s3 (Video.RTP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s4 (Video.RTCP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | </t> | |||
<t> | <table anchor="fig-checklist-succeeded" align="center" pn="table-3"> | |||
<name slugifiedName="name-checklist-state-with-succee">Checklist State w | ||||
ith Succeeded Candidate Pair</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left" colspan="1" rowspan="1"/> | ||||
<th align="left" colspan="1" rowspan="1">f1</th> | ||||
<th align="left" colspan="1" rowspan="1">f2</th> | ||||
<th align="left" colspan="1" rowspan="1">f3</th> | ||||
<th align="left" colspan="1" rowspan="1">f4</th> | ||||
<th align="left" colspan="1" rowspan="1">f5</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">S</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t indent="0" pn="section-12-9"> | ||||
Trickle ICE preserves all of these rules as they apply to | Trickle ICE preserves all of these rules as they apply to | |||
"static" check list sets. This implies that if | "static" checklist sets. This implies that if | |||
a Trickle ICE agent were to begin connectivity checks with all | a Trickle ICE agent were to begin connectivity checks with all | |||
of its pairs already present, the way that pair states change | of its pairs already present, the way that pair states change | |||
is indistinguishable from that of a regular ICE agent. | is indistinguishable from that of a regular ICE agent. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-12-10"> | |||
Of course, the major difference with Trickle ICE is that check list | Of course, the major difference with Trickle ICE is that checklist | |||
sets can be dynamically updated because candidates can | sets can be dynamically updated because candidates can | |||
arrive after connectivity checks have started. When this happens, an | arrive after connectivity checks have started. When this happens, an | |||
agent sets the state of the newly formed pair as described below. | agent sets the state of the newly formed pair as described below. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-12-11"> | |||
Rule 1: If the newly formed pair has the lowest component ID and, | Rule 1: If the newly formed pair has the lowest component ID and, | |||
if the component IDs are equal, the highest priority of any candidate | if the component IDs are equal, the highest priority of any candidate | |||
pair for this foundation (i.e., if it is the topmost pair in the | pair for this foundation (i.e., if it is the topmost pair in the | |||
column), set the state to Waiting. For example, this would be the | column), set the state to Waiting. For example, this would be the | |||
case if the newly formed pair were placed in column 5, row 1. This | case if the newly formed pair were placed in column 5, row 1. This | |||
rule is consistent with Section 6.1.2.6 of <xref target="rfc5245bis"/>. | rule is consistent with <xref target="RFC8445" format="default" sectionF | |||
</t> | ormat="of" section="6.1.2.6" derivedLink="https://rfc-editor.org/rfc/rfc8445#sec | |||
<t> | tion-6.1.2.6" derivedContent="RFC8445"/>. | |||
<figure title="Check List State with Newly Formed Pair, Rule 1" anchor=" | ||||
fig-checklist-rule1"> | ||||
<artwork> | ||||
<![CDATA[ | ||||
+-----------------+------+------+------+------+------+ | ||||
| | f1 | f2 | f3 | f4 | f5 | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s1 (Audio.RTP) | S | W | W | | ^W^ | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s2 (Audio.RTCP) | W | F | F | W | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s3 (Video.RTP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s4 (Video.RTCP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | </t> | |||
<t> | <table anchor="fig-checklist-rule1" align="center" pn="table-4"> | |||
<name slugifiedName="name-checklist-state-with-newly-">Checklist State w | ||||
ith Newly Formed Pair, Rule 1</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left" colspan="1" rowspan="1"/> | ||||
<th align="left" colspan="1" rowspan="1">f1</th> | ||||
<th align="left" colspan="1" rowspan="1">f2</th> | ||||
<th align="left" colspan="1" rowspan="1">f3</th> | ||||
<th align="left" colspan="1" rowspan="1">f4</th> | ||||
<th align="left" colspan="1" rowspan="1">f5</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">S</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1">^W^</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t indent="0" pn="section-12-13"> | ||||
Rule 2: If there is at least one pair in the Succeeded state for | Rule 2: If there is at least one pair in the Succeeded state for | |||
this foundation, set the state to Waiting. For example, this would be | this foundation, set the state to Waiting. For example, this would be | |||
the case if the pair in column 5, row 1 succeeded and the newly formed | the case if the pair in column 5, row 1 succeeded and the newly formed | |||
pair were placed in column 5, row 2. This rule is consistent with | pair were placed in column 5, row 2. This rule is consistent with | |||
Section 7.2.5.3.3 of <xref target="rfc5245bis"/>. | <xref target="RFC8445" format="default" sectionFormat="of" section="7.2. | |||
</t> | 5.3.3" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-7.2.5.3.3" derive | |||
<t> | dContent="RFC8445"/>. | |||
<figure title="Check List State with Newly Formed Pair, Rule 2" anchor=" | ||||
fig-checklist-rule2"> | ||||
<artwork> | ||||
<![CDATA[ | ||||
+-----------------+------+------+------+------+------+ | ||||
| | f1 | f2 | f3 | f4 | f5 | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s1 (Audio.RTP) | S | W | W | | S | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s2 (Audio.RTCP) | W | F | F | W | ^W^ | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s3 (Video.RTP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s4 (Video.RTCP) | W | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | </t> | |||
<t> | <table anchor="fig-checklist-rule2" align="center" pn="table-5"> | |||
<name slugifiedName="name-checklist-state-with-newly-f">Checklist State | ||||
with Newly Formed Pair, Rule 2</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left" colspan="1" rowspan="1"/> | ||||
<th align="left" colspan="1" rowspan="1">f1</th> | ||||
<th align="left" colspan="1" rowspan="1">f2</th> | ||||
<th align="left" colspan="1" rowspan="1">f3</th> | ||||
<th align="left" colspan="1" rowspan="1">f4</th> | ||||
<th align="left" colspan="1" rowspan="1">f5</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">S</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1">S</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">^W^</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t indent="0" pn="section-12-15"> | ||||
Rule 3: In all other cases, set the state to Frozen. For example, | Rule 3: In all other cases, set the state to Frozen. For example, | |||
this would be the case if the newly formed pair were placed in | this would be the case if the newly formed pair were placed in | |||
column 3, row 3. | column 3, row 3. | |||
</t> | </t> | |||
<t> | <table anchor="fig-checklist-rule3" align="center" pn="table-6"> | |||
<figure title="Check List State with Newly Formed Pair, Rule 3" anchor=" | <name slugifiedName="name-checklist-state-with-newly-fo">Checklist State | |||
fig-checklist-rule3"> | with Newly Formed Pair, Rule 3</name> | |||
<artwork> | <thead> | |||
<![CDATA[ | <tr> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1"/> | |||
| | f1 | f2 | f3 | f4 | f5 | | <th align="left" colspan="1" rowspan="1">f1</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f2</th> | |||
| s1 (Audio.RTP) | S | W | W | | S | | <th align="left" colspan="1" rowspan="1">f3</th> | |||
+-----------------+------+------+------+------+------+ | <th align="left" colspan="1" rowspan="1">f4</th> | |||
| s2 (Audio.RTCP) | W | F | F | W | W | | <th align="left" colspan="1" rowspan="1">f5</th> | |||
+-----------------+------+------+------+------+------+ | </tr> | |||
| s3 (Video.RTP) | W | | ^F^ | | | | </thead> | |||
+-----------------+------+------+------+------+------+ | <tbody> | |||
| s4 (Video.RTCP) | W | | | | | | <tr> | |||
+-----------------+------+------+------+------+------+ | <td align="left" colspan="1" rowspan="1">s1 (Audio.RTP)</td> | |||
]]> | <td align="left" colspan="1" rowspan="1">S</td> | |||
</artwork> | <td align="left" colspan="1" rowspan="1">W</td> | |||
</figure> | <td align="left" colspan="1" rowspan="1">W</td> | |||
</t> | <td align="left" colspan="1" rowspan="1"/> | |||
<td align="left" colspan="1" rowspan="1">S</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s2 (Audio.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">F</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s3 (Video.RTP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1">^F^</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">s4 (Video.RTCP)</td> | ||||
<td align="left" colspan="1" rowspan="1">W</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
<td align="left" colspan="1" rowspan="1"> </td> | ||||
<td align="left" colspan="1" rowspan="1"> | ||||
</td> | ||||
<td align="left" colspan="1" rowspan="1"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
<section title='Generating an End-of-Candidates Indication' | <section anchor="end-of-candidates.send" numbered="true" toc="include" remov | |||
anchor="end-of-candidates.send"> | eInRFC="false" pn="section-13"> | |||
<t> | <name slugifiedName="name-generating-an-end-of-candid">Generating an End-o | |||
f-Candidates Indication</name> | ||||
<t indent="0" pn="section-13-1"> | ||||
Once all candidate gathering is completed or expires for an | Once all candidate gathering is completed or expires for an | |||
ICE session associated with a specific data stream, the agent will gener ate an | ICE session associated with a specific data stream, the agent will gener ate an | |||
"end-of-candidates" indication for that session and convey it to | "end-of-candidates" indication for that session and convey it to | |||
the remote agent via the signaling channel. Although the exact form of | the remote agent via the signaling channel. Although the exact form of | |||
the indication depends on the using protocol, the indication | the indication depends on the using protocol, the indication | |||
MUST specify the generation (Username Fragment and Password combination) so that an agent | <bcp14>MUST</bcp14> specify the generation (Username Fragment and Passwo rd combination), so that an agent | |||
can correlate the end-of-candidates indication with a particular ICE | can correlate the end-of-candidates indication with a particular ICE | |||
session. The indication can be conveyed in the following ways: | session. The indication can be conveyed in the following ways: | |||
<list style='symbols'> | ||||
<t>As part of an initiation request (which would typically be the case | ||||
with | ||||
the initial ICE description for half trickle)</t> | ||||
<t>Along with the last candidate an agent can send for a stream</t> | ||||
<t>As a standalone notification (e.g., after STUN Binding requests | ||||
or TURN Allocate requests to a server time out and the agent | ||||
is no longer actively gathering candidates)</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-13- | |||
2"> | ||||
<li pn="section-13-2.1">As part of an initiation request (which would ty | ||||
pically be the case with | ||||
the initial ICE description for half trickle)</li> | ||||
<li pn="section-13-2.2">Along with the last candidate an agent can send | ||||
for a stream</li> | ||||
<li pn="section-13-2.3">As a standalone notification (e.g., after STUN B | ||||
inding requests | ||||
or TURN Allocate requests to a server time out and the agent | ||||
is no longer actively gathering candidates)</li> | ||||
</ul> | ||||
<t indent="0" pn="section-13-3"> | ||||
Conveying an end-of-candidates indication in a timely manner is importan t | Conveying an end-of-candidates indication in a timely manner is importan t | |||
in order to avoid ambiguities and speed up the conclusion of ICE process ing. | in order to avoid ambiguities and speed up the conclusion of ICE process ing. | |||
In particular: | In particular: | |||
<list style='symbols'> | </t> | |||
<t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-13- | |||
A controlled Trickle ICE agent SHOULD convey an end-of-candidates | 4"> | |||
<li pn="section-13-4.1"> | ||||
A controlled Trickle ICE agent <bcp14>SHOULD</bcp14> convey an end-o | ||||
f-candidates | ||||
indication after it has completed gathering for a data stream, | indication after it has completed gathering for a data stream, | |||
unless ICE processing terminates before the agent has had a chance | unless ICE processing terminates before the agent has had a chance | |||
to complete gathering. | to complete gathering. | |||
</t> | </li> | |||
<t> | <li pn="section-13-4.2"> | |||
A controlling agent MAY conclude ICE processing prior to conveying | A controlling agent <bcp14>MAY</bcp14> conclude ICE processing prior | |||
to conveying | ||||
end-of-candidates indications for all streams. However, it is | end-of-candidates indications for all streams. However, it is | |||
RECOMMENDED for a controlling agent to convey end-of-candidates | <bcp14>RECOMMENDED</bcp14> for a controlling agent to convey end-of- candidates | |||
indications whenever possible for the sake of consistency and to | indications whenever possible for the sake of consistency and to | |||
keep middleboxes and controlled agents up-to-date on the state of | keep middleboxes and controlled agents up-to-date on the state of | |||
ICE processing. | ICE processing. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | <t indent="0" pn="section-13-5"> | |||
<t> | ||||
When conveying an end-of-candidates indication during trickling | When conveying an end-of-candidates indication during trickling | |||
(rather than as a part of the initial ICE description or a response ther eto), | (rather than as a part of the initial ICE description or a response ther eto), | |||
it is the responsibility of the | it is the responsibility of the | |||
using protocol to define methods for associating the | using protocol to define methods for associating the | |||
indication with one or more specific data streams. | indication with one or more specific data streams. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-13-6"> | |||
An agent MAY also choose to generate an end-of-candidates | An agent <bcp14>MAY</bcp14> also choose to generate an end-of-candidates | |||
indication before candidate gathering has actually completed, if the | indication before candidate gathering has actually completed, if the | |||
agent determines that gathering has continued for more than an | agent determines that gathering has continued for more than an | |||
acceptable period of time. However, an agent MUST NOT convey any | acceptable period of time. However, an agent <bcp14>MUST NOT</bcp14> con vey any | |||
more candidates after it has conveyed an end-of-candidates | more candidates after it has conveyed an end-of-candidates | |||
indication. | indication. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-13-7"> | |||
When performing half trickle, an agent SHOULD convey an | When performing half trickle, an agent <bcp14>SHOULD</bcp14> convey an | |||
end-of-candidates indication together with its initial ICE description u nless | end-of-candidates indication together with its initial ICE description u nless | |||
it is planning to potentially trickle additional candidates (e.g., in | it is planning to potentially trickle additional candidates (e.g., in | |||
case the remote party turns out to support Trickle ICE). | case the remote party turns out to support Trickle ICE). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-13-8"> | |||
After an agent conveys the end-of-candidates indication, it will | After an agent conveys the end-of-candidates indication, it will | |||
update the state of the corresponding check list as explained | update the state of the corresponding checklist as explained | |||
in <xref target="checks"/>. Past that point, an | in <xref target="checks" format="default" sectionFormat="of" derivedCont | |||
agent MUST NOT trickle any new candidates within this ICE session. | ent="Section 8"/>. Past that point, an | |||
agent <bcp14>MUST NOT</bcp14> trickle any new candidates within this ICE | ||||
session. | ||||
Therefore, adding new candidates to the | Therefore, adding new candidates to the | |||
negotiation is possible only through an ICE restart (see | negotiation is possible only through an ICE restart (see | |||
<xref target='subsequent'/>). | <xref target="subsequent" format="default" sectionFormat="of" derivedCon tent="Section 15"/>). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-13-9"> | |||
This specification does not | This specification does not | |||
override regular ICE semantics for concluding ICE processing. | override regular ICE semantics for concluding ICE processing. | |||
Therefore, even if end-of-candidates indications are conveyed, | Therefore, even if end-of-candidates indications are conveyed, | |||
an agent will still need to go through pair nomination. Also, if | an agent will still need to go through pair nomination. Also, if | |||
pairs have been nominated for components and data streams, ICE | pairs have been nominated for components and data streams, ICE | |||
processing MAY still conclude even if end-of-candidates | processing <bcp14>MAY</bcp14> still conclude even if end-of-candidates | |||
indications have not been received for all streams. In all cases, | indications have not been received for all streams. In all cases, | |||
an agent MUST NOT trickle any new candidates within an ICE session | an agent <bcp14>MUST NOT</bcp14> trickle any new candidates within an IC | |||
after nomination of a candidate pair as described in Section 8.1.1 | E session | |||
of <xref target='rfc5245bis'/>. | after nomination of a candidate pair as described in | |||
<xref target="RFC8445" format="default" sectionFormat="of" section="8.1. | ||||
1" derivedLink="https://rfc-editor.org/rfc/rfc8445#section-8.1.1" derivedContent | ||||
="RFC8445"/>. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Receiving an End-of-Candidates Indication' | <section anchor="end-of-candidates.recv" numbered="true" toc="include" remov | |||
anchor="end-of-candidates.recv"> | eInRFC="false" pn="section-14"> | |||
<t> | <name slugifiedName="name-receiving-an-end-of-candida">Receiving an End-of | |||
-Candidates Indication</name> | ||||
<t indent="0" pn="section-14-1"> | ||||
Receiving an end-of-candidates indication enables an agent to | Receiving an end-of-candidates indication enables an agent to | |||
update check list states and, in case valid pairs do not exist | update checklist states and, in case valid pairs do not exist | |||
for every component in every data stream, determine that ICE | for every component in every data stream, determine that ICE | |||
processing has failed. It also enables an agent to speed up the | processing has failed. It also enables an agent to speed up the | |||
conclusion of ICE processing when a candidate pair has been validated | conclusion of ICE processing when a candidate pair has been validated | |||
but it involves the use of lower-preference transports such as | but uses a lower-preference transport such as | |||
TURN. In such situations, an implementation MAY choose to wait | TURN. In such situations, an implementation <bcp14>MAY</bcp14> choose to | |||
and see if higher-priority candidates are received; in this case | wait | |||
and see if higher-priority candidates are received; in this case, | ||||
the end-of-candidates indication provides a notification that such | the end-of-candidates indication provides a notification that such | |||
candidates are not forthcoming. | candidates are not forthcoming. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-14-2"> | |||
When an agent receives an end-of-candidates indication for a | When an agent receives an end-of-candidates indication for a | |||
specific data stream, it will update the state of the relevant | specific data stream, it will update the state of the relevant | |||
check list as per <xref target="checks"/> (which might lead to | checklist as per <xref target="checks" format="default" sectionFormat="o | |||
some check lists being marked as Failed). If the check list is | f" derivedContent="Section 8"/> (which might lead to | |||
still in the Running state after the update, the agent will persist | some checklists being marked as Failed). | |||
the fact that an end-of-candidates indication has been | If the checklist is | |||
still in the Running state after the update, the agent will note that an | ||||
end-of-candidates indication has been | ||||
received and take it into account in future updates | received and take it into account in future updates | |||
to the check list. | to the checklist. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-14-3"> | |||
After an agent has received an end-of-candidates indication, it | After an agent has received an end-of-candidates indication, it | |||
MUST ignore any newly received candidates for that data | <bcp14>MUST</bcp14> ignore any newly received candidates for that data | |||
stream or data session. | stream or data session. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Subsequent Exchanges and ICE Restarts' | <section anchor="subsequent" numbered="true" toc="include" removeInRFC="fals | |||
anchor="subsequent"> | e" pn="section-15"> | |||
<t> | <name slugifiedName="name-subsequent-exchanges-and-ic">Subsequent Exchange | |||
s and ICE Restarts</name> | ||||
<t indent="0" pn="section-15-1"> | ||||
Before conveying an end-of-candidates indication, | Before conveying an end-of-candidates indication, | |||
either agent MAY convey subsequent candidate information at any time all | either agent <bcp14>MAY</bcp14> convey subsequent candidate information | |||
owed | at any time allowed | |||
by the using protocol. When this happens, agents will use | by the using protocol. When this happens, agents will use semantics from | |||
<xref target="rfc5245bis"/> semantics (e.g., checking of the | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten | |||
t="RFC8445"/> (e.g., checking of the | ||||
Username Fragment and Password combination) to determine whether or not | Username Fragment and Password combination) to determine whether or not | |||
the new candidate information requires an ICE restart. | the new candidate information requires an ICE restart. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-15-2"> | |||
If an ICE restart | If an ICE restart | |||
occurs, the agents can assume that Trickle ICE is still supported | occurs, the agents can assume that Trickle ICE is still supported | |||
if support was determined previously, and thus can engage in Trickle ICE | if support was determined previously; thus, they can engage in Trickle I CE | |||
behavior as they would in an initial exchange of ICE descriptions where | behavior as they would in an initial exchange of ICE descriptions where | |||
support was determined through a capabilities discovery method. | support was determined through a capabilities discovery method. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Half Trickle' anchor="half-trickle"> | <section anchor="half-trickle" numbered="true" toc="include" removeInRFC="fa | |||
<t> | lse" pn="section-16"> | |||
<name slugifiedName="name-half-trickle">Half Trickle</name> | ||||
<t indent="0" pn="section-16-1"> | ||||
In half trickle, the initiator conveys the initial ICE description | In half trickle, the initiator conveys the initial ICE description | |||
with a usable but not necessarily full generation of candidates. This | with a usable but not necessarily full generation of candidates. This | |||
ensures that the ICE description can be processed by a regular ICE | ensures that the ICE description can be processed by a regular ICE | |||
responder and is mostly meant for use in cases where support for | responder and is mostly meant for use in cases where support for | |||
Trickle ICE cannot be confirmed prior to conveying the initial ICE | Trickle ICE cannot be confirmed prior to conveying the initial ICE | |||
description. The initial ICE description indicates support for | description. The initial ICE description indicates support for | |||
Trickle ICE, so that the responder can respond with something less | Trickle ICE, so that the responder can respond with something less | |||
than a full generation of candidates and then trickle the rest. | than a full generation of candidates and then trickle the rest. | |||
The initial ICE description for half trickle can contain | The initial ICE description for half trickle can contain | |||
an end-of-candidates indication, although this is not mandatory | an end-of-candidates indication, although this is not mandatory | |||
because if trickle support is confirmed then the initiator can | because if trickle support is confirmed, then the initiator can | |||
choose to trickle additional candidates before it conveys an | choose to trickle additional candidates before it conveys an | |||
end-of-candidates indication. | end-of-candidates indication. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-16-2"> | |||
The half trickle mechanism can be used in cases where there is | The half-trickle mechanism can be used in cases where there is | |||
no way for an agent to verify in advance whether a remote | no way for an agent to verify in advance whether a remote | |||
party supports Trickle ICE. Because the initial ICE description contain | party supports Trickle ICE. Because the initial ICE description contains | |||
a full generation of candidates, it can thus be handled by a regular | a full generation of candidates, it can thus be handled by a regular | |||
ICE agent, while still allowing a Trickle ICE agent to use | ICE agent, while still allowing a Trickle ICE agent to use | |||
the optimization defined in this specification. This prevents | the optimization defined in this specification. This prevents | |||
negotiation from failing in the former case while still giving | negotiation from failing in the former case while still giving | |||
roughly half the Trickle ICE benefits in the latter. | roughly half the Trickle ICE benefits in the latter. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-16-3"> | |||
Use of half trickle is only necessary during an initial | Use of half trickle is only necessary during an initial | |||
exchange of ICE descriptions. After both parties have received | exchange of ICE descriptions. After both parties have received | |||
an ICE description from their peer, they can each reliably | an ICE description from their peer, they can each reliably | |||
determine Trickle ICE support and use it for all subsequent | determine Trickle ICE support and use it for all subsequent | |||
exchanges (see <xref target='subsequent'/>). | exchanges (see <xref target="subsequent" format="default" sectionFormat= "of" derivedContent="Section 15"/>). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-16-4"> | |||
In some instances, using half trickle might bring more than | In some instances, using half trickle might bring more than | |||
just half the improvement in terms of user experience. This | just half the improvement in terms of user experience. | |||
can happen when an agent starts gathering candidates upon user | ||||
interface cues that the user will soon be initiating an interaction, | This | |||
can happen when an agent starts gathering candidates upon user-interface | ||||
cues that the user will soon be initiating an interaction, | ||||
such as activity on a keypad or the phone going off hook. This | such as activity on a keypad or the phone going off hook. This | |||
would mean that some or all of the candidate | would mean that some or all of the candidate | |||
gathering could be completed before the agent actually | gathering could be completed before the agent actually | |||
needs to convey the candidate information. Because the responder will be able | needs to convey the candidate information. Because the responder will be able | |||
to trickle candidates, both agents will be able to start | to trickle candidates, both agents will be able to start | |||
connectivity checks and complete ICE processing earlier than | connectivity checks and complete ICE processing earlier than | |||
with regular ICE and potentially even as early as with full | with regular ICE and potentially even as early as with full | |||
trickle. | trickle. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-16-5"> | |||
However, such anticipation is not always possible. For | However, such anticipation is not always possible. For | |||
example, a multipurpose user agent or a WebRTC web page where | example, a multipurpose user agent or a WebRTC web page where | |||
communication is a non-central feature (e.g., calling a support | communication is a non-central feature (e.g., calling a support | |||
line in case of a problem with the main features) would not | line in case of a problem with the main features) would not | |||
necessarily have a way of distinguishing between call | necessarily have a way of distinguishing between call | |||
intentions and other user activity. In such cases, using full | intentions and other user activity. In such cases, using full | |||
trickle is most likely to result in an ideal user experience. | trickle is most likely to result in an ideal user experience. | |||
Even so, using half trickle would be an improvement over regular | Even so, using half trickle would be an improvement over regular | |||
ICE because it would result in a better experience for responders. | ICE because it would result in a better experience for responders. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Preserving Candidate Order while Trickling'> | <section numbered="true" toc="include" removeInRFC="false" pn="section-17"> | |||
<t> | <name slugifiedName="name-preserving-candidate-order-">Preserving Candidat | |||
e Order While Trickling</name> | ||||
<t indent="0" pn="section-17-1"> | ||||
One important aspect of regular ICE is that connectivity checks | One important aspect of regular ICE is that connectivity checks | |||
for a specific foundation and component are attempted | for a specific foundation and component are attempted | |||
simultaneously by both agents, so that any firewalls or NATs | simultaneously by both agents, so that any firewalls or NATs | |||
fronting the agents would whitelist both endpoints and allow | fronting the agents would whitelist both endpoints and allow | |||
all except for the first ("suicide") packets to go through. This | all except for the first ("suicide") packets to go through. This | |||
is also important to unfreezing candidates at the right time. While | is also important to unfreezing candidates at the right time. While | |||
not crucial, preserving this behavior in Trickle ICE is likely to | not crucial, preserving this behavior in Trickle ICE is likely to | |||
improve ICE performance. | improve ICE performance. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-17-2"> | |||
To achieve this, when trickling candidates, agents SHOULD respect the | To achieve this, when trickling candidates, agents <bcp14>SHOULD</bcp14> | |||
respect the | ||||
order of components as reflected by their component IDs; that is, | order of components as reflected by their component IDs; that is, | |||
candidates for a given component | candidates for a given component | |||
SHOULD NOT be conveyed prior to candidates for a component with a | <bcp14>SHOULD NOT</bcp14> be conveyed prior to candidates for a componen t with a | |||
lower ID number within the same foundation. In addition, candidates | lower ID number within the same foundation. In addition, candidates | |||
SHOULD be paired, following the procedures in <xref target='trickle-inse rt'/>, | <bcp14>SHOULD</bcp14> be paired, following the procedures in <xref targe t="trickle-insert" format="default" sectionFormat="of" derivedContent="Section 1 2"/>, | |||
in the same order they are conveyed. | in the same order they are conveyed. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-17-3"> | |||
For example, the following SDP description contains two | For example, the following SDP description contains two | |||
components (RTP and RTCP) and two foundations (host and | components (RTP and RTCP) and two foundations (host and | |||
server reflexive): | server-reflexive): | |||
<figure> | </t> | |||
<artwork> | <sourcecode type="sdp" markers="false" pn="section-17-4"> | |||
<![CDATA[ | ||||
v=0 | v=0 | |||
o=jdoe 2890844526 2890842807 IN IP4 10.0.1.1 | o=jdoe 2890844526 2890842807 IN IP4 10.0.1.1 | |||
s= | s= | |||
c=IN IP4 10.0.1.1 | c=IN IP4 10.0.1.1 | |||
t=0 0 | t=0 0 | |||
a=ice-pwd:asd88fgpdd777uzjYhagZg | a=ice-pwd:asd88fgpdd777uzjYhagZg | |||
a=ice-ufrag:8hhY | a=ice-ufrag:8hhY | |||
m=audio 5000 RTP/AVP 0 | m=audio 5000 RTP/AVP 0 | |||
a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
a=candidate:1 1 UDP 2130706431 10.0.1.1 5000 typ host | a=candidate:1 1 UDP 2130706431 10.0.1.1 5000 typ host | |||
a=candidate:1 2 UDP 2130706431 10.0.1.1 5001 typ host | a=candidate:1 2 UDP 2130706431 10.0.1.1 5001 typ host | |||
a=candidate:2 1 UDP 1694498815 192.0.2.3 5000 typ srflx | a=candidate:2 1 UDP 1694498815 192.0.2.3 5000 typ srflx | |||
raddr 10.0.1.1 rport 8998 | raddr 10.0.1.1 rport 8998 | |||
a=candidate:2 2 UDP 1694498815 192.0.2.3 5001 typ srflx | a=candidate:2 2 UDP 1694498815 192.0.2.3 5001 typ srflx | |||
raddr 10.0.1.1 rport 8998 | raddr 10.0.1.1 rport 8998 | |||
]]> | </sourcecode> | |||
</artwork> | <t indent="0" pn="section-17-5"> | |||
</figure> | For this candidate information, the RTCP host candidate would not be con | |||
For this candidate information the RTCP host candidate would not be conv | veyed | |||
eyed | prior to the RTP host candidate. Similarly, the RTP server-reflexive | |||
prior to the RTP host candidate. Similarly the RTP server | candidate would be conveyed together with or prior to the | |||
reflexive candidate would be conveyed together with or prior to the | RTCP server-reflexive candidate. | |||
RTCP server reflexive candidate. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Requirements for Using Protocols' anchor="reqs"> | <section anchor="reqs" numbered="true" toc="include" removeInRFC="false" pn= | |||
<t> | "section-18"> | |||
<name slugifiedName="name-requirements-for-using-prot">Requirements for Us | ||||
ing Protocols</name> | ||||
<t indent="0" pn="section-18-1"> | ||||
In order to fully enable the use of Trickle ICE, this specification | In order to fully enable the use of Trickle ICE, this specification | |||
defines the following requirements for using protocols. | defines the following requirements for using protocols. | |||
<list style='symbols'> | </t> | |||
<t> | <ul spacing="normal" bare="false" empty="false" indent="3" pn="section-18- | |||
A using protocol SHOULD provide a way for parties to advertise | 2"> | |||
<li pn="section-18-2.1"> | ||||
A using protocol <bcp14>SHOULD</bcp14> provide a way for parties to | ||||
advertise | ||||
and discover support for Trickle ICE before an ICE | and discover support for Trickle ICE before an ICE | |||
session begins (see <xref target='support'/>). | session begins (see <xref target="support" format="default" sectionF | |||
</t> | ormat="of" derivedContent="Section 3"/>). | |||
<t> | </li> | |||
A using protocol MUST provide methods for incrementally | <li pn="section-18-2.2"> | |||
A using protocol <bcp14>MUST</bcp14> provide methods for incremental | ||||
ly | ||||
conveying (i.e., "trickling") additional candidates after | conveying (i.e., "trickling") additional candidates after | |||
conveying the initial ICE description (see | conveying the initial ICE description (see | |||
<xref target='trickle-send'/>). | <xref target="trickle-send" format="default" sectionFormat="of" deri | |||
</t> | vedContent="Section 9"/>). | |||
<t> | </li> | |||
A using protocol MUST deliver each trickled candidate | <li pn="section-18-2.3"> | |||
A using protocol <bcp14>MUST</bcp14> deliver each trickled candidate | ||||
or end-of-candidates indication exactly once | or end-of-candidates indication exactly once | |||
and in the same order it was conveyed (see | and in the same order it was conveyed (see | |||
<xref target='trickle-send'/>). | <xref target="trickle-send" format="default" sectionFormat="of" deri | |||
</t> | vedContent="Section 9"/>). | |||
<t> | </li> | |||
A using protocol MUST provide a mechanism for both parties | <li pn="section-18-2.4"> | |||
A using protocol <bcp14>MUST</bcp14> provide a mechanism for both pa | ||||
rties | ||||
to indicate and agree on the ICE session in force | to indicate and agree on the ICE session in force | |||
(see <xref target='trickle-send'/>). | (see <xref target="trickle-send" format="default" sectionFormat="of" | |||
</t> | derivedContent="Section 9"/>). | |||
<t> | </li> | |||
A using protocol MUST provide a way for parties to communicate the | <li pn="section-18-2.5"> | |||
end-of-candidates indication, which MUST specify the particular ICE | A using protocol <bcp14>MUST</bcp14> provide a way for parties to co | |||
session to which the indication applies (see <xref target='end-of-ca | mmunicate the | |||
ndidates.send'/>). | end-of-candidates indication, which <bcp14>MUST</bcp14> specify the | |||
</t> | particular | |||
</list> | ICE session to which the indication applies (see <xref target="end-o | |||
</t> | f-candidates.send" format="default" sectionFormat="of" derivedContent="Section 1 | |||
3"/>). | ||||
</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section title='IANA Considerations'> | <section numbered="true" toc="include" removeInRFC="false" pn="section-19"> | |||
<t> | <name slugifiedName="name-iana-considerations">IANA Considerations</name> | |||
IANA is requested to register the following ICE option in the "ICE | <t indent="0" pn="section-19-1"> | |||
Options" sub-registry of the "Interactive Connectivity Establishment | IANA has registered the following ICE option in the "ICE | |||
Options" subregistry of the "Interactive Connectivity Establishment | ||||
(ICE) registry", following the procedures defined in | (ICE) registry", following the procedures defined in | |||
<xref target='RFC6336'/>. | <xref target="RFC6336" format="default" sectionFormat="of" derivedConten t="RFC6336"/>. | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal" indent="3" pn="section-19-2"> | |||
<list style='hanging'> | <dt pn="section-19-2.1">ICE Option:</dt> | |||
<t hangText="ICE Option:">trickle</t> | <dd pn="section-19-2.2">trickle</dd> | |||
<t hangText="Contact:">IESG, iesg@ietf.org</t> | <dt pn="section-19-2.3">Contact:</dt> | |||
<t hangText="Change control:">IESG</t> | <dd pn="section-19-2.4">IESG <iesg@ietf.org></dd> | |||
<t hangText="Description:"> | <dt pn="section-19-2.5">Change controller:</dt> | |||
An ICE option of "trickle" indicates support for incremental | <dd pn="section-19-2.6">IESG</dd> | |||
<dt pn="section-19-2.7">Description:</dt> | ||||
<dd pn="section-19-2.8"> | ||||
An ICE option of 'trickle' indicates support for incremental | ||||
communication of ICE candidates. | communication of ICE candidates. | |||
</t> | </dd> | |||
<t hangText="Reference:">RFC XXXX</t> | <dt pn="section-19-2.9">Reference:</dt> | |||
</list> | <dd pn="section-19-2.10">RFC 8838</dd> | |||
</t> | </dl> | |||
</section> | </section> | |||
<section title='Security Considerations'> | <section numbered="true" toc="include" removeInRFC="false" pn="section-20"> | |||
<t> | <name slugifiedName="name-security-considerations">Security Considerations | |||
</name> | ||||
<t indent="0" pn="section-20-1"> | ||||
This specification inherits most of its semantics from | This specification inherits most of its semantics from | |||
<xref target="rfc5245bis"/> and as a result all security | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/>, and as a result, all security | |||
considerations described there apply to Trickle ICE. | considerations described there apply to Trickle ICE. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-20-2"> | |||
If the privacy implications of revealing host addresses on an | If the privacy implications of revealing host addresses on an | |||
endpoint device are a concern (see for example the discussion | endpoint device are a concern (see, for example, the discussion | |||
in <xref target='I-D.ietf-rtcweb-ip-handling'/> and in Section 19 | in <xref target="RFC8828" format="default" sectionFormat="of" derivedCon | |||
of <xref target="rfc5245bis"/>), agents can generate ICE descriptions th | tent="RFC8828"/> and in | |||
at contain no | <xref target="RFC8445" section="19" sectionFormat="of" format="default" | |||
derivedLink="https://rfc-editor.org/rfc/rfc8445#section-19" derivedContent="RFC8 | ||||
445"/>), agents can generate ICE descriptions that contain no | ||||
candidates and then only trickle candidates that do not reveal | candidates and then only trickle candidates that do not reveal | |||
host addresses (e.g., relayed candidates). | host addresses (e.g., relayed candidates). | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Acknowledgements'> | ||||
<t> | ||||
The authors would like to thank Bernard Aboba, Flemming Andreasen, | ||||
Rajmohan Banavi, Taylor Brandstetter, Philipp Hancke, Christer Holmberg, | ||||
Ari Keranen, Paul Kyzivat, Jonathan Lennox, Enrico Marocco, Pal Martinse | ||||
n, | ||||
Nils Ohlmeier, Thomas Stach, Peter Thatcher, Martin Thomson, Brandon Wil | ||||
liams, | ||||
and Dale Worley for their reviews and suggestions on improving this docu | ||||
ment. | ||||
Sarah Banks, Roni Even, and David Mandelberg completed opsdir, genart, a | ||||
nd | ||||
security reviews, respectively. Thanks also to Ari Keranen and Peter Tha | ||||
tcher | ||||
in their role as chairs, and Ben Campbell in his role as responsible Are | ||||
a | ||||
Director. | ||||
</t> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references title='Normative References'> | <references pn="section-21"> | |||
<?rfc include="reference.RFC.2119"?> | <name slugifiedName="name-references">References</name> | |||
<references pn="section-21.1"> | ||||
<reference anchor='rfc5245bis'> | <name slugifiedName="name-normative-references">Normative References</na | |||
<front> | me> | |||
<title>Interactive Connectivity Establishment (ICE): A Protocol for Network Addr | <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | |||
ess Translator (NAT) Traversal</title> | 119" quoteTitle="true" derivedAnchor="RFC2119"> | |||
<author initials='A' surname='Keranen' fullname='Ari Keranen'> | <front> | |||
<organization /> | <title>Key words for use in RFCs to Indicate Requirement Levels</tit | |||
</author> | le> | |||
<author initials='C' surname='Holmberg' fullname='Christer Holmberg'> | <author initials="S." surname="Bradner" fullname="S. Bradner"> | |||
<organization /> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<author initials='J' surname='Rosenberg' fullname='Jonathan Rosenberg'> | <date year="1997" month="March"/> | |||
<organization /> | <abstract> | |||
</author> | <t indent="0">In many standards track documents several words are | |||
<date month='March' day='8' year='2018' /> | used to signify the requirements in the specification. These words are often ca | |||
<abstract><t>This document describes a protocol for Network Address Translator ( | pitalized. This document defines these words as they should be interpreted in IE | |||
NAT) traversal for UDP-based multimedia. This protocol is called Interactive Co | TF documents. This document specifies an Internet Best Current Practices for th | |||
nnectivity Establishment (ICE). ICE makes use of the Session Traversal Utilitie | e Internet Community, and requests discussion and suggestions for improvements.< | |||
s for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN). | /t> | |||
This document obsoletes RFC 5245.</t></abstract> | </abstract> | |||
</front> | </front> | |||
<seriesInfo name='Internet-Draft' value='draft-ietf-ice-rfc5245bis-20' /> | <seriesInfo name="BCP" value="14"/> | |||
<format type='TXT' | <seriesInfo name="RFC" value="2119"/> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-ice-rfc5245bis-20 | <seriesInfo name="DOI" value="10.17487/RFC2119"/> | |||
.txt' /> | </reference> | |||
</reference> | <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | |||
174" quoteTitle="true" derivedAnchor="RFC8174"> | ||||
</references> | <front> | |||
<references title='Informative References'> | <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | |||
<?rfc include="reference.RFC.1918"?> | tle> | |||
<?rfc include="reference.RFC.3261"?> | <author initials="B." surname="Leiba" fullname="B. Leiba"> | |||
<?rfc include="reference.RFC.3264"?> | <organization showOnFrontPage="true"/> | |||
<?rfc include="reference.RFC.4566"?> | </author> | |||
<?rfc include="reference.RFC.4787"?> | <date year="2017" month="May"/> | |||
<?rfc include="reference.RFC.5389"?> | <abstract> | |||
<?rfc include="reference.RFC.5766"?> | <t indent="0">RFC 2119 specifies common key words that may be used | |||
<?rfc include="reference.RFC.6120"?> | in protocol specifications. This document aims to reduce the ambiguity by cla | |||
<?rfc include="reference.RFC.6336"?> | rifying that only UPPERCASE usage of the key words have the defined special mea | |||
<reference anchor='I-D.ietf-mmusic-trickle-ice-sip'> | nings.</t> | |||
<front> | </abstract> | |||
<title>A Session Initiation Protocol (SIP) usage for Trickle ICE</title> | </front> | |||
<author initials='E' surname='Ivov' fullname='Emil Ivov'> | <seriesInfo name="BCP" value="14"/> | |||
<organization /> | <seriesInfo name="RFC" value="8174"/> | |||
</author> | <seriesInfo name="DOI" value="10.17487/RFC8174"/> | |||
<author initials='T' surname='Stach' fullname='Thomas Stach'> | </reference> | |||
<organization /> | <reference anchor="RFC8445" target="https://www.rfc-editor.org/info/rfc8 | |||
</author> | 445" quoteTitle="true" derivedAnchor="RFC8445"> | |||
<author initials='E' surname='Marocco' fullname='Enrico Marocco'> | <front> | |||
<organization /> | <title>Interactive Connectivity Establishment (ICE): A Protocol for | |||
</author> | Network Address Translator (NAT) Traversal</title> | |||
<author initials='C' surname='Holmberg' fullname='Christer Holmberg'> | <author initials="A." surname="Keranen" fullname="A. Keranen"> | |||
<organization /> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<date month='February' day='24' year='2018' /> | <author initials="C." surname="Holmberg" fullname="C. Holmberg"> | |||
<abstract><t>The Interactive Connectivity Establishment (ICE) protocol describes | <organization showOnFrontPage="true"/> | |||
a Network Address Translator (NAT) traversal mechanism for UDP-based multimedia | </author> | |||
sessions established with the Offer/Answer model. The ICE extension for Increm | <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | |||
ental Provisioning of Candidates (Trickle ICE) defines a mechanism that allows I | <organization showOnFrontPage="true"/> | |||
CE agents to shorten session establishment delays by making the candidate gather | </author> | |||
ing and connectivity checking phases of ICE non-blocking and by executing them i | <date year="2018" month="July"/> | |||
n parallel. This document defines usage semantics for Trickle ICE with the Sess | <abstract> | |||
ion Initiation Protocol (SIP).</t></abstract> | <t indent="0">This document describes a protocol for Network Addre | |||
</front> | ss Translator (NAT) traversal for UDP-based communication. This protocol is cal | |||
<seriesInfo name='Internet-Draft' value='draft-ietf-mmusic-trickle-ice-sip-14' / | led Interactive Connectivity Establishment (ICE). ICE makes use of the Session | |||
> | Traversal Utilities for NAT (STUN) protocol and its extension, Traversal Using R | |||
<format type='TXT' | elay NAT (TURN).</t> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-mmusic-trickle-ic | <t indent="0">This document obsoletes RFC 5245.</t> | |||
e-sip-14.txt' /> | </abstract> | |||
</reference> | </front> | |||
<reference anchor='I-D.ietf-rtcweb-ip-handling'> | <seriesInfo name="RFC" value="8445"/> | |||
<front> | <seriesInfo name="DOI" value="10.17487/RFC8445"/> | |||
<title>WebRTC IP Address Handling Requirements</title> | </reference> | |||
<author initials='J' surname='Uberti' fullname='Justin Uberti'> | </references> | |||
<organization /> | <references pn="section-21.2"> | |||
</author> | <name slugifiedName="name-informative-references">Informative References | |||
<author initials='G' surname='Shieh' fullname='Guo-wei Shieh'> | </name> | |||
<organization /> | <reference anchor="RFC1918" target="https://www.rfc-editor.org/info/rfc1 | |||
</author> | 918" quoteTitle="true" derivedAnchor="RFC1918"> | |||
<date month='March' day='1' year='2018' /> | <front> | |||
<abstract><t>This document provides information and requirements for how IP addr | <title>Address Allocation for Private Internets</title> | |||
esses should be handled by WebRTC implementations.</t></abstract> | <author initials="Y." surname="Rekhter" fullname="Y. Rekhter"> | |||
</front> | <organization showOnFrontPage="true"/> | |||
<seriesInfo name='Internet-Draft' value='draft-ietf-rtcweb-ip-handling-06' /> | </author> | |||
<format type='TXT' | <author initials="B." surname="Moskowitz" fullname="B. Moskowitz"> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-rtcweb-ip-handlin | <organization showOnFrontPage="true"/> | |||
g-06.txt' /> | </author> | |||
</reference> | <author initials="D." surname="Karrenberg" fullname="D. Karrenberg"> | |||
<reference anchor="XEP-0176"> | <organization showOnFrontPage="true"/> | |||
<front> | </author> | |||
<title>XEP-0176: Jingle ICE-UDP Transport Method</title> | <author initials="G. J." surname="de Groot" fullname="G. J. de Groot | |||
<author initials='J.' surname='Beda' fullname='Joe Beda'> | "> | |||
<organization abbrev='Google'>Google</organization> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<author initials='S.' surname='Ludwig' | <author initials="E." surname="Lear" fullname="E. Lear"> | |||
fullname='Scott Ludwig'> | <organization showOnFrontPage="true"/> | |||
<organization abbrev='Google'>Google</organization> | </author> | |||
</author> | <date year="1996" month="February"/> | |||
<author initials='P.' surname='Saint-Andre' | <abstract> | |||
fullname='Peter Saint-Andre'> | <t indent="0">This document describes address allocation for priva | |||
</author> | te internets. This document specifies an Internet Best Current Practices for th | |||
<author initials='J.' surname='Hildebrand' | e Internet Community, and requests discussion and suggestions for improvements.< | |||
fullname='Joe Hildebrand'> | /t> | |||
<organization abbrev='Cisco'>Cisco</organization> | </abstract> | |||
</author> | </front> | |||
<author initials='S.' surname='Egan' fullname='Sean Egan'> | <seriesInfo name="BCP" value="5"/> | |||
<organization abbrev='Google'>Google </organization> | <seriesInfo name="RFC" value="1918"/> | |||
</author> | <seriesInfo name="DOI" value="10.17487/RFC1918"/> | |||
<author initials='R.' surname='McQueen' | </reference> | |||
fullname='Robert McQueen'> | <reference anchor="RFC3261" target="https://www.rfc-editor.org/info/rfc3 | |||
<organization abbrev='Collabora'>Collabora</organization> | 261" quoteTitle="true" derivedAnchor="RFC3261"> | |||
</author> | <front> | |||
<date month="June" year="2009" /> | <title>SIP: Session Initiation Protocol</title> | |||
</front> | <author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | |||
<seriesInfo name="XEP" value="XEP-0176" /> | <organization showOnFrontPage="true"/> | |||
</reference> | </author> | |||
<reference anchor="XEP-0030"> | <author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | |||
<front> | "> | |||
<title>XEP-0030: Service Discovery</title> | <organization showOnFrontPage="true"/> | |||
<author initials='J.' surname='Hildebrand' | </author> | |||
fullname='Joe Hildebrand'> | <author initials="G." surname="Camarillo" fullname="G. Camarillo"> | |||
<organization abbrev='Cisco'>Cisco</organization> | <organization showOnFrontPage="true"/> | |||
</author> | ||||
<author initials="A." surname="Johnston" fullname="A. Johnston"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Peterson" fullname="J. Peterson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Sparks" fullname="R. Sparks"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Handley" fullname="M. Handley"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E." surname="Schooler" fullname="E. Schooler"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2002" month="June"/> | ||||
<abstract> | ||||
<t indent="0">This document describes Session Initiation Protocol | ||||
(SIP), an application-layer control (signaling) protocol for creating, modifying | ||||
, and terminating sessions with one or more participants. These sessions includ | ||||
e Internet telephone calls, multimedia distribution, and multimedia conferences. | ||||
[STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3261"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3261"/> | ||||
</reference> | ||||
<reference anchor="RFC3264" target="https://www.rfc-editor.org/info/rfc3 | ||||
264" quoteTitle="true" derivedAnchor="RFC3264"> | ||||
<front> | ||||
<title>An Offer/Answer Model with Session Description Protocol (SDP) | ||||
</title> | ||||
<author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="H." surname="Schulzrinne" fullname="H. Schulzrinne | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2002" month="June"/> | ||||
<abstract> | ||||
<t indent="0">This document defines a mechanism by which two entit | ||||
ies can make use of the Session Description Protocol (SDP) to arrive at a common | ||||
view of a multimedia session between them. In the model, one participant offer | ||||
s the other a description of the desired session from their perspective, and the | ||||
other participant answers with the desired session from their perspective. Thi | ||||
s offer/answer model is most useful in unicast sessions where information from b | ||||
oth participants is needed for the complete view of the session. The offer/answ | ||||
er model is used by protocols like the Session Initiation Protocol (SIP). [STAN | ||||
DARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="3264"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC3264"/> | ||||
</reference> | ||||
<reference anchor="RFC4566" target="https://www.rfc-editor.org/info/rfc4 | ||||
566" quoteTitle="true" derivedAnchor="RFC4566"> | ||||
<front> | ||||
<title>SDP: Session Description Protocol</title> | ||||
<author initials="M." surname="Handley" fullname="M. Handley"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="V." surname="Jacobson" fullname="V. Jacobson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2006" month="July"/> | ||||
<abstract> | ||||
<t indent="0">This memo defines the Session Description Protocol ( | ||||
SDP). SDP is intended for describing multimedia sessions for the purposes of se | ||||
ssion announcement, session invitation, and other forms of multimedia session in | ||||
itiation. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="4566"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4566"/> | ||||
</reference> | ||||
<reference anchor="RFC4787" target="https://www.rfc-editor.org/info/rfc4 | ||||
787" quoteTitle="true" derivedAnchor="RFC4787"> | ||||
<front> | ||||
<title>Network Address Translation (NAT) Behavioral Requirements for | ||||
Unicast UDP</title> | ||||
<author initials="F." surname="Audet" fullname="F. Audet" role="edit | ||||
or"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Jennings" fullname="C. Jennings"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2007" month="January"/> | ||||
<abstract> | ||||
<t indent="0">This document defines basic terminology for describi | ||||
ng different types of Network Address Translation (NAT) behavior when handling U | ||||
nicast UDP and also defines a set of requirements that would allow many applicat | ||||
ions, such as multimedia communications or online gaming, to work consistently. | ||||
Developing NATs that meet this set of requirements will greatly increase the li | ||||
kelihood that these applications will function properly. This document specifie | ||||
s an Internet Best Current Practices for the Internet Community, and requests di | ||||
scussion and suggestions for improvements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="127"/> | ||||
<seriesInfo name="RFC" value="4787"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC4787"/> | ||||
</reference> | ||||
<reference anchor="RFC5389" target="https://www.rfc-editor.org/info/rfc5 | ||||
389" quoteTitle="true" derivedAnchor="RFC5389"> | ||||
<front> | ||||
<title>Session Traversal Utilities for NAT (STUN)</title> | ||||
<author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Mahy" fullname="R. Mahy"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P." surname="Matthews" fullname="P. Matthews"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="D." surname="Wing" fullname="D. Wing"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2008" month="October"/> | ||||
<abstract> | ||||
<t indent="0">Session Traversal Utilities for NAT (STUN) is a prot | ||||
ocol that serves as a tool for other protocols in dealing with Network Address T | ||||
ranslator (NAT) traversal. It can be used by an endpoint to determine the IP ad | ||||
dress and port allocated to it by a NAT. It can also be used to check connectiv | ||||
ity 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 indent="0">STUN is not a NAT traversal solution by itself. Rat | ||||
her, it is a tool to be used in the context of a NAT traversal solution. This i | ||||
s an important change from the previous version of this specification (RFC 3489) | ||||
, which presented STUN as a complete solution.</t> | ||||
<t indent="0">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="RFC5766" target="https://www.rfc-editor.org/info/rfc5 | ||||
766" quoteTitle="true" derivedAnchor="RFC5766"> | ||||
<front> | ||||
<title>Traversal Using Relays around NAT (TURN): Relay Extensions to | ||||
Session Traversal Utilities for NAT (STUN)</title> | ||||
<author initials="R." surname="Mahy" fullname="R. Mahy"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P." surname="Matthews" fullname="P. Matthews"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Rosenberg" fullname="J. Rosenberg"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2010" month="April"/> | ||||
<abstract> | ||||
<t indent="0">If a host is located behind a NAT, then in certain s | ||||
ituations it can be impossible for that host to communicate directly with other | ||||
hosts (peers). In these situations, it is necessary for the host to use the ser | ||||
vices of an intermediate node that acts as a communication relay. This specific | ||||
ation defines a protocol, called TURN (Traversal Using Relays around NAT), that | ||||
allows the host to control the operation of the relay and to exchange packets wi | ||||
th its peers using the relay. TURN differs from some other relay control protoc | ||||
ols in that it allows a client to communicate with multiple peers using a single | ||||
relay address. [STANDARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="5766"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5766"/> | ||||
</reference> | ||||
<reference anchor="RFC6120" target="https://www.rfc-editor.org/info/rfc6 | ||||
120" quoteTitle="true" derivedAnchor="RFC6120"> | ||||
<front> | ||||
<title>Extensible Messaging and Presence Protocol (XMPP): Core</titl | ||||
e> | ||||
<author initials="P." surname="Saint-Andre" fullname="P. Saint-Andre | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="March"/> | ||||
<abstract> | ||||
<t indent="0">The Extensible Messaging and Presence Protocol (XMPP | ||||
) is an application profile of the Extensible Markup Language (XML) that enables | ||||
the near-real-time exchange of structured yet extensible data between any two o | ||||
r more network entities. This document defines XMPP's core protocol methods: se | ||||
tup and teardown of XML streams, channel encryption, authentication, error handl | ||||
ing, and communication primitives for messaging, network availability ("presence | ||||
"), and request-response interactions. This document obsoletes RFC 3920. [STAN | ||||
DARDS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6120"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6120"/> | ||||
</reference> | ||||
<reference anchor="RFC6336" target="https://www.rfc-editor.org/info/rfc6 | ||||
336" quoteTitle="true" derivedAnchor="RFC6336"> | ||||
<front> | ||||
<title>IANA Registry for Interactive Connectivity Establishment (ICE | ||||
) Options</title> | ||||
<author initials="M." surname="Westerlund" fullname="M. Westerlund"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C." surname="Perkins" fullname="C. Perkins"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="July"/> | ||||
<abstract> | ||||
<t indent="0">It has been identified that "Interactive Connectivit | ||||
y Establishment (ICE): A Protocol for Network Address Translator (NAT) Traversal | ||||
for Offer/Answer Protocols" (RFC 5245) is missing a registry for ICE options. | ||||
This document defines this missing IANA registry and updates RFC 5245. [STANDAR | ||||
DS-TRACK]</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6336"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6336"/> | ||||
</reference> | ||||
<reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc8 | ||||
828" quoteTitle="true" derivedAnchor="RFC8828"> | ||||
<front> | ||||
<title>WebRTC IP Address Handling Requirements</title> | ||||
<author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="G" surname="Shieh" fullname="Guo-wei Shieh"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8828"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8828"/> | ||||
</reference> | ||||
<reference anchor="RFC8840" target="https://www.rfc-editor.org/info/rfc8 | ||||
840" quoteTitle="true" derivedAnchor="RFC8840"> | ||||
<front> | ||||
<title>A Session Initiation Protocol (SIP) Usage for Incremental Pro | ||||
visioning of Candidates for the Interactive Connectivity Establishment (Trickle | ||||
ICE)</title> | ||||
<author initials="E" surname="Ivov" fullname="Emil Ivov"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T" surname="Stach" fullname="Thomas Stach"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="E" surname="Marocco" fullname="Enrico Marocco"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="C" surname="Holmberg" fullname="Christer Holmberg" | ||||
> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date month="January" year="2021"/> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8840"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8840"/> | ||||
</reference> | ||||
<reference anchor="XEP-0030" quoteTitle="true" derivedAnchor="XEP-0030"> | ||||
<front> | ||||
<title>XEP-0030: Service Discovery</title> | ||||
<seriesInfo name="XMPP Standards Foundation," value="XEP-0030"/> | ||||
<author initials="J." surname="Hildebrand" fullname="Joe Hildebrand" | ||||
> | ||||
<organization abbrev="Cisco" showOnFrontPage="true">Cisco</organiz | ||||
ation> | ||||
</author> | ||||
<author initials="P." surname="Millard" fullname="Peter Millard"> | ||||
</author> | </author> | |||
<author initials='P.' surname='Millard' | <author initials="R." surname="Eatmon" fullname="Ryan Eatmon"> | |||
fullname='Peter Millard'> | ||||
</author> | </author> | |||
<author initials='R.' surname='Eatmon' | <author initials="P." surname="Saint-Andre" fullname="Peter Saint-An | |||
fullname='Ryan Eatmon'> | dre"> | |||
</author> | </author> | |||
<author initials='P.' surname='Saint-Andre' | <date month="June" year="2008"/> | |||
fullname='Peter Saint-Andre'> | </front> | |||
</reference> | ||||
<reference anchor="XEP-0176" quoteTitle="true" derivedAnchor="XEP-0176"> | ||||
<front> | ||||
<title>XEP-0176: Jingle ICE-UDP Transport Method</title> | ||||
<seriesInfo name="XMPP Standards Foundation," value="XEP-0176"/> | ||||
<author initials="J." surname="Beda" fullname="Joe Beda"> | ||||
<organization abbrev="Google" showOnFrontPage="true">Google</organ | ||||
ization> | ||||
</author> | ||||
<author initials="S." surname="Ludwig" fullname="Scott Ludwig"> | ||||
<organization abbrev="Google" showOnFrontPage="true">Google</organ | ||||
ization> | ||||
</author> | ||||
<author initials="P." surname="Saint-Andre" fullname="Peter Saint-An | ||||
dre"> | ||||
</author> | </author> | |||
<date month="June" year="2008" /> | <author initials="J." surname="Hildebrand" fullname="Joe Hildebrand" | |||
</front> | > | |||
<seriesInfo name="XEP" value="XEP-0030" /> | <organization abbrev="Cisco" showOnFrontPage="true">Cisco</organiz | |||
</reference> | ation> | |||
</author> | ||||
<author initials="S." surname="Egan" fullname="Sean Egan"> | ||||
<organization abbrev="Google" showOnFrontPage="true">Google</organ | ||||
ization> | ||||
</author> | ||||
<author initials="R." surname="McQueen" fullname="Robert McQueen"> | ||||
<organization abbrev="Collabora" showOnFrontPage="true">Collabora< | ||||
/organization> | ||||
</author> | ||||
<date month="June" year="2009"/> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<section title='Interaction with Regular ICE' | <section anchor="interaction" numbered="true" toc="include" removeInRFC="fal | |||
anchor='interaction'> | se" pn="section-appendix.a"> | |||
<t> | <name slugifiedName="name-interaction-with-regular-ic">Interaction with Re | |||
gular ICE</name> | ||||
<t indent="0" pn="section-appendix.a-1"> | ||||
The ICE protocol was designed to be flexible enough to | The ICE protocol was designed to be flexible enough to | |||
work in and adapt to as many network environments as | work in and adapt to as many network environments as | |||
possible. Despite that flexibility, ICE as specified in | possible. Despite that flexibility, ICE as specified in | |||
<xref target="rfc5245bis"/> does not by itself support trickle | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten t="RFC8445"/> does not by itself support Trickle | |||
ICE. This section describes how trickling of candidates | ICE. This section describes how trickling of candidates | |||
interacts with ICE. | interacts with ICE. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-appendix.a-2"> | |||
<xref target="rfc5245bis"/> describes the conditions required to | <xref target="RFC8445" format="default" sectionFormat="of" derivedConten | |||
update check lists and timer states while an ICE agent is in the | t="RFC8445"/> describes the conditions required to | |||
update checklists and timer states while an ICE agent is in the | ||||
Running state. These conditions are verified upon transaction | Running state. These conditions are verified upon transaction | |||
completion and one of them stipulates that: | completion, and one of them stipulates that: | |||
</t> | ||||
<t> | ||||
<list style='empty'> | ||||
<t> | ||||
If there is not a pair in the valid list for each component | ||||
of the data stream, the state of the check list is set to | ||||
Failed. | ||||
</t> | ||||
</list> | ||||
</t> | </t> | |||
<t> | <blockquote pn="section-appendix.a-3"> | |||
<t indent="0" pn="section-appendix.a-3.1"> | ||||
if there is not a | ||||
valid pair in the valid list for each component of the data stream | ||||
associated with the checklist, the state of the checklist is set to | ||||
Failed. | ||||
</t> | ||||
</blockquote> | ||||
<t indent="0" pn="section-appendix.a-4"> | ||||
This could be a problem and cause ICE processing to fail | This could be a problem and cause ICE processing to fail | |||
prematurely in a number of scenarios. Consider the following | prematurely in a number of scenarios. Consider the following | |||
case: | case: | |||
</t> | </t> | |||
<t> | <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-appe | |||
<list style='numbers'> | ndix.a-5"> | |||
<t> | <li pn="section-appendix.a-5.1" derivedCounter="1."> | |||
Alice and Bob are both located in different networks with | Alice and Bob are both located in different networks with | |||
Network Address Translation (NAT). Alice and Bob themselves | Network Address Translation (NAT). Alice and Bob themselves | |||
have different address but both networks use the same | have different addresses, but both networks use the same | |||
private internet block (e.g., the "20-bit block" | private internet block (e.g., the "20-bit block" | |||
172.16/12 specified in <xref target="RFC1918"/>). | 172.16/12 specified in <xref target="RFC1918" format="default" secti | |||
</t> | onFormat="of" derivedContent="RFC1918"/>). | |||
<t> | </li> | |||
Alice conveys to Bob the candidate 172.16.0.1 which also happens | <li pn="section-appendix.a-5.2" derivedCounter="2."> | |||
Alice conveys to Bob the candidate 172.16.0.1, which also happens | ||||
to correspond to an existing host on Bob's network. | to correspond to an existing host on Bob's network. | |||
</t> | </li> | |||
<t> | <li pn="section-appendix.a-5.3" derivedCounter="3."> | |||
Bob creates a check list consisting solely of 172.16.0.1 and | Bob creates a candidate pair from his host candidate and | |||
starts checks. | 172.16.0.1, puts this one pair into a checklist, and starts | |||
</t> | checks. | |||
<t> | </li> | |||
<li pn="section-appendix.a-5.4" derivedCounter="4."> | ||||
These checks reach the host at 172.16.0.1 in Bob's network, | These checks reach the host at 172.16.0.1 in Bob's network, | |||
which responds with an ICMP "port unreachable" error; per | which responds with an ICMP "port unreachable" error; per | |||
<xref target="rfc5245bis"/> Bob marks the transaction as | <xref target="RFC8445" format="default" sectionFormat="of" derivedCo ntent="RFC8445"/>, Bob marks the transaction as | |||
Failed. | Failed. | |||
</t> | </li> | |||
</list> | </ol> | |||
At this point the check list only contains Failed candidates and | <t indent="0" pn="section-appendix.a-6"> | |||
the valid list is empty. This causes the data stream and | At this point, the checklist only contains a Failed pair, and | |||
potentially all ICE processing to fail, even though if Trickle ICE agent | the valid list is empty. | |||
s | This causes the data stream and | |||
could subsequently convey candidates that | potentially all ICE processing to fail, even though Trickle ICE agents | |||
would cause previously empty check lists to become non-empty. | can subsequently convey candidates that could succeed. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-appendix.a-7"> | |||
A similar race condition would occur if the initial ICE description from | A similar race condition would occur if the initial ICE description from | |||
Alice contain only candidates that can be determined as | Alice contains only candidates that can be determined as | |||
unreachable from | unreachable from | |||
any of the candidates that Bob has gathered (e.g., this would be the | any of the candidates that Bob has gathered (e.g., this would be the | |||
case if Bob's candidates only contain IPv4 addresses and the | case if Bob's candidates only contain IPv4 addresses and the | |||
first candidate that he receives from Alice is an IPv6 one). | first candidate that he receives from Alice is an IPv6 one). | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-appendix.a-8"> | |||
Another potential problem could arise when a non-trickle | Another potential problem could arise when a non-Trickle | |||
ICE implementation initiates an interaction with a Trickle ICE | ICE implementation initiates an interaction with a Trickle ICE | |||
implementation. Consider the following case: | implementation. Consider the following case: | |||
<list style='numbers'> | </t> | |||
<t> | <ol spacing="normal" type="1" indent="adaptive" start="1" pn="section-appe | |||
ndix.a-9"> | ||||
<li pn="section-appendix.a-9.1" derivedCounter="1."> | ||||
Alice's client has a non-Trickle ICE implementation. | Alice's client has a non-Trickle ICE implementation. | |||
</t> | </li> | |||
<t> | <li pn="section-appendix.a-9.2" derivedCounter="2."> | |||
Bob's client has support for Trickle ICE. | Bob's client has support for Trickle ICE. | |||
</t> | </li> | |||
<t> | <li pn="section-appendix.a-9.3" derivedCounter="3."> | |||
Alice and Bob are behind NATs with address-dependent | Alice and Bob are behind NATs with address-dependent | |||
filtering <xref target="RFC4787"/>. | filtering <xref target="RFC4787" format="default" sectionFormat="of" | |||
</t> | derivedContent="RFC4787"/>. | |||
<t> | </li> | |||
Bob has two STUN servers but one of them is currently | <li pn="section-appendix.a-9.4" derivedCounter="4."> | |||
Bob has two STUN servers, but one of them is currently | ||||
unreachable. | unreachable. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | <t indent="0" pn="section-appendix.a-10"> | |||
<t> | After Bob's agent receives Alice's initial ICE description, it would | |||
After Bob's agent receives Alice's initial ICE description it would | ||||
immediately start connectivity checks. It would also start gathering | immediately start connectivity checks. It would also start gathering | |||
candidates, which would take a long time because of the unreachable | candidates, which would take a long time because of the unreachable | |||
STUN server. By the time Bob's answer is ready and conveyed to | STUN server. By the time Bob's answer is ready and conveyed to | |||
Alice, Bob's connectivity checks might have failed: until | Alice, Bob's connectivity checks might have failed: until | |||
Alice gets Bob's answer, she won't be able to start connectivity | Alice gets Bob's answer, she won't be able to start connectivity | |||
checks and punch holes in her NAT. The NAT would hence be | checks and punch holes in her NAT. The NAT would hence be | |||
filtering Bob's checks as originating from an unknown endpoint. | filtering Bob's checks as originating from an unknown endpoint. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Interaction with ICE Lite'> | <section numbered="true" toc="include" removeInRFC="false" pn="section-appen | |||
<t> | dix.b"> | |||
The behavior of ICE lite agents that are capable of Trickle ICE does not | <name slugifiedName="name-interaction-with-ice-lite">Interaction with ICE- | |||
Lite</name> | ||||
<t indent="0" pn="section-appendix.b-1"> | ||||
The behavior of ICE-lite agents that are capable of Trickle ICE does not | ||||
require any particular rules other than those already defined | require any particular rules other than those already defined | |||
in this specification and <xref target="rfc5245bis"/>. This section | in this specification and <xref target="RFC8445" format="default" sectio nFormat="of" derivedContent="RFC8445"/>. This section | |||
is hence provided only for informational purposes. | is hence provided only for informational purposes. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-appendix.b-2"> | |||
An ICE lite agent would generate candidate information | An ICE-lite agent would generate candidate information | |||
as per <xref target="rfc5245bis"/> and | as per <xref target="RFC8445" format="default" sectionFormat="of" derive | |||
dContent="RFC8445"/> and | ||||
would indicate support for Trickle ICE. Given | would indicate support for Trickle ICE. Given | |||
that the candidate information will contain a full generation of candida tes, | that the candidate information will contain a full generation of candida tes, | |||
it would also be accompanied by an end-of-candidates indication. | it would also be accompanied by an end-of-candidates indication. | |||
</t> | </t> | |||
<t> | <t indent="0" pn="section-appendix.b-3"> | |||
When performing full trickle, a full ICE implementation could | When performing full trickle, a full ICE implementation could | |||
convey the initial ICE description or response thereto with no candidate s. After receiving | convey the initial ICE description or response thereto with no candidate s. After receiving | |||
a response that | a response that | |||
identifies the remote agent as an ICE lite implementation, the | identifies the remote agent as an ICE-lite implementation, the | |||
initiator can choose to not trickle any additional | initiator can choose to not trickle any additional | |||
candidates. The same is also true in the case when the ICE lite | candidates. The same is also true in the case when the ICE-lite | |||
agent initiates the interaction and the full ICE agent is the responder. In | agent initiates the interaction and the full ICE agent is the responder. In | |||
these cases the connectivity checks would be enough for the ICE | these cases, the connectivity checks would be enough for the ICE-lite | |||
lite implementation to discover all potentially useful | implementation to discover all potentially useful | |||
candidates as peer reflexive. The following example illustrates | candidates as peer-reflexive. The following example illustrates | |||
one such ICE session using SDP syntax: | one such ICE session using SDP syntax: | |||
</t> | </t> | |||
<figure title="Example " anchor="fig-ice-lite"> | <figure anchor="fig-ice-lite" align="left" suppress-title="false" pn="figu | |||
<artwork> | re-2"> | |||
<![CDATA[ | <name slugifiedName="name-example">Example</name> | |||
ICE Lite Bob | <artwork name="" type="" align="left" alt="" pn="section-appendix.b-4.1" | |||
> | ||||
ICE-Lite Bob | ||||
Agent | Agent | |||
| Offer (a=ice-lite a=ice-options:trickle) | | | Offer (a=ice-lite a=ice-options:trickle) | | |||
|---------------------------------------------->| | |---------------------------------------------->| | |||
| |no cand | | |no cand | |||
| Answer (a=ice-options:trickle) |trickling | | Answer (a=ice-options:trickle) |trickling | |||
|<----------------------------------------------| | |<----------------------------------------------| | |||
| Connectivity Checks | | | Connectivity Checks | | |||
|<--------------------------------------------->| | |<--------------------------------------------->| | |||
peer rflx| | | peer rflx| | | |||
cand disco| | | cand disco| | | |||
|<========== CONNECTION ESTABLISHED ===========>| | |<========== CONNECTION ESTABLISHED ===========>| | |||
]]> | ||||
</artwork> | </artwork> | |||
</figure> | </figure> | |||
<t> | <t indent="0" pn="section-appendix.b-5"> | |||
In addition to reducing signaling traffic this approach also | In addition to reducing signaling traffic, this approach also | |||
removes the need to discover STUN bindings or make TURN | removes the need to discover STUN Bindings or make TURN | |||
allocations, which can considerably lighten ICE processing. | allocations, which can considerably lighten ICE processing. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Changes from Earlier Versions'> | <section numbered="false" toc="include" removeInRFC="false" pn="section-appe | |||
<t> | ndix.c"> | |||
Note to the RFC Editor: please remove this section prior to | <name slugifiedName="name-acknowledgements">Acknowledgements</name> | |||
publication as an RFC. | <t indent="0" pn="section-appendix.c-1"> | |||
The authors would like to thank | ||||
<contact fullname="Bernard Aboba"/>, | ||||
<contact fullname="Flemming Andreasen"/>, | ||||
<contact fullname="Rajmohan Banavi"/>, | ||||
<contact fullname="Taylor Brandstetter"/>, | ||||
<contact fullname="Philipp Hancke"/>, | ||||
<contact fullname="Christer Holmberg"/>, | ||||
<contact fullname="Ari Keränen"/>, | ||||
<contact fullname="Paul Kyzivat"/>, | ||||
<contact fullname="Jonathan Lennox"/>, | ||||
<contact fullname="Enrico Marocco"/>, | ||||
<contact fullname="Pal Martinsen"/>, | ||||
<contact fullname="Nils Ohlmeier"/>, | ||||
<contact fullname="Thomas Stach"/>, | ||||
<contact fullname="Peter Thatcher"/>, | ||||
<contact fullname="Martin Thomson"/>, | ||||
<contact fullname="Brandon Williams"/>, and | ||||
<contact fullname="Dale Worley"/> for their reviews and | ||||
suggestions on improving this document. <contact fullname="Sarah | ||||
Banks"/>, <contact fullname="Roni Even"/>, and <contact fullname="David Mandel | ||||
berg"/> completed OPSDIR, GenART, and security | ||||
reviews, respectively. Thanks also to <contact fullname="Ari Keränen"/> | ||||
and <contact fullname="Peter Thatcher"/> | ||||
in their role as chairs and <contact fullname="Ben Campbell"/> in his ro | ||||
le as responsible | ||||
Area Director. | ||||
</t> | </t> | |||
<section title='Changes from draft-ietf-ice-trickle-20'> | </section> | |||
<t> | <section anchor="authors-addresses" numbered="false" removeInRFC="false" toc | |||
<list style='symbols'> | ="include" pn="section-appendix.d"> | |||
<t> | <name slugifiedName="name-authors-addresses">Authors' Addresses</name> | |||
Slight corrections to hanlding of peer reflexive candidates. | <author fullname="Emil Ivov" initials="E." surname="Ivov"> | |||
</t> | <organization abbrev="8x8 / Jitsi" showOnFrontPage="true">8x8, Inc. / Ji | |||
<t> | tsi</organization> | |||
Wordsmithing in a few sections. | <address> | |||
</t> | <postal> | |||
</list> | <street>675 Creekside Way</street> | |||
</t> | <city>Campbell</city> | |||
</section> | <region>CA</region> | |||
<section title='Changes from draft-ietf-ice-trickle-19'> | <code>95008</code> | |||
<t> | <country>United States of America</country> | |||
<list style='symbols'> | </postal> | |||
<t> | <phone>+1 512 420 6968</phone> | |||
Further clarified handling of remote peer reflexive | <email>emcho@jitsi.org</email> | |||
candidates. | </address> | |||
</t> | </author> | |||
<t> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
To improve readibility, renamed and restructured some | <organization showOnFrontPage="true">Google</organization> | |||
sections and subsections, and modified some wording. | <address> | |||
</t> | <postal> | |||
</list> | <street>747 6th Street S</street> | |||
</t> | <city>Kirkland</city> | |||
</section> | <region>WA</region> | |||
<section title='Changes from draft-ietf-ice-trickle-18'> | <code>98033</code> | |||
<t> | <country>United States of America</country> | |||
<list style='symbols'> | </postal> | |||
<t> | <phone>+1 857 288 8888</phone> | |||
Cleaned up pairing and redundancy checking rules for | <email>justin@uberti.name</email> | |||
newly discovered candidates per IESG feedback and WG | </address> | |||
discussion. | </author> | |||
</t> | <author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre"> | |||
<t> | <organization showOnFrontPage="true">Mozilla</organization> | |||
Improved wording in half trickle section. | <address> | |||
</t> | <postal> | |||
<t> | <street>P.O. Box 787</street> | |||
Changed "not more than once" to "exactly once". | <city>Parker</city> | |||
</t> | <region>CO</region> | |||
<t> | <code>80134</code> | |||
Changed NAT examples back to IPv4. | <country>United States of America</country> | |||
</t> | </postal> | |||
</list> | <phone>+1 720 256 6756</phone> | |||
</t> | <email>stpeter@mozilla.com</email> | |||
</section> | <uri>https://www.mozilla.com/</uri> | |||
<section title='Changes from draft-ietf-ice-trickle-17'> | </address> | |||
<t> | </author> | |||
<list style='symbols'> | ||||
<t> | ||||
Simplified the rules for inserting a new pair in a check list. | ||||
</t> | ||||
<t> | ||||
Clarified it is not allowed to nominate a candidate | ||||
pair after a pair has already been nominated (a.k.a. | ||||
renomination or continuous nomination). | ||||
</t> | ||||
<t> | ||||
Removed some text that referenced older versions of | ||||
rfc5245bis. | ||||
</t> | ||||
<t> | ||||
Removed some text that duplicated concepts and procedures | ||||
specified in rfc5245bis. | ||||
</t> | ||||
<t> | ||||
Removed the ill-defined concept of stream order. | ||||
</t> | ||||
<t> | ||||
Shortened the introduction. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-16'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Made "ufrag" terminology consistent with 5245bis. | ||||
</t> | ||||
<t> | ||||
Applied in-order delivery rule to end-of-candidates indication. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-15'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Adjustments to address AD review feedback. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-14'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Minor modifications to track changes to ICE core. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-13'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Removed independent monitoring of check list "states" of | ||||
frozen or active, since this is handled by placing a check | ||||
list in the Running state defined in ICE core. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-12'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Specified that the end-of-candidates indication must | ||||
include the generation (ufrag/pwd) to enable association | ||||
with a particular ICE session. | ||||
</t> | ||||
<t> | ||||
Further editorial fixes to address WGLC feedback. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-11'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Editorial and terminological fixes to address WGLC feedback. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-10'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Minor editorial fixes. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-09'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Removed immediate unfreeze upon Fail. | ||||
</t> | ||||
<t> | ||||
Specified MUST NOT regarding ice-options. | ||||
</t> | ||||
<t> | ||||
Changed terminology regarding initial ICE parameters | ||||
to avoid implementer confusion. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-08'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Reinstated text about in-order processing of messages | ||||
as a requirement for signaling protocols. | ||||
</t> | ||||
<t> | ||||
Added IANA registration template for ICE option. | ||||
</t> | ||||
<t> | ||||
Corrected Case 3 rule in Section 8.1.1 to ensure | ||||
consistency with regular ICE rules. | ||||
</t> | ||||
<t> | ||||
Added tabular representations to Section 8.1.1 in order | ||||
to illustrate the new pair rules. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-07'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Changed "ICE description" to "candidate information" for | ||||
consistency with 5245bis. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-06'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Addressed editorial feedback from chairs' review. | ||||
</t> | ||||
<t> | ||||
Clarified terminology regarding generations. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-05'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Rewrote the text on inserting a new pair into a | ||||
check list. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-04'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Removed dependency on SDP and offer/answer model. | ||||
</t> | ||||
<t> | ||||
Removed mentions of aggressive nomination, since it is | ||||
deprecated in 5245bis. | ||||
</t> | ||||
<t> | ||||
Added section on requirements for signaling protocols. | ||||
</t> | ||||
<t> | ||||
Clarified terminology. | ||||
</t> | ||||
<t> | ||||
Addressed various WG feedback. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-03'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Provided more detailed description of unfreezing behavior, specifi | ||||
cally | ||||
how to replace pre-existing peer-reflexive candidates with higher- | ||||
priority | ||||
ones received via trickling. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-02'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Adjusted unfreezing behavior when there are disparate foundations. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-01'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Changed examples to use IPv6. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-00'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Removed dependency on SDP (which is to be provided | ||||
in a separate specification). | ||||
</t> | ||||
<t> | ||||
Clarified text about the fact that a check list | ||||
can be empty if no candidates have been sent or | ||||
received yet. | ||||
</t> | ||||
<t> | ||||
Clarified wording about check list states so as not | ||||
to define new states for "Active" and "Frozen" because | ||||
those states are not defined for check lists (only for | ||||
candidate pairs) in ICE core. | ||||
</t> | ||||
<t> | ||||
Removed open issues list because it was out of date. | ||||
</t> | ||||
<t> | ||||
Completed a thorough copy edit. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-mmusic-trickle-ice-02'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Addressed feedback from Rajmohan Banavi and Brandon Williams. | ||||
</t> | ||||
<t> | ||||
Clarified text about determining support and about how to | ||||
proceed if it can be determined that the answering agent | ||||
does not support Trickle ICE. | ||||
</t> | ||||
<t> | ||||
Clarified text about check list and timer updates. | ||||
</t> | ||||
<t> | ||||
Clarified when it is appropriate to use half trickle or | ||||
to send no candidates in an offer or answer. | ||||
</t> | ||||
<t> | ||||
Updated the list of open issues. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ivov-01 and draft-mmusic-00'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Added a requirement to trickle candidates by order of | ||||
components to avoid deadlocks in the unfreezing algorithm. | ||||
</t> | ||||
<t> | ||||
Added an informative note on peer-reflexive candidates | ||||
explaining that nothing changes for them semantically but | ||||
they do become a more likely occurrence for Trickle ICE. | ||||
</t> | ||||
<t> | ||||
Limit the number of pairs to 100 to comply with 5245. | ||||
</t> | ||||
<t> | ||||
Added clarifications on the non-importance of how newly | ||||
discovered candidates are trickled/sent to the remote | ||||
party or if this is done at all. | ||||
</t> | ||||
<t> | ||||
Added transport expectations for trickled candidates | ||||
as per Dale Worley's recommendation. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ivov-00'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Specified that end-of-candidates is a media level | ||||
attribute which can of course appear as session level, | ||||
which is equivalent to having it appear in all m-lines. | ||||
Also made end-of-candidates optional for cases such as | ||||
aggressive nomination for controlled agents. | ||||
</t> | ||||
<t> | ||||
Added an example for ICE lite and Trickle ICE to | ||||
illustrate how, when talking to an ICE lite agent doesn't | ||||
need to send or even discover any candidates. | ||||
</t> | ||||
<t> | ||||
Added an example for ICE lite and Trickle ICE to | ||||
illustrate how, when talking to an ICE lite agent doesn't | ||||
need to send or even discover any candidates. | ||||
</t> | ||||
<t> | ||||
Added wording that explicitly states ICE lite agents | ||||
have to be prepared to receive no candidates over | ||||
signaling and that they should not freak out if this | ||||
happens. (Closed the corresponding open issue). | ||||
</t> | ||||
<t> | ||||
It is now mandatory to use MID when trickling candidates | ||||
and using m-line indexes is no longer allowed. | ||||
</t> | ||||
<t> | ||||
Replaced use of 0.0.0.0 to IP6 :: in order to avoid | ||||
potential issues with RFC2543 SDP libraries that interpret | ||||
0.0.0.0 as an on-hold operation. Also changed the port | ||||
number here from 1 to 9 since it already has a more | ||||
appropriate meaning. (Port change suggested by Jonathan | ||||
Lennox). | ||||
</t> | ||||
<t> | ||||
Closed the Open Issue about use about what to do with | ||||
cands received after end-of-cands. Solution: ignore, do | ||||
an ICE restart if you want to add something. | ||||
</t> | ||||
<t> | ||||
Added more terminology, including trickling, trickled | ||||
candidates, half trickle, full trickle, | ||||
</t> | ||||
<t> | ||||
Added a reference to the SIP usage for Trickle ICE as | ||||
requested at the Boston interim. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-rescorla-01'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Brought back explicit use of Offer/Answer. There are no | ||||
more attempts to try to do this in an O/A independent way. | ||||
Also removed the use of ICE Descriptions. | ||||
</t> | ||||
<t> | ||||
Added SDP specification for trickled candidates, the | ||||
trickle option and 0.0.0.0 addresses in m-lines, and | ||||
end-of-candidates. | ||||
</t> | ||||
<t> | ||||
Support and Discovery. Changed that section to be less | ||||
abstract. As discussed in IETF85, the draft now says | ||||
implementations and usages need to either determine | ||||
support in advance and directly use trickle, or do | ||||
half trickle. Removed suggestion about use of discovery in | ||||
SIP or about letting implementing protocols do what they | ||||
want. | ||||
</t> | ||||
<t> | ||||
Defined Half Trickle. Added a section that says how it | ||||
works. Mentioned that it only needs to happen in the first | ||||
o/a (not necessary in updates), and added Jonathan's | ||||
comment about how it could, in some cases, offer more than | ||||
half the improvement if you can pre-gather part or all of | ||||
your candidates before the user actually presses the call | ||||
button. | ||||
</t> | ||||
<t> | ||||
Added a short section about subsequent offer/answer | ||||
exchanges. | ||||
</t> | ||||
<t> | ||||
Added a short section about interactions with ICE Lite | ||||
implementations. | ||||
</t> | ||||
<t> | ||||
Added two new entries to the open issues section. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-rescorla-00'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Relaxed requirements about verifying support following | ||||
a discussion on MMUSIC. | ||||
</t> | ||||
<t> | ||||
Introduced ICE descriptions in order to remove ambiguous | ||||
use of 3264 language and inappropriate references to | ||||
offers and answers. | ||||
</t> | ||||
<t> | ||||
Removed inappropriate assumption of adoption by RTCWEB | ||||
pointed out by Martin Thomson. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
</section> | </section> | |||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 251 change blocks. | ||||
1342 lines changed or deleted | 1764 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |