| 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/ | ||||