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' ?> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<rfc category='std' ipr='trust200902' | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | |||
docName='draft-ietf-ice-trickle-21'> | ipr="trust200902" number="8838" submissionType="IETF" consensus="yes" | |||
obsoletes="" updates="" xml:lang="en" tocInclude="true" symRefs="true" | ||||
sortRefs="true" version="3" docName="draft-ietf-ice-trickle-21"> | ||||
<?rfc toc='yes' ?> | <!-- xml2rfc v2v3 conversion 2.44.0 --> | |||
<?rfc symrefs='yes' ?> | ||||
<?rfc sortrefs='yes'?> | ||||
<?rfc iprnotified='no' ?> | ||||
<?rfc strict='yes' ?> | ||||
<?rfc compact='yes' ?> | ||||
<front> | <front> | |||
<title abbrev="Trickle ICE"> | ||||
<title abbrev='Trickle ICE'> | Trickle ICE: Incremental Provisioning of Candidates for the Interactive | |||
Trickle ICE: Incremental Provisioning of Candidates for the Interactive | Connectivity Establishment (ICE) Protocol | |||
Connectivity Establishment (ICE) Protocol | ||||
</title> | </title> | |||
<author initials='E.' surname='Ivov' | <seriesInfo name="RFC" value="8838"/> | |||
fullname='Emil Ivov'> | ||||
<organization abbrev='Atlassian'>Atlassian</organization> | <author fullname="Emil Ivov" initials="E." surname="Ivov"> | |||
<organization abbrev="8x8 / Jitsi">8x8, Inc. / Jitsi</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street>303 Colorado Street, #1600</street> | <street>675 Creekside Way</street> | |||
<city>Austin</city> | <city>Campbell</city> | |||
<region>TX</region> | <region>CA</region> | |||
<code>78701</code> | <code>95008</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1-512-640-3000</phone> | <phone>+1 512 420 6968</phone> | |||
<email>eivov@atlassian.com</email> | <email>emcho@jitsi.org</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<author fullname="Eric Rescorla" initials="E.K." surname="Rescorla"> | ||||
<organization>RTFM, Inc.</organization> | <!-- | |||
<author initials="E." surname="Ivov" fullname="Emil Ivov"> | ||||
<organization abbrev="Atlassian">Atlassian</organization> | ||||
<address> | <address> | |||
<postal> | <postal> | |||
<street>2064 Edgewood Drive</street> | <street>303 Colorado Street, #1600</street> | |||
<city>Palo Alto</city> | <city>Austin</city> | |||
<region>CA</region> | <region>TX</region> | |||
<code>94303</code> | <code>78701</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1 650 678 2350</phone> | <phone>+1 512 640 3000</phone> | |||
<email>ekr@rtfm.com</email> | <email>emcho@jitsi.org</email> | |||
</address> | </address> | |||
</author> | </author> | |||
--> | ||||
<!-- [rfced] As you may remember, this document was previously | ||||
in AUTH48 state during 2018. The changes made during that time | ||||
remain. This includes that Eric Rescorla was removed as an | ||||
author per his request 2018-09-17. | ||||
Here is a diff file that shows only the changes since this | ||||
document was previously in AUTH48: | ||||
https://www.rfc-editor.org/authors/rfc8838-previousround-diff.html | ||||
(Some minor formatting changes are a result of the change to v3 XML.) | ||||
If you would like us to forward all mails related to that previous | ||||
round of AUTH48, please let us know. | ||||
--> | ||||
<author fullname="Justin Uberti" initials="J." surname="Uberti"> | <author fullname="Justin Uberti" initials="J." surname="Uberti"> | |||
<organization>Google</organization> | <organization>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>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="May" year="2020"/> | |||
<abstract> | <abstract> | |||
<t> | <t> | |||
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> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<section title='Introduction'> | <section numbered="true" toc="default"> | |||
<name>Introduction</name> | ||||
<t> | <t> | |||
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"/> 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> | |||
<!--[rfced] RFC 5766 has been obsoleted by RFC 8656. May the | ||||
reference (and the corresponding citation) be changed to RFC 8656? | ||||
--> | ||||
<t> | <t> | |||
Following the procedures in <xref target="rfc5245bis"/> can | Following the procedures in <xref target="RFC8445" format="default"/> | |||
lead to somewhat lengthy establishment times for communication sessions, | can lead to somewhat lengthy establishment times for communication | |||
because candidate gathering often involves querying STUN servers | sessions, because candidate gathering often involves querying Session | |||
<xref target="RFC5389"/> and allocating relayed candidates using | Traversal Utilities for NAT (STUN) servers <xref target="RFC5389" | |||
TURN servers <xref target="RFC5766"/>. Although many ICE procedures | format="default"/> and allocating relayed candidates on Traversal | |||
can be completed in parallel, the pacing requirements from | Using Relay NAT (TURN) servers <xref target="RFC8656" | |||
<xref target="rfc5245bis"/> still need to be followed. | format="default"/>. Although many ICE procedures can be completed in | |||
parallel, the pacing requirements from <xref target="RFC8445" | ||||
format="default"/> still need to be followed. | ||||
</t> | </t> | |||
<t> | <t> | |||
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> | |||
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"/> 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"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
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"/> (which defines usage | |||
and the Session Description Protocol <xref target='RFC3261'/>) and | with the Session Initiation Protocol (SIP) <xref target="RFC3261" format | |||
<xref target='XEP-0176'/> (which defines usage with XMPP | ="default"/> | |||
<xref target='RFC6120'/>). However, some of the examples in the | and the Session Description Protocol (SDP) <xref target="RFC4566" format | |||
document use SDP and the offer/answer model <xref target='RFC3264'/> | ="default"/>) and | |||
<xref target="XEP-0176" format="default"/> (which defines usage with the | ||||
Extensible Messaging and Presence Protocol (XMPP) | ||||
<xref target="RFC6120" format="default"/>). However, some of the example | ||||
s in the | ||||
document use SDP and the Offer/Answer model <xref target="RFC3264" forma | ||||
t="default"/> | ||||
to explain the underlying concepts. | to explain the underlying concepts. | |||
</t> | </t> | |||
<t> | <t> | |||
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"> | |||
<artwork> | <name>Flow</name> | |||
<![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
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> | |||
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> | |||
<ol spacing="normal" type="1"> | ||||
<li>Determining support for Trickle ICE</li> | ||||
<li>Generating the initial ICE description</li> | ||||
<li>Handling the initial ICE description and generating the initial ICE | ||||
response</li> | ||||
<li>Handling the initial ICE response</li> | ||||
<li>Forming checklists, pruning candidates, performing connectivity chec | ||||
ks, etc.</li> | ||||
<li>Gathering and conveying candidates after the initial ICE description | ||||
and response</li> | ||||
<li>Handling inbound trickled candidates</li> | ||||
<li>Generating and handling the end-of-candidates indication</li> | ||||
<li>Handling ICE restarts</li> | ||||
</ol> | ||||
<t> | <t> | |||
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"/>); 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="default"> | |||
<t> | <name>Terminology</name> | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | <t> | |||
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"/>. | ", | |||
</t> | "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | ||||
be | ||||
interpreted as described in BCP 14 <xref target="RFC2119"/> <xref | ||||
target="RFC8174"/> when, and only when, they appear in all capitals, as | ||||
shown here. | ||||
</t> | ||||
<t> | <t> | |||
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"/>. In addition, it defines the f ollowing terms: | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style="hanging"> | <dt>Empty Checklist:</dt> | |||
<t hangText="Full Trickle:"> | <dd> | |||
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>Full Trickle:</dt> | ||||
<dd> | ||||
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>Generation:</dt> | |||
All of the candidates conveyed within an ICE session. | <dd> | |||
</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>Half Trickle:</dt> | ||||
<dd> | ||||
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>ICE Description:</dt> | |||
Any attributes related to the ICE session (not candidates) | <dd> | |||
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>Trickled Candidates:</dt> | |||
ial | <dd> | |||
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>Trickling:</dt> | |||
<dd> | ||||
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="default"> | |||
<name>Determining Support for Trickle ICE</name> | ||||
<t> | <t> | |||
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"> | |||
<list style='numbers'> | <li> | |||
<t> | ||||
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">Service Discovery</xref> is | |||
one such mechanism). | one such mechanism). | |||
</t> | </li> | |||
<t> | <li> | |||
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> | <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"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
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> | |||
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"/> is defined in | |||
ed in | <xref target="RFC8840" format="default"/>. | |||
<xref target='I-D.ietf-mmusic-trickle-ice-sip'/>. | ||||
</t> | </t> | |||
<t> | <t> | |||
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"/>). | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Generating the Initial ICE Description' anchor="initial"> | <section anchor="initial" numbered="true" toc="default"> | |||
<name>Generating the Initial ICE Description</name> | ||||
<t> | <t> | |||
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> | |||
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> | |||
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"/>. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title='Handling the Initial ICE Description and Generating the Init | <section numbered="true" toc="default"> | |||
ial ICE Response' > | <name>Handling the Initial ICE Description and Generating the Initial ICE | |||
Response</name> | ||||
<t> | <t> | |||
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"/>. If not, the responder <bcp 14>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"/> (or, if no ICE support is dete cted 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"/>). | |||
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> | |||
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> | |||
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> | |||
As noted in <xref target="support"/>, in using protocols that use | As noted in <xref target="support" format="default"/>, in using protocol | |||
SDP the initial ICE response can indicate support for Trickle ICE | s 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="default"> | |||
<name>Handling the Initial ICE Response</name> | ||||
<t> | <t> | |||
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"/>) | |||
and performs connectivity checks (<xref target='checks'/>). | and performs connectivity checks (<xref target="checks" format="default" | |||
/>). | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Forming Check Lists' anchor='checklists'> | <section anchor="checklists" numbered="true" toc="default"> | |||
<name>Forming Checklists</name> | ||||
<t> | <t> | |||
According to regular ICE procedures <xref target="rfc5245bis"/>, | According to regular ICE procedures <xref target="RFC8445" format="defau lt"/>, | |||
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"/>). | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Performing Connectivity Checks' anchor='checks'> | <section anchor="checks" numbered="true" toc="default"> | |||
<name>Performing Connectivity Checks</name> | ||||
<t> | <t> | |||
As specified in <xref target='rfc5245bis'/>, whenever timer | As specified in <xref target="RFC8445" format="default"/>, whenever time | |||
Ta fires, only check lists in the Running state will be picked | r | |||
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"/>. | |||
</t> | </t> | |||
<t> | <t> | |||
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"/>. | ||||
</t> | </t> | |||
<t> | <t> | |||
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"/> | |||
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"> | |||
<list style="symbols"> | <li> | |||
<t> | all of the pairs in the checklist are in either the | |||
all of the pairs in the check list are either in the | Failed state or the Succeeded state; and | |||
Failed state or Succeeded state; and | </li> | |||
</t> | <li> | |||
<t> | ||||
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> | <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"> | |||
<list style="symbols"> | <li> | |||
<t> | 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> | |||
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"/>. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
</section> | </section> | |||
<section title='Gathering and Conveying Newly Gathered Local Candidates' | <section anchor="trickle-send" numbered="true" toc="default"> | |||
anchor="trickle-send"> | <name>Gathering and Conveying Newly Gathered Local Candidates</name> | |||
<t> | <t> | |||
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> | |||
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> | |||
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> | |||
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"/>) to the receivi ng 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> | |||
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"><![CDATA[ | |||
<![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> | |||
</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> | |||
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"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
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="default"> | |||
ng"> | <name>Pairing Newly Gathered Local Candidates</name> | |||
<t> | <t> | |||
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"/>, with th e | |||
following provisos: | following provisos: | |||
<list style='numbers'> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
A Trickle ICE agent MUST NOT pair a local candidate until it | <li> | |||
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> | |||
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> | |||
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"/>. | |||
</t> | </li> | |||
<t> | <li> | |||
If a newly formed pair has a local candidate whose type is server | If a newly formed pair has a local candidate whose type is server | |||
reflexive, the agent MUST replace the local candidate with its | reflexive, 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> | |||
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"/> 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&nbhy;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> | |||
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 | />), 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"/>. | |||
</list> | </li> | |||
</t> | </ol> | |||
</section> | </section> | |||
<section title='Receiving Trickled Candidates' anchor="trickle-recv"> | <section anchor="trickle-recv" numbered="true" toc="default"> | |||
<name>Receiving Trickled Candidates</name> | ||||
<t> | <t> | |||
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"/>, with the following provisos: | |||
<list style='numbers'> | </t> | |||
<t> | <ol spacing="normal" type="1"> | |||
<li> | ||||
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> | |||
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"/>. | |||
</t> | </li> | |||
<t> | <li> | |||
If a newly formed pair has a local candidate whose type is server | If a newly formed pair has a local candidate whose type is server | |||
reflexive, the agent MUST replace the local candidate with its | reflexive, 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> | |||
<li> | ||||
<t> | <t> | |||
The agent prunes redundant pairs as described below, but checks | 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"> | |||
<li> | ||||
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 by the other agent.) | reflexive by the other agent.) | |||
</t> | ||||
<t> | </li> | |||
<li> | ||||
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"/>. | |||
</list> | </li> | |||
</t> | </ol> | |||
<t> | </li> | |||
If after the relevant redundancy tests the check list where the | <li> | |||
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 | />), 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"/>. | |||
</list> | </li> | |||
</t> | </ol> | |||
</section> | </section> | |||
<section title='Inserting Trickled Candidate Pairs into a Check List' | <section anchor="trickle-insert" numbered="true" toc="default"> | |||
anchor="trickle-insert"> | <name>Inserting Trickled Candidate Pairs into a Checklist</name> | |||
<t> | <t> | |||
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"/>), 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"/>), 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> | |||
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> | ||||
<figure title="Example of Check List State" anchor="fig-checklist-0"> | <table anchor="checklist_table"> | |||
<artwork> | <name>Example of Checklist State</name> | |||
<![CDATA[ | <thead> | |||
+-----------------+------+------+------+------+------+ | <tr> | |||
| | f1 | f2 | f3 | f4 | f5 | | <th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | |||
+-----------------+------+------+------+------+------+ | /th> | |||
| s1 (Audio.RTP) | F | F | F | | | | </tr> | |||
+-----------------+------+------+------+------+------+ | </thead> | |||
| s2 (Audio.RTCP) | F | F | F | F | | | <tbody> | |||
+-----------------+------+------+------+------+------+ | <tr> <td>s1 (Audio.RTP)</td> <td>F</td> <td>F</td><td>F</td><td></td> | |||
| s3 (Video.RTP) | F | | | | | | <td/> | |||
+-----------------+------+------+------+------+------+ | </tr> | |||
| s4 (Video.RTCP) | F | | | | | | <tr> <td>s2 (Audio.RTCP)</td> <td>F</td> <td>F</td><td>F</td><td>F</td> | |||
+-----------------+------+------+------+------+------+ | <td/> | |||
]]> | </tr> | |||
</artwork> | <tr> <td>s3 (Video.RTP)</td> <td>F</td> <td></td><td> </td><td></td> | |||
</figure> | <td/> | |||
</t> | </tr> | |||
<tr> <td>s4 (Video.RTCP)</td> <td>F</td> <td></td><td> </td><td> | ||||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
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> | |||
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"/>, 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> | |||
<table anchor="fig-checklist-initial"> | ||||
<name>Initial Checklist State</name> | ||||
<thead> | ||||
<tr> | ||||
<th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | ||||
/th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> <td>s1 (Audio.RTP)</td> <td>W</td> <td>W</td><td>W</td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s2 (Audio.RTCP)</td> <td>F</td> <td>F</td><td>F</td><td>W</td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s3 (Video.RTP)</td> <td>F</td> <td></td><td> </td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s4 (Video.RTCP)</td> <td>F</td> <td></td><td> </td><td> | ||||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
<figure title="Initial Check List State" anchor="fig-checklist-initial"> | Then, as the checks proceed (see | |||
<artwork> | <xref target="RFC8445" format="default" sectionFormat="of" section="7.2. | |||
<![CDATA[ | 5.4"/>), for each pair | |||
+-----------------+------+------+------+------+------+ | ||||
| | f1 | f2 | f3 | f4 | f5 | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s1 (Audio.RTP) | W | W | W | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s2 (Audio.RTCP) | F | F | F | W | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s3 (Video.RTP) | F | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
| s4 (Video.RTCP) | F | | | | | | ||||
+-----------------+------+------+------+------+------+ | ||||
]]> | ||||
</artwork> | ||||
</figure> | ||||
</t> | ||||
<t> | ||||
Then, as the checks proceed (see Section 7.2.5.4 of | ||||
<xref target="rfc5245bis"/>), 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> | |||
<table anchor="fig-checklist-succeeded"> | ||||
<name>Checklist State with Succeeded Candidate Pair</name> | ||||
<thead> | ||||
<tr> | ||||
<th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | ||||
/th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> <td>s1 (Audio.RTP)</td> <td>S</td> <td>W</td><td>W</td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s2 (Audio.RTCP)</td> <td>W</td> <td>F</td><td>F</td><td>W</td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s3 (Video.RTP)</td> <td>W</td> <td></td><td> </td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s4 (Video.RTCP)</td> <td>W</td> <td></td><td> </td><td> | ||||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
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> | |||
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> | |||
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" | |||
</t> | format="default" sectionFormat="of" section="6.1.2.6"/>. | |||
<t> | ||||
<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> | |||
<table anchor="fig-checklist-rule1"> | ||||
<name>Checklist State with Newly Formed Pair, Rule 1</name> | ||||
<thead> | ||||
<tr> | ||||
<th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | ||||
/th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> <td>s1 (Audio.RTP)</td> <td>S</td> <td>W</td> <td>W</td> <td></td | ||||
> <td>^W^</td> | ||||
</tr> | ||||
<tr> <td>s2 (Audio.RTCP)</td> <td>W</td> <td>F</td><td>F</td><td>W</td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s3 (Video.RTP)</td> <td>W</td> <td></td><td> </td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s4 (Video.RTCP)</td> <td>W</td> <td></td><td> </td><td> | ||||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
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"/>. | |||
<t> | ||||
<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> | |||
<table anchor="fig-checklist-rule2"> | ||||
<name>Checklist State with Newly Formed Pair, Rule 2</name> | ||||
<thead> | ||||
<tr> | ||||
<th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | ||||
/th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> <td>s1 (Audio.RTP)</td> <td>S</td> <td>W</td> <td>W</td> <td></td | ||||
> <td>S</td> | ||||
</tr> | ||||
<tr> <td>s2 (Audio.RTCP)</td> <td>W</td> <td>F</td><td>F</td><td>W</td> | ||||
<td>^W^</td> | ||||
</tr> | ||||
<tr> <td>s3 (Video.RTP)</td> <td>W</td> <td></td><td> </td><td></td> | ||||
<td/> | ||||
</tr> | ||||
<tr> <td>s4 (Video.RTCP)</td> <td>W</td> <td></td><td> </td><td> | ||||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t> | <t> | |||
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> | ||||
<figure title="Check List State with Newly Formed Pair, Rule 3" anchor=" | <table anchor="fig-checklist-rule3"> | |||
fig-checklist-rule3"> | <name>Checklist State with Newly Formed Pair, Rule 3</name> | |||
<artwork> | <thead> | |||
<![CDATA[ | <tr> | |||
+-----------------+------+------+------+------+------+ | <th></th> <th>f1</th> <th>f2</th> <th>f3</th> <th>f4</th> <th>f5< | |||
| | f1 | f2 | f3 | f4 | f5 | | /th> | |||
+-----------------+------+------+------+------+------+ | </tr> | |||
| s1 (Audio.RTP) | S | W | W | | S | | </thead> | |||
+-----------------+------+------+------+------+------+ | <tbody> | |||
| s2 (Audio.RTCP) | W | F | F | W | W | | <tr> <td>s1 (Audio.RTP)</td> <td>S</td> <td>W</td> <td>W</td> <td></td | |||
+-----------------+------+------+------+------+------+ | > <td>S</td> | |||
| s3 (Video.RTP) | W | | ^F^ | | | | </tr> | |||
+-----------------+------+------+------+------+------+ | <tr> <td>s2 (Audio.RTCP)</td> <td>W</td> <td>F</td><td>F</td><td>W</td> | |||
| s4 (Video.RTCP) | W | | | | | | <td>W</td> | |||
+-----------------+------+------+------+------+------+ | </tr> | |||
]]> | <tr> <td>s3 (Video.RTP)</td> <td>W</td> <td></td><td>^F^</td>< | |||
</artwork> | td></td> <td/> | |||
</figure> | </tr> | |||
</t> | <tr> <td>s4 (Video.RTCP)</td> <td>W</td> <td></td><td> </td><td> | |||
</td><td/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | </section> | |||
<section title='Generating an End-of-Candidates Indication' | <section anchor="end-of-candidates.send" numbered="true" toc="default"> | |||
anchor="end-of-candidates.send"> | <name>Generating an End-of-Candidates Indication</name> | |||
<t> | <t> | |||
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> | |||
<ul spacing="normal"> | ||||
<li>As part of an initiation request (which would typically be the case | ||||
with | ||||
the initial ICE description for half trickle)</li> | ||||
<li>Along with the last candidate an agent can send for a stream</li> | ||||
<li>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)</li> | ||||
</ul> | ||||
<t> | <t> | |||
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"> | |||
A controlled Trickle ICE agent SHOULD convey an end-of-candidates | <li> | |||
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> | |||
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> | <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> | |||
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> | |||
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> | |||
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"/>. Past that point, an | |||
agent MUST NOT trickle any new candidates within this ICE session. | 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"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
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"/>. | ||||
</t> | </t> | |||
</section> | </section> | |||
<section title='Receiving an End-of-Candidates Indication' | <section anchor="end-of-candidates.recv" numbered="true" toc="default"> | |||
anchor="end-of-candidates.recv"> | <name>Receiving an End-of-Candidates Indication</name> | |||
<t> | <t> | |||
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> | |||
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"/> (which might l | |||
some check lists being marked as Failed). If the check list is | ead 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> | |||
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="default"> | |||
anchor="subsequent"> | <name>Subsequent Exchanges and ICE Restarts</name> | |||
<t> | <t> | |||
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"/> (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> | |||
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="default"> | |||
<name>Half Trickle</name> | ||||
<t> | <t> | |||
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> | |||
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> | |||
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"/>). | |||
</t> | </t> | |||
<t> | <t> | |||
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> | |||
skipping to change at line 1016 ¶ | skipping to change at line 1069 ¶ | |||
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="default"> | |||
<name>Preserving Candidate Order While Trickling</name> | ||||
<t> | <t> | |||
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> | |||
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"/>, | |||
in the same order they are conveyed. | in the same order they are conveyed. | |||
</t> | </t> | |||
<t> | <t> | |||
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"><![CDATA[ | |||
<![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> | |||
</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="default"> | |||
<name>Requirements for Using Protocols</name> | ||||
<t> | <t> | |||
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"> | |||
A using protocol SHOULD provide a way for parties to advertise | <li> | |||
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"/>). | |||
</t> | </li> | |||
<t> | <li> | |||
A using protocol MUST provide methods for incrementally | 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"/>). | |||
</t> | </li> | |||
<t> | <li> | |||
A using protocol MUST deliver each trickled candidate | 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"/>). | |||
</t> | </li> | |||
<t> | <li> | |||
A using protocol MUST provide a mechanism for both parties | 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"/>). | |||
</t> | </li> | |||
<t> | <li> | |||
A using protocol MUST provide a way for parties to communicate the | A using protocol <bcp14>MUST</bcp14> provide a way for parties to co | |||
end-of-candidates indication, which MUST specify the particular ICE | mmunicate the | |||
session to which the indication applies (see <xref target='end-of-ca | end-of-candidates indication, which <bcp14>MUST</bcp14> specify the | |||
ndidates.send'/>). | particular | |||
</t> | ICE session to which the indication applies (see <xref | |||
</list> | target="end-of-candidates.send" format="default"/>). | |||
</t> | </li> | |||
</ul> | ||||
</section> | </section> | |||
<section title='IANA Considerations'> | <section numbered="true" toc="default"> | |||
<name>IANA Considerations</name> | ||||
<t> | <t> | |||
IANA is requested to register the following ICE option in the "ICE | IANA has registered the following ICE option in the "ICE | |||
Options" sub-registry of the "Interactive Connectivity Establishment | 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"/>. | |||
</t> | </t> | |||
<t> | <dl newline="false" spacing="normal"> | |||
<list style='hanging'> | <dt>ICE Option:</dt> | |||
<t hangText="ICE Option:">trickle</t> | <dd>trickle</dd> | |||
<t hangText="Contact:">IESG, iesg@ietf.org</t> | <dt>Contact:</dt> | |||
<t hangText="Change control:">IESG</t> | <dd>IESG <iesg@ietf.org></dd> | |||
<t hangText="Description:"> | <dt>Change controller:</dt> | |||
An ICE option of "trickle" indicates support for incremental | <dd>IESG</dd> | |||
<dt>Description:</dt> | ||||
<dd> | ||||
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>Reference:</dt> | |||
</list> | <dd>RFC 8838</dd> | |||
</t> | </dl> | |||
</section> | </section> | |||
<section title='Security Considerations'> | <section numbered="true" toc="default"> | |||
<name>Security Considerations</name> | ||||
<t> | <t> | |||
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"/>, and as a result, all security | |||
considerations described there apply to Trickle ICE. | considerations described there apply to Trickle ICE. | |||
</t> | </t> | |||
<t> | <t> | |||
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"/> and in | |||
of <xref target="rfc5245bis"/>), agents can generate ICE descriptions th | <xref target="RFC8445" section="19" sectionFormat="of"/>), agents can ge | |||
at contain no | nerate 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> | |||
<?rfc include="reference.RFC.2119"?> | <name>References</name> | |||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2119.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"/> | ||||
<!--note: rfc5245bis is now RFC 8445--> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/referen | ||||
ce.RFC.8445.xml"/> | ||||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1918.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.3261.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.3264.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.4566.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.4787.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.5389.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6120.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6336.xml"/> | ||||
<xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8656.xml"/> | ||||
<reference anchor='rfc5245bis'> | <!--draft-ietf-mmusic-trickle-ice-sip-18 in C238 --> | |||
<front> | <reference anchor="RFC8840" target="https://www.rfc-editor.org/info/rfc88 | |||
<title>Interactive Connectivity Establishment (ICE): A Protocol for Network Addr | 40"> | |||
ess Translator (NAT) Traversal</title> | <front> | |||
<author initials='A' surname='Keranen' fullname='Ari Keranen'> | <title>A Session Initiation Protocol (SIP) Usage for Incremental Pro | |||
<organization /> | visioning of Candidates for the Interactive Connectivity Establishment (Trickle | |||
</author> | ICE)</title> | |||
<author initials='C' surname='Holmberg' fullname='Christer Holmberg'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='J' surname='Rosenberg' fullname='Jonathan Rosenberg'> | ||||
<organization /> | ||||
</author> | ||||
<date month='March' day='8' year='2018' /> | ||||
<abstract><t>This document describes a protocol for Network Address Translator ( | ||||
NAT) traversal for UDP-based multimedia. This protocol is called Interactive Co | ||||
nnectivity Establishment (ICE). ICE makes use of the Session Traversal Utilitie | ||||
s for NAT (STUN) protocol and its extension, Traversal Using Relay NAT (TURN). | ||||
This document obsoletes RFC 5245.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='Internet-Draft' value='draft-ietf-ice-rfc5245bis-20' /> | ||||
<format type='TXT' | ||||
target='http://www.ietf.org/internet-drafts/draft-ietf-ice-rfc5245bis-20 | ||||
.txt' /> | ||||
</reference> | ||||
</references> | <author initials="E" surname="Ivov" fullname="Emil Ivov"> | |||
<references title='Informative References'> | <organization/> | |||
<?rfc include="reference.RFC.1918"?> | </author> | |||
<?rfc include="reference.RFC.3261"?> | <author initials="T" surname="Stach" fullname="Thomas Stach"> | |||
<?rfc include="reference.RFC.3264"?> | <organization/> | |||
<?rfc include="reference.RFC.4566"?> | </author> | |||
<?rfc include="reference.RFC.4787"?> | <author initials="E" surname="Marocco" fullname="Enrico Marocco"> | |||
<?rfc include="reference.RFC.5389"?> | <organization/> | |||
<?rfc include="reference.RFC.5766"?> | </author> | |||
<?rfc include="reference.RFC.6120"?> | <author initials="C" surname="Holmberg" fullname="Christer Holmberg" | |||
<?rfc include="reference.RFC.6336"?> | > | |||
<reference anchor='I-D.ietf-mmusic-trickle-ice-sip'> | <organization/> | |||
<front> | </author> | |||
<title>A Session Initiation Protocol (SIP) usage for Trickle ICE</title> | <date month="June" year="2018"/> | |||
<author initials='E' surname='Ivov' fullname='Emil Ivov'> | </front> | |||
<organization /> | <seriesInfo name="DOI" value="10.17487/RFC8840"/> | |||
</author> | <seriesInfo name="RFC" value="8840"/> | |||
<author initials='T' surname='Stach' fullname='Thomas Stach'> | </reference> | |||
<organization /> | ||||
</author> | <!--draft-ietf-rtcweb-ip-handling-09 in C238 --> | |||
<author initials='E' surname='Marocco' fullname='Enrico Marocco'> | <reference anchor="RFC8828" target="https://www.rfc-editor.org/info/rfc88 | |||
<organization /> | 28"> | |||
</author> | <front> | |||
<author initials='C' surname='Holmberg' fullname='Christer Holmberg'> | <title>WebRTC IP Address Handling Requirements</title> | |||
<organization /> | <author initials="J" surname="Uberti" fullname="Justin Uberti"> | |||
</author> | <organization/> | |||
<date month='February' day='24' year='2018' /> | </author> | |||
<abstract><t>The Interactive Connectivity Establishment (ICE) protocol describes | <author initials="G" surname="Shieh" fullname="Guo-wei Shieh"> | |||
a Network Address Translator (NAT) traversal mechanism for UDP-based multimedia | <organization/> | |||
sessions established with the Offer/Answer model. The ICE extension for Increm | </author> | |||
ental Provisioning of Candidates (Trickle ICE) defines a mechanism that allows I | <date month="May" year="2020"/> | |||
CE agents to shorten session establishment delays by making the candidate gather | </front> | |||
ing and connectivity checking phases of ICE non-blocking and by executing them i | <seriesInfo name="DOI" value="10.17487/RFC8828"/> | |||
n parallel. This document defines usage semantics for Trickle ICE with the Sess | <seriesInfo name="RFC" value="8828"/> | |||
ion Initiation Protocol (SIP).</t></abstract> | </reference> | |||
</front> | ||||
<seriesInfo name='Internet-Draft' value='draft-ietf-mmusic-trickle-ice-sip-14' / | <reference anchor="XEP-0176"> | |||
> | <front> | |||
<format type='TXT' | <title>XEP-0176: Jingle ICE-UDP Transport Method</title> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-mmusic-trickle-ic | <seriesInfo name="XMPP Standards Foundation," value="XEP-0176"/> | |||
e-sip-14.txt' /> | <author initials="J." surname="Beda" fullname="Joe Beda"> | |||
</reference> | <organization abbrev="Google">Google</organization> | |||
<reference anchor='I-D.ietf-rtcweb-ip-handling'> | </author> | |||
<front> | <author initials="S." surname="Ludwig" fullname="Scott Ludwig"> | |||
<title>WebRTC IP Address Handling Requirements</title> | <organization abbrev="Google">Google</organization> | |||
<author initials='J' surname='Uberti' fullname='Justin Uberti'> | </author> | |||
<organization /> | <author initials="P." surname="Saint-Andre" fullname="Peter Saint-An | |||
</author> | dre"> | |||
<author initials='G' surname='Shieh' fullname='Guo-wei Shieh'> | ||||
<organization /> | ||||
</author> | ||||
<date month='March' day='1' year='2018' /> | ||||
<abstract><t>This document provides information and requirements for how IP addr | ||||
esses should be handled by WebRTC implementations.</t></abstract> | ||||
</front> | ||||
<seriesInfo name='Internet-Draft' value='draft-ietf-rtcweb-ip-handling-06' /> | ||||
<format type='TXT' | ||||
target='http://www.ietf.org/internet-drafts/draft-ietf-rtcweb-ip-handlin | ||||
g-06.txt' /> | ||||
</reference> | ||||
<reference anchor="XEP-0176"> | ||||
<front> | ||||
<title>XEP-0176: Jingle ICE-UDP Transport Method</title> | ||||
<author initials='J.' surname='Beda' fullname='Joe Beda'> | ||||
<organization abbrev='Google'>Google</organization> | ||||
</author> | ||||
<author initials='S.' surname='Ludwig' | ||||
fullname='Scott Ludwig'> | ||||
<organization abbrev='Google'>Google</organization> | ||||
</author> | ||||
<author initials='P.' surname='Saint-Andre' | ||||
fullname='Peter Saint-Andre'> | ||||
</author> | ||||
<author initials='J.' surname='Hildebrand' | ||||
fullname='Joe Hildebrand'> | ||||
<organization abbrev='Cisco'>Cisco</organization> | ||||
</author> | ||||
<author initials='S.' surname='Egan' fullname='Sean Egan'> | ||||
<organization abbrev='Google'>Google </organization> | ||||
</author> | ||||
<author initials='R.' surname='McQueen' | ||||
fullname='Robert McQueen'> | ||||
<organization abbrev='Collabora'>Collabora</organization> | ||||
</author> | ||||
<date month="June" year="2009" /> | ||||
</front> | ||||
<seriesInfo name="XEP" value="XEP-0176" /> | ||||
</reference> | ||||
<reference anchor="XEP-0030"> | ||||
<front> | ||||
<title>XEP-0030: Service Discovery</title> | ||||
<author initials='J.' surname='Hildebrand' | ||||
fullname='Joe Hildebrand'> | ||||
<organization abbrev='Cisco'>Cisco</organization> | ||||
</author> | </author> | |||
<author initials='P.' surname='Millard' | <author initials="J." surname="Hildebrand" fullname="Joe Hildebrand" | |||
fullname='Peter Millard'> | > | |||
<organization abbrev="Cisco">Cisco</organization> | ||||
</author> | ||||
<author initials="S." surname="Egan" fullname="Sean Egan"> | ||||
<organization abbrev="Google">Google </organization> | ||||
</author> | ||||
<author initials="R." surname="McQueen" fullname="Robert McQueen"> | ||||
<organization abbrev="Collabora">Collabora</organization> | ||||
</author> | ||||
<date month="June" year="2009"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="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">Cisco</organization> | ||||
</author> | ||||
<author initials="P." surname="Millard" fullname="Peter Millard"> | ||||
</author> | </author> | |||
<author initials='R.' surname='Eatmon' | <author initials="R." surname="Eatmon" fullname="Ryan Eatmon"> | |||
fullname='Ryan Eatmon'> | ||||
</author> | </author> | |||
<author initials='P.' surname='Saint-Andre' | <author initials="P." surname="Saint-Andre" fullname="Peter Saint-An | |||
fullname='Peter Saint-Andre'> | dre"> | |||
</author> | </author> | |||
<date month="June" year="2008" /> | <date month="June" year="2008"/> | |||
</front> | </front> | |||
<seriesInfo name="XEP" value="XEP-0030" /> | </reference> | |||
</reference> | </references> | |||
</references> | </references> | |||
<section title='Interaction with Regular ICE' | <section anchor="interaction" numbered="true" toc="default"> | |||
anchor='interaction'> | <name>Interaction with Regular ICE</name> | |||
<t> | <t> | |||
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"/> does not by itself support Tri ckle | |||
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> | |||
<xref target="rfc5245bis"/> describes the conditions required to | <xref target="RFC8445" format="default"/> describes the conditions requi | |||
update check lists and timer states while an ICE agent is in the | red 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> | |||
<t> | <ul empty="true" spacing="normal"> | |||
<list style='empty'> | <li> | |||
<t> | ||||
If there is not a pair in the valid list for each component | 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 | of the data stream, the state of the checklist is set to | |||
Failed. | Failed. | |||
</t> | </li> | |||
</list> | </ul> | |||
</t> | ||||
<t> | <t> | |||
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"> | |||
<list style='numbers'> | <li> | |||
<t> | ||||
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"/>). | |||
</t> | </li> | |||
<t> | <li> | |||
Alice conveys to Bob the candidate 172.16.0.1 which also happens | 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> | |||
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> | ||||
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"/>, Bob marks the transaction as | |||
Failed. | Failed. | |||
</t> | </li> | |||
</list> | </ol> | |||
At this point the check list only contains Failed candidates and | <t> | |||
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> | |||
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> | |||
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"> | |||
<li> | ||||
Alice's client has a non-Trickle ICE implementation. | Alice's client has a non-Trickle ICE implementation. | |||
</t> | </li> | |||
<t> | <li> | |||
Bob's client has support for Trickle ICE. | Bob's client has support for Trickle ICE. | |||
</t> | </li> | |||
<t> | <li> | |||
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"/>. | |||
</t> | </li> | |||
<t> | <li> | |||
Bob has two STUN servers but one of them is currently | Bob has two STUN servers, but one of them is currently | |||
unreachable. | unreachable. | |||
</t> | </li> | |||
</list> | </ol> | |||
</t> | ||||
<t> | <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="default"> | |||
<name>Interaction with ICE-Lite</name> | ||||
<t> | <t> | |||
The behavior of ICE lite agents that are capable of Trickle ICE does not | 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"/>. Thi s section | |||
is hence provided only for informational purposes. | is hence provided only for informational purposes. | |||
</t> | </t> | |||
<t> | <t> | |||
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"/> 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> | |||
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"> | |||
<artwork> | <name>Example</name> | |||
<![CDATA[ | <artwork name="" type="" align="left" alt=""><![CDATA[ | |||
ICE Lite Bob | 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> | |||
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="default"> | |||
<name>Acknowledgements</name> | ||||
<t> | <t> | |||
Note to the RFC Editor: please remove this section prior to | The authors would like to thank | |||
publication as an RFC. | <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 Mandelberg"/> completed OPSDIR, GenART, and security | ||||
reviews, respectively. Thanks also to Ari Keranen and Peter Thatcher | ||||
in their role as chairs and Ben Campbell in his role as responsible | ||||
Area Director. | ||||
</t> | </t> | |||
<section title='Changes from draft-ietf-ice-trickle-20'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Slight corrections to hanlding of peer reflexive candidates. | ||||
</t> | ||||
<t> | ||||
Wordsmithing in a few sections. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-19'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Further clarified handling of remote peer reflexive | ||||
candidates. | ||||
</t> | ||||
<t> | ||||
To improve readibility, renamed and restructured some | ||||
sections and subsections, and modified some wording. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-18'> | ||||
<t> | ||||
<list style='symbols'> | ||||
<t> | ||||
Cleaned up pairing and redundancy checking rules for | ||||
newly discovered candidates per IESG feedback and WG | ||||
discussion. | ||||
</t> | ||||
<t> | ||||
Improved wording in half trickle section. | ||||
</t> | ||||
<t> | ||||
Changed "not more than once" to "exactly once". | ||||
</t> | ||||
<t> | ||||
Changed NAT examples back to IPv4. | ||||
</t> | ||||
</list> | ||||
</t> | ||||
</section> | ||||
<section title='Changes from draft-ietf-ice-trickle-17'> | ||||
<t> | ||||
<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. 234 change blocks. | ||||
1231 lines changed or deleted | 869 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |