| rfc8839xml2.original.xml | rfc8839.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="US-ASCII"?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc toc='yes' ?> | ||||
| <rfc category="std" docName="draft-ietf-mmusic-ice-sip-sdp-39" ipr="pre5378Trust | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" | |||
| 200902" obsoletes="5245"> | number="8839" | |||
| obsoletes="5245, 6336" | ||||
| updates="" | ||||
| category="std" | ||||
| consensus="true" | ||||
| docName="draft-ietf-mmusic-ice-sip-sdp-39" | ||||
| ipr="pre5378Trust200902" | ||||
| submissionType="IETF" | ||||
| xml:lang="en" | ||||
| tocInclude="true" | ||||
| symRefs="true" | ||||
| sortRefs="true" | ||||
| version="3"> | ||||
| <!-- xml2rfc v2v3 conversion 2.30.0 --> | ||||
| <front> | <front> | |||
| <title abbrev="ICE SDP Usage">Session Description Protocol (SDP) Offer/Answe | <title abbrev="ICE SDP Usage">Session Description Protocol (SDP) Offer/Answe | |||
| r procedures for Interactive Connectivity Establishment (ICE)</title> | r Procedures for Interactive Connectivity Establishment (ICE)</title> | |||
| <author surname="Petit-Huguenin" initials="M.P." fullname="Marc Petit-Huguen | <seriesInfo name="RFC" value="8839"/> | |||
| in"> | <author surname="Petit-Huguenin" initials="M." fullname="Marc Petit-Huguenin | |||
| "> | ||||
| <organization>Impedance Mismatch</organization> | <organization>Impedance Mismatch</organization> | |||
| <address> | <address> | |||
| <email>marc@petit-huguenin.org</email> | <email>marc@petit-huguenin.org</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author surname="Nandakumar" initials="S.N." fullname="Suhas Nandakumar"> | <author surname="Nandakumar" initials="S." fullname="Suhas Nandakumar"> | |||
| <organization>Cisco Systems</organization> | <organization>Cisco Systems</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>707 Tasman Dr</street> | <street>707 Tasman Dr</street> | |||
| <city>Milpitas</city> | <city>Milpitas</city> | |||
| <region>CA</region> | <region>CA</region> | |||
| <code>95035</code> | <code>95035</code> | |||
| <country>USA</country> | <country>United States of America</country> | |||
| </postal> | </postal> | |||
| <email>snandaku@cisco.com</email> | <email>snandaku@cisco.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Christer Holmberg" initials="C.H." surname="Holmberg"> | <author fullname="Christer Holmberg" initials="C." surname="Holmberg"> | |||
| <organization abbrev="Ericsson">Ericsson</organization> | <organization abbrev="Ericsson">Ericsson</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>Hirsalantie 11</street> | <street>Hirsalantie 11</street> | |||
| <city>Jorvas</city> | <city>Jorvas</city> | |||
| <region/> | <region/> | |||
| <code>02420</code> | <code>02420</code> | |||
| <country>Finland</country> | <country>Finland</country> | |||
| </postal> | </postal> | |||
| <email>christer.holmberg@ericsson.com</email> | <email>christer.holmberg@ericsson.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author surname="Keranen" initials="A.K." fullname="Ari Keranen"> | ||||
| <author surname="Keränen" initials="A." fullname="Ari Keränen"> | ||||
| <organization>Ericsson</organization> | <organization>Ericsson</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street/> | <street/> | |||
| <city>Jorvas</city> | <city>Jorvas</city> | |||
| <code>02420</code> | <code>02420</code> | |||
| <country>Finland</country> | <country>Finland</country> | |||
| </postal> | </postal> | |||
| <email>ari.keranen@ericsson.com</email> | <email>ari.keranen@ericsson.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author fullname="Roman Shpount" initials="R.S." surname="Shpount"> | <author fullname="Roman Shpount" initials="R." surname="Shpount"> | |||
| <organization abbrev="TurboBridge">TurboBridge</organization> | <organization abbrev="TurboBridge">TurboBridge</organization> | |||
| <address> | <address> | |||
| <postal> | <postal> | |||
| <street>4905 Del Ray Avenue, Suite 300</street> | <street>4905 Del Ray Avenue, Suite 300</street> | |||
| <city>Bethesda</city> | <city>Bethesda</city> | |||
| <region>MD</region> | <region>MD</region> | |||
| <code>20814</code> | <code>20814</code> | |||
| <country>USA</country> | <country>United States of America</country> | |||
| </postal> | </postal> | |||
| <phone>+1 (240) 292-6632</phone> | ||||
| <email>rshpount@turbobridge.com</email> | <email>rshpount@turbobridge.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date day="13" month="August" year="2019"/> | <date month="January" year="2021"/> | |||
| <area>RAI</area> | <area>ART</area> | |||
| <workgroup>MMUSIC</workgroup> | <workgroup>MMUSIC</workgroup> | |||
| <keyword>SIP</keyword> | ||||
| <keyword>Session Initial Protocol</keyword> | ||||
| <abstract> | <abstract> | |||
| <t> | <t> | |||
| This document describes Session Description Protocol (SDP) Offer/Answer procedur | This document describes Session Description Protocol (SDP) Offer/Answer | |||
| es | procedures for carrying out Interactive Connectivity Establishment (ICE) | |||
| for carrying out Interactive Connectivity Establishment (ICE) between the agents | between the agents. | |||
| . | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| This document obsoletes RFC 5245. | This document obsoletes RFCs 5245 and 6336. | |||
| </t> | </t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="intro" title="Introduction"> | <section anchor="intro" numbered="true" toc="default"> | |||
| <name>Introduction</name> | ||||
| <t> | <t> | |||
| This document describes how Interactive Connectivity Establishment (ICE) is used | This document describes how Interactive Connectivity Establishment (ICE) is | |||
| with Session Description Protocol (SDP) offer/answer <xref target="RFC3264"/>. T | used with Session Description Protocol (SDP) offer/answer <xref | |||
| he ICE specification | target="RFC3264" format="default"/>. The ICE specification <xref | |||
| <xref target="RFC8445"/> describes procedures that are common to all usages of I | target="RFC8445" format="default"/> describes procedures that are common to | |||
| CE and this document | all usages of ICE, and this document gives the additional details needed to | |||
| gives the additional details needed to use ICE with SDP offer/answer. | use ICE with SDP offer/answer. | |||
| </t> | </t> | |||
| <t>This document obsoletes RFC 5245. </t> | ||||
| <t hangText="Note:"> | <t>This document obsoletes RFCs 5245 and 6336. </t> | |||
| NOTE: Previously both the common ICE procedures, and the SDP offer/answer specif | <t> | |||
| ic details, were described in<xref target="RFC5245"/>. <xref target="RFC8445"/> | NOTE: Previously both the common ICE procedures, and the SDP offer/answer | |||
| obsoleted <xref target="RFC5245"/>, and the SDP offer/answer specific details we | specific details, were described in <xref target="RFC5245" | |||
| re removed from the document. <xref target="sec.5245"/> describes the changes to | format="default"/>. <xref target="RFC8445" format="default"/> obsoleted <xref | |||
| the SDP offer/answer specific details specified in this document. | target="RFC5245" format="default"/>, and the SDP offer/answer-specific details | |||
| were removed from the document. <xref target="sec.5245" format="default"/> | ||||
| describes the changes to the SDP offer/answer-specific details specified in | ||||
| this document. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Conventions"> | <section numbered="true" toc="default"> | |||
| <name>Conventions</name> | ||||
| <t> | <t> | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
| described in BCP 14 <xref target="RFC2119"></xref> <xref target="RFC8174 | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| "></xref> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
| when, and only when, they appear in all capitals, as shown here. | 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> | |||
| </section> | </section> | |||
| <section title="Terminology"> | <section numbered="true" toc="default"> | |||
| <name>Terminology</name> | ||||
| <t> | <t> | |||
| Readers should be familiar with the terminology defined in <xref target="RFC3264 | Readers should be familiar with the terminology defined in <xref | |||
| "/>, | target="RFC3264" format="default"/>, in <xref target="RFC8445" | |||
| in <xref target="RFC8445"/> and the following: | format="default"/>, and the following: | |||
| </t> | </t> | |||
| <t> | ||||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Default Destination/Candidate:"> | <dt>Default Destination/Candidate:</dt> | |||
| <dd> | ||||
| The default destination for a component of a data stream is the transport | The default destination for a component of a data stream is the transport | |||
| address that would be used by an agent that is not ICE aware. A default | address that would be used by an agent that is not ICE aware. A default | |||
| candidate for a component is one whose transport address matches the default | candidate for a component is one whose transport address matches the default | |||
| destination for that component. For the RTP component, the default connection ad | destination for that component. For the RTP component, the default connection | |||
| dress | address is in the "c=" line of the SDP, and the port and transport protocol | |||
| is in the "c=" line of the SDP, and the port and transport protocol are in | are in the "m=" line. For the RTP Control Protocol (RTCP) component, the | |||
| the "m=" line. For the RTCP component, the address and port are indicated | address and port are indicated using the "rtcp" attribute defined in <xref | |||
| using the "a=rtcp" attribute defined in <xref target="RFC3605"/>, if present; ot | target="RFC3605" format="default"/>, if present; otherwise, the RTCP component | |||
| herwise, | address is the same as the address of the RTP component, and its port is one | |||
| the RTCP component address is the same as the address of the RTP component, and | greater than the port of the RTP component. | |||
| its port is one greater than the port of the RTP component. | </dd> | |||
| </t> | </dl> | |||
| </list> | ||||
| </t> | ||||
| </section> | </section> | |||
| <section title="SDP Offer/Answer Procedures"> | <section numbered="true" toc="default"> | |||
| <section title="Introduction"> | <name>SDP Offer/Answer Procedures</name> | |||
| <t><xref target="RFC8445"/> defines ICE candidate exchange as the proces | <section numbered="true" toc="default"> | |||
| s for ICE | <name>Introduction</name> | |||
| agents (Initiator and Responder) to exchange their candidate information | <t><xref target="RFC8445" format="default"/> defines ICE candidate | |||
| required for ICE processing at the agents. For the purposes of this | exchange as the process for ICE agents (initiator and responder) to | |||
| specification, the candidate exchange process corresponds to the <xref target="R | exchange their candidate information required for ICE processing at | |||
| FC3264"/> | the agents. For the purposes of this specification, the candidate | |||
| Offer/Answer protocol and the terms "offerer" and "answerer" correspond | exchange process corresponds to the Offer/Answer protocol <xref | |||
| to the initiator and responder roles from <xref target="RFC8445"/> respectively. | target="RFC3264" format="default"/>, and the terms "offerer" and | |||
| "answerer" correspond to the initiator and responder roles from <xref | ||||
| target="RFC8445" format="default"/> respectively. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| Once the initiating agent has gathered, pruned, and prioritized its | Once the initiating agent has gathered, pruned, and prioritized its set of | |||
| set of candidates <xref target="RFC8445"/>, the candidate exchange with the peer | candidates <xref target="RFC8445" format="default"/>, the candidate exchange | |||
| agent begins. | with the peer agent begins. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Generic Procedures"> | <section numbered="true" toc="default"> | |||
| <section anchor="sec-encoding" title="Encoding"> | <name>Generic Procedures</name> | |||
| <t><xref target="sec-grammar"/> provides detailed rules for constructi | <section anchor="sec-encoding" numbered="true" toc="default"> | |||
| ng various SDP | <name>Encoding</name> | |||
| attributes defined in this specification. | <t><xref target="sec-grammar" format="default"/> provides detailed | |||
| rules for constructing various SDP attributes defined in this | ||||
| specification. | ||||
| </t> | </t> | |||
| <section title="Data Streams"> | <section numbered="true" toc="default"> | |||
| <name>Data Streams</name> | ||||
| <t> | <t> | |||
| Each data stream <xref target="RFC8445"/> is represented by an SDP media descrip | Each data stream <xref target="RFC8445" format="default"/> is represented by | |||
| tion ("m=" section). | an SDP media description ("m=" section). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Candidates"> | <section numbered="true" toc="default"> | |||
| <name>Candidates</name> | ||||
| <t> | <t> | |||
| Within an "m=" section, each candidate (including the default candidate) associa ted | Within an "m=" section, each candidate (including the default candidate) associa ted | |||
| with the data stream is represented by an SDP candidate attribute. | with the data stream is represented by an SDP "candidate" attribute. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Prior to nomination, the "c=" line associated with an "m=" section contains | Prior to nomination, the "c=" line associated with an "m=" section contains | |||
| the connection address of the default candidate, while the "m=" line contains th e port | the connection address of the default candidate, while the "m=" line contains th e port | |||
| and transport protocol of the default candidate for that "m=" section. | and transport protocol of the default candidate for that "m=" section. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| After nomination, the "c=" line for a given "m=" section contains the | After nomination, the "c=" line for a given "m=" section contains the | |||
| connection address of the nominated candidate (the local candidate of the | connection address of the nominated candidate (the local candidate of the | |||
| nominated candidate pair) and the "m=" line contains the port and | nominated candidate pair), and the "m=" line contains the port and | |||
| transport protocol corresponding to the nominated candidate for that | transport protocol corresponding to the nominated candidate for that | |||
| "m=" section. | "m=" section. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Username and Password"> | <section numbered="true" toc="default"> | |||
| <name>Username and Password</name> | ||||
| <t> | <t> | |||
| The ICE username is represented by an SDP ice-ufrag attribute and the ICE | The ICE username is represented by an SDP "ice-ufrag" attribute, and the ICE | |||
| password is represented by an SDP ice-pwd attribute. | password is represented by an SDP "ice-pwd" attribute. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Lite Implementations"> | <section numbered="true" toc="default"> | |||
| <name>Lite Implementations</name> | ||||
| <t> | <t> | |||
| An ICE lite implementation <xref target="RFC8445"/> MUST include an SDP ice-lite | An ICE-lite implementation <xref target="RFC8445" format="default"/> <bcp14>MUST | |||
| attribute. | </bcp14> include an SDP "ice-lite" attribute. | |||
| A full implementation MUST NOT include that attribute. | A full implementation <bcp14>MUST NOT</bcp14> include that attribute. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="ICE Extensions"> | <section numbered="true" toc="default"> | |||
| <name>ICE Extensions</name> | ||||
| <t> | <t> | |||
| An agent uses the SDP ice-options attribute to indicate support of ICE | An agent uses the SDP "ice-options" attribute to indicate support of ICE | |||
| extensions. | extensions. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| An agent compliant to this specification MUST include an SDP ice-options | An agent compliant with this specification <bcp14>MUST</bcp14> include an SDP "i | |||
| attribute with an "ice2" attribute value <xref target="RFC8445"/>. If an agent r | ce-options" | |||
| eceives an SDP offer | attribute with an "ice2" attribute value <xref target="RFC8445" format="default" | |||
| or answer that indicates ICE support, but that does not contain an SDP ice-optio | />. If an agent receives an SDP offer | |||
| ns attribute with an "ice2" attribute value, | or answer that indicates ICE support, but that does not contain an SDP "ice-opti | |||
| the agent can assume that the peer is compliant to <xref target="RFC5245"/>. | ons" attribute with an "ice2" attribute value, | |||
| the agent can assume that the peer is compliant to <xref target="RFC5245" format | ||||
| ="default"/>. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Inactive and Disabled Data Streams"> | <section numbered="true" toc="default"> | |||
| <name>Inactive and Disabled Data Streams</name> | ||||
| <t> | <t> | |||
| If an "m=" section is marked as inactive <xref target="RFC4566"/>, or has a band | If an "m=" section is marked as inactive <xref target="RFC4566" format="default" | |||
| width | />, or has a bandwidth | |||
| value of zero <xref target="RFC4566"/>, the agent MUST still include ICE-related | value of zero <xref target="RFC4566" format="default"/>, the agent <bcp14>MUST</ | |||
| SDP | bcp14> still include ICE-related SDP | |||
| attributes. | attributes. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the port value associated with an "m=" section is set to zero (implying a | If the port value associated with an "m=" section is set to zero (implying a | |||
| disabled stream) as defined in section 8.2 of <xref target="RFC3264"/>, the agen | disabled stream) as defined in <xref target="RFC3264" sectionFormat="of" section | |||
| t SHOULD NOT | ="8.2" format="default"/>, the agent <bcp14>SHOULD NOT</bcp14> | |||
| include ICE-related SDP candidate attributes in that "m=" section, unless an | include ICE-related SDP "candidate" attributes in that "m=" section, unless an | |||
| SDP extension specifying otherwise is used. | SDP extension specifying otherwise is used. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="RTP/RTCP Considerations"> | <section numbered="true" toc="default"> | |||
| <name>RTP/RTCP Considerations</name> | ||||
| <t> | <t> | |||
| If an agent utilizes both RTP and RTCP, and separate ports | If an agent utilizes both RTP and RTCP, and separate ports | |||
| are used for RTP and RTCP, the agent MUST include SDP candidate | are used for RTP and RTCP, the agent <bcp14>MUST</bcp14> include SDP "candidate" | |||
| attributes for both the RTP and RTCP components. | attributes for both the RTP and RTCP components. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The agent includes an SDP rtcp attribute following the procedures | The agent includes an SDP "rtcp" attribute following the procedures | |||
| in <xref target="RFC3605"/>. Hence, in the cases where the RTCP | in <xref target="RFC3605" format="default"/>. Hence, in the cases where the RTCP | |||
| port value is one higher than the RTP port value and the RTCP component | port value is one higher than the RTP port value and the RTCP component | |||
| address the same as the address of the RTP component, the SDP rtcp attribute | address the same as the address of the RTP component, the SDP "rtcp" attribute | |||
| might be omitted. | might be omitted. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| NOTE: <xref target="RFC5245"/> required that an agent always includes the | NOTE: <xref target="RFC5245" format="default"/> required that an agent always in | |||
| SDP rtcp attribute, even if the RTCP port value was one higher than the | cludes the | |||
| RTP port value. This specification aligns the rtcp attribute procedures | SDP "rtcp" attribute, even if the RTCP port value was one higher than the | |||
| with <xref target="RFC3605"/>. | RTP port value. This specification aligns the "rtcp" attribute procedures | |||
| with <xref target="RFC3605" format="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| If the agent does not utilize RTCP, it indicates that by including b=RS:0 | If the agent does not utilize RTCP, it indicates that by including "RS:0" | |||
| and b=RR:0 SDP attributes, as described in <xref target="RFC3556"/>. | and "RR:0" SDP attributes as described in <xref target="RFC3556" format="default | |||
| "/>. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Determining Role"> | <section numbered="true" toc="default"> | |||
| <name>Determining Role</name> | ||||
| <t> | <t> | |||
| The offerer acts as the Initiating agent. The answerer acts as the | The offerer acts as the initiating agent. The answerer acts as the | |||
| Responding agent. The ICE roles (controlling and controlled) are determined | responding agent. The ICE roles (controlling and controlled) are determined | |||
| using the procedures in <xref target="RFC8445"/>. | using the procedures in <xref target="RFC8445" format="default"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="STUN Considerations"> | <section numbered="true" toc="default"> | |||
| <name>STUN Considerations</name> | ||||
| <t> | <t> | |||
| Once an agent has provided its local candidates to its peer in an SDP | Once an agent has provided its local candidates to its peer in an SDP | |||
| offer or answer, the agent MUST be prepared to receive STUN connectivity | offer or answer, the agent <bcp14>MUST</bcp14> be prepared to receive STUN | |||
| (Session Traversal Utilities for NAT, <xref target="RFC5389" format="default"/>) | ||||
| connectivity | ||||
| check Binding requests on those candidates. | check Binding requests on those candidates. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec-ice-mismatch" title="Verifying ICE Support Procedur | <section anchor="sec-ice-mismatch" numbered="true" toc="default"> | |||
| es"> | <name>Verifying ICE Support Procedures</name> | |||
| <t> | <t> | |||
| An ICE agent is considered to indicate support of ICE by including | An ICE agent indicates support of ICE by including | |||
| at least the SDP ice-pwd and ice-ufrag attributes in an offer or ans | at least the SDP "ice-pwd" and "ice-ufrag" attributes in an offer or | |||
| wer. | answer. | |||
| An ICE agent compliant with this specification MUST also include an | An ICE agent compliant with this specification <bcp14>MUST</bcp14> a | |||
| SDP ice-options attribute with an "ice2" attribute value. | lso include an | |||
| SDP "ice-options" attribute with an "ice2" attribute value. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| The agents will proceed with the ICE procedures defined in <xref target="RFC8445 "/> and | The agents will proceed with the ICE procedures defined in <xref target="RFC8445 " format="default"/> and | |||
| this specification if, for each data stream in the SDP it received, the | this specification if, for each data stream in the SDP it received, the | |||
| default destination for each component of that data stream appears in | default destination for each component of that data stream appears in | |||
| a candidate attribute. For example, in the case of RTP, the | a "candidate" attribute. For example, in the case of RTP, the | |||
| connection address, port, and transport protocol in the | connection address, port, and transport protocol in the | |||
| "c=" and "m=" lines, respectively, appear in a candidate | "c=" and "m=" lines, respectively, appear in a "candidate" | |||
| attribute and the value in the rtcp attribute appears in a candidate | attribute, and the value in the "rtcp" attribute appears in a "candidate" | |||
| attribute. | attribute. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This specification provides no guidance on how an agent should proceed | This specification provides no guidance on how an agent should proceed | |||
| in the cases where the above condition is not met with the few | in the cases where the above condition is not met with the few | |||
| exceptions noted below: | exceptions noted below: | |||
| </t> | </t> | |||
| <t> | <ol spacing="normal" type="1"> | |||
| <list style="numbers"> | <li> | |||
| <t> | The presence of certain Application Layer Gateways might modify | |||
| The presence of certain application layer gateways might modify | the transport address information as described in <xref target="sec-alg-sip" for | |||
| the transport address information as described in <xref target="sec-alg-sip"/>. | mat="default"/>. | |||
| The behavior of the responding agent in such a situation is | The behavior of the responding agent in such a situation is | |||
| implementation dependent. Informally, the responding agent might | implementation dependent. Informally, the responding agent might | |||
| consider the mismatched transport address information as a | consider the mismatched transport address information as a | |||
| plausible new candidate learnt from the peer and continue its | plausible new candidate learned from the peer and continue its | |||
| ICE processing with that transport address included. | ICE processing with that transport address included. | |||
| Alternatively, the responding agent MAY include an "a=ice-mismatch" | Alternatively, the responding agent <bcp14>MAY</bcp14> include an "ice-mismatch" | |||
| attribute in its answer for such data streams. If an agent chooses to | attribute in its answer for such data streams. If an agent chooses to | |||
| include an "a=ice-mismatch" attribute in its answer for a data stream, | include an "ice-mismatch" attribute in its answer for a data stream, | |||
| then it MUST also omit "a=candidate" attributes, MUST terminate | then it <bcp14>MUST</bcp14> also omit "candidate" attributes, <bcp14>MUST</bcp14 | |||
| the usage of ICE procedures and <xref target="RFC3264"/> procedures MUST be used | > terminate | |||
| instead for this data stream. | the usage of ICE procedures, and <xref target="RFC3264" format="default"/> | |||
| procedures <bcp14>MUST</bcp14> be used instead for this data stream. | ||||
| </t> | </li> | |||
| <t> | <li> | |||
| The transport address from the peer for the default destination | The transport address from the peer for the default destination | |||
| is set to IPv4/IPv6 address values "0.0.0.0"/"::" and port value of "9". | is set to IPv4/IPv6 address values "0.0.0.0"/"::" and port value of "9". | |||
| This MUST NOT be considered as a ICE failure by the peer agent and | This <bcp14>MUST NOT</bcp14> be considered as an ICE failure by the peer agent, | |||
| the ICE processing MUST continue as usual. | and | |||
| the ICE processing <bcp14>MUST</bcp14> continue as usual. | ||||
| </t> | </li> | |||
| <t> | <li> | |||
| In some cases, the controlling/initiator agent may receive the SDP answer | In some cases, the controlling/initiator agent may receive an SDP answer | |||
| that may omit "a=candidate" attributes for the data stream, and instead | that may omit "candidate" attributes for the data stream, and instead | |||
| include a media level "a=ice-mismatch" attribute. This signals to the | include a media-level "ice-mismatch" attribute. This signals to the | |||
| offerer that the answerer supports ICE, but that ICE processing was not | offerer that the answerer supports ICE, but that ICE processing was not | |||
| used for this data stream. In this case, ICE processing MUST be terminated | used for this data stream. In this case, ICE processing <bcp14>MUST</bcp14> be t | |||
| for this data stream and <xref target="RFC3264"/> procedures MUST be followed in | erminated | |||
| stead. | for this data stream, and <xref target="RFC3264" format="default"/> procedures < | |||
| bcp14>MUST</bcp14> be followed instead. | ||||
| </t> | </li> | |||
| <t> | <li> | |||
| The transport address from the peer for the default destination is | The transport address from the peer for the default destination is | |||
| an FQDN. Regardless of the procedures used to resolve FQDN or the | an FQDN. Regardless of the procedures used to resolve FQDN or the | |||
| resolution result, this MUST NOT be considered as a ICE failure by | resolution result, this <bcp14>MUST NOT</bcp14> be considered as an ICE failure | |||
| the peer agent and the ICE processing MUST continue as usual. | by | |||
| the peer agent, and the ICE processing <bcp14>MUST</bcp14> continue as usual. | ||||
| </t> | </li> | |||
| </list> | </ol> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="SDP Example"> | <section numbered="true" toc="default"> | |||
| <name>SDP Example</name> | ||||
| <t> | <t> | |||
| The following is an example SDP message that includes ICE attributes | The following is an example SDP message that includes ICE attributes | |||
| (lines folded for readability): | (lines folded for readability): | |||
| </t> | </t> | |||
| <figure> | <sourcecode name="" type="sdp"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| v=0 | v=0 | |||
| o=jdoe 2890844526 2890842807 IN IP4 203.0.113.141 | o=jdoe 2890844526 2890842807 IN IP4 203.0.113.141 | |||
| s= | s= | |||
| c=IN IP4 192.0.2.3 | c=IN IP4 192.0.2.3 | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:ice2 | a=ice-options:ice2 | |||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | a=ice-pwd:asd88fgpdd777uzjYhagZg | |||
| a=ice-ufrag:8hhY | a=ice-ufrag:8hhY | |||
| m=audio 45664 RTP/AVP 0 | m=audio 45664 RTP/AVP 0 | |||
| b=RS:0 | b=RS:0 | |||
| b=RR:0 | b=RR:0 | |||
| a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
| a=candidate:1 1 UDP 2130706431 203.0.113.141 8998 typ host | a=candidate:1 1 UDP 2130706431 203.0.113.141 8998 typ host | |||
| a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr | a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr | |||
| 203.0.113.141 rport 8998 | 203.0.113.141 rport 8998 | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Initial Offer/Answer Exchange"> | <section numbered="true" toc="default"> | |||
| <section title="Sending the Initial Offer"> | <name>Initial Offer/Answer Exchange</name> | |||
| <section numbered="true" toc="default"> | ||||
| <name>Sending the Initial Offer</name> | ||||
| <t> | <t> | |||
| When an offerer generates the initial offer, in each "m=" section it MUST | When an offerer generates the initial offer, in each "m=" section it <bcp14>MUST | |||
| include SDP candidate attributes for each available candidate associated | </bcp14> | |||
| with the "m=" section. In addition, the offerer MUST include an SDP ice-ufrag | include SDP "candidate" attributes for each available candidate associated | |||
| attribute, an SDP ice-pwd attribute and an SDP ice-options attribute with | with the "m=" section. In addition, the offerer <bcp14>MUST</bcp14> include an S | |||
| DP "ice-ufrag" | ||||
| attribute, an SDP "ice-pwd" attribute, and an SDP "ice-options" attribute with | ||||
| an "ice2" attribute value in the offer. If the offerer is a full ICE implementat ion, | an "ice2" attribute value in the offer. If the offerer is a full ICE implementat ion, | |||
| it SHOULD include an ice-pacing attribute in the offer (if not included, the | it <bcp14>SHOULD</bcp14> include an "ice-pacing" attribute in the offer (if not | |||
| default value will apply). A lite ICE implementation MUST NOT included the ice-p | included, the | |||
| acing | default value will apply). A lite ICE implementation <bcp14>MUST NOT</bcp14> inc | |||
| lude the "ice-pacing" | ||||
| attribute in the offer (as it will not perform connectivity checks). | attribute in the offer (as it will not perform connectivity checks). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| It is valid for an offer "m=" line to include no SDP candidate attributes | It is valid for an offer "m=" line to include no SDP "candidate" attributes | |||
| and with default destination set to the IP address values | and have the default destination set to the IP address values | |||
| "0.0.0.0"/"::" and port value of "9". This implies that the offering agent | "0.0.0.0"/"::" and the port value to "9". | |||
| is only going to use peer reflexive candidates or that additional candidates | This implies that the offering agent is only going to use peer-reflexive | |||
| would be provided in subsequent signaling messages. | candidates or will provide additional candidates in subsequent signaling | |||
| messages. | ||||
| </t> | </t> | |||
| <t> | <dl newline="false" spacing="normal"> | |||
| <list style="hanging"> | <dt>Note:</dt> | |||
| <t hangText="Note:"> | <dd> | |||
| Within the scope of this document, "Initial Offer" refers to the first | Within the scope of this document, "initial offer" refers to the first | |||
| SDP offer that is sent in order to negotiate usage of ICE. It might, or | SDP offer that is sent in order to negotiate usage of ICE. It might, or | |||
| might not, be the initial SDP offer of the SDP session. | might not, be the initial SDP offer of the SDP session. | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | <dl newline="false" spacing="normal"> | |||
| <t> | <dt>Note:</dt> | |||
| <list style="hanging"> | <dd> | |||
| <t hangText="Note:"> | ||||
| The procedures in this document only consider "m=" sections associated | The procedures in this document only consider "m=" sections associated | |||
| with data streams where ICE is used. | with data streams where ICE is used. | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="Sending the Initial Answer"> | <section numbered="true" toc="default"> | |||
| <name>Sending the Initial Answer</name> | ||||
| <t> | <t> | |||
| When an answerer receives an initial offer that indicates | When an answerer receives an initial offer indicating | |||
| that the offerer supports ICE, and if the answerer accepts | that the offerer supports ICE, and if the answerer accepts | |||
| the offer and the usage of ICE, in each "m=" section within | the offer and the usage of ICE, the answerer <bcp14>MUST</bcp14> include | |||
| the answer, it MUST include SDP candidate attributes for | in each "m=" section within the answer the SDP "candidate" | |||
| each available candidate associated with the "m=" section. | attributes for each available candidate associated with | |||
| In addition, the answerer MUST include an SDP ice-ufrag | the "m=" section. | |||
| attribute, an SDP ice-pwd attribute and an SDP ice-options | In addition, the answerer <bcp14>MUST</bcp14> include an SDP "ice-ufrag" | |||
| attribute, an SDP "ice-pwd" attribute, and an SDP "ice-options" | ||||
| attribute with an "ice2" attribute value in the answer. If the | attribute with an "ice2" attribute value in the answer. If the | |||
| answerer is a full ICE implementation, it SHOULD include an | answerer is a full ICE implementation, it <bcp14>SHOULD</bcp14> include an | |||
| ice-pacing attribute in the answerer (if not included, the | "ice-pacing" attribute in the answer (if not included, the | |||
| default value will apply). A lite ICE implementation MUST NOT | default value will apply). A lite ICE implementation <bcp14>MUST NOT</bcp14> | |||
| included the ice-pacing attribute in the answer (as it will | include the "ice-pacing" attribute in the answer (as it will | |||
| not perform connectivity chekcks). | not perform connectivity checks). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In each "m=" line, the answerer MUST use the same transport | In each "m=" line, the answerer <bcp14>MUST</bcp14> use the same transport | |||
| protocol as was used in the offer "m=" line. If none of | protocol as was used in the offer "m=" line. If none of | |||
| the candidates in the "m=" line in the answer use the same | the candidates in the "m=" line in the answer uses the same | |||
| transport protocol as indicated in the offer "m=" line, | transport protocol as indicated in the offer "m=" line, | |||
| then, in order to avoid ICE mismatch, the default destination | then, in order to avoid ICE mismatch, the default destination | |||
| MUST be set to IP address values "0.0.0.0"/"::" and | <bcp14>MUST</bcp14> be set to IP address values "0.0.0.0"/"::" and | |||
| port value of "9". | port value of "9". | |||
| </t> | </t> | |||
| <t> | <t> | |||
| It is also valid for an answer "m=" line to include no SDP | It is also valid for an answer "m=" line to include no SDP | |||
| candidate attributes and with default destination set | "candidate" attributes and have the default destination set | |||
| to the IP address values "0.0.0.0"/"::" and port value of "9". | to the IP address values "0.0.0.0"/"::" and the port value to "9". | |||
| This implies that the answering agent is only going to use peer | This implies that the answering agent is only going to use | |||
| reflexive candidates or that additional candidates would be | peer-reflexive candidates or that additional candidates would be | |||
| provided in subsequent signaling messages. | provided in subsequent signaling messages. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Once the answerer has sent the answer, it can start performing | Once the answerer has sent the answer, it can start performing | |||
| connectivity checks towards the peer candidates that were provided | connectivity checks towards the peer candidates that were provided | |||
| in the offer. | in the offer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the offer does not indicate support of ICE <xref target="sec-ice-mismatch"/>, | If the offer does not indicate support of ICE (<xref target="sec-ice-mismatch" f | |||
| the answerer | ormat="default"/>), the answerer | |||
| MUST NOT accept the usage of ICE. If the answerer still accepts | <bcp14>MUST NOT</bcp14> accept the usage of ICE. If the answerer still accepts | |||
| the offer, the answerer MUST NOT include any ICE-related SDP | the offer, the answerer <bcp14>MUST NOT</bcp14> include any ICE-related SDP | |||
| attributes in the answer. Instead the answerer will generate | attributes in the answer. Instead, the answerer will generate | |||
| the answer according to normal offer/answer procedures <xref target="RFC3264"/>. | the answer according to normal offer/answer procedures <xref target="RFC3264" fo | |||
| rmat="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| If the answerer detects a possibility of an ICE mismatch, | If the answerer detects a possibility of an ICE mismatch, | |||
| procedures described in <xref target="sec-ice-mismatch"/> are followed. | procedures described in <xref target="sec-ice-mismatch" format="default"/> are f ollowed. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Receiving the Initial Answer"> | <section numbered="true" toc="default"> | |||
| <name>Receiving the Initial Answer</name> | ||||
| <t> | <t> | |||
| When an offerer receives an initial answer that indicates | When an offerer receives an initial answer that indicates | |||
| that the answerer supports ICE, it can start performing | that the answerer supports ICE, it can start performing | |||
| connectivity checks towards the peer candidates that were | connectivity checks towards the peer candidates that were | |||
| provided in the answer. | provided in the answer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the answer does not indicate that the answerer | If the answer does not indicate that the answerer supports ICE, or if the | |||
| supports ICE, or if the answerer included "a=ice-mismatch" | answerer included "ice-mismatch" attributes for all the active data streams | |||
| attributes for all the active data streams in | in the answer, the offerer <bcp14>MUST</bcp14> terminate the usage of ICE for | |||
| the answer, the offerer MUST terminate the usage of ICE | the entire session, and <xref target="RFC3264" format="default"/> procedures | |||
| for the entire session and <xref target="RFC3264"/> procedures MUST be | <bcp14>MUST</bcp14> be followed instead. | |||
| followed instead. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| On the other hand, if the answer indicates support for | On the other hand, if the answer indicates support for | |||
| ICE but includes "a=ice-mismatch" in certain active data | ICE but includes "ice-mismatch" in certain active data | |||
| streams, then the offerer MUST terminate the usage of ICE | streams, then the offerer <bcp14>MUST</bcp14> terminate the usage of ICE | |||
| procedures and <xref target="RFC3264"/> procedures | procedures, and <xref target="RFC3264" format="default"/> procedures | |||
| MUST be used instead for only these data streams. Also, ICE | <bcp14>MUST</bcp14> be used instead for only these data streams. Also, ICE | |||
| procedures MUST be used for data streams where an "a=ice-mismatch" | procedures <bcp14>MUST</bcp14> be used for data streams where an "ice-mismatch" | |||
| attribute was not included. | attribute was not included. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the offerer detects an ICE mismatch for one or more | If the offerer detects an ICE mismatch for one or more data streams in the | |||
| data streams in the answer, as described in <xref target="sec-ice-mismatch"/>, | answer, as described in <xref target="sec-ice-mismatch" format="default"/>, | |||
| the offerer MUST terminate the usage of ICE for the entire session. | the offerer <bcp14>MUST</bcp14> terminate the usage of ICE for the entire | |||
| The subsequent actions taken by the offerer are implementation | session. The subsequent actions taken by the offerer are implementation | |||
| dependent and are out of the scope of this specification. | dependent and are out of the scope of this specification. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Concluding ICE"> | <section numbered="true" toc="default"> | |||
| <name>Concluding ICE</name> | ||||
| <t> | <t> | |||
| Once the agent has successfully nominated a pair <xref target="RFC8445"/>, the s | Once the agent has successfully nominated a pair <xref target="RFC8445" | |||
| tate of the | format="default"/>, the state of the checklist associated with the pair is set | |||
| checklist associated with the pair is set to Completed. Once the state of each c | to Completed. Once the state of each checklist is set to either Completed or | |||
| hecklist is | Failed, for each Completed checklist, the agent checks whether the nominated | |||
| set to either Completed or Failed, for each Completed checklist the agent checks | pair matches the default candidate pair. If there are one or more pairs that | |||
| whether the | do not match, and the peer did not indicate support for the 'ice2' ice-option, | |||
| nominated pair matches the default candidate pair. If there are one or more pair | the controlling agent <bcp14>MUST</bcp14> generate a subsequent offer in which | |||
| s that do not | the connection address, port, and transport protocol in the "c=" and "m=" | |||
| match, and the peer did not indicate support for the 'ice2' ice-option, the cont | lines associated with each data stream match the corresponding local | |||
| rolling agent | information of the nominated pair for that data stream (<xref | |||
| MUST generate a subsequent offer, in which the connection address, port and tran | target="sec-send-subsequent-offer-after-nom" format="default"/>). If the peer | |||
| sport protocol | did indicate support for the 'ice2' ice-option, the controlling agent does not | |||
| in the "c=" and "m=" lines associated with each data stream match the correspond | immediately need to generate an updated offer in order to align a connection | |||
| ing | address, port, and protocol with a nominated pair. However, later in the | |||
| local information of the nominated pair for that data stream (<xref target="sec- | session, whenever the controlling agent does send a subsequent offer, it | |||
| send-subsequent-offer-after-nom"/>). | <bcp14>MUST</bcp14> do the alignment as described above. | |||
| If the peer did indicate support for the 'ice2' ice-option, the controlling agen | </t> | |||
| t does not | ||||
| immediately need to generate an updated offer in order to align a connection add | ||||
| ress, port | ||||
| and protocol with a nominated pair. However, later in the session, whenever the | ||||
| controlling agent | ||||
| does sent a subsequent offer, it MUST do the alignment as described above. | ||||
| </t> | ||||
| <t> | ||||
| If there are one or more checklists with the state set to Failed, the controllin | ||||
| g | ||||
| agent MUST generate a subsequent offer in order to remove the associated data st | ||||
| reams by setting | ||||
| the port value of the data streams to zero (<xref target="sec-send-subsequent-of | ||||
| fer-remove"/>), | ||||
| even if the peer did indicate support for the 'ice2' ice-option. If needed, such | ||||
| offer is used to align the connection address, port and transport protocol, as | ||||
| described above. | ||||
| </t> | ||||
| <t> | <t> | |||
| As described in <xref target="RFC8445"/>, once the controlling agent has nominat | If there are one or more checklists with the state set to Failed, the | |||
| ed | controlling agent <bcp14>MUST</bcp14> generate a subsequent offer in order to | |||
| a candidate pair for a checklist, the agent MUST NOT nominate another pair | remove the associated data streams by setting the port value of the data | |||
| for that checklist during the lifetime of the ICE session (i.e. until | streams to zero (<xref target="sec-send-subsequent-offer-remove" | |||
| format="default"/>), even if the peer did indicate support for the 'ice2' | ||||
| ice-option. If needed, such offer is used to align the connection address, | ||||
| port, and transport protocol, as described above. | ||||
| </t> | ||||
| <t> | ||||
| As described in <xref target="RFC8445" format="default"/>, once the controlling | ||||
| agent has nominated | ||||
| a candidate pair for a checklist, the agent <bcp14>MUST NOT</bcp14> nominate ano | ||||
| ther pair | ||||
| for that checklist during the lifetime of the ICE session (i.e., until | ||||
| ICE is restarted). | ICE is restarted). | |||
| </t> | </t> | |||
| <t> | ||||
| <xref target="draft-ietf-ice-pac"/> provides a mechanism for | <t> | |||
| <xref target="RFC8863" format="default"/> provides a mechanism for | ||||
| allowing the ICE process to run long enough in order to find working candidate pairs, | allowing the ICE process to run long enough in order to find working candidate pairs, | |||
| by waiting for potential peer-reflexive candidates, even though no candidate p airs were | by waiting for potential peer-reflexive candidates, even though no candidate p airs were | |||
| received from the peer or all current candidate pairs associated with a checkl ist have | received from the peer or all current candidate pairs associated with a checkl ist have | |||
| either failed or been discarded. It is OPTIONAL for an ICE agent to support th e mechanism. | either failed or been discarded. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Subsequent Offer/Answer Exchanges"> | <section numbered="true" toc="default"> | |||
| <name>Subsequent Offer/Answer Exchanges</name> | ||||
| <t> | <t> | |||
| Either agent MAY generate a subsequent offer at any time allowed by | Either agent <bcp14>MAY</bcp14> generate a subsequent offer at any time allowed | |||
| <xref target="RFC3264"/>. This section defines rules for construction of subsequ | by | |||
| ent | <xref target="RFC3264" format="default"/>. This section defines rules for constr | |||
| uction of subsequent | ||||
| offers and answers. | offers and answers. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Should a subsequent offer fail, ICE processing continues as if the | Should a subsequent offer fail, ICE processing continues as if the | |||
| subsequent offer had never been made. | subsequent offer had never been made. | |||
| </t> | </t> | |||
| <section anchor="sec-send-subsequent-offer" title="Sending Subsequent Of | <section anchor="sec-send-subsequent-offer" numbered="true" toc="default | |||
| fer"> | "> | |||
| <section title="Procedures for All Implementations"> | <name>Sending Subsequent Offer</name> | |||
| <section anchor="sec-suboffer-restarts" title="ICE Restart"> | <section numbered="true" toc="default"> | |||
| <name>Procedures for All Implementations</name> | ||||
| <section anchor="sec-suboffer-restarts" numbered="true" toc="default | ||||
| "> | ||||
| <name>ICE Restart</name> | ||||
| <t> | <t> | |||
| An agent MAY restart ICE processing for an existing data stream <xref target="RF C8445"/>. | An agent <bcp14>MAY</bcp14> restart ICE processing for an existing data stream < xref target="RFC8445" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The rules governing the ICE restart imply that setting the connection address | The rules governing the ICE restart imply that setting the connection address | |||
| in the "c=" line to "0.0.0.0" (for IPv4)/ "::" (for IPv6) will cause an ICE rest art. | in the "c=" line to "0.0.0.0" (for IPv4)/ "::" (for IPv6) will cause an ICE rest art. | |||
| Consequently, ICE implementations MUST NOT utilize this mechanism for call hold, | Consequently, ICE implementations <bcp14>MUST NOT</bcp14> utilize this mechanism | |||
| and instead MUST use "a=inactive" and "a=sendonly" as described in <xref target= | for call hold, | |||
| "RFC3264"/>. | and instead <bcp14>MUST</bcp14> use "inactive" and "sendonly" as described in | |||
| <xref target="RFC3264" format="default"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| To restart ICE, an agent MUST change both the ice-pwd and the ice-ufrag for | To restart ICE, an agent <bcp14>MUST</bcp14> change both the "ice-pwd" and the " ice-ufrag" for | |||
| the data stream in an offer. However, it is permissible to use a session-level | the data stream in an offer. However, it is permissible to use a session-level | |||
| attribute in one offer, but to provide the same ice-pwd or ice-ufrag as a | attribute in one offer, but to provide the same "ice-pwd" or "ice-ufrag" as a | |||
| media-level attribute in a subsequent offer. This MUST NOT be considered | media-level attribute in a subsequent offer. This <bcp14>MUST NOT</bcp14> be con | |||
| sidered | ||||
| as ICE restart. | as ICE restart. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| An agent sets the rest of the ICE-related fields in the SDP for this data stream as it | An agent sets the rest of the ICE-related fields in the SDP for this data stream as it | |||
| would in an initial offer of this data stream (<xref target="sec-encoding"/>). | would in an initial offer of this data stream (<xref target="sec-encoding" forma | |||
| Consequently, the set of candidates MAY include some, none, or all of the | t="default"/>). | |||
| previous candidates for that data stream and MAY include a totally new set of | Consequently, the set of candidates <bcp14>MAY</bcp14> include some, none, or al | |||
| candidates. The agent MAY modify the attribute values of the SDP ice-options and | l of the | |||
| SDP ice-pacing attributes, and it MAY change its role using the SDP ice-lite att | previous candidates for that data stream and <bcp14>MAY</bcp14> include a totall | |||
| ribute. | y new set of | |||
| The agent MUST NOT modify the SDP ice-options, ice-pacing and ice-lite attribute | candidates. The agent <bcp14>MAY</bcp14> modify the attribute values of the SDP | |||
| s in a | "ice-options" and | |||
| SDP "ice-pacing" attributes, and it <bcp14>MAY</bcp14> change its role using the | ||||
| SDP "ice-lite" attribute. | ||||
| The agent <bcp14>MUST NOT</bcp14> modify the SDP "ice-options", "ice-pacing", an | ||||
| d "ice-lite" attributes in a | ||||
| subsequent offer unless the offer is sent in order to request an ICE restart. | subsequent offer unless the offer is sent in order to request an ICE restart. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Removing a Data Stream" anchor="sec-send-subsequent- | <section anchor="sec-send-subsequent-offer-remove" numbered="true" t | |||
| offer-remove"> | oc="default"> | |||
| <name>Removing a Data Stream</name> | ||||
| <t> | <t> | |||
| If an agent removes a data stream by setting its port to zero, it MUST NOT | If an agent removes a data stream by setting its port to zero, it <bcp14>MUST NO | |||
| include any candidate attributes for that data stream and SHOULD NOT include | T</bcp14> | |||
| any other ICE-related attributes defined in <xref target="sec-grammar"/> for tha | include any "candidate" attributes for that data stream and <bcp14>SHOULD NOT</b | |||
| t data stream. | cp14> include | |||
| any other ICE-related attributes defined in <xref target="sec-grammar" format="d | ||||
| efault"/> for that data stream. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Adding a Data Stream"> | <section numbered="true" toc="default"> | |||
| <name>Adding a Data Stream</name> | ||||
| <t> | <t> | |||
| If an agent wishes to add a new data stream, it sets the fields in the SDP for | If an agent wishes to add a new data stream, it sets the fields in the SDP for | |||
| this data stream as if this were an initial offer for that data stream | this data stream as if this were an initial offer for that data stream | |||
| (<xref target="sec-encoding"/>). This will cause ICE processing to begin for thi s data stream. | (<xref target="sec-encoding" format="default"/>). This will cause ICE processing to begin for this data stream. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Procedures for Full Implementations"> | <section numbered="true" toc="default"> | |||
| <name>Procedures for Full Implementations</name> | ||||
| <t> | <t> | |||
| This section describes additional procedures for full implementations, | This section describes additional procedures for full implementations, | |||
| covering existing data streams. | covering existing data streams. | |||
| </t> | </t> | |||
| <section title="Before Nomination"> | <section numbered="true" toc="default"> | |||
| <name>Before Nomination</name> | ||||
| <t> | <t> | |||
| When an offerer sends a subsequent offer; in each "m=" section for which a | When an offerer sends a subsequent offer; in each "m=" section for which a | |||
| candidate pair has not yet been nominated, the offer MUST include the | candidate pair has not yet been nominated, the offer <bcp14>MUST</bcp14> include the | |||
| same set of ICE-related information that the offerer included in the | same set of ICE-related information that the offerer included in the | |||
| previous offer or answer. The agent MAY include additional candidates | previous offer or answer. The agent <bcp14>MAY</bcp14> include additional candid ates | |||
| it did not offer previously, but which it has gathered since the last | it did not offer previously, but which it has gathered since the last | |||
| offer/answer exchange, including peer reflexive candidates. | offer/answer exchange, including peer-reflexive candidates. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The agent MAY change the default destination for media. As with initial | The agent <bcp14>MAY</bcp14> change the default destination for media. As with i | |||
| offers, there MUST be a set of candidate attributes in the offer matching | nitial | |||
| offers, there <bcp14>MUST</bcp14> be a set of "candidate" attributes in the offe | ||||
| r matching | ||||
| this default destination. | this default destination. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="After Nomination" anchor="sec-send-subsequent-offer- | <section anchor="sec-send-subsequent-offer-after-nom" numbered="true | |||
| after-nom"> | " toc="default"> | |||
| <name>After Nomination</name> | ||||
| <t> | <t> | |||
| Once a candidate pair has been nominated for a data stream, the connection addre ss, | Once a candidate pair has been nominated for a data stream, the connection addre ss, | |||
| port and transport protocol in each "c=" and "m=" line associated with that data | port, and transport protocol in each "c=" and "m=" line associated with that dat | |||
| stream MUST match the data associated with the nominated pair for that | a | |||
| data stream. In addition, the offerer only includes SDP candidates | stream <bcp14>MUST</bcp14> match the data associated with the nominated pair for | |||
| (one per component) representing the local candidates of the nominated candidate | that | |||
| pair. The offerer MUST NOT include any other SDP candidate attributes in the | data stream. In addition, the offerer only includes SDP "candidate" attributes | |||
| (one per component) representing the local candidates of the nominated candidate | ||||
| pair. | ||||
| The offerer <bcp14>MUST NOT</bcp14> include any other SDP "candidate" attributes | ||||
| in the | ||||
| subsequent offer. | subsequent offer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| In addition, if the agent is controlling, it MUST include the | In addition, if the agent is controlling, it <bcp14>MUST</bcp14> include the | |||
| "a=remote-candidates" attribute for each data stream whose checklist | "remote-candidates" attribute for each data stream whose checklist | |||
| is in the Completed state. The attribute contains the remote candidates | is in the Completed state. The attribute contains the remote candidates | |||
| corresponding to the nominated pair in the valid list for each | corresponding to the nominated pair in the valid list for each | |||
| component of that data stream. It is needed to avoid a race condition | component of that data stream. It is needed to avoid a race condition | |||
| whereby the controlling agent chooses its pairs, but the updated offer | whereby the controlling agent chooses its pairs, but the updated offer | |||
| beats the connectivity checks to the controlled agent, which doesn’t | beats the connectivity checks to the controlled agent, which doesn't | |||
| even know these pairs are valid, let alone selected. See Appendix B | even know these pairs are valid, let alone selected. See <xref target="sec-why-r | |||
| emote" format="default"/> | ||||
| for elaboration on this race condition. | for elaboration on this race condition. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Procedures for Lite Implementations"> | <section numbered="true" toc="default"> | |||
| <name>Procedures for Lite Implementations</name> | ||||
| <t> | <t> | |||
| If the ICE state is Running, a lite implementation MUST include all of | If the ICE state is Running, a lite implementation <bcp14>MUST</bcp14> include a | |||
| its candidates for each component of each data stream in "a=candidate" | ll of | |||
| its candidates for each component of each data stream in "candidate" | ||||
| attributes in any subsequent offer. The candidates are formed identically | attributes in any subsequent offer. The candidates are formed identically | |||
| to the procedures for initial offers. | to the procedures for initial offers. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A lite implementation MUST NOT add additional host candidates in a | A lite implementation <bcp14>MUST NOT</bcp14> add additional host candidates in | |||
| subsequent offer, and MUST NOT modify the username fragments and | a | |||
| subsequent offer, and <bcp14>MUST NOT</bcp14> modify the username fragments and | ||||
| passwords. If an agent needs to offer additional candidates, or | passwords. If an agent needs to offer additional candidates, or | |||
| modify the username fragments and passwords, it MUST request an | to modify the username fragments and passwords, it <bcp14>MUST</bcp14> request a | |||
| ICE restart (<xref target="sec-suboffer-restarts"/>) for that data stream. | n | |||
| ICE restart (<xref target="sec-suboffer-restarts" format="default"/>) for that d | ||||
| ata stream. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| If ICE has completed for a data stream and if the agent is controlled, | If ICE has completed for a data stream, and if the agent is controlled, | |||
| the default destination for that data stream MUST be set to the | the default destination for that data stream <bcp14>MUST</bcp14> be set to the | |||
| remote candidate of the candidate pair for that component in the valid list. | remote candidate of the candidate pair for that component in the valid list. | |||
| For a lite implementation, there is always just a single candidate pair in | For a lite implementation, there is always just a single candidate pair in | |||
| the valid list for each component of a data stream. Additionally, the agent | the valid list for each component of a data stream. Additionally, the agent | |||
| MUST include a candidate attribute for each default destination. | <bcp14>MUST</bcp14> include a "candidate" attribute for each default destination . | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If the ICE state is Completed and if the agent is controlling (which only | If the ICE state is Completed, and if the agent is controlling (which only | |||
| happens when both agents are lite), the agent MUST include the | happens when both agents are lite), the agent <bcp14>MUST</bcp14> include the | |||
| "a=remote-candidates" attribute for each data stream. The attribute | "remote-candidates" attribute for each data stream. The attribute | |||
| contains the remote candidates from the candidate pairs in the | contains the remote candidates from the candidate pairs in the | |||
| valid list (one pair for each component of each data stream). | valid list (one pair for each component of each data stream). | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-subsequent-answer" title="Sending Subsequent Answer | <section anchor="sec-subsequent-answer" numbered="true" toc="default"> | |||
| "> | <name>Sending Subsequent Answer</name> | |||
| <t> | <t> | |||
| If ICE is Completed for a data stream, and the offer for that data | If ICE is Completed for a data stream, and the offer for that data | |||
| stream lacked the "a=remote-candidates" attribute, the rules for | stream lacked the "remote-candidates" attribute, the rules for | |||
| construction of the answer are identical to those for the offerer, | construction of the answer are identical to those for the offerer, | |||
| except that the answerer MUST NOT include the "a=remote-candidates" | except that the answerer <bcp14>MUST NOT</bcp14> include the "remote-candidates" | |||
| attribute in the answer. | attribute in the answer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A controlled agent will receive an offer with the "a=remote-candidates" | A controlled agent will receive an offer with the "remote-candidates" | |||
| attribute for a data stream when its peer has concluded ICE processing | attribute for a data stream when its peer has concluded ICE processing | |||
| for that data stream. This attribute is present in the | for that data stream. This attribute is present in the | |||
| offer to deal with a race condition between the receipt of the offer, | offer to deal with a race condition between the receipt of the offer, | |||
| and the receipt of the Binding Response that tells the answerer the | and the receipt of the Binding response that tells the answerer the | |||
| candidate that will be selected by ICE. See Appendix B for an | candidate that will be selected by ICE. See <xref target="sec-why-remote" format | |||
| ="default"/> for an | ||||
| explanation of this race condition. Consequently, processing of an | explanation of this race condition. Consequently, processing of an | |||
| offer with this attribute depends on the winner of the race. | offer with this attribute depends on the winner of the race. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The agent forms a candidate pair for each component of the data stream by: | The agent forms a candidate pair for each component of the data stream by: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | Setting the remote candidate equal to the offerer's default | |||
| Setting the remote candidate equal to the offerer’s default | destination for that component (i.e., the contents of the "m=" and | |||
| destination for that component (i.e. the contents of the "m=" and | "c=" lines for RTP, and the "rtcp" attribute for RTCP) | |||
| "c=" lines for RTP, and the "a=rtcp" attribute for RTCP) | ||||
| </t> | </li> | |||
| <t> | <li> | |||
| Setting the local candidate equal to the transport address for | Setting the local candidate equal to the transport address for | |||
| that same component in the "a=remote-candidates" attribute in the | that same component in the "remote-candidates" attribute in the | |||
| offer. | offer. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| The agent then sees if each of these candidate pairs is present | The agent then sees if each of these candidate pairs is present | |||
| in the valid list. If a particular pair is not in the valid list, | in the valid list. If a particular pair is not in the valid list, | |||
| the check has "lost" the race. Call such a pair a "losing pair". | the check has "lost" the race. Call such a pair a "losing pair". | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The agent finds all the pairs in the checklist whose remote | The agent finds all the pairs in the checklist whose remote | |||
| candidates equal the remote candidate in the losing pair: | candidates equal the remote candidate in the losing pair: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | ||||
| <t> | <li> | |||
| If none of the pairs are In-Progress, and at least one is Failed, | If none of the pairs is In-Progress, and at least one is Failed, | |||
| it is most likely that a network failure, such as a network | it is most likely that a network failure, such as a network | |||
| partition or serious packet loss, has occurred. The agent SHOULD | partition or serious packet loss, has occurred. The agent <bcp14>SHOULD</bcp14> | |||
| generate an answer for this data stream as if the remote- | generate an answer for this data stream as if the "remote- | |||
| candidates attribute had not been present, and then restart ICE | candidates" attribute had not been present, and then restart ICE | |||
| for this stream. | for this stream. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| If at least one of the pairs is In-Progress, the agent SHOULD wait | If at least one of the pairs is In-Progress, the agent <bcp14>SHOULD</bcp14> wai | |||
| t | ||||
| for those checks to complete, and as each completes, redo the | for those checks to complete, and as each completes, redo the | |||
| processing in this section until there are no losing pairs. | processing in this section until there are no losing pairs. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| Once there are no losing pairs, the agent can generate the answer. | Once there are no losing pairs, the agent can generate the answer. | |||
| It MUST set the default destination for media to the candidates in | It <bcp14>MUST</bcp14> set the default destination for media to the candidates i | |||
| the remote-candidates attribute from the offer (each of which will | n | |||
| the "remote-candidates" attribute from the offer (each of which will | ||||
| now be the local candidate of a candidate pair in the valid list). | now be the local candidate of a candidate pair in the valid list). | |||
| It MUST include a candidate attribute in the answer for each | It <bcp14>MUST</bcp14> include a "candidate" attribute in the answer for each | |||
| candidate in the remote-candidates attribute in the offer. | candidate in the "remote-candidates" attribute in the offer. | |||
| </t> | </t> | |||
| <section title="ICE Restart"> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>ICE Restart</name> | ||||
| <t> | <t> | |||
| If the offerer in a subsequent offer requested an ICE restart (<xref target="sec -suboffer-restarts"/>) | If the offerer in a subsequent offer requested an ICE restart (<xref target="sec -suboffer-restarts" format="default"/>) | |||
| for a data stream, and if the answerer accepts the offer, the | for a data stream, and if the answerer accepts the offer, the | |||
| answerer follows the procedures for generating an initial answer. | answerer follows the procedures for generating an initial answer. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| For a given data stream, the answerer MAY include the same | For a given data stream, the answerer <bcp14>MAY</bcp14> include the same | |||
| candidates that were used in the previous ICE session, but | candidates that were used in the previous ICE session, but | |||
| it MUST change the SDP ice-pwd and ice-ufrag attribute | it <bcp14>MUST</bcp14> change the SDP "ice-pwd" and "ice-ufrag" attribute | |||
| values. | values. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The answerer MAY modify the attribute values of the SDP ice-options and | The answerer <bcp14>MAY</bcp14> modify the attribute values of the SDP "ice-opti | |||
| SDP ice-pacing attributes, and it MAY change its role using the SDP ice-lite att | ons" and | |||
| ribute. | SDP "ice-pacing" attributes, and it <bcp14>MAY</bcp14> change its role using the | |||
| The answerer MUST NOT modify the SDP ice-options, ice-pacing and ice-lite attrib | SDP "ice-lite" attribute. | |||
| utes in a | The answerer <bcp14>MUST NOT</bcp14> modify the SDP "ice-options", "ice-pacing", | |||
| and "ice-lite" attributes in a | ||||
| subsequent answer unless the answer is sent for an offer that was used to reques t an ICE restart | subsequent answer unless the answer is sent for an offer that was used to reques t an ICE restart | |||
| (<xref target="sec-suboffer-restarts"/>). If any of the SDP attributes have been | (<xref target="sec-suboffer-restarts" format="default"/>). If any of the SDP att | |||
| modified in | ributes have been modified in | |||
| a subsequent offer that is not used to request an ICE restart, the answerer MUST | a subsequent offer that is not used to request an ICE restart, the answerer <bcp | |||
| reject the | 14>MUST</bcp14> reject the | |||
| offer. | offer. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Lite Implementation specific procedures"> | <section numbered="true" toc="default"> | |||
| <name>Lite Implementation Specific Procedures</name> | ||||
| <t> | <t> | |||
| If the received offer contains the remote-candidates attribute for a | If the received offer contains the "remote-candidates" attribute for a | |||
| data stream, the agent forms a candidate pair for each component of the | data stream, the agent forms a candidate pair for each component of the | |||
| data stream by: | data stream by: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | Setting the remote candidate equal to the offerer's default destination | |||
| Setting the remote candidate equal to the offerer’s default destination | ||||
| for that component (i.e., the contents of the "m=" and "c=" lines for RTP, | for that component (i.e., the contents of the "m=" and "c=" lines for RTP, | |||
| and the "a=rtcp" attribute for RTCP). | and the "rtcp" attribute for RTCP). | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Setting the local candidate equal to the transport address for that same | Setting the local candidate equal to the transport address for that same | |||
| component in the "a=remote-candidates" attribute in the offer. | component in the "remote-candidates" attribute in the offer. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| The state of the checklist associated with that data stream is set to Completed. | The state of the checklist associated with that data stream is set to Completed. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Furthermore, if the agent believed it was controlling, but the offer contained | Furthermore, if the agent believed it was controlling, but the offer contained | |||
| the "a=remote-candidates" attribute, both agents believe they are controlling. | the "remote-candidates" attribute, both agents believe they are controlling. | |||
| In this case, both would have sent updated offers around the same time. | In this case, both would have sent updated offers around the same time. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| However, the signaling protocol carrying the offer/answer exchanges | However, the signaling protocol carrying the offer/answer exchanges | |||
| will have resolved this glare condition, so that one agent is always | will have resolved this glare condition, so that one agent is always | |||
| the 'winner' by having its offer received before its peer has sent | the 'winner' by having its offer received before its peer has sent | |||
| an offer. The winner takes the role of controlling, so that the | an offer. The winner takes the role of controlling, so that the | |||
| loser (the answerer under consideration in this section) MUST | loser (the answerer under consideration in this section) <bcp14>MUST</bcp14> | |||
| change its role to controlled. | change its role to controlled. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Consequently, if the agent was going to send an updated offer since, | Consequently, if the agent was controlling based on the rules | |||
| based on the rules in section 8.2 of <xref target="RFC8445"/>, it was controllin | in <xref target="RFC8445" sectionFormat="of" section="8.2" format="default"/> | |||
| g, | and was going to send an updated offer, it no longer needs to. | |||
| it no longer needs to. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| Besides the potential role change, change in the Valid list, and | Besides the potential role change, change in the valid list, and | |||
| state changes, the construction of the answer is performed identically | state changes, the construction of the answer is performed identically | |||
| to the construction of an offer. | to the construction of an offer. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Receiving Answer for a Subsequent Offer"> | <section numbered="true" toc="default"> | |||
| <section title="Procedures for Full Implementations"> | <name>Receiving Answer for a Subsequent Offer</name> | |||
| <section numbered="true" toc="default"> | ||||
| <name>Procedures for Full Implementations</name> | ||||
| <t> | <t> | |||
| There may be certain situations where the offerer receives | There may be certain situations where the offerer receives | |||
| an SDP answer that lacks ICE candidates although the initial answer | an SDP answer that lacks ICE candidates although the initial answer | |||
| included them. One example of such an "unexpected" answer might be | included them. One example of such an "unexpected" answer might | |||
| happen when an ICE-unaware Back-to-Back User Agent (B2BUA) | happen when an ICE-unaware Back-to-Back User Agent (B2BUA) | |||
| introduces a media server during call hold using 3rd party | introduces a media server during call hold using third party | |||
| call-control procedures <xref target="RFC3725"/>. Omitting further details how t | call control procedures <xref target="RFC3725" format="default"/>. | |||
| his | Omitting further details on how this is done, this could | |||
| is done, this could result in an answer being received at the holding | result in an answer that was constructed by the B2BUA | |||
| UA that was constructed by the B2BUA. With the B2BUA being | being received at the holding UA. With the B2BUA being | |||
| ICE-unaware, that answer would not include ICE candidates. | ICE-unaware, that answer would not include ICE candidates. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Receiving an answer without ICE attributes in this situation might be | Receiving an answer without ICE attributes in this situation might be | |||
| unexpected, but would not necessarily impair the user experience. | unexpected, but would not necessarily impair the user experience. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When the offerer receives an answer indicating support for ICE, the | When the offerer receives an answer indicating support for ICE, the | |||
| offer performs one of the following actions: | offer performs one of the following actions: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | If the offer was a restart, the agent <bcp14>MUST</bcp14> perform ICE restart | |||
| If the offer was a restart, the agent MUST perform ICE restart | procedures as specified in <xref target="sec-restart-subsequent" format="default | |||
| procedures as specified in <xref target="sec-restart-subsequent"/></t> | "/>.</li> | |||
| <t> | <li> | |||
| If the offer/answer exchange removed a data stream, or an | If the offer/answer exchange removed a data stream, or an | |||
| answer rejected an offered data stream, an agent MUST flush the | answer rejected an offered data stream, an agent <bcp14>MUST</bcp14> flush the | |||
| Valid list for that data stream. It MUST also terminate any | valid list for that data stream. It <bcp14>MUST</bcp14> also terminate any | |||
| STUN transactions in progress for that data stream. | STUN transactions in progress for that data stream. | |||
| </li> | ||||
| </t> | <li> | |||
| <t> | ||||
| If the offer/answer exchange added a new data stream, the agent | If the offer/answer exchange added a new data stream, the agent | |||
| MUST create a new checklist for it (and an empty Valid list to | <bcp14>MUST</bcp14> create a new checklist for it (and an empty valid list to | |||
| start of course) which in turn triggers the candidate | start of course), which in turn triggers the candidate | |||
| processing procedures <xref target="RFC8445"/>. | processing procedures <xref target="RFC8445" format="default"/>. | |||
| </li> | ||||
| </t> | <li> | |||
| <t> | ||||
| If the checklist state associated with a data stream is Running, the agent | If the checklist state associated with a data stream is Running, the agent | |||
| recomputes the checklist. If a pair on the new checklist was | recomputes the checklist. If a pair on the new checklist was | |||
| also on the previous checklist, its candidate pair state is copied over. | also on the previous checklist, its candidate pair state is copied over. | |||
| Otherwise, its candidate pair state is set to Frozen. If none of the checklist s | Otherwise, its candidate pair state is set to Frozen. If none of the checklist s | |||
| are active (meaning that the candidate pair states in each checklist | are active (meaning that the candidate pair states in each checklist | |||
| are Frozen), appropriate procedures in <xref target="RFC8445"/> | are Frozen), appropriate procedures in <xref target="RFC8445" format="default" /> | |||
| are performed to move candidate pair(s) to the Waiting state to | are performed to move candidate pair(s) to the Waiting state to | |||
| further continue ICE processing. | further continue ICE processing. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| If the ICE state is Completed and the SDP answer conforms to | If the ICE state is Completed, and the SDP answer conforms to | |||
| <xref target="sec-subsequent-answer"/>, the agent MUST remain in the | <xref target="sec-subsequent-answer" format="default"/>, the agent <bcp14>MUST</ | |||
| bcp14> remain in the | ||||
| Completed ICE state. | Completed ICE state. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| However, if the ICE support is no longer indicated in the SDP answer, | However, if the ICE support is no longer indicated in the SDP answer, | |||
| the agent MUST fall-back to <xref target="RFC3264"/> procedures and SHOULD NOT | the agent <bcp14>MUST</bcp14> fall back to <xref target="RFC3264" format="defaul | |||
| drop the dialog because of the missing ICE support or unexpected answer. | t"/> | |||
| Once the agent sends a new offer later on, it MUST perform an ICE restart. | procedures and <bcp14>SHOULD NOT</bcp14> drop the dialog because of the | |||
| missing ICE support or unexpected answer. | ||||
| When the agent sends a new offer, it <bcp14>MUST</bcp14> perform an ICE restart. | ||||
| </t> | </t> | |||
| <section anchor="sec-restart-subsequent" title="ICE Restarts"> | <section anchor="sec-restart-subsequent" numbered="true" toc="defaul | |||
| t"> | ||||
| <name>ICE Restarts</name> | ||||
| <t> | <t> | |||
| The agent MUST remember the nominated pair in the Valid list for each | The agent <bcp14>MUST</bcp14> remember the nominated pair in the valid list for each | |||
| component of the data stream, called the "previous selected pair", prior | component of the data stream, called the "previous selected pair", prior | |||
| to the restart. The agent will continue to send media using this pair, | to the restart. The agent will continue to send media using this pair, | |||
| as described in section 12 of <xref target="RFC8445"/>. Once these destinations | as described in <xref target="RFC8445" sectionFormat="of" section="12" format="d | |||
| are | efault"/>. Once these destinations are | |||
| noted, the agent MUST flush the Valid lists and checklists, and then recompute | noted, the agent <bcp14>MUST</bcp14> flush the valid lists and checklists, and t | |||
| hen recompute | ||||
| the checklist and its states, thus triggering the candidate processing | the checklist and its states, thus triggering the candidate processing | |||
| procedures <xref target="RFC8445"/></t> | procedures <xref target="RFC8445" format="default"/>.</t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Procedures for Lite Implementations"> | <section numbered="true" toc="default"> | |||
| <name>Procedures for Lite Implementations</name> | ||||
| <t> | <t> | |||
| If ICE is restarting for a data stream, the agent MUST create a new | If ICE is restarting for a data stream, the agent <bcp14>MUST</bcp14> create a n | |||
| Valid list for that data stream. It MUST remember the nominated pair in the | ew | |||
| previous Valid list for each component of the data stream, called | valid list for that data stream. It <bcp14>MUST</bcp14> remember the nominated p | |||
| air in the | ||||
| previous valid list for each component of the data stream, called | ||||
| the "previous selected pairs", and continue to send media there as | the "previous selected pairs", and continue to send media there as | |||
| described in section 12 of <xref target="RFC8445"/>. The state of each | described in <xref target="RFC8445" sectionFormat="of" section="12" format="defa | |||
| checklist for each data stream MUST change to Running, and the ICE state | ult"/>. The state of each | |||
| MUST be set to Running. | checklist for each data stream <bcp14>MUST</bcp14> change to Running, and the IC | |||
| E state | ||||
| <bcp14>MUST</bcp14> be set to Running. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-grammar" title="Grammar"> | <section anchor="sec-grammar" numbered="true" toc="default"> | |||
| <name>Grammar</name> | ||||
| <t> | <t> | |||
| This specification defines eight new SDP attributes — the "can didate", | This specification defines eight new SDP attributes -- the "candidate", | |||
| "remote-candidates", "ice-lite", "ice-mismatch", "ice-ufrag", "ice-pwd", "ice-pa cing", | "remote-candidates", "ice-lite", "ice-mismatch", "ice-ufrag", "ice-pwd", "ice-pa cing", | |||
| and "ice-options" attributes. | and "ice-options" attributes. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This section also provides non-normative examples of the attributes defined. | This section also provides non-normative examples of the attributes defined. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The syntax for the attributes follow Augmented BNF as defined in <xref target="R FC5234"/>. | The syntax for the attributes follow Augmented BNF as defined in <xref target="R FC5234" format="default"/>. | |||
| </t> | </t> | |||
| <section title=""candidate" Attribute"> | <section numbered="true" toc="default"> | |||
| <name>"candidate" Attribute</name> | ||||
| <t> | <t> | |||
| The candidate attribute is a media-level attribute only. | The "candidate" attribute is a media-level attribute only. | |||
| It contains a transport address for a candidate that can be used for connectivit y checks. | It contains a transport address for a candidate that can be used for connectivit y checks. | |||
| </t> | </t> | |||
| <figure> | <sourcecode name="" type="abnf"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| candidate-attribute = "candidate" ":" foundation SP component-id SP | candidate-attribute = "candidate" ":" foundation SP component-id SP | |||
| transport SP | transport SP | |||
| priority SP | priority SP | |||
| connection-address SP ;from RFC 4566 | connection-address SP ;from RFC 4566 | |||
| port ;port from RFC 4566 | port ;port from RFC 4566 | |||
| SP cand-type | SP cand-type | |||
| [SP rel-addr] | [SP rel-addr] | |||
| [SP rel-port] | [SP rel-port] | |||
| *(SP cand-extension) | *(SP cand-extension) | |||
| skipping to change at line 890 ¶ | skipping to change at line 974 ¶ | |||
| transport-extension = token ; from RFC 3261 | transport-extension = token ; from RFC 3261 | |||
| priority = 1*10DIGIT | priority = 1*10DIGIT | |||
| cand-type = "typ" SP candidate-types | cand-type = "typ" SP candidate-types | |||
| candidate-types = "host" / "srflx" / "prflx" / "relay" / token | candidate-types = "host" / "srflx" / "prflx" / "relay" / token | |||
| rel-addr = "raddr" SP connection-address | rel-addr = "raddr" SP connection-address | |||
| rel-port = "rport" SP port | rel-port = "rport" SP port | |||
| cand-extension = extension-att-name SP extension-att-value | cand-extension = extension-att-name SP extension-att-value | |||
| extension-att-name = token | extension-att-name = token | |||
| extension-att-value = *VCHAR | extension-att-value = *VCHAR | |||
| ice-char = ALPHA / DIGIT / "+" / "/" | ice-char = ALPHA / DIGIT / "+" / "/" | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| This grammar encodes the primary information about a candidate: its IP address, | This grammar encodes the primary information about a candidate: its IP address, | |||
| port and transport protocol, and its properties: the foundation, component ID, p riority, | port and transport protocol, and its properties: the foundation, component ID, p riority, | |||
| type, and related transport address: | type, and related transport address: | |||
| </t> | </t> | |||
| <t> | <dl newline="false" spacing="normal"> | |||
| <list style="hanging"> | <dt><connection-address>:</dt> | |||
| <t hangText="<connection-address>:"> | <dd> | |||
| is taken from RFC 4566 <xref target="RFC4566"/>. | is taken from RFC 4566 <xref target="RFC4566" format="default"/>. | |||
| It is the IP address of the candidate, allowing for | It is the IP address of the candidate, allowing for | |||
| IPv4 addresses, IPv6 addresses, and fully qualified domain names (FQDNs). | IPv4 addresses, IPv6 addresses, and fully qualified domain names (FQDNs). | |||
| When parsing this field, an agent can differentiate an IPv4 address | When parsing this field, an agent can differentiate an IPv4 address | |||
| and an IPv6 address by presence of a colon in its value - | and an IPv6 address by presence of a colon in its value - | |||
| the presence of a colon indicates IPv6. An agent generating | the presence of a colon indicates IPv6. An agent generating | |||
| local candidates MUST NOT use FQDN addresses. An agent processing remote | local candidates <bcp14>MUST NOT</bcp14> use FQDN addresses. An agent processing | |||
| candidates MUST ignore candidate lines that include candidates with | remote | |||
| FQDN or IP address versions that are not supported or recognized. | candidates <bcp14>MUST</bcp14> ignore "candidate" lines that include candidates | |||
| with | ||||
| FQDNs or IP address versions that are not supported or recognized. | ||||
| The procedures for generation and handling of FQDN candidates, as well as, | The procedures for generation and handling of FQDN candidates, as well as, | |||
| how agents indicate support for such procedures, need to be specified in an | how agents indicate support for such procedures, need to be specified in an | |||
| extension specification. | extension specification. | |||
| </t> | </dd> | |||
| <t hangText="<port>:"> | <dt><port>:</dt> | |||
| is also taken from RFC 4566 <xref target="RFC4566"/>. | <dd> | |||
| is also taken from RFC 4566 <xref target="RFC4566" format="default"/>. | ||||
| It is the port of the candidate. | It is the port of the candidate. | |||
| </t> | </dd> | |||
| <t hangText="<transport>:"> | <dt><transport>:</dt> | |||
| <dd> | ||||
| indicates the transport protocol for the candidate. | indicates the transport protocol for the candidate. | |||
| This specification only defines UDP. However, extensibility is provided to allow for | This specification only defines UDP. However, extensibility is provided to allow for | |||
| future transport protocols to be used with ICE by extending the sub-registry | future transport protocols to be used with ICE by extending the subregistry | |||
| "ICE Transport Protocols" under "Interactive Connectivity Establishment (ICE)" r | "ICE Transport Protocols" under the "Interactive Connectivity Establishment (ICE | |||
| egistry. | )" registry. | |||
| </t> | </dd> | |||
| <t hangText="<foundation>:"> | <dt><foundation>:</dt> | |||
| <dd> | ||||
| is composed of 1 to 32 <ice-char>s. | is composed of 1 to 32 <ice-char>s. | |||
| It is an identifier that is equivalent for two candidates that are of the same t ype, | It is an identifier that is equivalent for two candidates that are of the same t ype, | |||
| share the same base, and come from the same STUN server. | share the same base, and come from the same STUN server. | |||
| The foundation is used to optimize ICE performance in the Frozen algorithm as | The foundation is used to optimize ICE performance in the Frozen algorithm as | |||
| described in <xref target="RFC8445"/></t> | described in <xref target="RFC8445" format="default"/>.</dd> | |||
| <t hangText="<component-id>:"> | <dt><component-id>:</dt> | |||
| <dd> | ||||
| is a positive integer between 1 and 256 (inclusive) that | is a positive integer between 1 and 256 (inclusive) that | |||
| identifies the specific component of the data stream for which this is a candida te. | identifies the specific component of the data stream for which this is a candida te. | |||
| It MUST start at 1 and MUST increment by 1 for each component of a particular ca | It <bcp14>MUST</bcp14> start at 1 and <bcp14>MUST</bcp14> increment by 1 for eac | |||
| ndidate. | h component of a particular candidate. | |||
| For data streams based on RTP, candidates for the actual RTP media MUST have a c | For data streams based on RTP, candidates for the actual RTP media <bcp14>MUST</ | |||
| omponent | bcp14> have a component | |||
| ID of 1, and candidates for RTCP MUST have a component ID of 2. | ID of 1, and candidates for RTCP <bcp14>MUST</bcp14> have a component ID of 2. | |||
| See section 13 in <xref target="RFC8445"/> for additional discussion on extendin | See <xref target="RFC8445" sectionFormat="of" section="13" format="default"/> fo | |||
| g ICE to new data streams. | r additional discussion on extending ICE to new data streams. | |||
| </t> | </dd> | |||
| <t hangText="<priority>:"> | <dt><priority>:</dt> | |||
| <dd> | ||||
| is a positive integer between 1 and (2**31 - 1) inclusive. The procedures | is a positive integer between 1 and (2**31 - 1) inclusive. The procedures | |||
| for computing candidate’s priority is described in section 5.1.2 of <xref | for computing a candidate's priority are described in <xref target="RFC8445" sec | |||
| target="RFC8445"/>. | tionFormat="of" section="5.1.2" format="default"/>. | |||
| </t> | </dd> | |||
| <t hangText="<cand-type>:"> | <dt><cand-type>:</dt> | |||
| <dd> | ||||
| encodes the type of candidate. | encodes the type of candidate. | |||
| This specification defines the values "host", "srflx", "prflx", and "relay" for host, | This specification defines the values "host", "srflx", "prflx", and "relay" for host, | |||
| server reflexive, peer reflexive, and relayed candidates, respectively. | server-reflexive, peer-reflexive, and relayed candidates, respectively. | |||
| Specifications for new candidate types MUST define how, if at all, various steps | Specifications for new candidate types <bcp14>MUST</bcp14> define how, if at all | |||
| in the ICE | , various steps in the ICE | |||
| processing differ from the ones defined by this specification. | processing differ from the ones defined by this specification. | |||
| </t> | </dd> | |||
| <t hangText="<rel-addr> and <rel-port>:"> | <dt><rel-addr> and <rel-port>:</dt> | |||
| convey transport addresses related to the candidate, | ||||
| useful for diagnostics and other purposes. | <dd> | |||
| <rel-addr> and <rel-port> MUST be present for server reflexive, peer | convey transport addresses related to the candidate, useful for diagnostics | |||
| reflexive, | and other purposes. <rel-addr> and <rel-port> <bcp14>MUST</bcp14> be | |||
| and relayed candidates. If a candidate is server or peer reflexive, <rel-addr | present for | |||
| > and | server-reflexive, peer-reflexive, and relayed candidates. | |||
| <rel-port> are equal to the base for that server or peer reflexive candida | If a candidate is server-reflexive or peer-reflexive, <rel-addr> and <r | |||
| te. If the | el-port> | |||
| candidate is relayed, <rel-addr> and <rel-port> are equal to the map | are equal to the base for that server-reflexive or peer-reflexive candidate. | |||
| ped address in the | If the candidate is relayed, <rel-addr> and <rel-port> are equal to | |||
| Allocate response that provided the client with that relayed candidate (see | the mapped address in the Allocate response that provided the client with | |||
| Appendix B.3 of <xref target="RFC8445"/> for a discussion of its purpose). | that relayed candidate (see <xref target="RFC5766" section="6.3" sectionFormat=" | |||
| of" format="default"/>). | ||||
| If the candidate is a host candidate, <rel-addr> and <rel-port> MUST be omitted. | If the candidate is a host candidate, <rel-addr> and <rel-port> MUST be omitted. | |||
| </t> | </dd> | |||
| <t hangText=""> | <dt></dt> | |||
| <dd> | ||||
| In some cases, e.g., for privacy reasons, an agent may not want to reveal the re lated | In some cases, e.g., for privacy reasons, an agent may not want to reveal the re lated | |||
| address and port. In this case the address MUST be set to "0.0.0.0" (for IPv4 ca | address and port. In this case the address <bcp14>MUST</bcp14> be set to "0.0.0. | |||
| ndidates) | 0" (for IPv4 candidates) | |||
| or "::" (for IPv6 candidates) and the port to '9'. | or "::" (for IPv6 candidates) and the port to "9". | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| <t> | <t> | |||
| The candidate attribute can itself be extended. The grammar allows for new name/ | The "candidate" attribute can itself be extended. The grammar allows for new nam | |||
| value pairs | e/value pairs | |||
| to be added at the end of the attribute. Such extensions MUST be made through IE | to be added at the end of the attribute. Such extensions <bcp14>MUST</bcp14> be | |||
| TF Review or | made through IETF Review or | |||
| IESG Approval <xref target="RFC8126"/> and the assignments MUST contain the spec | IESG Approval <xref target="RFC8126" format="default"/>, and the assignments <bc | |||
| ific extension and a | p14>MUST</bcp14> contain the specific extension and a | |||
| reference to the document defining the usage of the extension. | reference to the document defining the usage of the extension. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| An implementation MUST ignore any name/value pairs it doesn’t understand. | An implementation <bcp14>MUST</bcp14> ignore any name/value pairs it doesn't und erstand. | |||
| </t> | </t> | |||
| <figure> | <t> | |||
| <artwork><![CDATA[ | The following is an example SDP line for a UDP server-reflexive "candidate" attr | |||
| Example: SDP line for UDP server reflexive candidate attribute for | ibute for | |||
| the RTP component | the RTP component: | |||
| </t> | ||||
| <sourcecode name="" type="sdp"><![CDATA[ | ||||
| a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr | a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr | |||
| 203.0.113.141 rport 8998 | 203.0.113.141 rport 8998 | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section title=""remote-candidates" Attribute"> | <section numbered="true" toc="default"> | |||
| <name>"remote-candidates" Attribute</name> | ||||
| <t> | <t> | |||
| The syntax of the "remote-candidates" attribute is defined using Augmented BNF | The syntax of the "remote-candidates" attribute is defined using Augmented BNF | |||
| as defined in <xref target="RFC5234"/>. | as defined in <xref target="RFC5234" format="default"/>. | |||
| The remote-candidates attribute is a media-level attribute only. | The "remote-candidates" attribute is a media-level attribute only. | |||
| </t> | </t> | |||
| <figure> | ||||
| <artwork><![CDATA[ | <sourcecode type="abnf"><![CDATA[ | |||
| remote-candidate-att = "remote-candidates:" remote-candidate | remote-candidate-att = "remote-candidates:" remote-candidate | |||
| 0*(SP remote-candidate) | 0*(SP remote-candidate) | |||
| remote-candidate = component-ID SP connection-address SP port | remote-candidate = component-id SP connection-address SP port | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| The attribute contains a connection-address and port for each component. The ord ering | The attribute contains a connection-address and port for each component. The ord ering | |||
| of components is irrelevant. However, a value MUST be present for each component | of components is irrelevant. However, a value <bcp14>MUST</bcp14> be present for | |||
| of a | each component of a | |||
| data stream. This attribute MUST be included in an offer by a controlling agent | data stream. This attribute <bcp14>MUST</bcp14> be included in an offer by a con | |||
| for | trolling agent for | |||
| a data stream that is Completed, and MUST NOT be included in any other case. | a data stream that is Completed, and <bcp14>MUST NOT</bcp14> be included in any | |||
| other case. | ||||
| </t> | </t> | |||
| <figure> | <t> | |||
| <artwork><![CDATA[ | The following is an example of "remote-candidates" SDP lines for the RTP and RTC | |||
| Example: Remote candidates SDP lines for the RTP and RTCP components: | P components: | |||
| </t> | ||||
| <sourcecode name="" type="sdp"><![CDATA[ | ||||
| a=remote-candidates:1 192.0.2.3 45664 | a=remote-candidates:1 192.0.2.3 45664 | |||
| a=remote-candidates:2 192.0.2.3 45665 | a=remote-candidates:2 192.0.2.3 45665 | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section title=""ice-lite" and "ice-mismatch" Attribut | <section numbered="true" toc="default"> | |||
| es"> | <name>"ice-lite" and "ice-mismatch" Attributes</name> | |||
| <t> | <t> | |||
| The syntax of the "ice-lite" and "ice-mismatch" attributes, both of which are fl ags, is: | The syntax of the "ice-lite" and "ice-mismatch" attributes, both of which are fl ags, is: | |||
| </t> | </t> | |||
| <figure> | <sourcecode type="abnf"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| ice-lite = "ice-lite" | ice-lite = "ice-lite" | |||
| ice-mismatch = "ice-mismatch" | ice-mismatch = "ice-mismatch" | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| "ice-lite" is a session-level attribute only, and indicates that an agent is a | "ice-lite" is a session-level attribute only, and indicates that an agent is a | |||
| lite implementation. "ice-mismatch" is a media-level attribute and only | lite implementation. "ice-mismatch" is a media-level attribute and only | |||
| reported in the answer. It indicates that the offer arrived with a default | reported in the answer. It indicates that the offer arrived with a default | |||
| destination for a media component that didn’t have a corresponding candida | destination for a media component that didn't have a corresponding "candidate" | |||
| te | attribute. Inclusion of "ice-mismatch" attribute for a given data stream implies | |||
| attribute. Inclusion of "a=ice-mismatch" attribute for a given data stream impli | that even though both agents support ICE, ICE procedures <bcp14>MUST NOT</bcp14> | |||
| es | be used for this data | |||
| that even though both agents support ICE, ICE procedures MUST NOT be used for th | stream, and <xref target="RFC3264" format="default"/> procedures <bcp14>MUST</bc | |||
| is data | p14> be used instead. | |||
| stream and <xref target="RFC3264"/> procedures MUST be used instead. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title=""ice-ufrag" and "ice-pwd" Attributes"> | <section numbered="true" toc="default"> | |||
| <name>"ice-ufrag" and "ice-pwd" Attributes</name> | ||||
| <t> | <t> | |||
| The "ice-ufrag" and "ice-pwd" attributes convey the username fragment and passwo rd used by ICE for message integrity. | The "ice-ufrag" and "ice-pwd" attributes convey the username fragment and passwo rd used by ICE for message integrity. | |||
| Their syntax is: | Their syntax is: | |||
| </t> | </t> | |||
| <figure> | <sourcecode type="abnf"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| ice-pwd-att = "ice-pwd:" password | ice-pwd-att = "ice-pwd:" password | |||
| ice-ufrag-att = "ice-ufrag:" ufrag | ice-ufrag-att = "ice-ufrag:" ufrag | |||
| password = 22*256ice-char | password = 22*256ice-char | |||
| ufrag = 4*256ice-char | ufrag = 4*256ice-char | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| The "ice-pwd" and "ice-ufrag" attributes can appear at either the session-level | The "ice-pwd" and "ice-ufrag" attributes can appear at either the session-level | |||
| or media-level. When present in both, the value in the media-level takes precede nce. | or media-level. When present in both, the value in the media-level takes precede nce. | |||
| Thus, the value at the session-level is effectively a default that applies to al l | Thus, the value at the session-level is effectively a default that applies to al l | |||
| data streams, unless overridden by a media-level value. Whether present at the s ession | data streams, unless overridden by a media-level value. Whether present at the s ession | |||
| or media-level, there MUST be an ice-pwd and ice-ufrag attribute for each data s | or media-level, there <bcp14>MUST</bcp14> be an "ice-pwd" and "ice-ufrag" attrib | |||
| tream. | ute for each data stream. | |||
| If two data streams have identical ice-ufrag’s, they MUST have identical i | If two data streams have identical "ice-ufrag"s, they <bcp14>MUST</bcp14> have i | |||
| ce-pwd’s. | dentical "ice-pwd"s. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The ice-ufrag and ice-pwd attributes MUST be chosen randomly at the beginning of | The "ice-ufrag" and "ice-pwd" attributes <bcp14>MUST</bcp14> be chosen randomly at the beginning of | |||
| a session (the same applies when ICE is restarting for an agent). | a session (the same applies when ICE is restarting for an agent). | |||
| </t> | </t> | |||
| <t><xref target="RFC8445"/> requires the ice-ufrag attribute to contain | <t><xref target="RFC8445" format="default"/> requires the "ice-ufrag" at | |||
| at least 24 bits of | tribute to contain at least 24 bits of | |||
| randomness, and the ice-pwd attribute to contain at least 128 bits of | randomness, and the "ice-pwd" attribute to contain at least 128 bits of | |||
| randomness. This means that the ice-ufrag | randomness. This means that the "ice-ufrag" | |||
| attribute will be at least 4 characters long, and the ice-pwd at least 22 charac | attribute will be at least 4 characters long, and the "ice-pwd" at least 22 char | |||
| ters long, | acters long, | |||
| since the grammar for these attributes allows for 6 bits of information per char acter. | since the grammar for these attributes allows for 6 bits of information per char acter. | |||
| The attributes MAY be longer than 4 and 22 characters, respectively, of course, up to | The attributes <bcp14>MAY</bcp14> be longer than 4 and 22 characters, respective ly, of course, up to | |||
| 256 characters. The upper limit allows for buffer sizing in implementations. | 256 characters. The upper limit allows for buffer sizing in implementations. | |||
| Its large upper limit allows for increased amounts of randomness to be added ove r time. | Its large upper limit allows for increased amounts of randomness to be added ove r time. | |||
| For compatibility with the 512 character limitation for the STUN username attrib | For compatibility with the 512-character limitation for the STUN username attrib | |||
| ute value | ute value | |||
| and for bandwidth conservation considerations, the ice-ufrag attribute MUST NOT | and for bandwidth conservation considerations, the "ice-ufrag" attribute <bcp14> | |||
| be longer | MUST NOT</bcp14> be longer | |||
| than 32 characters when sending, but an implementation MUST accept up to 256 ch | than 32 characters when sending, but an implementation <bcp14>MUST</bcp14> acce | |||
| aracters | pt up to 256 characters | |||
| when receiving. | when receiving. | |||
| </t> | </t> | |||
| <figure> | <t> | |||
| <artwork><![CDATA[ | The following example shows sample "ice-ufrag" and "ice-pwd" SDP lines: | |||
| Example shows sample ice-ufrag and ice-pwd SDP lines: | </t> | |||
| <sourcecode name="" type="sdp"><![CDATA[ | ||||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | a=ice-pwd:asd88fgpdd777uzjYhagZg | |||
| a=ice-ufrag:8hhY | a=ice-ufrag:8hhY | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section title=""ice-pacing" Attribute"> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>"ice-pacing" Attribute</name> | ||||
| <t> | <t> | |||
| The "ice-pacing" is a session level attribute that indicates the desired connect | The "ice-pacing" is a session-level attribute that indicates the desired connect | |||
| ivity | ivity-check pacing (Ta interval), in milliseconds, that the sender wishes to use | |||
| check pacing (Ta interval), in milliseconds, that the sender wishes to use. See | . See | |||
| section 14.2 | <xref target="RFC8445" sectionFormat="of" section="14.2" format="default"/> for | |||
| of <xref target="RFC8445"/> for more information regarding selecting a pacing va | more information regarding selecting a pacing value. | |||
| lue. | ||||
| The syntax is: | The syntax is: | |||
| </t> | </t> | |||
| <figure> | <sourcecode type="abnf"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| ice-pacing-att = "ice-pacing:" pacing-value | ice-pacing-att = "ice-pacing:" pacing-value | |||
| pacing-value = 1*10DIGIT | pacing-value = 1*10DIGIT | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| If absent in an offer or answer the default value of the attribute is 50 ms, | If absent in an offer or answer, the default value of the attribute is 50 ms, | |||
| which is the recommended value specified in <xref target="RFC8445"/>. | which is the recommended value specified in <xref target="RFC8445" format="defau | |||
| lt"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| As defined in <xref target="RFC8445" format="default"/>, regardless of the Ta va | ||||
| lue | ||||
| chosen for each agent, the combination of all transactions from all agents (if a | ||||
| given | ||||
| implementation runs several concurrent agents) will not be sent more often than | ||||
| once every 5 ms. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| Once both agents have indicated the pacing value they with to use, both | As defined in <xref target="RFC8445" format="default"/>, once both agents have | |||
| agents MUST use the larger of the indicated values. | indicated the pacing value they want to use, both agents will use the larger of | |||
| the | ||||
| indicated values. | ||||
| </t> | </t> | |||
| <figure> | <t> | |||
| <artwork><![CDATA[ | The following example shows an "ice-pacing" SDP line with value '50': | |||
| Example shows an ice-pacing SDP line with value '50': | </t> | |||
| <sourcecode name="" type="sdp"><![CDATA[ | ||||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="sec-ice-options" title=""ice-options" Attribute | <section anchor="sec-ice-options" numbered="true" toc="default"> | |||
| "> | <name>"ice-options" Attribute</name> | |||
| <t> | <t> | |||
| The "ice-options" attribute is a session- and media-level attribute. | The "ice-options" attribute is a session-level and media-level attribute. | |||
| It contains a series of tokens that identify the options supported by the agent. | It contains a series of tokens that identify the options supported by the agent. | |||
| Its grammar is: | Its grammar is: | |||
| </t> | </t> | |||
| <figure> | <sourcecode type="abnf"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| ice-options = "ice-options:" ice-option-tag | ice-options = "ice-options:" ice-option-tag | |||
| *(SP ice-option-tag) | *(SP ice-option-tag) | |||
| ice-option-tag = 1*ice-char | ice-option-tag = 1*ice-char | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| The existence of an ice-option in an offer indicates that a certain extension | The existence of an "ice-options" in an offer indicates that a certain extension | |||
| is supported by the agent and it is willing to use it, if the peer agent also in | is supported by the agent, and it is willing to use it if the peer agent also in | |||
| cludes | cludes | |||
| the same extension in the answer. There might be further extension specific | the same extension in the answer. There might be further extension-specific | |||
| negotiation needed between the agents that determine how the extension gets used | negotiation needed between the agents that determine how the extension gets used | |||
| in a given session. The details of the negotiation procedures, if present, MUST | in a given session. The details of the negotiation procedures, if present, <bcp1 | |||
| be | 4>MUST</bcp14> be | |||
| defined by the specification defining the extension (<xref target="sec-iana-ice- | defined by the specification defining the extension (<xref target="sec-iana-ice- | |||
| options"/>). | options" format="default"/>). | |||
| </t> | </t> | |||
| <figure> | <t>The following example shows an "ice-options" SDP line with 'ice2' and | |||
| <artwork><![CDATA[ | 'rtp+ecn' <xref target="RFC6679" format="default"/> values.</t> | |||
| Example shows an ice-options SDP line with 'ice2' and 'rtp+ecn' [RFC6679] values | <sourcecode name="" type="sdp"><![CDATA[ | |||
| : | ||||
| a=ice-options:ice2 rtp+ecn | a=ice-options:ice2 rtp+ecn | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-keepalive" title="Keepalives"> | <section anchor="sec-keepalive" numbered="true" toc="default"> | |||
| <name>Keepalives</name> | ||||
| <t> | <t> | |||
| All the ICE agents MUST follow the procedures defined in section 11 of <xref tar | All the ICE agents <bcp14>MUST</bcp14> follow the procedures defined in | |||
| get="RFC8445"/> | <xref target="RFC8445" sectionFormat="of" section="11" format="default"/> | |||
| for sending keepalives. The keepalives MUST be sent regardless of whether the | for sending keepalives. As defined in <xref target="RFC8445" format="default"/> | |||
| data stream is currently inactive, sendonly, recvonly, or sendrecv, and regardle | , | |||
| ss | the keepalives will be sent regardless of whether the data stream is currently | |||
| inactive, sendonly, recvonly, or sendrecv, and regardless | ||||
| of the presence or value of the bandwidth attribute. An agent can determine that its | of the presence or value of the bandwidth attribute. An agent can determine that its | |||
| peer supports ICE by the presence of "a=candidate" attributes for each media ses sion. | peer supports ICE by the presence of "candidate" attributes for each media sessi on. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="SIP Considerations"> | <section numbered="true" toc="default"> | |||
| <name>SIP Considerations</name> | ||||
| <t> | <t> | |||
| Note that ICE is not intended for NAT traversal for SIP signaling, which is assu med to be | Note that ICE is not intended for NAT traversal for SIP signaling, which is assu med to be | |||
| provided via another mechanism <xref target="RFC5626"/>. | provided via another mechanism <xref target="RFC5626" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When ICE is used with SIP, forking may result in a single offer generating a | When ICE is used with SIP, forking may result in a single offer generating a | |||
| multiplicity of answers. In that case, ICE proceeds completely in parallel and | multiplicity of answers. In that case, ICE proceeds completely in parallel and | |||
| independently for each answer, treating the combination of its offer and | independently for each answer, treating the combination of its offer and | |||
| each answer as an independent offer/answer exchange, with its own set of local | each answer as an independent offer/answer exchange, with its own set of local | |||
| candidates, pairs, checklists, states, and so on. | candidates, pairs, checklists, states, and so on. | |||
| </t> | </t> | |||
| <section anchor="sec-latency" title="Latency Guidelines"> | <section anchor="sec-latency" numbered="true" toc="default"> | |||
| <name>Latency Guidelines</name> | ||||
| <t> | <t> | |||
| ICE requires a series of STUN-based connectivity checks to take place between | ICE requires a series of STUN-based connectivity checks to take place between | |||
| endpoints. These checks start from the answerer on generation of its answer, | endpoints. These checks start from the answerer on generation of its answer, | |||
| and start from the offerer when it receives the answer. | and start from the offerer when it receives the answer. | |||
| These checks can take time to complete, and as such, the selection of | These checks can take time to complete, and as such, the selection of | |||
| messages to use with offers and answers can affect perceived user latency. | messages to use with offers and answers can affect perceived user latency. | |||
| Two latency figures are of particular interest. These are the post-pickup delay | Two latency figures are of particular interest. These are the post-pickup delay | |||
| and the post-dial delay. The post-pickup delay refers to the time between when | and the post-dial delay. The post-pickup delay refers to the time between when | |||
| a user "answers the phone" and when any speech they utter can be delivered to | a user "answers the phone" and when any speech they utter can be delivered to | |||
| the caller. The post-dial delay refers to the time between when a user enters | the caller. The post-dial delay refers to the time between when a user enters | |||
| the destination address for the user and ringback begins as a consequence of | the destination address for the user and ringback begins as a consequence of | |||
| having successfully started alerting the called user agent. | having successfully started alerting the called user agent. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Two cases can be considered — one where the offer is present i n the initial | Two cases can be considered -- one where the offer is present in the initial | |||
| INVITE and one where it is in a response. | INVITE and one where it is in a response. | |||
| </t> | </t> | |||
| <section title="Offer in INVITE"> | <section numbered="true" toc="default"> | |||
| <name>Offer in INVITE</name> | ||||
| <t> | <t> | |||
| To reduce post-dial delays, it is RECOMMENDED that the caller begin gathering | To reduce post-dial delays, it is <bcp14>RECOMMENDED</bcp14> that the caller beg in gathering | |||
| candidates prior to actually sending its initial INVITE, so that the candidates | candidates prior to actually sending its initial INVITE, so that the candidates | |||
| can be provided in the INVITE. This can be started upon | can be provided in the INVITE. This can be started upon | |||
| user interface cues that a call is pending, such as activity on a keypad or | user interface cues that a call is pending, such as activity on a keypad or | |||
| the phone going off-hook. | the phone going off-hook. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| On the receipt of the offer, the answerer SHOULD generate an answer in a | On the receipt of the offer, the answerer <bcp14>SHOULD</bcp14> generate an answ er in a | |||
| provisional response as soon as it has completed gathering | provisional response as soon as it has completed gathering | |||
| the candidates. ICE requires that a provisional response with an SDP be | the candidates. ICE requires that a provisional response with an SDP be | |||
| transmitted reliably. This can be done through the existing | transmitted reliably. This can be done through the existing | |||
| Provisional Response Acknowledgment (PRACK) | Provisional Response Acknowledgment (PRACK) | |||
| mechanism <xref target="RFC3262"/> or through an ICE specific optimization, wher ein, | mechanism <xref target="RFC3262" format="default"/> or through an ICE-specific o ptimization, wherein, | |||
| the agent retransmits the provisional response with the exponential backoff | the agent retransmits the provisional response with the exponential backoff | |||
| timers described in <xref target="RFC3262"/>. Such retransmissions MUST cease on receipt | timers described in <xref target="RFC3262" format="default"/>. Such retransmissi ons <bcp14>MUST</bcp14> cease on receipt | |||
| of a STUN Binding request with the transport address matching the candidate addr ess | of a STUN Binding request with the transport address matching the candidate addr ess | |||
| for one of the data streams signaled in that SDP or on transmission of the answe r | for one of the data streams signaled in that SDP or on transmission of the answe r | |||
| in a 2xx response. If no Binding request is received prior to the last retransmi t, | in a 2xx response. If no Binding request is received prior to the last retransmi t, | |||
| the agent does not consider the session terminated. For the ICE lite peers, the | the agent does not consider the session terminated. For the ICE-lite peers, the | |||
| agent MUST cease retransmitting the 18x after | agent <bcp14>MUST</bcp14> cease retransmitting the 18x response after | |||
| sending it four times since there will be no Binding request sent and | sending it four times since there will be no Binding request sent, and | |||
| the number four is arbitrarily chosen to limit the number of 18x retransmits. | the number four is arbitrarily chosen to limit the number of 18x retransmits. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Once the answer has been sent, the agent SHOULD begin its connectivity checks. | Once the answer has been sent, the agent <bcp14>SHOULD</bcp14> begin its connect ivity checks. | |||
| Once candidate pairs for each component of a data stream enter the valid list, | Once candidate pairs for each component of a data stream enter the valid list, | |||
| the answerer can begin sending media on that data stream. | the answerer can begin sending media on that data stream. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| However, prior to this point, any media that needs to be sent towards the | However, prior to this point, any media that needs to be sent towards the | |||
| caller (such as SIP early media <xref target="RFC3960"/>) MUST NOT be transmitte | caller (such as SIP early media <xref target="RFC3960" format="default"/>) <bcp1 | |||
| d. For this | 4>MUST NOT</bcp14> be transmitted. For this | |||
| reason, implementations SHOULD delay alerting the called party until candidates | reason, implementations <bcp14>SHOULD</bcp14> delay alerting the called party un | |||
| til candidates | ||||
| for each component of each data stream have entered the valid list. | for each component of each data stream have entered the valid list. | |||
| In the case of a PSTN gateway, this would mean that the setup message into the | In the case of a PSTN gateway, this would mean that the setup message into the | |||
| PSTN is delayed until this point. Doing this increases the post-dial delay, but | PSTN is delayed until this point. Doing this increases the post-dial delay, but | |||
| has the effect of eliminating 'ghost rings'. | has the effect of eliminating 'ghost rings'. | |||
| Ghost rings are cases where the called party hears the phone ring, picks up, but | Ghost rings are cases where the called party hears the phone ring, picks up, but | |||
| hears nothing and cannot be heard. This technique works without requiring suppor t | hears nothing and cannot be heard. This technique works without requiring suppor t | |||
| for, or usage of, preconditions <xref target="RFC3312"/>. It also has the benefi t of guaranteeing | for, or usage of, preconditions <xref target="RFC3312" format="default"/>. It al so has the benefit of guaranteeing | |||
| that not a single packet of media will get clipped, so that post-pickup delay is zero. | that not a single packet of media will get clipped, so that post-pickup delay is zero. | |||
| If an agent chooses to delay local alerting in this way, it SHOULD generate a 18 0 | If an agent chooses to delay local alerting in this way, it <bcp14>SHOULD</bcp14 > generate a 180 | |||
| response once alerting begins. | response once alerting begins. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Offer in Response"> | <section numbered="true" toc="default"> | |||
| <name>Offer in Response</name> | ||||
| <t> | <t> | |||
| In addition to uses where the offer is in an INVITE, and the answer is in the | In addition to uses where the offer is in an INVITE, and the answer is in the | |||
| provisional and/or 200 OK response, ICE works with cases where the offer appears | provisional and/or 200 OK response, ICE works with cases where the offer appears | |||
| in the response. | in the response. | |||
| In such cases, which are common in third party call control <xref target="RFC372 | In such cases, which are common in third party call control <xref target="RFC372 | |||
| 5"/>, ICE | 5" format="default"/>, ICE | |||
| agents SHOULD generate their offers in a reliable provisional response | agents <bcp14>SHOULD</bcp14> generate their offers in a reliable provisional res | |||
| (which MUST utilize <xref target="RFC3262"/>), and not alert the user on receipt | ponse | |||
| of the INVITE. | (which <bcp14>MUST</bcp14> utilize <xref target="RFC3262" format="default"/>), a | |||
| nd not alert the user on receipt of the INVITE. | ||||
| The answer will arrive in a PRACK. | The answer will arrive in a PRACK. | |||
| This allows for ICE processing to take place prior to alerting, so that there is no | This allows for ICE processing to take place prior to alerting, so that there is no | |||
| post-pickup delay, at the expense of increased call setup delays. | post-pickup delay, at the expense of increased call setup delays. | |||
| Once ICE completes, the callee can alert the user and then generate a 200 OK | Once ICE completes, the callee can alert the user and then generate a 200 OK | |||
| when they answer. | when they answer. | |||
| The 200 OK would contain no SDP, since the offer/answer exchange has completed. | The 200 OK would contain no SDP, since the offer/answer exchange has completed. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Alternatively, agents MAY place the offer in a 2xx instead (in which case the | Alternatively, agents <bcp14>MAY</bcp14> place the offer in a 2xx instead (in wh ich case the | |||
| answer comes in the ACK). | answer comes in the ACK). | |||
| When this happens, the callee will alert the user on receipt of the INVITE, | When this happens, the callee will alert the user on receipt of the INVITE, | |||
| and the ICE exchanges will take place only after the user answers. | and the ICE exchanges will take place only after the user answers. | |||
| This has the effect of reducing call setup delay, but can cause substantial | This has the effect of reducing call-setup delay, but can cause substantial | |||
| post-pickup delays and media clipping. | post-pickup delays and media clipping. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="SIP Option Tags and Media Feature Tags"> | <section numbered="true" toc="default"> | |||
| <t><xref target="RFC5768"/> specifies a SIP option tag and media feature | <name>SIP Option Tags and Media Feature Tags</name> | |||
| tag for usage with ICE. | <t><xref target="RFC5768" format="default"/> specifies a SIP option tag | |||
| ICE implementations using SIP SHOULD support this specification, which uses a | and media feature tag for usage with ICE. | |||
| ICE implementations using SIP <bcp14>SHOULD</bcp14> support this specification, | ||||
| which uses a | ||||
| feature tag in registrations to facilitate interoperability through signaling | feature tag in registrations to facilitate interoperability through signaling | |||
| intermediaries. | intermediaries. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Interactions with Forking"> | <section numbered="true" toc="default"> | |||
| <name>Interactions with Forking</name> | ||||
| <t> | <t> | |||
| ICE interacts very well with forking. | ICE interacts very well with forking. | |||
| Indeed, ICE fixes some of the problems associated with forking. | Indeed, ICE fixes some of the problems associated with forking. | |||
| Without ICE, when a call forks and the caller receives multiple incoming | Without ICE, when a call forks and the caller receives multiple incoming | |||
| data streams, it cannot determine which data stream corresponds to | data streams, it cannot determine which data stream corresponds to | |||
| which callee. | which callee. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| With ICE, this problem is resolved. | With ICE, this problem is resolved. | |||
| The connectivity checks which occur prior to transmission of media carry | The connectivity checks which occur prior to transmission of media carry | |||
| username fragments, which in turn are correlated to a specific callee. | username fragments which in turn are correlated to a specific callee. | |||
| Subsequent media packets that arrive on the same candidate pair as the | Subsequent media packets that arrive on the same candidate pair as the | |||
| connectivity check will be associated with that same callee. | connectivity check will be associated with that same callee. | |||
| Thus, the caller can perform this correlation as long as it has received an answ er. | Thus, the caller can perform this correlation as long as it has received an answ er. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Interactions with Preconditions"> | <section numbered="true" toc="default"> | |||
| <name>Interactions with Preconditions</name> | ||||
| <t> | <t> | |||
| Quality of Service (QoS) preconditions, which are defined in <xref target="RFC33 | Quality of Service (QoS) preconditions, which are defined in <xref target="RFC33 | |||
| 12"/> | 12" format="default"/> | |||
| and <xref target="RFC4032"/>, apply only to the transport addresses listed as th | and <xref target="RFC4032" format="default"/>, apply only to the transport addre | |||
| e default | sses listed as the default | |||
| targets for media in an offer/answer. | targets for media in an offer/answer. | |||
| If ICE changes the transport address where media is received, this change | If ICE changes the transport address where media is received, this change | |||
| is reflected in an updated offer that changes the default destination for | is reflected in an updated offer that changes the default destination for | |||
| media to match ICE’s selection. As such, it appears like any other re-INVI TE would, | media to match ICE's selection. As such, it appears like any other re-INVITE wou ld, | |||
| and is fully treated in RFCs 3312 and 4032, which apply without regard to the fa ct | and is fully treated in RFCs 3312 and 4032, which apply without regard to the fa ct | |||
| that the destination for media is changing due to ICE negotiations occurring | that the destination for media is changing due to ICE negotiations occurring | |||
| "in the background". | "in the background". | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Indeed, an agent SHOULD NOT indicate that QoS preconditions have been met | Indeed, an agent <bcp14>SHOULD NOT</bcp14> indicate that QoS preconditions have been met | |||
| until the checks have completed and selected the candidate pairs to be used for media. | until the checks have completed and selected the candidate pairs to be used for media. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| ICE also has (purposeful) interactions with connectivity preconditions <xref tar get="RFC5898"/>. | ICE also has interactions with connectivity preconditions <xref target="RFC5898" format="default"/>. | |||
| Those interactions are described there. | Those interactions are described there. | |||
| Note that the procedures described in <xref target="sec-latency"/> descri be their own type of "preconditions", albeit with less functionality than those provided by the explicit preconditions in <xref target="RFC5898"/>. | Note that the procedures described in <xref target="sec-latency" format=" default"/> describe their own type of "preconditions", albeit with less function ality than those provided by the explicit preconditions in <xref target="RFC5898 " format="default"/>. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Interactions with Third Party Call Control"> | <section numbered="true" toc="default"> | |||
| <name>Interactions with Third Party Call Control</name> | ||||
| <t> | <t> | |||
| ICE works with Flows I, III, and IV as described in <xref target="RFC3725"/>. | ICE works with Flows I, III, and IV as described in <xref target="RFC3725" forma t="default"/>. | |||
| Flow I works without the controller supporting or being aware of ICE. | Flow I works without the controller supporting or being aware of ICE. | |||
| Flow IV will work as long as the controller passes along the ICE attributes with out alteration. | Flow IV will work as long as the controller passes along the ICE attributes with out alteration. | |||
| Flow II is fundamentally incompatible with ICE; each agent will believe itself t o be the answerer and thus never generate a re-INVITE. | Flow II is fundamentally incompatible with ICE; each agent will believe itself t o be the answerer and thus never generate a re-INVITE. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The flows for continued operation, as described in Section 7 of <xref target="RF | The flows for continued operation, as described in <xref target="RFC3725" sectio | |||
| C3725"/>, require additional behavior of ICE implementations to support. | nFormat="of" section="7" format="default"/>, | |||
| In particular, if an agent receives a mid-dialog re-INVITE that contains no offe | require additional behavior of ICE implementations to support. | |||
| r, it MUST restart ICE for each data stream and go through the process of gather | In particular, if an agent receives a mid-dialog re-INVITE that contains no offe | |||
| ing new candidates. | r, it <bcp14>MUST</bcp14> restart ICE for each data stream and go through the pr | |||
| Furthermore, that list of candidates SHOULD include the ones currently being use | ocess of gathering new candidates. | |||
| d for media. | Furthermore, that list of candidates <bcp14>SHOULD</bcp14> include the ones curr | |||
| ently being used for media. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-alg-sip" title="Interactions with Application Layer Gat | <section anchor="sec-alg-sip" numbered="true" toc="default"> | |||
| eways and SIP"> | <name>Interactions with Application Layer Gateways and SIP</name> | |||
| <t> | <t> | |||
| Application Layer Gateways (ALGs) are functions present in a Network Add ress Translation (NAT) | Application Layer Gateways (ALGs) are functions present in a Network Add ress Translation (NAT) | |||
| device that inspect the contents of packets and modify them, in order to facilitate NAT traversal | device that inspect the contents of packets and modify them, in order to facilitate NAT traversal | |||
| for application protocols. Session Border Controllers (SBCs) are close c ousins of ALGs, but are | for application protocols. Session Border Controllers (SBCs) are close c ousins of ALGs, but are | |||
| less transparent since they actually exist as application-layer SIP inte rmediaries. ICE has | less transparent since they actually exist as application-layer SIP inte rmediaries. ICE has | |||
| interactions with SBCs and ALGs. | interactions with SBCs and ALGs. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If an ALG is SIP aware but not ICE aware, ICE will work through it as lo ng as the ALG correctly | If an ALG is SIP aware but not ICE aware, ICE will work through it as lo ng as the ALG correctly | |||
| modifies the SDP. A correct ALG implementation behaves as follows: | modifies the SDP. A correct ALG implementation behaves as follows: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | The ALG does not modify the "m=" and "c=" lines or the "rtcp" attrib | |||
| The ALG does not modify the "m=" and "c=" lines or the rtcp attribut | ute if they contain | |||
| e if they contain | ||||
| external addresses. | external addresses. | |||
| </t> | </li> | |||
| <li> | ||||
| <t> | <t> | |||
| If the "m=" and "c=" lines contain internal addresses, the modificat ion depends on the state of the ALG: | If the "m=" and "c=" lines contain internal addresses, the modificat ion depends on the state of the ALG: | |||
| <list style="symbols"> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <li> | ||||
| If the ALG already has a binding established that maps an extern al port to an internal connection | If the ALG already has a binding established that maps an extern al port to an internal connection | |||
| address and port matching the values in the "m=" and "c=" lines or rtcp attribute, the ALG uses that | address and port matching the values in the "m=" and "c=" lines or "rtcp" attribute, the ALG uses that | |||
| binding instead of creating a new one. | binding instead of creating a new one. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| If the ALG does not already have a binding, it creates a new one and modifies the SDP, rewriting | If the ALG does not already have a binding, it creates a new one and modifies the SDP, rewriting | |||
| the "m=" and "c=" lines and rtcp attribute. | the "m=" and "c=" lines and "rtcp" attribute. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| <t> | <t> | |||
| Unfortunately, many ALGs are known to work poorly in these corner cases. | Unfortunately, many ALGs are known to work poorly in these corner cases. | |||
| ICE does not try to work around broken ALGs, as this is outside the scop e of its functionality. | ICE does not try to work around broken ALGs, as this is outside the scop e of its functionality. | |||
| ICE can help diagnose these conditions, which often show up as a mismatc h between the set of candidates and | ICE can help diagnose these conditions, which often show up as a mismatc h between the set of candidates and | |||
| the "m=" and "c=" lines and rtcp attributes. The ice-mismatch attribute is used for this purpose. | the "m=" and "c=" lines and "rtcp" attributes. The "ice-mismatch" attrib ute is used for this purpose. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| ICE works best through ALGs when the signaling is run over TLS. | ICE works best through ALGs when the signaling is run over TLS. | |||
| This prevents the ALG from manipulating the SDP messages and interfering with ICE operation. | This prevents the ALG from manipulating the SDP messages and interfering with ICE operation. | |||
| Implementations that are expected to be deployed behind ALGs SHOULD prov ide for TLS transport of the SDP. | Implementations that are expected to be deployed behind ALGs <bcp14>SHOU LD</bcp14> provide for TLS transport of the SDP. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| If an SBC is SIP aware but not ICE aware, the result depends on the beha vior of the SBC. | If an SBC is SIP aware but not ICE aware, the result depends on the beha vior of the SBC. | |||
| If it is acting as a proper Back-to-Back User Agent (B2BUA), the SBC wil l remove any SDP attributes | If it is acting as a proper Back-to-Back User Agent (B2BUA), the SBC wil l remove any SDP attributes | |||
| it doesn’t understand, including the ICE attributes. Consequently, | it doesn't understand, including the ICE attributes. Consequently, the c | |||
| the call will appear to both | all will appear to both | |||
| endpoints as if the other side doesn’t support ICE. This will resu | endpoints as if the other side doesn't support ICE. This will result in | |||
| lt in ICE being disabled, and | ICE being disabled, and | |||
| media flowing through the SBC, if the SBC has requested it. If, however, the SBC passes the ICE attributes | media flowing through the SBC, if the SBC has requested it. If, however, the SBC passes the ICE attributes | |||
| without modification, yet modifies the default destination for media (co ntained in the "m=" and "c=" lines | without modification, yet modifies the default destination for media (co ntained in the "m=" and "c=" lines | |||
| and rtcp attribute), this will be detected as an ICE mismatch, and ICE p rocessing is aborted for the call. | and "rtcp" attribute), this will be detected as an ICE mismatch, and ICE processing is aborted for the call. | |||
| It is outside of the scope of ICE for it to act as a tool for "working a round" SBCs. | It is outside of the scope of ICE for it to act as a tool for "working a round" SBCs. | |||
| If one is present, ICE will not be used and the SBC techniques take prec edence. | If one is present, ICE will not be used and the SBC techniques take prec edence. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Security Considerations"> | <section numbered="true" toc="default"> | |||
| <name>Security Considerations</name> | ||||
| <t> | <t> | |||
| The generic ICE security considerations are defined in <xref target="RFC | The generic ICE security considerations are defined in <xref target="RFC | |||
| 8445"/>, and the | 8445" format="default"/>, and the | |||
| generic SDP offer/answer security considerations are defined in <xref ta | generic SDP offer/answer security considerations are defined in <xref ta | |||
| rget="RFC3264"/>. These | rget="RFC3264" format="default"/>. These | |||
| security considerations also apply to implementations of this document. | security considerations also apply to implementations of this document. | |||
| </t> | </t> | |||
| <section title="IP Address Privacy"> | <section numbered="true" toc="default"> | |||
| <name>IP Address Privacy</name> | ||||
| <t> | <t> | |||
| In some cases, e.g., for privacy reasons, an agent may not want to rev eal the related | In some cases, e.g., for privacy reasons, an agent may not want to rev eal the related | |||
| address and port. In this case the address MUST be set to "0.0.0.0" (f or IPv4 candidates) | address and port. In this case the address <bcp14>MUST</bcp14> be set to "0.0.0.0" (for IPv4 candidates) | |||
| or "::" (for IPv6 candidates) and the port to '9'. | or "::" (for IPv6 candidates) and the port to '9'. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Attacks on the Offer/Answer Exchanges"> | <section numbered="true" toc="default"> | |||
| <name>Attacks on the Offer/Answer Exchanges</name> | ||||
| <t> | <t> | |||
| An attacker that can modify or disrupt the offer/answer exchanges them selves can readily | An attacker that can modify or disrupt the offer/answer exchanges them selves can readily | |||
| launch a variety of attacks with ICE. They could direct media to a tar get of a DoS attack, | launch a variety of attacks with ICE. They could direct media to a tar get of a DoS attack, | |||
| they could insert themselves into the data stream, and so on. These ar e similar to the general | they could insert themselves into the data stream, and so on. These ar e similar to the general | |||
| security considerations for offer/answer exchanges, and the security c onsiderations in | security considerations for offer/answer exchanges, and the security c onsiderations in | |||
| <xref target="RFC3264"/> apply. These require techniques for message i | <xref target="RFC3264" format="default"/> apply. These require techniq | |||
| ntegrity and encryption | ues for message integrity and encryption | |||
| for offers and answers, which are satisfied by the TLS mechanism <xref | for offers and answers, which are satisfied by the TLS mechanism <xref | |||
| target="RFC3261"/> when | target="RFC3261" format="default"/> when | |||
| SIP is used. As such, the usage of TLS with ICE is RECOMMENDED. | SIP is used. As such, the usage of TLS with ICE is <bcp14>RECOMMENDED< | |||
| /bcp14>. | ||||
| </t> | </t> | |||
| </section> | </section> | |||
| <section anchor="sec-voice-hammer" title="The Voice Hammer Attack"> | <section anchor="sec-voice-hammer" numbered="true" toc="default"> | |||
| <name>The Voice Hammer Attack</name> | ||||
| <t> | <t> | |||
| The voice hammer attack is an amplification attack, and can be trigger ed even if the attacker | The voice hammer attack is an amplification attack, and can be trigger ed even if the attacker | |||
| is an authenticated and valid participant in a session. | is an authenticated and valid participant in a session. | |||
| In this attack, the attacker initiates sessions to other agents, and m aliciously includes | In this attack, the attacker initiates sessions to other agents, and m aliciously includes | |||
| the connection address and port of a DoS target as the destination for media traffic | the connection address and port of a DoS target as the destination for media traffic | |||
| signaled in the SDP. This causes substantial amplification; a single o ffer/answer exchange | signaled in the SDP. This causes substantial amplification; a single o ffer/answer exchange | |||
| can create a continuing flood of media packets, possibly at high rates (consider video sources). | can create a continuing flood of media packets, possibly at high rates (consider video sources). | |||
| The use of ICE can help to prevent against this attack. | The use of ICE can help to prevent against this attack. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Specifically, if ICE is used, the agent receiving the malicious SDP wi ll first perform connectivity | Specifically, if ICE is used, the agent receiving the malicious SDP wi ll first perform connectivity | |||
| checks to the target of media before sending media there. If this targ et is a third-party host, the | checks to the target of media before sending media there. If this targ et is a third-party host, the | |||
| checks will not succeed, and media is never sent. | checks will not succeed, and media is never sent. The ICE extension d | |||
| efined in <xref target="RFC7675" format="default"/> | ||||
| can be used to further protect against voice hammer attacks. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| Unfortunately, ICE doesn’t help if it’s not used, in which case an attacker could simply | Unfortunately, ICE doesn't help if it's not used, in which case an att acker could simply | |||
| send the offer without the ICE parameters. However, in environments wh ere the set of clients is known, | send the offer without the ICE parameters. However, in environments wh ere the set of clients is known, | |||
| and is limited to ones that support ICE, the server can reject any off ers or answers that don’t | and is limited to ones that support ICE, the server can reject any off ers or answers that don't | |||
| indicate ICE support. | indicate ICE support. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| SIP User Agents (UA) <xref target="RFC3261"/> that are not willing to | SIP user agents (UA) <xref target="RFC3261" format="default"/> that ar | |||
| receive non-ICE answers MUST include | e not willing to receive non-ICE answers <bcp14>MUST</bcp14> include | |||
| an "ice" Option Tag <xref target="RFC5768"/> in the SIP Require Header | an "ice" option tag <xref target="RFC5768" format="default"/> in the S | |||
| Field in their offer. UAs that | IP Require header field in their offer. UAs that | |||
| reject non-ICE offers will generally use a 421 response code, together | reject non-ICE offers will generally use a 421 response code, together | |||
| with an Option Tag "ice" in the | with an option tag "ice" in the | |||
| Require Header Field in the response. | Require header field in the response. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="iana" title="IANA Considerations"> | ||||
| <section title="SDP Attributes"> | <section anchor="iana" numbered="true" toc="default"> | |||
| <name>IANA Considerations</name> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>SDP Attributes</name> | ||||
| <t> | <t> | |||
| The original ICE specification defined seven new SDP attributes per the procedur es of | The original ICE specification defined seven new SDP attributes per the procedur es of | |||
| Section 8.2.4 of <xref target="RFC4566"/>. The registration information from the | <xref target="RFC4566" sectionFormat="of" section="8.2.4" format="default"/>. | |||
| original specification | The registration information from the original specification | |||
| is included here with modifications to include Mux Category and also defines | is included here with modifications to include Mux Category <xref target="RFC885 | |||
| a new SDP attribute 'ice-pacing'. | 9" format="default"/> | |||
| and also defines a new SDP attribute "ice-pacing". | ||||
| </t> | </t> | |||
| <section title="candidate Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"candidate" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| candidate | candidate | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| media-level | media-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and provides one of many possible candidate addresses for communication. | and provides one of many possible candidate addresses for communication. | |||
| These addresses are validated with an end-to-end connectivity check using Sessio n | These addresses are validated with an end-to-end connectivity check using Sessio n | |||
| Traversal Utilities for NAT (STUN). | Traversal Utilities for NAT (STUN). | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact Email:"> | <dt>Contact Email:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| TRANSPORT | TRANSPORT | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="remote-candidates Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"remote-candidates" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| remote-candidates | remote-candidates | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| media-level | media-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and provides the identity of the remote candidates that the offerer wishes the a nswerer | and provides the identity of the remote candidates that the offerer wishes the a nswerer | |||
| to use in its answer. | to use in its answer. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact Email:"> | <dt>Contact Email:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| TRANSPORT | TRANSPORT | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-lite Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"ice-lite" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| ice-lite | ice-lite | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| session-level | session-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and indicates that an agent has the minimum functionality required to support IC E | and indicates that an agent has the minimum functionality required to support IC E | |||
| inter-operation with a peer that has a full implementation. | inter-operation with a peer that has a full implementation. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact Email:"> | <dt>Contact Email:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| NORMAL | NORMAL | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-mismatch Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"ice-mismatch" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| ice-mismatch | ice-mismatch | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| media-level | media-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), and in dicates that an agent is ICE capable, but did not proceed with ICE due to a mism atch of candidates with the default destination for media signaled in the SDP. | This attribute is used with Interactive Connectivity Establishment (ICE), and in dicates that an agent is ICE capable, but did not proceed with ICE due to a mism atch of candidates with the default destination for media signaled in the SDP. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact e-mail:"> | <dt>Contact e-mail:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| NORMAL | NORMAL | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-pwd Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"ice-pwd" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| ice-pwd | ice-pwd | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| session- or media-level | session- or media-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and provides the password used to protect STUN connectivity checks. | and provides the password used to protect STUN connectivity checks. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact e-mail:"> | <dt>Contact e-mail:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| TRANSPORT | TRANSPORT | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-ufrag Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"ice-ufrag" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| ice-ufrag | ice-ufrag | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| session- or media-level | session- or media-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and provides the fragments used to construct the username in STUN connectivity c hecks. | and provides the fragments used to construct the username in STUN connectivity c hecks. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact e-mail:"> | <dt>Contact e-mail:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| TRANSPORT | TRANSPORT | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-options Attribute"> | <section numbered="true" toc="default"> | |||
| <t> | <name>"ice-options" Attribute</name> | |||
| <list style="hanging"> | <dl newline="false" spacing="normal"> | |||
| <t hangText="Attribute Name:"> | <dt>Attribute Name:</dt> | |||
| <dd> | ||||
| ice-options | ice-options | |||
| </t> | </dd> | |||
| <t hangText="Long Form:"> | <dt>Long Form:</dt> | |||
| <dd> | ||||
| ice-options | ice-options | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| session-level | session-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE), | This attribute is used with Interactive Connectivity Establishment (ICE), | |||
| and indicates the ICE options or extensions used by the agent. | and indicates the ICE options or extensions used by the agent. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact e-mail:"> | <dt>Contact e-mail:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| NORMAL | NORMAL | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| <section title="ice-pacing Attribute"> | <section numbered="true" toc="default"> | |||
| <name>"ice-pacing" Attribute</name> | ||||
| <t> | <t> | |||
| This specification also defines a new SDP attribute, "ice-pacing" according | This specification also defines a new SDP attribute, "ice-pacing", according | |||
| to the following data: | to the following data: | |||
| </t> | </t> | |||
| <t> | <dl newline="false" spacing="normal"> | |||
| <list style="hanging"> | <dt>Attribute Name:</dt> | |||
| <t hangText="Attribute Name:"> | <dd> | |||
| ice-pacing | ice-pacing | |||
| </t> | </dd> | |||
| <t hangText="Type of Attribute:"> | <dt>Type of Attribute:</dt> | |||
| <dd> | ||||
| session-level | session-level | |||
| </t> | </dd> | |||
| <t hangText="Subject to charset:"> | <dt>Subject to charset:</dt> | |||
| <dd> | ||||
| No | No | |||
| </t> | </dd> | |||
| <t hangText="Purpose:"> | <dt>Purpose:</dt> | |||
| <dd> | ||||
| This attribute is used with Interactive Connectivity Establishment (ICE) | This attribute is used with Interactive Connectivity Establishment (ICE) | |||
| to indicate desired connectivity check pacing values. | to indicate desired connectivity check pacing values. | |||
| </t> | </dd> | |||
| <t hangText="Appropriate Values:"> | <dt>Appropriate Values:</dt> | |||
| See <xref target="sec-grammar"/> of RFC XXXX. | <dd> | |||
| </t> | See <xref target="sec-grammar" format="default"/> of RFC 8839. | |||
| <t hangText="Contact Name:"> | </dd> | |||
| <dt>Contact Name:</dt> | ||||
| <dd> | ||||
| IESG | IESG | |||
| </t> | </dd> | |||
| <t hangText="Contact e-mail:"> | <dt>Contact e-mail:</dt> | |||
| <dd> | ||||
| iesg@ietf.org | iesg@ietf.org | |||
| </t> | </dd> | |||
| <t hangText="Reference:"> | <dt>Reference:</dt> | |||
| RFCXXXX | <dd> | |||
| </t> | RFC 8839 | |||
| <t hangText="Mux Category:"> | </dd> | |||
| <dt>Mux Category:</dt> | ||||
| <dd> | ||||
| NORMAL | NORMAL | |||
| </t> | </dd> | |||
| </list> | </dl> | |||
| </t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section anchor="sec-iana-ice-options" title="Interactive Connectivity Est | ||||
| ablishment (ICE) Options Registry"> | <section anchor="sec-iana-ice-options" numbered="true" toc="default"> | |||
| <name>Interactive Connectivity Establishment (ICE) Options Registry</nam | ||||
| e> | ||||
| <t> | <t> | |||
| IANA maintains a registry for ice-options identifiers under the Specification | IANA maintains a registry for "ice-options" identifiers under the Specification | |||
| Required policy as defined in "Guidelines for Writing an IANA Considerations | Required policy as defined in "Guidelines for Writing an IANA Considerations | |||
| Section in RFCs" <xref target="RFC8126"/>. | Section in RFCs" <xref target="RFC8126" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| ICE options are of unlimited length according to the syntax in | ICE options are of unlimited length according to the syntax in | |||
| <xref target="sec-ice-options"/>; however, they are RECOMMENDED to be no longer | <xref target="sec-ice-options" format="default"/>; however, they are <bcp14>RECO MMENDED</bcp14> to be no longer | |||
| than 20 characters. This is to reduce message sizes and allow for | than 20 characters. This is to reduce message sizes and allow for | |||
| efficient parsing. ICE options are defined at the session level. | efficient parsing. ICE options are defined at the session level. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A registration request MUST include the following information: | A registration request <bcp14>MUST</bcp14> include the following information: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | ||||
| The ICE option identifier to be registered | The ICE option identifier to be registered | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Name and email address of organization or individuals having change control | ||||
| </li> | ||||
| <li> | ||||
| Short description of the ICE extension to which the option relates | Short description of the ICE extension to which the option relates | |||
| </t> | </li> | |||
| <t> | <li> | |||
| Reference(s) to the specification defining the ICE option and the related extens ions | Reference(s) to the specification defining the ICE option and the related extens ions | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| </section> | </section> | |||
| <section anchor="sec-iana-cand-ext" title="Candidate Attribute Extension S | <section anchor="sec-iana-cand-ext" numbered="true" toc="default"> | |||
| ubregistry Establishment"> | <name>Candidate Attribute Extension Subregistry Establishment</name> | |||
| <t> | <t> | |||
| This section creates a new sub-registry, "Candidate Attribute Extensio | This section creates a new subregistry, "Candidate Attribute | |||
| ns", under the sdp-parameters | Extensions", under the SDP Parameters | |||
| registry: http://www.iana.org/assignments/sdp-parameters. | registry: <eref target="http://www.iana.org/assignments/sdp-parameters | |||
| "/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| The purpose of the sub-registry is to register SDP candidate attribute extensions. | The purpose of the subregistry is to register SDP "candidate" attribut e extensions. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| When a candidate extension is registered in the sub-registry, it needs | When a "candidate" extension is registered in the subregistry, it need | |||
| to meet the "Specification Required" | s to meet the "Specification Required" | |||
| policies defined in <xref target="RFC8126"/>. | policies defined in <xref target="RFC8126" format="default"/>. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| Candidate attribute extensions MUST follow the 'cand-extension' syntax | "candidate" attribute extensions <bcp14>MUST</bcp14> follow the 'cand- | |||
| . The attribute extension | extension' syntax. The attribute extension | |||
| name MUST follow the 'extension-att-name' syntax, and the attribute ex | name <bcp14>MUST</bcp14> follow the 'extension-att-name' syntax, and t | |||
| tension value MUST follow the | he attribute extension value <bcp14>MUST</bcp14> follow the | |||
| 'extension-att-value' syntax. | 'extension-att-value' syntax. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| A registration request MUST include the following information: | A registration request <bcp14>MUST</bcp14> include the following infor mation: | |||
| </t> | </t> | |||
| <t> | <ul spacing="normal"> | |||
| <list style="symbols"> | <li> | |||
| <t> | ||||
| The name of the attribute extension. | The name of the attribute extension. | |||
| </t> | </li> | |||
| <t> | ||||
| <li> | ||||
| Name and email address of organization or individuals having change control | ||||
| </li> | ||||
| <li> | ||||
| A short description of the attribute extension. | A short description of the attribute extension. | |||
| </t> | </li> | |||
| <t> | <li> | |||
| A reference to a specification that describes the semantics, usage and possible | A reference to a specification that describes the semantics, usage and possible | |||
| values of the attribute extension. | values of the attribute extension. | |||
| </t> | </li> | |||
| </list> | </ul> | |||
| </t> | ||||
| </section> | </section> | |||
| </section> | </section> | |||
| <section title="Acknowledgments"> | <section anchor="sec.5245" numbered="true" toc="default"> | |||
| <t> | <name>Changes from RFC 5245</name> | |||
| A large part of the text in this document was taken from <xref target="RFC5245"/ | ||||
| >, authored by | ||||
| Jonathan Rosenberg. | ||||
| </t> | ||||
| <t> | ||||
| Some of the text in this document was taken from <xref target="RFC6336"/>, autho | ||||
| red by Magnus Westerlund | ||||
| and Colin Perkins. | ||||
| </t> | ||||
| <t> | ||||
| Many thanks to Flemming Andreasen for shepherd review feedback. | ||||
| </t> | ||||
| <t> | <t> | |||
| Thanks to following experts for their reviews and constructive feedback: Thomas | <xref target="RFC8445" format="default"/> describes the changes made to th | |||
| Stach, | e | |||
| Adam Roach, Peter Saint-Andre, Roman Danyliw, Alissa Cooper, Benjamin Kaduk, Mir | ||||
| ja Kuhlewind, Alexey Melnikov, Eric Vyncke for their detailed reviews. | ||||
| </t> | ||||
| </section> | ||||
| <section title="Changes from RFC 5245" anchor="sec.5245"> | ||||
| <t> | ||||
| <xref target="RFC8445"/> describes the changes that were done to the | ||||
| common SIP procedures, including removal of aggressive nomination, | common SIP procedures, including removal of aggressive nomination, | |||
| modifying the procedures for calculating candidate pair states and | modifying the procedures for calculating candidate pair states, | |||
| scheduling connectivity checks and the calculation of timer values. | scheduling connectivity checks, and the calculation of timer values. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This document defines the following SDP offer/answer specific changes: | This document defines the following SDP offer/answer specific changes: | |||
| <list style="symbols"> | </t> | |||
| <t>SDP offer/answer realization and usage of of 'ice2' option.</t> | ||||
| <t>Definition and usage of SDP 'ice-pacing' attribute.</t> | <ul spacing="normal"> | |||
| <t>Explicit text that an ICE agent must not generate candidates with FQD | <li>SDP offer/answer realization and usage of 'ice2' option.</li> | |||
| Ns, and | <li>Definition and usage of SDP "ice-pacing" attribute.</li> | |||
| must discard such candidates if received from the peer agent.</t> | <li>Explicit text that an ICE agent must not generate candidates with FQ | |||
| <t>Relax requirement to include SDP 'rtcp' attribute.</t> | DNs, and | |||
| <t>Generic clarifications of SDP offer/answer procedures.</t> | must discard such candidates if received from the peer agent.</li> | |||
| </list> | <li>Relax requirement to include SDP "rtcp" attribute.</li> | |||
| </t> | <li>Generic clarifications of SDP offer/answer procedures.</li> | |||
| <li>ICE mismatch is now optional, and an agent has an option to not | ||||
| trigger mismatch and instead treat the default candidate as an | ||||
| additional candidate.</li> | ||||
| <li>FQDNs and "0.0.0.0"/"::" IP addresses with port "9" default | ||||
| candidates do not trigger ICE mismatch.</li> | ||||
| </ul> | ||||
| </section> | </section> | |||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references title="Normative References"> | <references> | |||
| <?rfc include="reference.RFC.2119"?> | <name>References</name> | |||
| <?rfc include="reference.RFC.3261"?> | <references> | |||
| <?rfc include="reference.RFC.3262"?> | ||||
| <?rfc include="reference.RFC.3264"?> | <name>Normative References</name> | |||
| <?rfc include="reference.RFC.3312"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.3556"?> | ence.RFC.2119.xml"/> | |||
| <?rfc include="reference.RFC.3605"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.4032"?> | ence.RFC.3261.xml"/> | |||
| <?rfc include="reference.RFC.4566"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.5234"?> | ence.RFC.3262.xml"/> | |||
| <?rfc include="reference.RFC.5768"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.6336"?> | ence.RFC.3264.xml"/> | |||
| <?rfc include="reference.RFC.8174"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.8445"?> | ence.RFC.3312.xml"/> | |||
| <reference anchor="draft-ietf-ice-pac" target="http://www.ietf.org/interne | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| t-drafts/draft-ietf-ice-pac-02.txt"> | ence.RFC.3556.xml"/> | |||
| <front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <title>Interactive Connectivity Establishment Patiently Awaiting Conne | ence.RFC.3605.xml"/> | |||
| ctivity (ICE PAC)</title> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <author initials="C." surname="Holmberg" fullname="Christer Holmberg"> | ence.RFC.4032.xml"/> | |||
| <organization/> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </author> | ence.RFC.4566.xml"/> | |||
| <author initials="J." surname="Uberti" fullname="Justin Uberti"> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <organization/> | ence.RFC.5234.xml"/> | |||
| </author> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <date year="2019" month="July"/> | ence.RFC.5389.xml"/> | |||
| <abstract> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <t>During the process of establishing peer-to-peer connectivity, ICE | ence.RFC.5768.xml"/> | |||
| agents can encounter situations where they have no candidate pairs to check, an | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| d, as a result, conclude that ICE processing has failed. However, because additi | ence.RFC.6336.xml"/> | |||
| onal candidate pairs can be discovered during ICE processing, declaring failure | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| at this point may be premature. This document discusses when these situations ca | ence.RFC.8174.xml"/> | |||
| n occur and proposes a way to avoid premature failure. [STANDARDS-TRACK]</t> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| </abstract> | ence.RFC.8445.xml"/> | |||
| </front> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <seriesInfo name="Internet-Draft" value="draft-ietf-ice-pac-02"/> | ence.RFC.5766.xml"/> | |||
| </reference> | </references> | |||
| </references> | <references> | |||
| <references title="Informative References"> | <name>Informative References</name> | |||
| <?rfc include="reference.RFC.3725"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.3960"?> | ence.RFC.3725.xml"/> | |||
| <?rfc include="reference.RFC.5245"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.5626"?> | ence.RFC.3960.xml"/> | |||
| <?rfc include="reference.RFC.5898"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| <?rfc include="reference.RFC.6679"?> | ence.RFC.5245.xml"/> | |||
| <?rfc include="reference.RFC.8126"?> | <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | |||
| ence.RFC.5626.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5898.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.6679.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7675.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.8126.xml"/> | ||||
| <reference anchor="RFC8859" target="https://www.rfc-editor.org/info/rfc8 | ||||
| 859"> | ||||
| <front> | ||||
| <title>A Framework for Session Description Protocol (SDP) | ||||
| Attributes When Multiplexing</title> | ||||
| <author initials="S" surname="Nandakumar" fullname="Suhas Nandakumar | ||||
| "> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8859"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8859"/> | ||||
| </reference> | ||||
| <reference anchor="RFC8863" target="https://www.rfc-editor.org/info/rfc8863"> | ||||
| <front> | ||||
| <title>Interactive Connectivity Establishment Patiently Awaiting Connectivity | ||||
| (ICE PAC)</title> | ||||
| <author initials="C" surname="Holmberg" fullname="Christer Holmberg"> | ||||
| <organization/> | ||||
| </author> | ||||
| <author initials="J" surname="Uberti" fullname="Justin Uberti"> | ||||
| <organization/> | ||||
| </author> | ||||
| <date month="January" year="2021"/> | ||||
| </front> | ||||
| <seriesInfo name="RFC" value="8863"/> | ||||
| <seriesInfo name="DOI" value="10.17487/RFC8863"/> | ||||
| </reference> | ||||
| </references> | ||||
| </references> | </references> | |||
| <section anchor="sec-example" title="Examples"> | <section anchor="sec-example" numbered="true" toc="default"> | |||
| <name>Examples</name> | ||||
| <t> | <t> | |||
| For the example shown in section 15 of <xref target="RFC8445"/> the resulting of | For the example shown in <xref target="RFC8445" sectionFormat="of" section="15" | |||
| fer (message 5) encoded in SDP looks like: | format="default"/>, | |||
| the resulting offer (message 5) encoded in SDP looks like (lines folded for clar | ||||
| ity): | ||||
| </t> | </t> | |||
| <figure> | <sourcecode name="" type="sdp"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| v=0 | v=0 | |||
| o=jdoe 2890844526 2890842807 IN IP6 $L-PRIV-1.IP | o=jdoe 2890844526 2890842807 IN IP6 $L-PRIV-1.IP | |||
| s= | s= | |||
| c=IN IP6 $NAT-PUB-1.IP | c=IN IP6 $NAT-PUB-1.IP | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:ice2 | a=ice-options:ice2 | |||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | a=ice-pwd:asd88fgpdd777uzjYhagZg | |||
| a=ice-ufrag:8hhY | a=ice-ufrag:8hhY | |||
| m=audio $NAT-PUB-1.PORT RTP/AVP 0 | m=audio $NAT-PUB-1.PORT RTP/AVP 0 | |||
| b=RS:0 | b=RS:0 | |||
| b=RR:0 | b=RR:0 | |||
| a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
| a=candidate:1 1 UDP 2130706431 $L-PRIV-1.IP $L-PRIV-1.PORT typ host | a=candidate:1 1 UDP 2130706431 $L-PRIV-1.IP $L-PRIV-1.PORT typ host | |||
| a=candidate:2 1 UDP 1694498815 $NAT-PUB-1.IP $NAT-PUB-1.PORT typ | a=candidate:2 1 UDP 1694498815 $NAT-PUB-1.IP $NAT-PUB-1.PORT typ | |||
| srflx raddr $L-PRIV-1.IP rport $L-PRIV-1.PORT | srflx raddr $L-PRIV-1.IP rport $L-PRIV-1.PORT | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| The offer, with the variables replaced with their values, will look like (lines folded for clarity): | The offer, with the variables replaced with their values, will look like (lines folded for clarity): | |||
| </t> | </t> | |||
| <figure> | ||||
| <artwork><![CDATA[ | <sourcecode name="" type="sdp"><![CDATA[ | |||
| v=0 | v=0 | |||
| o=jdoe 2890844526 2890842807 IN IP6 fe80::6676:baff:fe9c:ee4a | o=jdoe 2890844526 2890842807 IN IP6 fe80::6676:baff:fe9c:ee4a | |||
| s= | s= | |||
| c=IN IP6 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 | c=IN IP6 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:ice2 | a=ice-options:ice2 | |||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | a=ice-pwd:asd88fgpdd777uzjYhagZg | |||
| a=ice-ufrag:8hhY | a=ice-ufrag:8hhY | |||
| m=audio 45664 RTP/AVP 0 | m=audio 45664 RTP/AVP 0 | |||
| b=RS:0 | b=RS:0 | |||
| b=RR:0 | b=RR:0 | |||
| a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
| a=candidate:1 1 UDP 2130706431 fe80::6676:baff:fe9c:ee4a 8998 typ host | a=candidate:1 1 UDP 2130706431 fe80::6676:baff:fe9c:ee4a 8998 | |||
| typ host | ||||
| a=candidate:2 1 UDP 1694498815 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 | a=candidate:2 1 UDP 1694498815 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 | |||
| 45664 typ srflx raddr fe80::6676:baff:fe9c:ee4a rport 8998 | 45664 typ srflx raddr fe80::6676:baff:fe9c:ee4a rport 8998 | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| The resulting answer looks like: | The resulting answer looks like: | |||
| </t> | </t> | |||
| <figure> | <sourcecode name="" type="sdp"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| v=0 | v=0 | |||
| o=bob 2808844564 2808844564 IN IP4 $R-PUB-1.IP | o=bob 2808844564 2808844564 IN IP4 $R-PUB-1.IP | |||
| s= | s= | |||
| c=IN IP4 $R-PUB-1.IP | c=IN IP4 $R-PUB-1.IP | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:ice2 | a=ice-options:ice2 | |||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh | a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh | |||
| a=ice-ufrag:9uB6 | a=ice-ufrag:9uB6 | |||
| m=audio $R-PUB-1.PORT RTP/AVP 0 | m=audio $R-PUB-1.PORT RTP/AVP 0 | |||
| b=RS:0 | b=RS:0 | |||
| b=RR:0 | b=RR:0 | |||
| a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
| a=candidate:1 1 UDP 2130706431 $R-PUB-1.IP $R-PUB-1.PORT typ host | a=candidate:1 1 UDP 2130706431 $R-PUB-1.IP $R-PUB-1.PORT typ host | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| <t> | <t> | |||
| With the variables filled in: | With the variables filled in: | |||
| </t> | </t> | |||
| <figure> | <sourcecode name="" type="sdp"><![CDATA[ | |||
| <artwork><![CDATA[ | ||||
| v=0 | v=0 | |||
| o=bob 2808844564 2808844564 IN IP4 192.0.2.1 | o=bob 2808844564 2808844564 IN IP4 192.0.2.1 | |||
| s= | s= | |||
| c=IN IP4 192.0.2.1 | c=IN IP4 192.0.2.1 | |||
| t=0 0 | t=0 0 | |||
| a=ice-options:ice2 | a=ice-options:ice2 | |||
| a=ice-pacing:50 | a=ice-pacing:50 | |||
| a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh | a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh | |||
| a=ice-ufrag:9uB6 | a=ice-ufrag:9uB6 | |||
| m=audio 3478 RTP/AVP 0 | m=audio 3478 RTP/AVP 0 | |||
| b=RS:0 | b=RS:0 | |||
| b=RR:0 | b=RR:0 | |||
| a=rtpmap:0 PCMU/8000 | a=rtpmap:0 PCMU/8000 | |||
| a=candidate:1 1 UDP 2130706431 192.0.2.1 3478 typ host | a=candidate:1 1 UDP 2130706431 192.0.2.1 3478 typ host | |||
| ]]></artwork> | ]]></sourcecode> | |||
| </figure> | ||||
| </section> | </section> | |||
| <section anchor="sec-why-remote" title="The remote-candidates Attribute"> | ||||
| <section anchor="sec-why-remote" numbered="true" toc="default"> | ||||
| <name>The "remote-candidates" Attribute</name> | ||||
| <t> | <t> | |||
| The "a=remote-candidates" attribute exists to eliminate a race condition between | The "remote-candidates" attribute exists to eliminate a race condition between t | |||
| the updated offer and the response to the STUN Binding request that moved a can | he updated offer and the response to the STUN Binding request that moved a candi | |||
| didate into the Valid list. | date into the valid list. | |||
| This race condition is shown in <xref target="fig-race-flow"/>. | This race condition is shown in <xref target="fig-race-flow" format="default"/>. | |||
| On receipt of message 4, agent L adds a candidate pair to the valid list. | On receipt of message 4, agent L adds a candidate pair to the valid list. | |||
| If there was only a single data stream with a single component, agent L could no w send an updated offer. | If there was only a single data stream with a single component, agent L could no w send an updated offer. | |||
| However, the check from agent R has not yet generated a response, and agent R re | However, the check from agent R has not yet | |||
| ceives the updated offer (message 7) before getting the response (message 9). | received a response, and agent R receives the updated offer | |||
| (message 7) before getting the response (message 9). | ||||
| Thus, it does not yet know that this particular pair is valid. | Thus, it does not yet know that this particular pair is valid. | |||
| To eliminate this condition, the actual candidates at R that were selected by th e offerer (the remote candidates) are included in the offer itself, and the answ erer delays its answer until those pairs validate. | To eliminate this condition, the actual candidates at R that were selected by th e offerer (the remote candidates) are included in the offer itself, and the answ erer delays its answer until those pairs validate. | |||
| </t> | </t> | |||
| <figure anchor="fig-race-flow" title="Race Condition Flow"> | <figure anchor="fig-race-flow"> | |||
| <artwork><![CDATA[ | <name>Race Condition Flow</name> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Agent L Network Agent R | Agent L Network Agent R | |||
| |(1) Offer | | | |(1) Offer | | | |||
| |------------------------------------------>| | |------------------------------------------>| | |||
| |(2) Answer | | | |(2) Answer | | | |||
| |<------------------------------------------| | |<------------------------------------------| | |||
| |(3) STUN Req. | | | |(3) STUN Req. | | | |||
| |------------------------------------------>| | |------------------------------------------>| | |||
| |(4) STUN Res. | | | |(4) STUN Res. | | | |||
| |<------------------------------------------| | |<------------------------------------------| | |||
| |(5) STUN Req. | | | |(5) STUN Req. | | | |||
| skipping to change at line 1984 ¶ | skipping to change at line 2184 ¶ | |||
| |------------------------------------------>| | |------------------------------------------>| | |||
| |(8) STUN Req. | | | |(8) STUN Req. | | | |||
| |<------------------------------------------| | |<------------------------------------------| | |||
| |(9) STUN Res. | | | |(9) STUN Res. | | | |||
| |------------------------------------------>| | |------------------------------------------>| | |||
| |(10) Answer | | | |(10) Answer | | | |||
| |<------------------------------------------| | |<------------------------------------------| | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| </section> | </section> | |||
| <section anchor="sec-glare" title="Why Is the Conflict Resolution Mechanism | <section anchor="sec-glare" numbered="true" toc="default"> | |||
| Needed?"> | <name>Why Is the Conflict Resolution Mechanism Needed?</name> | |||
| <t> | <t> | |||
| When ICE runs between two peers, one agent acts as controlled, and the other as controlling. | When ICE runs between two peers, one agent acts as controlled, and the other as controlling. | |||
| Rules are defined as a function of implementation type and offerer/answerer to d etermine who is controlling and who is controlled. | Rules are defined as a function of implementation type and offerer/answerer to d etermine who is controlling and who is controlled. | |||
| However, the specification mentions that, in some cases, both sides might believ e they are controlling, or both sides might believe they are controlled. | However, the specification mentions that, in some cases, both sides might believ e they are controlling, or both sides might believe they are controlled. | |||
| How can this happen? | How can this happen? | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The condition when both agents believe they are controlled shows up in third par ty call control cases. | The condition when both agents believe they are controlled shows up in third par ty call control cases. | |||
| Consider the following flow: | Consider the following flow: | |||
| </t> | </t> | |||
| <figure anchor="fig-conflict" title="Role Conflict Flow"> | <figure anchor="fig-conflict"> | |||
| <artwork><![CDATA[ | <name>Role Conflict Flow</name> | |||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| A Controller B | A Controller B | |||
| |(1) INV() | | | |(1) INV() | | | |||
| |<-------------| | | |<-------------| | | |||
| |(2) 200(SDP1) | | | |(2) 200(SDP1) | | | |||
| |------------->| | | |------------->| | | |||
| | |(3) INV() | | | |(3) INV() | | |||
| | |------------->| | | |------------->| | |||
| | |(4) 200(SDP2) | | | |(4) 200(SDP2) | | |||
| | |<-------------| | | |<-------------| | |||
| |(5) ACK(SDP2) | | | |(5) ACK(SDP2) | | | |||
| |<-------------| | | |<-------------| | | |||
| | |(6) ACK(SDP1) | | | |(6) ACK(SDP1) | | |||
| | |------------->| | | |------------->| | |||
| ]]></artwork> | ]]></artwork> | |||
| </figure> | </figure> | |||
| <t> | <t> | |||
| This flow is a variation on flow III of RFC 3725 <xref target="RFC3725"/>. | This flow is a variation on flow III of RFC 3725 <xref target="RFC3725" format=" default"/>. | |||
| In fact, it works better than flow III since it produces fewer messages. | In fact, it works better than flow III since it produces fewer messages. | |||
| In this flow, the controller sends an offerless INVITE to agent A, which respond s with its offer, SDP1. | In this flow, the controller sends an offerless INVITE to agent A, which respond s with its offer, SDP1. | |||
| The agent then sends an offerless INVITE to agent B, which it responds to with i ts offer, SDP2. | The agent then sends an offerless INVITE to agent B, which it responds to with i ts offer, SDP2. | |||
| The controller then uses the offer from each agent to generate the answers. | The controller then uses the offer from each agent to generate the answers. | |||
| When this flow is used, ICE will run between agents A and B, but both will belie ve they are in the controlling role. | When this flow is used, ICE will run between agents A and B, but both will belie ve they are in the controlling role. | |||
| With the role conflict resolution procedures, this flow will function properly w hen ICE is used. | With the role conflict resolution procedures, this flow will function properly w hen ICE is used. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| At this time, there are no documented flows that can result in the case where bo th agents believe they are controlled. | At this time, there are no documented flows that can result in the case where bo th agents believe they are controlled. | |||
| However, the conflict resolution procedures allow for this case, should a flow a rise that would fit into this category. | However, the conflict resolution procedures allow for this case, should a flow a rise that would fit into this category. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Why Send an Updated Offer?"> | <section numbered="true" toc="default"> | |||
| <name>Why Send an Updated Offer?</name> | ||||
| <t> | <t> | |||
| Section 11.1 describes rules for sending media. | <xref target="RFC8445" section="12.1" sectionFormat="of" format="default"/> | |||
| describes rules for sending media. | ||||
| Both agents can send media once ICE checks complete, without waiting for an upda ted offer. | Both agents can send media once ICE checks complete, without waiting for an upda ted offer. | |||
| Indeed, the only purpose of the updated offer is to "correct" the SDP so that th e default destination for media matches where media is being sent based on ICE p rocedures (which will be the highest-priority nominated candidate pair). | Indeed, the only purpose of the updated offer is to "correct" the SDP so that th e default destination for media matches where media is being sent based on ICE p rocedures (which will be the highest-priority nominated candidate pair). | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This raises the question — why is the updated offer/answer exc hange needed at all? | This raises the question -- why is the updated offer/answer exchange needed at a ll? | |||
| Indeed, in a pure offer/answer environment, it would not be. | Indeed, in a pure offer/answer environment, it would not be. | |||
| The offerer and answerer will agree on the candidates to use through ICE, and th en can begin using them. | The offerer and answerer will agree on the candidates to use through ICE, and th en can begin using them. | |||
| As far as the agents themselves are concerned, the updated offer/answer provides no new information. | As far as the agents themselves are concerned, the updated offer/answer provides no new information. | |||
| However, in practice, numerous components along the signaling path look at the S DP information. | However, in practice, numerous components along the signaling path look at the S DP information. | |||
| These include entities performing off-path QoS reservations, NAT traversal compo nents such as ALGs and Session Border Controllers (SBCs), and diagnostic tools t hat passively monitor the network. | These include entities performing off-path QoS reservations, NAT traversal compo nents such as ALGs and Session Border Controllers (SBCs), and diagnostic tools t hat passively monitor the network. | |||
| For these tools to continue to function without change, the core property of SDP  — that the existing, pre-ICE definitions of the addresses use d for media — the "m=" and "c=" lines and the rtcp attribute&# 8201;— must be retained. | For these tools to continue to function without change, the core property of SDP -- that the existing, pre-ICE definitions of the addresses used for media -- th e "m=" and "c=" lines and the "rtcp" attribute -- must be retained. | |||
| For this reason, an updated offer must be sent. | For this reason, an updated offer must be sent. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Contributors"> | <section numbered="false" toc="default"> | |||
| <name>Acknowledgements</name> | ||||
| <t> | <t> | |||
| Following experts have contributed textual and structural improvements for this | A large part of the text in this document was taken from <xref | |||
| work | target="RFC5245" format="default"/>, authored by <contact fullname="Jonathan | |||
| Rosenberg"/>. | ||||
| </t> | </t> | |||
| <t> | <t> | |||
| <list style="numbers"> | Some of the text in this document was taken from <xref target="RFC6336" format=" | |||
| <t> | default"/>, | |||
| Thomas Stach | authored by <contact fullname="Magnus Westerlund"/> and <contact fullname="Colin | |||
| <list style="symbols"><t>thomass.stach@gmail.com</t></list></t> | Perkins"/>. | |||
| </list> | </t> | |||
| </t> | <t> | |||
| Many thanks to <contact fullname="Flemming Andreasen"/> for shepherd review feed | ||||
| back. | ||||
| </t> | ||||
| <t> | ||||
| Thanks to following experts for their reviews and constructive feedback: | ||||
| <contact fullname="Thomas Stach"/>, <contact fullname="Adam Roach"/>, | ||||
| <contact fullname="Peter Saint-Andre"/>, <contact fullname="Roman Danyliw"/>, | ||||
| <contact fullname="Alissa Cooper"/>, <contact fullname="Benjamin Kaduk"/>, | ||||
| <contact fullname="Mirja Kühlewind"/>, <contact fullname="Alexey Melnikov"/>, an | ||||
| d | ||||
| <contact fullname="Éric Vyncke"/> for their detailed reviews. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="false" toc="default"> | ||||
| <name>Contributors</name> | ||||
| <t> | ||||
| The following experts have contributed textual and structural improvements for t | ||||
| his work: | ||||
| </t> | ||||
| <contact fullname="Thomas Stach"> | ||||
| <address> | ||||
| <email>thomass.stach@gmail.com</email> | ||||
| </address> | ||||
| </contact> | ||||
| </section> | </section> | |||
| </back> | </back> | |||
| </rfc> | </rfc> | |||
| End of changes. 413 change blocks. | ||||
| 1138 lines changed or deleted | 1399 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||