| draft-ietf-mmusic-trickle-ice-sip-18xml2.original.xml | draft-ietf-mmusic-trickle-ice-sip-18.xml | |||
|---|---|---|---|---|
| <?xml version='1.0' encoding='utf-8'?> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | ||||
| <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" ipr="trust200902" | ||||
| docName="draft-ietf-mmusic-trickle-ice-sip-18" obsoletes="" updates="" submissi | ||||
| onType="IETF" xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" ver | ||||
| sion="3" consensus="true" number="0000"> | ||||
| <!-- xml2rfc v2v3 conversion 2.34.0 --> | ||||
| <!-- [rfced] updated by KC 11/07/19 --> | ||||
| <front> | ||||
| <title abbrev="Trickle ICE for SIP"> | ||||
| A Session Initiation Protocol (SIP) Usage for | ||||
| Incremental Provisioning of Candidates for | ||||
| the Interactive Connectivity Establishment (Trickle ICE) | ||||
| </title> | ||||
| <seriesInfo name="RFC" value="0000"/> | ||||
| <author initials="E." surname="Ivov" fullname="Emil Ivov"> | ||||
| <organization abbrev="Jitsi">Jitsi</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street/> | ||||
| <city>Strasbourg</city> | ||||
| <code>67000</code> | ||||
| <country>France</country> | ||||
| </postal> | ||||
| <phone>+33 6 72 81 15 55</phone> | ||||
| <email>emcho@jitsi.org</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="T." surname="Stach" fullname="Thomas Stach"> | ||||
| <organization>Unaffiliated</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street/> | ||||
| <city>Vienna</city> | ||||
| <region/> | ||||
| <code>1130</code> | ||||
| <country>Austria</country> | ||||
| </postal> | ||||
| <email>thomass.stach@gmail.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="E." surname="Marocco" fullname="Enrico Marocco"> | ||||
| <organization>Telecom Italia</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Via G. Reiss Romoli, 274</street> | ||||
| <city>Turin</city> | ||||
| <code>10148</code> | ||||
| <country>Italy</country> | ||||
| </postal> | ||||
| <email>enrico.marocco@telecomitalia.it</email> | ||||
| </address> | ||||
| </author> | ||||
| <author initials="C.H." surname="Holmberg" fullname="Christer Holmberg"> | ||||
| <organization>Ericsson</organization> | ||||
| <address> | ||||
| <postal> | ||||
| <street>Hirsalantie 11</street> | ||||
| <code>02420</code> | ||||
| <city>Jorvas</city> | ||||
| <country>Finland</country> | ||||
| </postal> | ||||
| <email>christer.holmberg@ericsson.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <date month="November" year="2019"/> | ||||
| <!-- [rfced] Please insert any keywords (beyond those that appear in | ||||
| the title) for use on https://www.rfc-editor.org/search. | ||||
| --> | ||||
| <abstract> | ||||
| <t> | ||||
| The Interactive Connectivity Establishment (ICE) protocol | ||||
| describes a Network Address Translator (NAT) traversal mechanism | ||||
| for UDP-based multimedia sessions established with the | ||||
| Offer/Answer model. The ICE extension for Incremental | ||||
| Provisioning of Candidates (Trickle ICE) defines a mechanism | ||||
| that allows ICE Agents to shorten session establishment delays | ||||
| by making the candidate gathering and connectivity checking | ||||
| phases of ICE non-blocking and executing them in parallel. | ||||
| </t> | ||||
| <t> | ||||
| This document defines usage semantics for Trickle ICE with the | ||||
| Session Initiation Protocol (SIP). | ||||
| The document also defines | ||||
| a new SIP Info Package to support this usage | ||||
| together with the corresponding media type. | ||||
| Additionally, a new Session Description Protocol (SDP) "end-of-candidate | ||||
| s" attribute and | ||||
| a new SIP Option Tag 'trickle-ice' are defined. | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <middle> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Introduction</name> | ||||
| <t> | ||||
| The Interactive Connectivity Establishment (ICE) protocol | ||||
| <xref target="RFC8445" format="default"/> describes | ||||
| a mechanism for Network Address Translator (NAT) traversal | ||||
| that consists of three main phases. | ||||
| </t> | ||||
| <t> | ||||
| During the first phase, an agent gathers a set of candidate | ||||
| transport addresses (source IP, port, and transport | ||||
| protocol). | ||||
| This is followed by a second phase | ||||
| where these candidates are sent to a | ||||
| remote agent within | ||||
| the Session Description Protocol (SDP) body of a SIP message. | ||||
| At the remote agent, the gathering procedure is repeated and | ||||
| candidates are sent to the first agent. | ||||
| Once the candidate information is available, a third phase | ||||
| starts in parallel where connectivity between all candidates | ||||
| in both sets is checked (connectivity checks). | ||||
| Once these phases | ||||
| have been completed, and only then, both agents can begin | ||||
| communication. | ||||
| </t> | ||||
| <t> | ||||
| According to <xref target="RFC8445" format="default"/>, | ||||
| the three phases above happen consecutively, in a blocking way, | ||||
| which can introduce undesirable setup delay during session | ||||
| establishment. | ||||
| The Trickle ICE extension | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> defines generic | ||||
| semantics required for these ICE phases to happen | ||||
| in a parallel, non-blocking way and hence speed up session | ||||
| establishment. | ||||
| </t> | ||||
| <t> | ||||
| This specification defines a usage of Trickle ICE with | ||||
| the Session Initiation Protocol (SIP)<xref target="RFC3261" format="defa | ||||
| ult"/>. | ||||
| It describes how ICE | ||||
| candidates are to be exchanged incrementally using SIP INFO | ||||
| requests <xref target="RFC6086" format="default"/> | ||||
| and how the Half Trickle and Full Trickle modes defined in | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> are to be used by | ||||
| SIP User Agents (UAs) depending on their expectations for | ||||
| support of Trickle ICE by a remote agent. | ||||
| </t> | ||||
| <t> | ||||
| This document defines a new Info Package as specified in | ||||
| <xref target="RFC6086" format="default"/> for use with Trickle ICE toget | ||||
| her | ||||
| with the corresponding media type, | ||||
| SDP attribute, and SIP option tag. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Terminology</name> | ||||
| <t> | ||||
| The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
| "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | ||||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
| "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
| to be interpreted as described in BCP 14 <xref target="RFC2119"/> | ||||
| <xref target="RFC8174"/> when, and only when, they appear in all capitals, | ||||
| as shown here. | ||||
| </t> | ||||
| <t> | ||||
| This specification makes use of terminology defined by the | ||||
| ICE protocol in | ||||
| <xref target="RFC8445" format="default"/> and by its Trickle ICE extensi | ||||
| on in | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/>. It is assumed th | ||||
| at | ||||
| the reader is familiar with the terminology from both documents. | ||||
| </t> | ||||
| <!--[rfced] Fyi, we updated the expansion of NAT to be 'Traversal | ||||
| Using Relays around NAT (TURN)' (instead of 'Traversal Using | ||||
| Relay NAT (TURN)') to match RFC 5766 and the companion documents. | ||||
| Updated: | ||||
| [RFC8445] also describes how ICE makes use of the Session | ||||
| Traversal Utilities for NAT (STUN) protocol [RFC5389] and its | ||||
| extension Traversal Using Relay NAT (TURN) [RFC5766]. | ||||
| --> | ||||
| <t> <xref target="RFC8445" format="default"/> also describes | ||||
| how ICE makes use of the | ||||
| Session Traversal Utilities for NAT (STUN) protocol | ||||
| <xref target="RFC5389" format="default"/> and its extension | ||||
| Traversal Using Relays around NAT (TURN) <xref target="RFC5766" format= | ||||
| "default"/>. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="overview" numbered="true" toc="default"> | ||||
| <name>Protocol Overview</name> | ||||
| <t> | ||||
| When using ICE for SIP according to | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>, | ||||
| the ICE candidates are exchanged solely via | ||||
| SDP Offer/Answer as per <xref target="RFC3264" format="default"/>. | ||||
| This specification defines an additional mechanism | ||||
| where candidates can be exchanged using SIP INFO messages | ||||
| and a newly defined Info Package <xref target="RFC6086" format="default" | ||||
| />. | ||||
| This also allows ICE | ||||
| candidates to be sent in parallel to an ongoing Offer/Answer | ||||
| negotiation and/or after the completion of the Offer/Answer | ||||
| negotiation. | ||||
| </t> | ||||
| <t> | ||||
| Typically, in cases where Trickle ICE is fully supported, | ||||
| the Offerer sends an INVITE request | ||||
| containing a subset of candidates. | ||||
| Once an early dialog is established, | ||||
| the Offerer can continue sending | ||||
| candidates in INFO requests within that dialog. | ||||
| </t> | ||||
| <t> | ||||
| Similarly, an Answerer can send | ||||
| ICE candidates using INFO requests within | ||||
| the dialog established by its 18x provisional response. | ||||
| <xref target="fig-intro-example" format="default"/> shows such a sample | ||||
| exchange: | ||||
| </t> | ||||
| <!--[rfced] We believe 'Turn' should be 'TURN' in Figures 1 and 9. We made | ||||
| the updates; if this is not correct, please let us know. | ||||
| Original: | ||||
| STUN/Turn | ||||
| Servers | ||||
| Updated: | ||||
| STUN/TURN | ||||
| Servers | ||||
| --> | ||||
| <figure anchor="fig-intro-example"> | ||||
| <name>Sample Trickle ICE Scenario with SIP</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| STUN/TURN STUN/TURN | ||||
| Servers Alice Bob Servers | ||||
| | | | | | ||||
| | STUN Bi.Req. | INVITE (Offer) | | | ||||
| |<--------------|------------------------>| | | ||||
| | | 183 (Answer) | TURN Alloc Req | | ||||
| | STUN Bi.Resp. |<------------------------|--------------->| | ||||
| |-------------->| INFO/OK (SRFLX Cand.) | | | ||||
| | |------------------------>| TURN Alloc Resp| | ||||
| | | INFO/OK (Relay Cand.) |<---------------| | ||||
| | |<------------------------| | | ||||
| | | | | | ||||
| | | More Cands & ConnChecks| | | ||||
| | |<=======================>| | | ||||
| | | | | | ||||
| | | 200 OK | | | ||||
| | |<------------------------| | | ||||
| | | ACK | | | ||||
| | |------------------------>| | | ||||
| | | | | | ||||
| | |<===== MEDIA FLOWS =====>| | | ||||
| | | | | | ||||
| Note: SRFLX denotes server-reflexive candidates ]]></artwork> | ||||
| </figure> | ||||
| <section anchor="disco-issues" numbered="true" toc="default"> | ||||
| <name>Discovery Issues</name> | ||||
| <t> | ||||
| In order to benefit from Trickle ICE's full potential and | ||||
| reduce session establishment latency to a minimum, Trickle ICE | ||||
| agents need to generate SDP Offers and Answers that contain | ||||
| incomplete and potentially empty sets of candidates. Such Offers | ||||
| and Answers can only be handled meaningfully by agents that | ||||
| actually support incremental candidate provisioning, which | ||||
| implies the need to confirm such support before using | ||||
| it. | ||||
| </t> | ||||
| <t> | ||||
| Contrary to other protocols, | ||||
| where "in advance" capability | ||||
| discovery is widely implemented, the mechanisms that allow this | ||||
| for SIP (i.e., a combination of UA capabilities | ||||
| <xref target="RFC3840" format="default"/> and Globally Routable User A | ||||
| gent URIs (GRUUs) <xref target="RFC5627" format="default"/>) | ||||
| have only seen low levels of adoption. | ||||
| This presents an issue | ||||
| for Trickle ICE implementations as SIP UAs do not have an | ||||
| obvious means of verifying that their peer will support | ||||
| incremental candidate provisioning. | ||||
| </t> | ||||
| <t> | ||||
| The Half Trickle mode of operation defined in the Trickle | ||||
| ICE specification <xref target="I-D.ietf-ice-trickle" format="default" | ||||
| /> | ||||
| provides one way around this, by requiring the first Offer to | ||||
| contain a complete set of local ICE candidates | ||||
| and using only | ||||
| incremental provisioning of remote candidates | ||||
| for the rest of the session. | ||||
| </t> | ||||
| <t> | ||||
| While using Half Trickle does provide a working solution, it | ||||
| also comes at the price of increased latency. Therefore, | ||||
| <xref target="disco" format="default"/> makes several alternative | ||||
| suggestions that enable SIP UAs to engage in Full Trickle | ||||
| right from their first Offer: <xref target="disco-prov" format="defaul | ||||
| t"/> | ||||
| discusses the use of online provisioning as a means of | ||||
| allowing the use of Trickle ICE for all endpoints in controlled | ||||
| environments. <xref target="disco-gruu" format="default"/> describes | ||||
| anticipatory discovery for implementations that actually do | ||||
| support GRUU and UA capabilities and | ||||
| <xref target="half-full-trickle" format="default"/> discusses the impl | ||||
| ementation | ||||
| and use of Half Trickle by SIP UAs where none of the above | ||||
| are an option. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Relationship with the Offer/Answer Model</name> | ||||
| <t> | ||||
| From the perspective of SIP middleboxes and proxies, | ||||
| the Offer/Answer exchange for | ||||
| Trickle ICE looks partly similar to the Offer/Answer exchange | ||||
| for regular ICE for SIP | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. | ||||
| However, in order to have the full picture of the candidate | ||||
| exchange, the newly introduced INFO messages | ||||
| need to be considered as well. | ||||
| </t> | ||||
| <figure anchor="fig-oa-and-trickle"> | ||||
| <name>Distinguishing between Trickle ICE and Traditional Signaling</na | ||||
| me> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| +-------------------------------+ +-------------------------------+ | ||||
| | Alice +--------------+ | | +--------------+ Bob | | ||||
| | | Offer/Answer | | | | Offer/Answer | | | ||||
| | +--------+ | Module | | | | Module | +--------+ | | ||||
| | | ICE | +--------------+ | | +--------------+ | ICE | | | ||||
| | | Module | | | | | | Module | | | ||||
| | +--------+ | | | | +--------+ | | ||||
| +-------------------------------+ +-------------------------------+ | ||||
| | | | | | ||||
| | | INVITE (Offer) | | | ||||
| | |--------------------->| | | ||||
| | | 183 (Answer) | | | ||||
| | |<---------------------| | | ||||
| | | | | | ||||
| | | | ||||
| | SIP INFO (more candidates) | | ||||
| |----------------------------------------------------->| | ||||
| | SIP INFO (more candidates) | | ||||
| |<-----------------------------------------------------| | ||||
| | | | ||||
| | STUN Binding Requests/Responses | | ||||
| |----------------------------------------------------->| | ||||
| | STUN Binding Requests/Responses | | ||||
| |<-----------------------------------------------------| | ||||
| | |]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| From an architectural viewpoint, as displayed in | ||||
| <xref target="fig-oa-and-trickle" format="default"/>, exchanging candi | ||||
| dates | ||||
| through SIP INFO requests could be represented as signaling | ||||
| between ICE modules and not between Offer/Answer modules of | ||||
| SIP UAs. Then, such INFO requests | ||||
| do not impact the state of the Offer/Answer transaction other | ||||
| than providing additional candidates. | ||||
| Consequently, INFO requests are not considered Offers or Answers. | ||||
| Nevertheless, candidates that have been exchanged | ||||
| using INFO requests | ||||
| <bcp14>SHALL</bcp14> be included in subsequent Offers or Answers. | ||||
| The version number in the "o=" line of that subsequent Offer | ||||
| needs to be incremented by 1 per the rules | ||||
| in <xref target="RFC3264" format="default"/>. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="OAproc" numbered="true" toc="default"> | ||||
| <name>Incremental Signaling of ICE Candidates</name> | ||||
| <t> | ||||
| Trickle ICE Agents will exchange | ||||
| ICE descriptions compliant to | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> | ||||
| via Offer/Answer procedures and/or INFO request bodies. | ||||
| This requires the following SIP-specific extensions: | ||||
| </t> | ||||
| <ol spacing="normal" type="1"> | ||||
| <li> | ||||
| Trickle ICE Agents <bcp14>MUST</bcp14> indicate support for Trickle | ||||
| ICE by | ||||
| including the SIP option-tag 'trickle-ice' in a SIP Supported: heade | ||||
| r field | ||||
| within all SIP INVITE requests and responses. | ||||
| </li> | ||||
| <li> | ||||
| Trickle ICE Agents <bcp14>MUST</bcp14> indicate support for Trickle | ||||
| ICE by | ||||
| including the ice-option 'trickle' | ||||
| within all SDP Offers and Answers in accordance to | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/>. | ||||
| </li> | ||||
| <li> | ||||
| Trickle ICE Agents <bcp14>MAY</bcp14> include any number of ICE candid | ||||
| ates, | ||||
| i.e., from zero to the complete set of candidates, | ||||
| in their initial Offer or Answer. | ||||
| If the complete candidate set is already included | ||||
| in the initial Offer, it is called Half Trickle. | ||||
| </li> | ||||
| <li> | ||||
| Trickle ICE Agents <bcp14>MAY</bcp14> exchange additional ICE candid | ||||
| ates using INFO requests | ||||
| within an existing INVITE dialog usage (including an early dialog) | ||||
| as specified in <xref target="RFC6086" format="default"/>. | ||||
| The INFO requests carry an Info-Package: trickle-ice. | ||||
| Trickle ICE Agents <bcp14>MUST</bcp14> be prepared to receive INFO r | ||||
| equests | ||||
| within that same dialog usage, | ||||
| containing additional candidates and/or | ||||
| an indication that trickling of such candidates has ended. | ||||
| </li> | ||||
| <li> | ||||
| Trickle ICE Agents <bcp14>MAY</bcp14> exchange additional ICE candid | ||||
| ates | ||||
| before the Answerer has sent the Answer provided that | ||||
| an invite dialog usage is established at both Trickle ICE Agents. | ||||
| Note that in case of forking, multiple early dialogs may exist. | ||||
| </li> | ||||
| </ol> | ||||
| <t> | ||||
| The following sections provide further details on how | ||||
| Trickle ICE Agents perform the initial Offer/Answer exchange | ||||
| (<xref target="InitialOA" format="default"/>), | ||||
| perform subsequent Offer/Answer exchanges | ||||
| (<xref target="subsOA" format="default"/>), | ||||
| and establish the INVITE dialog usage | ||||
| (<xref target="dialog-est" format="default"/>) | ||||
| such that they can incrementally trickle candidates | ||||
| (<xref target="info-sdp" format="default"/>). | ||||
| </t> | ||||
| <section anchor="InitialOA" numbered="true" toc="default"> | ||||
| <name>Initial Offer/Answer Exchange</name> | ||||
| <section anchor="IniOS" numbered="true" toc="default"> | ||||
| <name>Sending the Initial Offer</name> | ||||
| <t> | ||||
| If the Offerer includes candidates in its initial Offer, | ||||
| it <bcp14>MUST</bcp14> encode these candidates as specified in | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. | ||||
| </t> | ||||
| <t>If the Offerer wants to send its initial Offer | ||||
| before knowing any candidate for one or more media descriptions | ||||
| , | ||||
| it <bcp14>MUST</bcp14> set the port to the default value '9' f | ||||
| or these media descriptions. | ||||
| If the Offerer does not want to include the | ||||
| host IP address in the corresponding c-line, | ||||
| e.g., due to privacy reasons, | ||||
| it <bcp14>SHOULD</bcp14> include a default address in the c-lin | ||||
| e, | ||||
| which is set to the IPv4 address 0.0.0.0 or | ||||
| to the IPv6 equivalent ::. | ||||
| </t> | ||||
| <t> | ||||
| In this case, the Offerer obviously cannot know the RTP Control | ||||
| Protocol (RTCP) transport address and, | ||||
| thus, <bcp14>MUST NOT</bcp14> include the "a=rtcp" attribute < | ||||
| xref target="RFC6086" format="default"/>. | ||||
| This avoids potential ICE mismatch | ||||
| (see <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default | ||||
| "/>) for the RTCP transport address. | ||||
| </t> | ||||
| <t> | ||||
| If the Offerer wants to use RTCP multiplexing | ||||
| <xref target="RFC5761" format="default"/> | ||||
| and/or exclusive RTCP multiplexing | ||||
| <xref target="I-D.ietf-mmusic-mux-exclusive" format="default"/> | ||||
| , | ||||
| it still will include the "a=rtcp-mux" and/or | ||||
| "a=rctp-mux-only" attribute | ||||
| in the initial Offer. | ||||
| </t> | ||||
| <t> | ||||
| In any case, the Offerer <bcp14>MUST</bcp14> include | ||||
| the attribute "a=ice-options:trickle" in accordance to | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> and | ||||
| <bcp14>MUST</bcp14> include in each "m=" line a "a=mid:" attribu | ||||
| te | ||||
| in accordance to <xref target="RFC5888" format="default"/>. | ||||
| The "a=mid:" attribute identifies the "m=" line | ||||
| to which a candidate belongs and | ||||
| helps in case of multiple "m=" lines, | ||||
| when candidate gathering could occur in a order different | ||||
| from the order of the "m=" lines. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="IniOR" numbered="true" toc="default"> | ||||
| <name>Receiving the Initial Offer</name> | ||||
| <t> | ||||
| If the initial Offer included candidates, | ||||
| the Answerer uses these candidates to start ICE processing | ||||
| as specified in <xref target="I-D.ietf-ice-trickle" format="def | ||||
| ault"/>. | ||||
| </t> | ||||
| <t> | ||||
| If the initial Offer included the attribute "a=ice-options:tric | ||||
| kle", | ||||
| the Answerer <bcp14>MUST</bcp14> be prepared for receiving tric | ||||
| kled candidates later on. | ||||
| </t> | ||||
| <t> | ||||
| In case of a "m/c=" line with default values, | ||||
| none of the eventually trickled candidates | ||||
| will match the default destination. | ||||
| This situation <bcp14>MUST NOT</bcp14> cause an ICE mismatch | ||||
| (see <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default | ||||
| "/>). | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="IniAS" numbered="true" toc="default"> | ||||
| <name>Sending the Initial Answer</name> | ||||
| <t> | ||||
| If the Answerer includes candidates in its initial Answer, | ||||
| it <bcp14>MUST</bcp14> encode these candidates as specified in | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. | ||||
| </t> | ||||
| <t>If the Answerer wants to send its initial Answer | ||||
| before knowing any candidate for one or more media descriptions | ||||
| , | ||||
| it <bcp14>MUST</bcp14> set the port to the default value '9' f | ||||
| or these media descriptions. | ||||
| If the Answerer does not want to include the | ||||
| host IP address in the corresponding c-line, | ||||
| e.g., due to privacy reasons, | ||||
| it <bcp14>SHOULD</bcp14> include a default address in the c-lin | ||||
| e, | ||||
| which is set to the IPv4 address 0.0.0.0 or | ||||
| to the IPv6 equivalent ::. | ||||
| </t> | ||||
| <t> | ||||
| In this case, the Answerer obviously cannot know the RTCP trans | ||||
| port address and, | ||||
| thus, <bcp14>MUST NOT</bcp14> include the "a=rtcp" attribute < | ||||
| xref target="RFC6086" format="default"/>. | ||||
| This avoids potential ICE mismatch | ||||
| (see <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default | ||||
| "/>) for the RTCP transport address. | ||||
| </t> | ||||
| <t> | ||||
| If the Answerer accepts the use of RTCP multiplexing | ||||
| <xref target="RFC5761" format="default"/> | ||||
| and/or exclusive RTCP multiplexing | ||||
| <xref target="I-D.ietf-mmusic-mux-exclusive" format="default"/> | ||||
| , | ||||
| it will include the "a=rtcp-mux" attribute | ||||
| in the initial Answer. | ||||
| </t> | ||||
| <t> | ||||
| In any case, the Answerer <bcp14>MUST</bcp14> include | ||||
| the attribute "a=ice-options:trickle" in accordance to | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> and | ||||
| <bcp14>MUST</bcp14> include in each "m=" line | ||||
| a "a=mid:" attribute in accordance to | ||||
| <xref target="RFC5888" format="default"/>. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="IniAR" numbered="true" toc="default"> | ||||
| <name>Receiving the Initial Answer</name> | ||||
| <t> | ||||
| If the initial Answer included candidates, | ||||
| the Offerer uses these candidates to start ICE processing | ||||
| as specified in <xref target="I-D.ietf-ice-trickle" format="def | ||||
| ault"/>. | ||||
| </t> | ||||
| <t> | ||||
| In case of a "m/c=" line with default values, | ||||
| none of the eventually trickled candidates | ||||
| will match the default destination. | ||||
| This situation <bcp14>MUST NOT</bcp14> cause an ICE mismatch | ||||
| (see <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default | ||||
| "/>). | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="subsOA" numbered="true" toc="default"> | ||||
| <name>Subsequent Offer/Answer Exchanges</name> | ||||
| <t> | ||||
| Subsequent Offer/Answer exchanges are handled | ||||
| the same as regular ICE (see <xref target="I-D.ietf-mmusic-ice-sip-s | ||||
| dp" sectionFormat="of" section="4.2"/>). | ||||
| </t> | ||||
| <t> If an Offer or Answer needs to be sent while the ICE agents | ||||
| are in the middle of trickling, | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" sectionFormat="of" sectio | ||||
| n="3.2"/> applies. | ||||
| This means that an ICE agent includes candidate attributes | ||||
| for all local candidates it had trickled previously | ||||
| for a specific media stream. | ||||
| </t> | ||||
| <t> | ||||
| [RFC EDITOR NOTE: The section 3.2 in above sentence is correct for version 20 o | ||||
| f said I-D. | ||||
| Authors need to cross-check during Auth48 since it could have have changed in t | ||||
| he meantime.] | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="dialog-est" numbered="true" toc="default"> | ||||
| <name>Establishing the Dialog</name> | ||||
| <t> | ||||
| In order to be able to start trickling, the | ||||
| following two conditions need to be satisfied at the SIP UAs: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| Trickle ICE support at the peer agent <bcp14>MUST</bcp14> be confi | ||||
| rmed. | ||||
| </li> | ||||
| <li> | ||||
| A dialog <bcp14>MUST</bcp14> have been created between the peers. | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| <xref target="disco" format="default"/> discusses in detail the variou | ||||
| s options | ||||
| for satisfying the first of the above conditions. However, regardless | ||||
| of those mechanisms, agents are certain to have a | ||||
| clear understanding of whether their peers support trickle | ||||
| ICE once an Offer and an Answer have been exchanged, | ||||
| which also allows for ICE processing to commence | ||||
| (see <xref target="offerer-can-trickle" format="default"/>). | ||||
| </t> | ||||
| <section anchor="relprov" numbered="true" toc="default"> | ||||
| <name>Establishing Dialog State through Reliable Offer/Answer Delivery | ||||
| </name> | ||||
| <figure anchor="offerer-can-trickle"> | ||||
| <name>A SIP Offerer can freely trickle as soon as it receives an Ans | ||||
| wer</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Alice Bob | ||||
| | | | ||||
| | INVITE (Offer) | | ||||
| |------------------------>| | ||||
| | 183 (Answer) | | ||||
| |<------------------------| | ||||
| | PRACK/OK | | ||||
| |------------------------>| | ||||
| | | | ||||
| +----------------------------------------+ | ||||
| |Alice and Bob know that both can trickle| | ||||
| |and know that the dialog is in the early| | ||||
| |state. Send INFO! | | ||||
| +----------------------------------------+ | ||||
| | | | ||||
| | INFO/OK (+SRFLX Cand.) | | ||||
| |------------------------>| | ||||
| | INFO/OK (+SRFLX Cand.) | | ||||
| |<------------------------| | ||||
| | | | ||||
| Note: SRFLX denotes server-reflexive candidates]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| As shown in <xref target="offerer-can-trickle" format="default"/>, | ||||
| satisfying both conditions is relatively trivial for | ||||
| ICE Agents that have sent an Offer in an INVITE and that have | ||||
| received an Answer in a reliable provisional response. | ||||
| It is guaranteed to have confirmed support (or lack thereof) for | ||||
| Trickle ICE at the Answerer and to have | ||||
| fully initialized the SIP dialog at both ends. | ||||
| Offerers and Answerers (after receipt of the PRACK request) | ||||
| in the above situation can therefore | ||||
| freely commence trickling within the newly established dialog. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="unrelprov" numbered="true" toc="default"> | ||||
| <name>Establishing Dialog State through Unreliable Offer/Answer Delive | ||||
| ry</name> | ||||
| <t> | ||||
| The situation is a bit more delicate for agents that have | ||||
| received an Offer in an INVITE request and have sent an Answer | ||||
| in an unreliable provisional response because, once the | ||||
| response has been sent, the Answerer does not | ||||
| know when or if it has been received | ||||
| (<xref target="answerer-cant-trickle" format="default"/>). | ||||
| </t> | ||||
| <figure anchor="answerer-cant-trickle"> | ||||
| <name>A SIP UA that sent an Answer in an unreliable provisional resp | ||||
| onse does not know if it was received or if the dialog at the side of the Offere | ||||
| r has entered the early state</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Alice Bob | ||||
| | | | ||||
| | INVITE (Offer) | | ||||
| |------------------------>| | ||||
| | 183 (Answer) | | ||||
| |<------------------------| | ||||
| | | | ||||
| | +----------------------+ | ||||
| | |Bob: I don't know if | | ||||
| | |Alice got my 183 or if| | ||||
| | |her dialog is already | | ||||
| | |in the early state. | | ||||
| | | Can I send INFO??? | | ||||
| | +----------------------+ | ||||
| | | ]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| In order to clear this ambiguity as soon as possible, | ||||
| the Answerer needs to retransmit the provisional response | ||||
| with the exponential backoff timers described in | ||||
| <xref target="RFC3262" format="default"/>. | ||||
| These retransmissions <bcp14>MUST</bcp14> cease on receipt | ||||
| of an INFO request carrying a 'trickle-ice' Info Package body, | ||||
| on receipt of any other in-dialog request from the offerer, or | ||||
| on transmission of the Answer in a 2xx response. | ||||
| The offerer cannot send in-dialog requests until it receives | ||||
| a response, so the arrival of such a request proves that | ||||
| the response has arrived. | ||||
| Using the INFO request for dialog confirmation | ||||
| is similar to the procedure described in | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" sectionFormat="of" sectio | ||||
| n="6.1.1"/>, except that | ||||
| the STUN binding Request is replaced by the INFO request. | ||||
| </t> | ||||
| <t> | ||||
| [RFC EDITOR NOTE: The section 6.1.1 in above sentence is correct for version 20 | ||||
| of said I-D. | ||||
| Authors need to cross-check during Auth48 since it could have have changed in t | ||||
| he meantime.] | ||||
| </t> | ||||
| <t> | ||||
| The Offerer <bcp14>MUST</bcp14> send a Trickle ICE INFO request as s | ||||
| oon as | ||||
| it receives an SDP Answer in an unreliable provisional | ||||
| response. This INFO request <bcp14>MUST</bcp14> repeat the candidate | ||||
| s | ||||
| that were already provided in the Offer (as would be the case | ||||
| when Half Trickle is performed or when new candidates have not | ||||
| been learned since then). | ||||
| The first case could happen when Half Trickle is used and | ||||
| all candidate are already in the initial offer. | ||||
| The second case could happen when Full Trickle is used and | ||||
| the offerer is currently gathering additional candidates | ||||
| but did not yet get them. | ||||
| Also, if the initial Offer did not contain any candidates, | ||||
| depending on how the Offerer gathers its candidates and | ||||
| how long it takes to do so, this INFO could still contain no candida | ||||
| tes. | ||||
| </t> | ||||
| <t> | ||||
| When Full Trickle is used and if newly learned candidates | ||||
| are available, the Offerer <bcp14>SHOULD</bcp14> also deliver | ||||
| these candidates in said INFO request, | ||||
| unless it wants to hold back some candidates in reserve, | ||||
| e.g., in case these candidates | ||||
| are expensive to use and would only be trickled | ||||
| if all other candidates failed. | ||||
| </t> | ||||
| <t> | ||||
| The Offerer <bcp14>SHOULD</bcp14> include an end-of-candidates attri | ||||
| bute | ||||
| in case candidate discovery has ended in the meantime | ||||
| and no further candidates are to be trickled. | ||||
| </t> | ||||
| <t> | ||||
| As soon as an Answerer has received such an INFO request, | ||||
| the Answerer has an indication that a dialog is established | ||||
| at both ends and can begin trickling | ||||
| (<xref target="answerer-can-now-trickle" format="default"/>). | ||||
| </t> | ||||
| <t> | ||||
| Note: The +SRFLX in | ||||
| <xref target="answerer-can-now-trickle" format="default"/> | ||||
| indicates that additionally newly learned server-reflexive candidat | ||||
| es are included. | ||||
| </t> | ||||
| <figure anchor="answerer-can-now-trickle"> | ||||
| <name>A SIP UA that received an INFO request after sending an unreli | ||||
| able provisional response knows that the dialog at th | ||||
| e side of the receiver has entered the early state</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Alice Bob | ||||
| | | | ||||
| | INVITE (Offer) | | ||||
| |------------------------>| | ||||
| | 183 (Answer) | | ||||
| |<------------------------| | ||||
| | INFO/OK (+SRFLX Cand.) | | ||||
| |------------------------>| | ||||
| | | | ||||
| | +----------------------+ | ||||
| | |Bob: Now I know Alice| | ||||
| | | is ready. Send INFO! | | ||||
| | +----------------------+ | ||||
| | INFO/OK (+SRFLX Cand.) | | ||||
| |<------------------------| | ||||
| | | | ||||
| | 200/ACK (Answer) | | ||||
| |<------------------------| | ||||
| Note: SRFLX denotes server-reflexive candidates ]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| When sending the Answer in the 200 OK response to the INVITE request, | ||||
| the Answerer needs to repeat | ||||
| exactly the same Answer that was previously sent | ||||
| in the unreliable provisional | ||||
| response in order to fulfill the corresponding requirements in | ||||
| <xref target="RFC3264" format="default"/>. | ||||
| Thus, the Offerer needs to be prepared | ||||
| for receiving a different number of candidates | ||||
| in that repeated Answer than previously exchanged via trickling | ||||
| and <bcp14>MUST</bcp14> ignore the candidate information | ||||
| in that 200 OK response. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="head-start" numbered="true" toc="default"> | ||||
| <name>Initiating Trickle ICE without an SDP Answer</name> | ||||
| <t> | ||||
| The ability to convey arbitrary candidates in INFO | ||||
| message bodies allows ICE Agents to initiate trickling | ||||
| without actually sending an Answer. | ||||
| Trickle ICE Agents can therefore respond to an INVITE request | ||||
| with provisional responses without an SDP Answer | ||||
| <xref target="RFC3261" format="default"/>. | ||||
| Such provisional responses serve for establishing an early dialog. | ||||
| </t> | ||||
| <t> | ||||
| Agents that choose to establish the dialog in this way | ||||
| <bcp14>MUST</bcp14> retransmit these responses | ||||
| with the exponential backoff timers described in | ||||
| <xref target="RFC3262" format="default"/>. | ||||
| These retransmissions <bcp14>MUST</bcp14> cease on receipt | ||||
| of an INFO request carrying a 'trickle-ice' Info Package body, | ||||
| on receipt of any in-dialog request from the offerer, or | ||||
| on transmission of the Answer in a 2xx response. | ||||
| The offerer cannot send in-dialog requests until it receives | ||||
| a response, so the arrival of such a request proves that | ||||
| the response has arrived. | ||||
| This is again similar to the procedure described in | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" sectionFormat="of" sectio | ||||
| n="6.1.1"/>, | ||||
| except that an Answer is not yet provided. | ||||
| </t> | ||||
| <t> | ||||
| [RFC EDITOR NOTE: The section 6.1.1 in above sentence is correct for version 20 | ||||
| of said I-D. | ||||
| Authors need to cross-check during Auth48 since it could have have changed in t | ||||
| he meantime.] | ||||
| </t> | ||||
| <t> | ||||
| Note: The +SRFLX in | ||||
| <xref target="can-now-trickle-unrelprov" format="default"/> | ||||
| indicates that additional newly learned server-reflexive candidates | ||||
| are included. | ||||
| </t> | ||||
| <figure anchor="can-now-trickle-unrelprov"> | ||||
| <name>A SIP UA sends an unreliable provisional response without an | ||||
| Answer for establishing an early dialog</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Alice Bob | ||||
| | | | ||||
| | INVITE (Offer) | | ||||
| |------------------------>| | ||||
| | 183 (-) | | ||||
| |<------------------------| | ||||
| | INFO/OK (SRFLX Cand.) | | ||||
| |------------------------>| | ||||
| | | | ||||
| | +----------------------+ | ||||
| | |Bob: Now I know again| | ||||
| | | that Alice is ready. | | ||||
| | | Send INFO! | | ||||
| | +----------------------+ | ||||
| | INFO/OK (SRFLX Cand.) | | ||||
| |<------------------------| | ||||
| | 183 (Answer) opt. | | ||||
| |<------------------------| | ||||
| | INFO/OK (SRFLX Cand.) | | ||||
| |<------------------------| | ||||
| | 200/ACK (Answer) | | ||||
| |<------------------------| | ||||
| Note: SRFLX denotes server-reflexive candidates]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| When sending the Answer, the agent <bcp14>MUST</bcp14> repeat all curren | ||||
| tly | ||||
| known and used candidates, if any, | ||||
| and <bcp14>MAY</bcp14> include all newly gathered candidates since the l | ||||
| ast INFO request was sent. | ||||
| However, if that Answer was already sent in a unreliable provisional res | ||||
| ponse, | ||||
| the Answerers <bcp14>MUST</bcp14> repeat | ||||
| exactly the same Answer in the 200 OK response to the INVITE request | ||||
| in order to fulfill the corresponding requirements in | ||||
| <xref target="RFC3264" format="default"/>. | ||||
| In case that trickling continued, | ||||
| an Offerer needs to be prepared for receiving fewer candidates | ||||
| in that repeated Answer than previously exchanged via trickling | ||||
| and <bcp14>MUST</bcp14> ignore the candidate information in that 200 OK | ||||
| response. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="info-sdp" numbered="true" toc="default"> | ||||
| <name>Delivering Candidates in INFO Requests</name> | ||||
| <t> | ||||
| Whenever new ICE candidates become available for sending, | ||||
| agents encode them in "a=candidate:" attributes as described | ||||
| by <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. For ex | ||||
| ample: | ||||
| </t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| a=candidate:1 1 UDP 2130706432 200a0b:12f0::1 5000 typ host ]]></artwork> | ||||
| <t> | ||||
| The use of SIP INFO requests happens within the context of the | ||||
| Info Package as defined in <xref target="info-package" format="default | ||||
| "/>. | ||||
| The media type | ||||
| <xref target="RFC6838" format="default"/> | ||||
| for their payload <bcp14>MUST</bcp14> be set to | ||||
| 'application/trickle-ice-sdpfrag' as defined in | ||||
| <xref target="trickle_ice_sdpfrag_def" format="default"/>. | ||||
| The Info request body adheres to the grammar as specified in | ||||
| <xref target="trickle_ice_sdpfrag_grammar" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| Since neither the "a=candidate:" nor the "a=end-of-candidates" | ||||
| attributes contain information that would allow correlating them to | ||||
| a specific "m=" line, | ||||
| it is handled through the use of | ||||
| pseudo "m=" lines. | ||||
| </t> | ||||
| <t> | ||||
| Pseudo "m=" lines follow the SDP syntax for "m=" lines as | ||||
| defined in | ||||
| <xref target="RFC4566" format="default"/> and are linked to the corres | ||||
| ponding "m=" line | ||||
| in the SDP Offer or Answer via the identification tag | ||||
| in a "a=mid:" attribute | ||||
| <xref target="RFC5888" format="default"/>. | ||||
| A pseudo "m=" line does not provide semantics other | ||||
| than indicating to which "m=" line a candidate belongs. | ||||
| Consequently, the receiving agent <bcp14>MUST</bcp14> ignore any remai | ||||
| ning content of the pseudo "m=" line, | ||||
| which is not defined in this document. | ||||
| This guarantees that the 'application/trickle-ice-sdpfrag' bodies do | ||||
| not interfere with the Offer/Answer | ||||
| procedures as specified in <xref target="RFC3264" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| When sending the INFO request, the agent <bcp14>MAY</bcp14>, | ||||
| if already known to the agent, include the same content into | ||||
| the pseudo "m=" line as for the "m=" line in the corresponding Offer or | ||||
| Answer. | ||||
| However, since Trickle-ICE might be decoupled from the Offer/Answer nego | ||||
| tiation, the content might | ||||
| be unknown to the agent. In this case, the agent <bcp14>MUST</bcp14> inc | ||||
| lude the following default values: | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| The media field is set to 'audio'. | ||||
| </li> | ||||
| <li> | ||||
| The port value is set to '9'. | ||||
| </li> | ||||
| <li> | ||||
| The proto value is set to 'RTP/AVP'. | ||||
| </li> | ||||
| <li> | ||||
| The fmt field <bcp14>MUST</bcp14> appear only once and is set to ' | ||||
| 0'. | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Agents <bcp14>MUST</bcp14> include a pseudo "m=" line and an | ||||
| identification tag in a "a=mid:" attribute for every "m=" line | ||||
| whose candidate list they intend to update. | ||||
| Such "a=mid:" attributes <bcp14>MUST</bcp14> | ||||
| immediately precede the list of candidates for that specific | ||||
| "m=" line. | ||||
| </t> | ||||
| <t> | ||||
| All "a=candidate:" or "a=end-of-candidates" attributes | ||||
| following an "a=mid:" attribute, up until (and excluding) the next | ||||
| occurrence of a pseudo "m=" line, pertain to the "m=" line | ||||
| identified by that identification tag. | ||||
| </t> | ||||
| <t> | ||||
| Note, that there is no requirement that the Info request body | ||||
| contains as many pseudo "m=" lines as the Offer/Answer | ||||
| contains "m=" lines, nor that the pseudo "m=" lines be in the same | ||||
| order as the "m=" lines that they pertain to. | ||||
| The correspondence can be made via the "a=mid:" attributes | ||||
| since candidates are grouped in sections headed | ||||
| by "pseudo" "m=" lines. | ||||
| These sections contain "a=mid:" attribute values that point | ||||
| back to the true "m=" line. | ||||
| </t> | ||||
| <t> | ||||
| An "a=end-of-candidates" attribute, preceding | ||||
| the first pseudo "m=" line, indicates the end of all trickling | ||||
| from that agent, | ||||
| as opposed to end of trickling for a specific "m=" line, | ||||
| which would be indicated by a media-level | ||||
| "a=end-of-candidates" attribute. | ||||
| </t> | ||||
| <t> | ||||
| Refer to | ||||
| <xref target="INFOexample" format="default"/> | ||||
| for an example of the INFO request content. | ||||
| </t> | ||||
| <t> | ||||
| The use of pseudo "m=" lines allows for a structure similar to | ||||
| the one in SDP Offers and Answers where | ||||
| separate media-level and session-level sections can be distinguished. | ||||
| In the current case, lines preceding the first | ||||
| pseudo "m=" line are considered to be session level. | ||||
| Lines appearing in between or after | ||||
| pseudo "m=" lines will be interpreted as media level. | ||||
| </t> | ||||
| <aside><t>Note that while this specification uses the "a=mid:" | ||||
| attribute from <xref target="RFC5888" format="default"/>, it does | ||||
| not | ||||
| define any grouping semantics.</t></aside> | ||||
| <!--Note: I marked the above text as an aside; if that's not ideal, you can reve | ||||
| rt to the coding below--> | ||||
| <!-- <ul empty="true" spacing="normal"> | ||||
| <li> | ||||
| Note that while this specification uses the "a=mid:" | ||||
| attribute from <xref target="RFC5888" format="default"/>, it does | ||||
| not | ||||
| define any grouping semantics. | ||||
| </li> | ||||
| </ul>--> | ||||
| <t> | ||||
| All INFO requests <bcp14>MUST</bcp14> carry the "a=ice-pwd:" and "a=ic | ||||
| e-ufrag:" | ||||
| attributes that allow mapping them to a specific ICE generation. | ||||
| An agent <bcp14>MUST</bcp14> discard any received INFO requests contai | ||||
| ning "a=ice-pwd:" and "a=ice-ufrag:" | ||||
| attributes that do not match those of the current ICE Negotiation Sess | ||||
| ion. | ||||
| </t> | ||||
| <t> | ||||
| The "a=ice-pwd:" and "a=ice-ufrag:" attributes <bcp14>MUST</bcp14> app | ||||
| ear at the same level | ||||
| as the ones in the Offer/Answer exchange. | ||||
| In other words, if they were present | ||||
| as session-level attributes, they will also appear | ||||
| at the beginning of all INFO request payloads, i.e., preceding | ||||
| the first pseudo "m=" line. | ||||
| If they were originally exchanged as media-level | ||||
| attributes, potentially overriding session-level values, | ||||
| then they will also be included in INFO request payloads | ||||
| following the corresponding pseudo "m=" lines. | ||||
| </t> | ||||
| <t> | ||||
| Note that <xref target="I-D.ietf-ice-trickle" format="default"/> requi | ||||
| res that | ||||
| when candidates are trickled, each candidate must be delivered | ||||
| to the receiving Trickle ICE implementation not more than once | ||||
| and in the same order as it was conveyed. | ||||
| If the signaling protocol provides any candidate retransmissions, | ||||
| they need to be hidden from the ICE implementation. | ||||
| This requirement is fulfilled as follows. | ||||
| </t> | ||||
| <t> | ||||
| Since the agent is not fully aware of the state of the ICE Negotiation | ||||
| Session at its peer, | ||||
| it <bcp14>MUST</bcp14> include all currently known and used local cand | ||||
| idates in every INFO request. | ||||
| That is, the agent <bcp14>MUST</bcp14> repeat in the INFO request body | ||||
| all candidates that were previously sent under the same | ||||
| combination of "a=ice-pwd:" and "a=ice-ufrag:" | ||||
| in the same order as they were sent before. | ||||
| In other words, the sequence of a previously sent | ||||
| list of candidates <bcp14>MUST NOT</bcp14> change in subsequent INFO r | ||||
| equests, | ||||
| and newly gathered candidates <bcp14>MUST</bcp14> be added | ||||
| at the end of that list. | ||||
| Although repeating all candidates creates some overhead, it also allow | ||||
| s easier handling of problems | ||||
| that could arise from unreliable transports like, e.g., loss of messag | ||||
| es and reordering, | ||||
| which can be detected through the CSeq: header field in the INFO reque | ||||
| st. | ||||
| </t> | ||||
| <t> | ||||
| In addition, an ICE agent needs to adhere to | ||||
| <xref target="I-D.ietf-ice-trickle" sectionFormat="of" section="17"/> | ||||
| on preserving candidate order while trickling. | ||||
| </t> | ||||
| <t> | ||||
| When receiving INFO requests carrying any candidates, agents | ||||
| <bcp14>MUST</bcp14> first identify and discard the attribute lines | ||||
| containing candidates they have already received in previous | ||||
| INFO requests or in the Offer/Answer exchange preceding them. | ||||
| </t> | ||||
| <t> Such candidates are considered to be equal if their IP address | ||||
| port, transport, and component ID are the same. | ||||
| After identifying and discarding the known candidates, | ||||
| the agents <bcp14>MUST</bcp14> forward the actually new candidates to | ||||
| the ICE Agents | ||||
| in the same order as they were received in the INFO request body. | ||||
| The ICE Agents will then process the new candidates | ||||
| according to the rules described in <xref target="I-D.ietf-ice-trickle | ||||
| " format="default"/>. | ||||
| </t> | ||||
| <t> Receiving an "a=end-of-candidates" attribute in an INFO request body | ||||
| -- with the "a=ice-ufrag" and "a=ice-pwd" attributes matching the curren | ||||
| t ICE generation -- | ||||
| is an indication from the peer agent that it will not send any further c | ||||
| andidates. | ||||
| When included at the session level, i.e., before any pseudo "m=" line, | ||||
| this indication applies to the whole session; | ||||
| when included at the media level, the indication applies | ||||
| only to the corresponding "m=" line. | ||||
| Handling of such end-of-candidates indications is defined in | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| The example in <xref target="INFOexample" format="default"/> shows the | ||||
| content | ||||
| of a candidate delivering INFO request. In the example, the | ||||
| "a=end-of-candidates" attributes indicate that | ||||
| the candidate gathering is finished and | ||||
| that no further INFO requests follow. | ||||
| </t> | ||||
| <figure anchor="INFOexample"> | ||||
| <name>An Example for the Content of an INFO Request</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| INFO sip:alice@example.com SIP/2.0 | ||||
| ... | ||||
| Info-Package: trickle-ice | ||||
| Content-type: application/trickle-ice-sdpfrag | ||||
| Content-Disposition: Info-Package | ||||
| Content-length: 862 | ||||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | ||||
| a=ice-ufrag:8hhY | ||||
| m=audio 9 RTP/AVP 0 | ||||
| a=mid:1 | ||||
| a=candidate:1 1 UDP 2130706432 2001:db8:a0b:12f0::1 5000 typ host | ||||
| a=candidate:1 2 UDP 2130706432 2001:db8:a0b:12f0::1 5001 typ host | ||||
| a=candidate:1 1 UDP 2130706431 192.0.2.1 5010 typ host | ||||
| a=candidate:1 2 UDP 2130706431 192.0.2.1 5011 typ host | ||||
| a=candidate:2 1 UDP 1694498815 192.0.2.3 5010 typ srflx | ||||
| raddr 192.0.2.1 rport 8998 | ||||
| a=candidate:2 2 UDP 1694498815 192.0.2.3 5011 typ srflx | ||||
| raddr 192.0.2.1 rport 8998 | ||||
| a=end-of-candidates | ||||
| m=audio 9 RTP/AVP 0 | ||||
| a=mid:2 | ||||
| a=candidate:1 1 UDP 2130706432 2001:db8:a0b:12f0::1 6000 typ host | ||||
| a=candidate:1 2 UDP 2130706432 2001:db8:a0b:12f0::1 6001 typ host | ||||
| a=candidate:1 1 UDP 2130706431 192.0.2.1 6010 typ host | ||||
| a=candidate:1 2 UDP 2130706431 192.0.2.1 6011 typ host | ||||
| a=candidate:2 1 UDP 1694498815 192.0.2.3 6010 typ srflx | ||||
| raddr 192.0.2.1 rport 9998 | ||||
| a=candidate:2 2 UDP 1694498815 192.0.2.3 6011 typ srflx | ||||
| raddr 192.0.2.1 rport 9998 | ||||
| a=end-of-candidates | ||||
| Note: In a real INFO request, there will be no line breaks | ||||
| in the "a=candidate:" attributes ]]></artwork> | ||||
| </figure> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="disco" numbered="true" toc="default"> | ||||
| <name>Initial Discovery of Trickle ICE Support</name> | ||||
| <t> | ||||
| SIP UAs are required by <xref target="I-D.ietf-ice-trickle" format="def | ||||
| ault"/> to indicate their support of and intent to use Trickle ICE in their Offe | ||||
| rs and Answers using the atrribute "a=ice-options:trickle", and they <bcp14>MUST | ||||
| </bcp14> include the SIP option-tag "trickle-ice" in | ||||
| a SIP Supported: or Require: header field. | ||||
| This makes discovery | ||||
| fairly straightforward for Answerers or for cases where | ||||
| Offers need to be generated within existing dialogs (i.e., | ||||
| when sending UPDATE or re-INVITE requests). | ||||
| In both scenarios, prior | ||||
| SDP bodies will have provided the necessary information. | ||||
| </t> | ||||
| <t> | ||||
| Obviously, such information is not available at the time a first | ||||
| Offer is being constructed and it is therefore impossible | ||||
| for ICE Agents to determine support for incremental | ||||
| provisioning that way. The following options are suggested as | ||||
| ways of addressing this issue. | ||||
| </t> | ||||
| <section anchor="disco-prov" numbered="true" toc="default"> | ||||
| <name>Provisioning Support for Trickle ICE</name> | ||||
| <t> | ||||
| In certain situations, it may be possible for integrators | ||||
| deploying Trickle ICE to know in advance that some or all | ||||
| endpoints reachable from within the deployment will support | ||||
| Trickle ICE. | ||||
| This is the case, for example, if Session Border Controllers | ||||
| (SBCs) with support for this specification are used | ||||
| to connect to UAs that do not support Trickle ICE. | ||||
| </t> | ||||
| <t> | ||||
| While the exact mechanism for allowing such provisioning | ||||
| is out of scope here, this specification encourages trickle | ||||
| ICE implementations to allow the option in the way they find | ||||
| most appropriate. | ||||
| </t> | ||||
| <t> | ||||
| However, an Offerer assuming Trickle ICE support <bcp14>MUST</bcp14> | ||||
| include a SIP Require: trickle-ice header field. | ||||
| That way, if the provisioned assumption of Trickle ICE support | ||||
| ends up being incorrect, the failure is (a) operationally | ||||
| easy to track down, and (b) recoverable by the client, | ||||
| i.e., they can re-send the request without the | ||||
| SIP Require: header field and without | ||||
| the assumption of Trickle ICE support. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="disco-gruu" numbered="true" toc="default"> | ||||
| <name>Trickle ICE Discovery with Globally Routable User Agent URIs (GRUU | ||||
| s)</name> | ||||
| <t> | ||||
| <xref target="RFC3840" format="default"/> provides a way for SIP UAs | ||||
| to query for support of specific capabilities using, among | ||||
| others, OPTIONS requests. On the other hand, support for | ||||
| GRUU according to | ||||
| <xref target="RFC5627" format="default"/> | ||||
| allows SIP requests to be addressed to specific UAs (as | ||||
| opposed to arbitrary instances of an address of record). | ||||
| Combining the two and using the "trickle-ice" option tag | ||||
| defined in <xref target="option-tag" format="default"/> provides SIP | ||||
| UAs with | ||||
| a way of learning the capabilities of specific SIP UA instances | ||||
| and then addressing them directly with INVITE requests that | ||||
| require Trickle ICE support. | ||||
| </t> | ||||
| <t> | ||||
| Such learning of capabilities may happen in different ways. | ||||
| One option for a SIP UA is to learn the | ||||
| GRUU instance ID of a peer through presence and then to query | ||||
| its capabilities with an OPTIONS request. | ||||
| Alternatively, it can also just send an OPTIONS request to | ||||
| the Address of Record (AOR) it intends to contact and then inspect t | ||||
| he returned | ||||
| response(s) for support of both GRUU and Trickle ICE | ||||
| (<xref target="options-gruu" format="default"/>). | ||||
| It is noted that using the GRUU means that the INVITE request | ||||
| can go only to that particular device. | ||||
| This prevents the use of forking for that request. | ||||
| </t> | ||||
| <figure anchor="options-gruu"> | ||||
| <name>Trickle ICE Support Discovery with OPTIONS and GRUU</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| Alice Bob | ||||
| | | | ||||
| | OPTIONS sip:b1@example.com SIP/2.0 | | ||||
| |-------------------------------------------------->| | ||||
| | | | ||||
| | 200 OK | | ||||
| | Contact: sip:b1@example.com;gr=hha9s8d-999a | | ||||
| | ;audio;video|;trickle-ice;... | | ||||
| |<--------------------------------------------------| | ||||
| | | | ||||
| | INVITE sip:b1@example.com;gr=hha9s8d-999a SIP/2.0 | | ||||
| | Supported: trickle-ice | | ||||
| | (Offer) | | ||||
| |-------------------------------------------------->| | ||||
| | | | ||||
| | 183 (Answer) | | ||||
| |<--------------------------------------------------| | ||||
| | INFO/OK (Trickling) | | ||||
| |<------------------------------------------------->| | ||||
| | | | ||||
| | ... | | ||||
| | |]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| Confirming support for Trickle ICE through | ||||
| <xref target="RFC3840" format="default"/> gives SIP UAs the option t | ||||
| o engage | ||||
| in Full Trickle negotiation (as opposed to the more lengthy | ||||
| Half Trickle) from the very first Offer they send. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="half-full-trickle" numbered="true" toc="default"> | ||||
| <name>Fallback to Half Trickle</name> | ||||
| <t> | ||||
| In cases where none of the other mechanisms in this section | ||||
| are acceptable, SIP UAs should use the Half Trickle mode | ||||
| defined in <xref target="I-D.ietf-ice-trickle" format="default"/>. | ||||
| With Half Trickle, agents initiate sessions the same way | ||||
| they would when using ICE for SIP | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>. | ||||
| This means that, prior to actually sending an Offer, agents | ||||
| first gather ICE candidates in a blocking way and then | ||||
| send them all in that Offer. The blocking nature of the | ||||
| process implies that some amount of latency will | ||||
| be accumulated, and it is advised that agents try to | ||||
| anticipate it where possible, for example, when user | ||||
| actions indicate a high likelihood for an imminent call | ||||
| (e.g., activity on a keypad or a phone going off hook). | ||||
| </t> | ||||
| <t> | ||||
| Using Half Trickle results in Offers that are | ||||
| compatible with both ICE SIP endpoints and legacy | ||||
| <xref target="RFC3264" format="default"/> endpoints. | ||||
| </t> | ||||
| <figure anchor="fig-half-trickle"> | ||||
| <name>Example of a Typical (Half) Trickle ICE Exchange with SIP</name> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| STUN/TURN STUN/TURN | ||||
| Servers Alice Bob Servers | ||||
| | | | | | ||||
| |<--------------| | | | ||||
| | | | | | ||||
| | | | | | ||||
| | Candidate | | | | ||||
| | | | | | ||||
| | | | | | ||||
| | Discovery | | | | ||||
| | | | | | ||||
| | | | | | ||||
| |-------------->| INVITE (Offer) | | | ||||
| | |---------------------------->| | | ||||
| | | 183 (Answer) |-------------->| | ||||
| | |<----------------------------| | | ||||
| | | INFO (repeated candidates) | | | ||||
| | |---------------------------->| | | ||||
| | | | | | ||||
| | | INFO (more candidates) | Candidate | | ||||
| | |<----------------------------| | | ||||
| | | Connectivity Checks | | | ||||
| | |<===========================>| Discovery | | ||||
| | | INFO (more candidates) | | | ||||
| | |<----------------------------| | | ||||
| | | Connectivity Checks |<--------------| | ||||
| | |<===========================>| | | ||||
| | | | | | ||||
| | | 200 OK | | | ||||
| | |<----------------------------| | | ||||
| | | | | | ||||
| | |<======= MEDIA FLOWS =======>| | | ||||
| | | | | ]]></artwork> | ||||
| </figure> | ||||
| <t> | ||||
| As a reminder, once a single Offer or Answer has | ||||
| been exchanged within a specific dialog, support for | ||||
| Trickle ICE will have been determined. | ||||
| No further use of Half Trickle will therefore be necessary | ||||
| within that same dialog, | ||||
| and all subsequent exchanges can use the Full Trickle mode | ||||
| of operation. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="rtcp-cons" numbered="true" toc="default"> | ||||
| <name>Considerations for RTP and RTCP Multiplexing</name> | ||||
| <t> | ||||
| The following consideration describes options for Trickle ICE | ||||
| in order to give some guidance to implementers on how trickling | ||||
| can be optimized with respect to providing RTCP candidates. | ||||
| </t> | ||||
| <t> | ||||
| Handling of the "a=rtcp" attribute <xref target="RFC3605" format="defaul | ||||
| t"/> | ||||
| and the "a=rtcp-mux" attribute for RTP/RTCP multiplexing <xref target="R | ||||
| FC5761" format="default"/> | ||||
| is already considered in | ||||
| <xref target="RFC8445" sectionFormat="of" section="5.1.1.1"/> and | ||||
| in <xref target="RFC5761" format="default"/>. | ||||
| These considerations are still valid for Trickle ICE; however, | ||||
| trickling provides more flexibility for the sequence of candidate exchan | ||||
| ge in case of RTCP multiplexing. | ||||
| </t> | ||||
| <t> | ||||
| [RFC EDITOR NOTE: The section 5.1.1.1 in above sentence is correct for version 1 | ||||
| 7 of said I-D. | ||||
| Authors need to cross-check during Auth48 since it could have have changed in th | ||||
| e meantime.] | ||||
| </t> | ||||
| <t> | ||||
| If the Offerer supports RTP/RTCP multiplexing exclusively as specified | ||||
| in <xref target="I-D.ietf-mmusic-mux-exclusive" format="default"/>, | ||||
| the procedures in that document apply for the handling of the "a=rtcp-mu | ||||
| x-only", "a=rtcp", and "a=rtcp-mux" attributes. | ||||
| </t> | ||||
| <t> | ||||
| While a Half Trickle Offerer has to send an Offer compliant to | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/> and <xref | ||||
| target="RFC5761" format="default"/> including candidates for all components, | ||||
| the flexibility of a Full Trickle Offerer allows | ||||
| to send only RTP candidates (component 1) in the initial Offer | ||||
| assuming that RTCP multiplexing is supported by the Answerer. | ||||
| A Full Trickle Offerer would need to start gathering and trickling | ||||
| RTCP candidates (component 2) | ||||
| only after having received an indication in the Answer that | ||||
| the Answerer unexpectedly does not support RTCP multiplexing. | ||||
| </t> | ||||
| <t> | ||||
| A Trickle Answerer <bcp14>MAY</bcp14> include an "a=rtcp-mux" attribute | ||||
| <xref target="RFC5761" format="default"/> in the application/trickle-ice | ||||
| -sdpfrag body | ||||
| if it supports and uses RTP and RTCP multiplexing. | ||||
| The Trickle Answerer needs to follow the guidance on the usage of the "a | ||||
| =rtcp" attribute as given in | ||||
| <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/> and | ||||
| <xref target="RFC3605" format="default"/>. | ||||
| Receipt of this attribute at the Offerer in an INFO request prior to the | ||||
| Answer | ||||
| indicates that the Answerer supports and uses RTP and RTCP multiplexing. | ||||
| The Offerer can use this information, e.g., for stopping the gathering o | ||||
| f RTCP candidates | ||||
| and/or for freeing corresponding resources. | ||||
| </t> | ||||
| <t> | ||||
| This behavior is illustrated by the following example Offer that indicat | ||||
| es support for RTP and RTCP multiplexing. | ||||
| </t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| v=0 | ||||
| o=alice 2890844526 2890844526 IN IP6 atlanta.example.com | ||||
| s= | ||||
| c=IN IP6 2001:db8:a0b:12f0::3 | ||||
| t=0 0 | ||||
| a=ice-pwd:777uzjYhagZgasd88fgpdd | ||||
| a=ice-ufrag:Yhh8 | ||||
| m=audio 5000 RTP/AVP 0 | ||||
| a=mid:1 | ||||
| a=rtcp-mux | ||||
| a=candidate:1 1 UDP 1658497328 2001:db8:a0b:12f0::3 5000 typ host]]></artw | ||||
| ork> | ||||
| <t> | ||||
| Once the dialog is established as described in <xref target="dialog-est" | ||||
| format="default"/>, the Answerer | ||||
| sends the following INFO request. | ||||
| </t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| INFO sip:alice@example.com SIP/2.0 | ||||
| ... | ||||
| Info-Package: trickle-ice | ||||
| Content-type: application/trickle-ice-sdpfrag | ||||
| Content-Disposition: Info-Package | ||||
| Content-length: 161 | ||||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | ||||
| a=ice-ufrag:8hhY | ||||
| m=audio 9 RTP/AVP 0 | ||||
| a=mid:1 | ||||
| a=rtcp-mux | ||||
| a=candidate:1 1 UDP 1658497382 2001:db8:a0b:12f0::4 6000 typ host ]]></art | ||||
| work> | ||||
| <t> | ||||
| This INFO request indicates that the Answerer supports and uses | ||||
| RTP and RTCP multiplexing as well. | ||||
| It allows the Offerer to omit gathering RTCP candidates or | ||||
| releasing already gathered RTCP candidates. | ||||
| If the INFO request did not contain the "a=rtcp-mux" attribute, | ||||
| the Offerer has to gather RTCP candidates | ||||
| unless it wants to wait until receipt of an Answer that eventually confi | ||||
| rms | ||||
| support or non-support for RTP and RTCP multiplexing. | ||||
| In casethe Offerer had sent RTCP candidates in a previous INFO request, | ||||
| it still needs to repeat them in subsequent INFO requests, | ||||
| even when that support for RTCP multiplexing was confirmed | ||||
| by the Answerer and the Offerer has released its RTCP candidates. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="bundle-cons" numbered="true" toc="default"> | ||||
| <name>Considerations for Media Multiplexing</name> | ||||
| <t> | ||||
| The following considerations describe options for Trickle ICE | ||||
| in order to give some guidance to implementers on how trickling | ||||
| can be optimized with respect to providing candidates in case of Media M | ||||
| ultiplexing | ||||
| <xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" format="default"/> | ||||
| . | ||||
| It is assumed that the reader is familiar with <xref target="I-D.ietf-mm | ||||
| usic-sdp-bundle-negotiation" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| ICE candidate exchange is already considered | ||||
| in | ||||
| <xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" sectionFormat="of" | ||||
| section="11"/>. | ||||
| These considerations are still valid for Trickle ICE; however, | ||||
| trickling provides more flexibility for the sequence of candidate exchan | ||||
| ge, | ||||
| especially in Full Trickle mode. | ||||
| </t> | ||||
| <t> | ||||
| Except for bundle-only "m=" lines, a Half Trickle Offerer has to | ||||
| send an Offer with candidates for all bundled "m=" lines. | ||||
| The additional flexibility, however, allows a Full Trickle Offerer | ||||
| to initially send only candidates for the "m=" line with the | ||||
| suggested Offerer BUNDLE address. | ||||
| </t> | ||||
| <t> | ||||
| On receipt of the Answer, the Offerer will detect | ||||
| if BUNDLE is supported by the Answerer and if the suggested Offerer BUND | ||||
| LE address was selected. | ||||
| In this case, the Offerer does not need to trickle further candidates fo | ||||
| r the remaining "m=" lines in a bundle. | ||||
| However, if BUNDLE is not supported, the Full Trickle Offerer needs to g | ||||
| ather and trickle candidates | ||||
| for the remaining "m=" lines as necessary. | ||||
| If the Answerer selects an Offerer BUNDLE address that is different from | ||||
| the suggested Offerer BUNDLE address, | ||||
| the Full Trickle Offerer needs to gather and trickle candidates | ||||
| for the "m=" line that carries the selected Offerer BUNDLE address. | ||||
| </t> | ||||
| <t> | ||||
| A Trickle Answerer <bcp14>SHOULD</bcp14> include an "a=group:BUNDLE" att | ||||
| ribute | ||||
| <xref target="I-D.ietf-mmusic-sdp-bundle-negotiation" format="default"/> | ||||
| at session level in the application/trickle-ice-sdpfrag body | ||||
| if it supports and uses bundling. | ||||
| When doing so, the Answerer <bcp14>MUST</bcp14> include all identificati | ||||
| on-tags in the same order that is used or will be used in the Answer. | ||||
| </t> | ||||
| <t> | ||||
| Receipt of this attribute at the Offerer in an INFO request prior to the | ||||
| Answer indicates that the Answerer | ||||
| supports and uses bundling. | ||||
| The Offerer can use this information, e.g., for stopping the gathering o | ||||
| f candidates | ||||
| for the remaining "m=" lines in a bundle and/or for freeing correspondin | ||||
| g resources. | ||||
| </t> | ||||
| <t> | ||||
| This behavior is illustrated by the following example Offer that indicat | ||||
| es support for Media Multiplexing. | ||||
| </t> | ||||
| <t> | ||||
| If the Offerer had already sent candidates for "m=" lines | ||||
| in a bundle in a previous INFO request, | ||||
| it still needs to repeat them in subsequent INFO requests, | ||||
| even when that support for bundling was confirmed | ||||
| by the Answerer, and the Offerer has released candiates that are no long | ||||
| er needed. | ||||
| </t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| v=0 | ||||
| o=alice 2890844526 2890844526 IN IP6 atlanta.example.com | ||||
| s= | ||||
| c=IN IP6 2001:db8:a0b:12f0::3 | ||||
| t=0 0 | ||||
| a=group:BUNDLE foo bar | ||||
| a=ice-pwd:777uzjYhagZgasd88fgpdd | ||||
| a=ice-ufrag:Yhh8 | ||||
| m=audio 10000 RTP/AVP 0 | ||||
| a=mid:foo | ||||
| a=rtcp-mux | ||||
| a=rtpmap:0 PCMU/8000 | ||||
| a=extmap 1 urn:ietf:params:rtp-hdrext:sdes:mid | ||||
| a=candidate:1 1 UDP 1658497328 2001:db8:a0b:12f0::3 10000 typ host | ||||
| m=video 10002 RTP/AVP 31 | ||||
| a=mid:bar | ||||
| a=rtcp-mux | ||||
| a=rtpmap:31 H261/90000 | ||||
| a=extmap 1 urn:ietf:params:rtp-hdrext:sdes:mid]]></artwork> | ||||
| <t> | ||||
| The example Offer indicates support for RTP and RTCP multiplexing | ||||
| and contains an "a=candidate:" attribute only for the "m=" line | ||||
| with the suggested Offerer bundle address. | ||||
| Once the dialog is established as described in <xref target="dialog-est | ||||
| " format="default"/>, the Answerer | ||||
| sends the following INFO request. | ||||
| </t> | ||||
| <artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
| INFO sip:alice@example.com SIP/2.0 | ||||
| ... | ||||
| Info-Package: trickle-ice | ||||
| Content-type: application/trickle-ice-sdpfrag | ||||
| Content-Disposition: Info-Package | ||||
| Content-length: 219 | ||||
| a=group:BUNDLE foo bar | ||||
| a=ice-pwd:asd88fgpdd777uzjYhagZg | ||||
| a=ice-ufrag:8hhY | ||||
| m=audio 9 RTP/AVP 0 | ||||
| a=mid:foo | ||||
| a=rtcp-mux | ||||
| a=candidate:1 1 UDP 1658497328 2001:db8:a0b:12f0::3 5000 typ host ]]></art | ||||
| work> | ||||
| <t> | ||||
| This INFO request indicates that the Answerer supports and uses Media Mu | ||||
| ltiplexing as well. | ||||
| Note that the Answerer only includes a single pseudo "m=" line since can | ||||
| didates | ||||
| matching those from the second "m=" line in the offer are not needed fr | ||||
| om the Answerer. | ||||
| </t> | ||||
| <t> | ||||
| The INFO request also indicates that the Answerer accepted the suggested | ||||
| Offerer Bundle Address. | ||||
| This allows the Offerer to omit gathering RTP and RTCP candidates for th | ||||
| e other "m=" lines | ||||
| or releasing already gathered candidates. | ||||
| If the INFO request did not contain the "a=group:BUNDLE" attribute, the | ||||
| Offerer has to gather | ||||
| RTP and RTCP candidates for the other "m=" lines unless it wants to wa | ||||
| it until receipt | ||||
| of an Answer that eventually confirms | ||||
| support or non-support for Media Multiplexing. | ||||
| </t> | ||||
| <t> | ||||
| Independent of using Full Trickle or Half Trickle mode, the rules from | ||||
| <xref target="I-D.ietf-mmusic-sdp-mux-attributes" format="default"/> ap | ||||
| ply to both, Offerer and Answerer, | ||||
| when putting attributes as specified in | ||||
| <xref target="trickle_ice_sdpfrag_grammar" format="default"/> | ||||
| in the application/trickle-ice-sdpfrag body. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="sec-eoc" toc="default" numbered="true"> | ||||
| <name>SDP "end-of-candidates" Attribute</name> | ||||
| <section anchor="eoc-def" numbered="true" toc="default"> | ||||
| <name>Definition</name> | ||||
| <t> | ||||
| This section defines the new SDP media-level and session-level attribute | ||||
| <xref target="RFC4566" format="default"/> | ||||
| "end-of-candidates". "end-of-candidates" is a property attribute | ||||
| <xref target="RFC4566" format="default"/>; hence, it has no value. | ||||
| By including this attribute in an Offer or Answer, the sending agent indic | ||||
| ates | ||||
| that it will not trickle further candidates. | ||||
| When included at session level, this indication applies to the whole sessi | ||||
| on; | ||||
| when included at the media level, the indication applies only to the corre | ||||
| sponding media description. | ||||
| </t> | ||||
| <ul empty="true"> | ||||
| <li> | ||||
| <dl spacing="normal"> | ||||
| <dt>Name:</dt><dd>end-of-candidates</dd> | ||||
| <dt>Value:</dt><dd>N/A</dd> | ||||
| <dt>Usage Level:</dt><dd>media and session level</dd> | ||||
| <dt>Charset Dependent:</dt><dd>no</dd> | ||||
| <dt>Mux Category:</dt><dd>IDENTICAL</dd> | ||||
| <dt>Example:</dt><dd>a=end-of-candidates</dd> | ||||
| </dl> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="eoc-ind" numbered="true" toc="default"> | ||||
| <name>Offer/Answer Procedures</name> | ||||
| <t>The Offerer or Answerer <bcp14>MAY</bcp14> include an "a=end-of-candi | ||||
| dates" attribute | ||||
| in case candidate discovery has ended | ||||
| and no further candidates are to be trickled. | ||||
| The Offerer or Answerer <bcp14>MUST</bcp14> provide the "a=end-of-cand | ||||
| idates" attribute | ||||
| together with the "a=ice-ufrag" and "a=ice-pwd" attributes of the curr | ||||
| ent | ||||
| ICE generation as required by | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/>. | ||||
| When included at the session level, | ||||
| this indication applies to the whole session; | ||||
| when included at the media level, the indication applies | ||||
| only to the corresponding media description. | ||||
| </t> | ||||
| <t> | ||||
| Receipt of an "a=end-of-candidates" attribute at an | ||||
| Offerer or Answerer | ||||
| -- with the "a=ice-ufrag" and "a=ice-pwd" attributes matching the curr | ||||
| ent ICE generation -- | ||||
| indicates that the gathering of candidates | ||||
| has ended at the peer, for either the session or only the | ||||
| corresponding media description as specified above. | ||||
| The receiving agent forwards an end-of-candidates indication | ||||
| to the ICE Agent, which in turn acts as specified in | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/>. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="trickle_ice_sdpfrag_def" numbered="true" toc="default"> | ||||
| <name>Content Type 'application/trickle-ice-sdpfrag'</name> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Overall Description</name> | ||||
| <t> | ||||
| An application/trickle-ice-sdpfrag body is used exclusively by the 'tric | ||||
| kle-ice' Info Package. | ||||
| Other SDP-related applications need to define their own media type. | ||||
| The INFO request body uses a subset of the possible SDP lines | ||||
| as defined by the grammar in <xref target="RFC4566" format="default"/>. | ||||
| A valid body uses only pseudo "m=" lines and certain attributes | ||||
| that are needed and/or useful for trickling candidates. | ||||
| The content adheres to the following grammar. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="trickle_ice_sdpfrag_grammar" numbered="true" toc="default | ||||
| "> | ||||
| <name>Grammar</name> | ||||
| <t> | ||||
| The grammar of an 'application/trickle-ice-sdpfrag' body is | ||||
| based on the following ABNF <xref target="RFC5234" format="default"/> | ||||
| . | ||||
| It specifies the subset of existing SDP attributes | ||||
| that is needed or useful for trickling candidates. | ||||
| The grammar uses the indicator for case-sensitive %s, | ||||
| as defined in <xref target="RFC7405" format="default"/>, | ||||
| but it also imports grammar for other SDP attributes that | ||||
| precede the production of <xref target="RFC7405" format="default"/>. | ||||
| A sender <bcp14>SHOULD</bcp14> use lower case for attributes | ||||
| from such earlier grammar, but a receiver <bcp14>MUST</bcp14> treat | ||||
| them as case insensitive. | ||||
| </t> | ||||
| <sourcecode type="abnf"><![CDATA[ | ||||
| ; Syntax | ||||
| trickle-ice-sdpfrag = session-level-fields | ||||
| pseudo-media-descriptions | ||||
| session-level-fields = *(session-level-field CRLF) | ||||
| session-level-field = ice-lite-attribute / | ||||
| ice-pwd-attribute / | ||||
| ice-ufrag-attribute / | ||||
| ice-options-attribute / | ||||
| ice-pacing-attribute / | ||||
| end-of-candidates-attribute / | ||||
| bundle-group-attribute / | ||||
| extension-attribute-fields | ||||
| ; for future extensions | ||||
| ice-lite-attribute = %s"a" "=" ice-lite | ||||
| ice-pwd-attribute = %s"a" "=" ice-pwd-att | ||||
| ice-ufrag-attribute = %s"a" "=" ice-ufrag-att | ||||
| ice-pacing-attribute = %s"a" "=" ice-pacing-att | ||||
| ice-options-attribute = %s"a" "=" ice-options | ||||
| end-of-candidates-attribute = %s"a" "=" end-of-candidates | ||||
| end-of-candidates = %s"end-of-candidates" | ||||
| bundle-group-attribute = %s"a" "=" %s"group:" bundle-semantics | ||||
| *(SP identification-tag) | ||||
| bundle-semantics = "BUNDLE" | ||||
| extension-attribute-fields = attribute-fields | ||||
| pseudo-media-descriptions = *( media-field | ||||
| trickle-ice-attribute-fields ) | ||||
| trickle-ice-attribute-fields = *(trickle-ice-attribute-field CRLF) | ||||
| trickle-ice-attribute-field = mid-attribute / | ||||
| candidate-attributes / | ||||
| ice-pwd-attribute / | ||||
| ice-ufrag-attribute / | ||||
| remote-candidate-attribute / | ||||
| end-of-candidates-attribute / | ||||
| rtcp-attribute / | ||||
| rtcp-mux-attribute / | ||||
| rtcp-mux-only-attribute / | ||||
| extension-attribute-fields | ||||
| ; for future extensions | ||||
| rtcp-attribute = %s"a" "=" %s"rtcp" | ||||
| rtcp-mux-attribute = %s"a" "=" %s"rtcp-mux" | ||||
| rtcp-mux-only-attribute = %s"a" "=" %s"rtcp-mux-only" | ||||
| candidate-attributes = %s"a" "=" candidate-attribute | ||||
| remote-candidate-attribute = %s"a" "=" remote-candidate-att ]]></source | ||||
| code> | ||||
| <t> | ||||
| <!--[rfced] For easier readability, may we update the text as follows? | ||||
| Please let us know if this is agreeable or if you prefer | ||||
| otherwise. | ||||
| Original: | ||||
| with ice-lite, ice-pwd-att, remote-candidate-att, ice-ufrag-att, ice- | ||||
| pacing-att, ice-options, candidate-attribute remote-candidate-att | ||||
| from [I-D.ietf-mmusic-ice-sip-sdp], identification-tag, mid-attribute | ||||
| ; from [RFC5888], media-field, attribute-fields from [RFC4566]. | ||||
| Perhaps: | ||||
| with ice-lite, ice-pwd-att, remote-candidate-att, ice-ufrag-att, ice- | ||||
| pacing-att, ice-options, candidate-attribute, and remote-candidate-att | ||||
| from [RFCYYY1]; identification-tag and mid-attribute | ||||
| from [RFC5888]; and media-field and attribute-fields from [RFC4566]. | ||||
| --> | ||||
| with ice-lite, ice-pwd-att, remote-candidate-att, ice-ufrag-att, | ||||
| ice-pacing-att, ice-options, candidate-attribute remote-candidate-att | ||||
| from <xref target="I-D.ietf-mmusic-ice-sip-sdp" format="default"/>, | ||||
| identification-tag, mid-attribute; from <xref target="RFC5888" format=" | ||||
| default"/>; | ||||
| media-field, attribute-fields from <xref target="RFC4566" format="defau | ||||
| lt"/>. | ||||
| The "a=rtcp" attribute is defined in <xref target="RFC3605" format="def | ||||
| ault"/>, | ||||
| the "a=rtcp-mux" attribute is defined in <xref target="RFC5761" format | ||||
| ="default"/>, and | ||||
| the "a=rtcp-mux-only" attribute is defined in <xref target="I-D.ietf-mm | ||||
| usic-mux-exclusive" format="default"/>. | ||||
| The latter attributes lack formal grammar in their corresponding RFC an | ||||
| d are reproduced here. | ||||
| </t> | ||||
| <t> | ||||
| The "a=ice-pwd:" and "a=ice-ufrag:" attributes <bcp14>MUST</bcp14> app | ||||
| ear at the | ||||
| same level as the ones in the Offer/Answer exchange. In other words, | ||||
| if they were present as session-level attributes, they will also | ||||
| appear at the beginning of all INFO request payloads, i.e., preceding | ||||
| all pseudo "m=" lines. If they were originally exchanged as media-lev | ||||
| el | ||||
| attributes, potentially overriding session-level values, then | ||||
| they will also be included in INFO request payloads following the | ||||
| corresponding pseudo "m=" lines. | ||||
| </t> | ||||
| <t> | ||||
| An Agent <bcp14>MUST</bcp14> ignore any received unknown extension-attr | ||||
| ibute-fields. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="info-package" numbered="true" toc="default"> | ||||
| <name>Info Package</name> | ||||
| <section anchor="rationale" numbered="true" toc="default"> | ||||
| <name>Rationale -- Why INFO?</name> | ||||
| <t> | ||||
| The decision to use SIP INFO requests as a candidate transport | ||||
| method is based primarily on their lightweight nature. Once a | ||||
| dialog has been established, INFO requests can be exchanged | ||||
| both ways with no restrictions on timing and frequency and no | ||||
| risk of collision. | ||||
| </t> | ||||
| <t> A critical fact is that the sending of Trickle ICE candidates | ||||
| in one direction is entirely uncoupled from sending candidates | ||||
| in the other direction. | ||||
| Thus, the sending of candidates in each direction can be | ||||
| done by a stream of INFO requests that is not correlated with | ||||
| the stream of INFO requests in the other direction. | ||||
| And since each INFO request cumulatively includes | ||||
| the contents of all previous INFO requests in that direction, | ||||
| the ordering between INFO requests need not be preserved. | ||||
| All of this permits using largely independent INFO requests. | ||||
| </t> | ||||
| <t> | ||||
| Contrarily, UPDATE or other offer/answer mechanisms assume | ||||
| that the messages in each direction are tightly coupled | ||||
| with messages in the other direction. | ||||
| Using Offer/Answer and UPDATE requests | ||||
| <xref target="RFC3311" format="default"/> | ||||
| would introduce the following complications: | ||||
| </t> | ||||
| <dl newline="false" spacing="normal"> | ||||
| <dt>Blocking of messages: </dt> | ||||
| <dd> | ||||
| Offer/Answer is defined as a | ||||
| strictly sequential mechanism in <xref target="RFC3264" format="de | ||||
| fault"/>. | ||||
| There can only be a maximum of one active exchange | ||||
| at any point of time. | ||||
| Both sides cannot simultaneously send Offers nor | ||||
| can they generate multiple Offers prior to | ||||
| receiving an Answer. | ||||
| Using UPDATE requests for | ||||
| candidate transport would therefore imply the | ||||
| implementation of a candidate pool at every agent where | ||||
| candidates can be stored until it is once again that | ||||
| agent's "turn" to emit an Answer or a new Offer. | ||||
| Such an approach would introduce non-negligible | ||||
| complexity for no additional value. | ||||
| </dd> | ||||
| <dt>Elevated risk of glare: </dt> | ||||
| <dd> | ||||
| The sequential nature of Offer/Answer also makes it | ||||
| impossible for both sides to send Offers simultaneously. | ||||
| What's worse is that there are no mechanisms in SIP to | ||||
| actually prevent that. <xref target="RFC3261" format="default"/>, | ||||
| where | ||||
| the situation of Offers crossing on the wire is described | ||||
| as "glare", only defines a procedure for addressing the | ||||
| issue after it has occurred. According to that procedure, | ||||
| both Offers are invalidated and both sides need to retry | ||||
| the negotiation after a period between 0 and 4 seconds. | ||||
| The high likelihood for glare and the average two-second | ||||
| backoff intervals to occur implies that the duration of | ||||
| Trickle ICE processing would not only fail to improve but | ||||
| actually exceed those of regular ICE. | ||||
| </dd> | ||||
| </dl> | ||||
| <t> | ||||
| INFO messages decouple the exchange of candidates from the | ||||
| Offer/Answer negotiation | ||||
| and are subject to none of the glare issues described above, | ||||
| which makes them a very convenient and lightweight mechanism | ||||
| for asynchronous delivery of candidates. | ||||
| </t> | ||||
| <t> | ||||
| Using in-dialog INFO messages also provides a way of | ||||
| guaranteeing that candidates are delivered end to end, between | ||||
| the same entities that are actually in the process of | ||||
| initiating a session. Out-of-dialog alternatives would have implied | ||||
| requiring support for GRUU | ||||
| <xref target="RFC5627" format="default"/> that, given GRUUs relatively | ||||
| low | ||||
| adoption levels, would have constituted too strong of a | ||||
| constraint to the adoption of Trickle ICE. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Overall Description</name> | ||||
| <t> | ||||
| This specification defines an Info Package for use by | ||||
| SIP UAs implementing Trickle ICE. | ||||
| INFO requests carry ICE candidates discovered after the peer UAs have | ||||
| confirmed mutual support for Trickle ICE. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Applicability</name> | ||||
| <t> | ||||
| The purpose of the ICE protocol is to establish a media path | ||||
| in the presence of NAT and firewalls. | ||||
| The candidates are transported in INFO requests and are | ||||
| part of this establishment. | ||||
| </t> | ||||
| <t> | ||||
| Candidates sent by a Trickle ICE Agent after the Offer | ||||
| follow the same signaling path and reach the same | ||||
| entity as the Offer itself. While it is true that GRUUs can | ||||
| be used to achieve this, one of the goals of this | ||||
| specification is to allow operation of Trickle ICE in as many | ||||
| environments as possible including those without GRUU support. | ||||
| Using out-of-dialog SUBSCRIBE/NOTIFY requests would not | ||||
| satisfy this goal. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Info Package Name</name> | ||||
| <t> | ||||
| This document defines a SIP Info Package as per | ||||
| <xref target="RFC6086" format="default"/>. The Info Package token name | ||||
| for this | ||||
| package is "trickle-ice". | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Info Package Parameters</name> | ||||
| <t> | ||||
| This document does not define any Info Package parameters. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="option-tag" numbered="true" toc="default"> | ||||
| <name>SIP Option Tags</name> | ||||
| <t> | ||||
| <xref target="RFC6086" format="default"/> allows Info Package specific | ||||
| ations to | ||||
| define SIP option-tags. This specification extends the option-tag | ||||
| construct of the SIP grammar as follows: | ||||
| </t> | ||||
| <artwork align="left" name="" type="" alt=""><![CDATA[ | ||||
| option-tag /= "trickle-ice" ]]></artwork> | ||||
| <t> | ||||
| SIP entities that support this | ||||
| specification <bcp14>MUST</bcp14> place the 'trickle-ice' option-tag i | ||||
| n a SIP | ||||
| Supported: or Require: header field within | ||||
| all SIP INVITE requests and responses. | ||||
| </t> | ||||
| <t> | ||||
| When responding to, or generating, a SIP OPTIONS request, a SIP | ||||
| entity <bcp14>MUST</bcp14> also include the 'trickle-ice' option-tag i | ||||
| n a SIP | ||||
| Supported: or Require: header field. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Info Request Body Parts</name> | ||||
| <t> | ||||
| Entities implementing this specification <bcp14>MUST</bcp14> include a | ||||
| payload of type 'application/trickle-ice-sdpfrag' as defined | ||||
| in <xref target="trickle_ice_sdpfrag_grammar" format="default"/> | ||||
| in SIP INFO requests. | ||||
| The payload is used to convey SDP-encoded ICE candidates. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Info Package Usage Restrictions</name> | ||||
| <t> | ||||
| This document does not define any Info Package Usage Restrictions. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Rate of INFO Requests</name> | ||||
| <t> | ||||
| Given that IP addresses may be gathered rapidly, a | ||||
| Trickle ICE Agent with many network interfaces might create a | ||||
| high rate of INFO requests if every newly | ||||
| detected candidate is trickled individually without aggregation. | ||||
| An implementation <bcp14>MUST</bcp14> aggregate ICE candidates in case | ||||
| an | ||||
| unreliable transport protocol such as UDP is used. | ||||
| A Trickle ICE agent <bcp14>MUST NOT</bcp14> have more than one INFO re | ||||
| quest | ||||
| pending at any one time. | ||||
| When INFO messages are sent over an unreliable transport, | ||||
| they are retransmitted according to the rules specified in | ||||
| <xref target="RFC3261" sectionFormat="comma" section="17.1.2.1"/>. | ||||
| </t> | ||||
| <t> | ||||
| If the INFO requests are sent on top of TCP, | ||||
| which is probably the standard way, | ||||
| it is not an issue for the network anymore, | ||||
| but it can remain one for SIP proxies and other intermediaries | ||||
| forwarding the SIP INFO messages. | ||||
| Also, an endpoint may not be able to tell that it has congestion | ||||
| controlled transport all the way. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Info Package Security Considerations</name> | ||||
| <t> | ||||
| See <xref target="sec-cons" format="default"/>. | ||||
| </t> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="deploy-cons" numbered="true" toc="default"> | ||||
| <name>Deployment Considerations</name> | ||||
| <t> | ||||
| Trickle ICE uses two mechanisms for the exchange of candidate informatio | ||||
| n. | ||||
| This imposes new requirements to certain middleboxes | ||||
| that are used in some networks, e.g., for monitoring purposes. | ||||
| While the first mechanism, SDP Offers and Answers, | ||||
| is already used by regular ICE and is assumed to be supported, | ||||
| the second mechanism, INFO request bodies, | ||||
| needs to be considered by such middleboxes as well when | ||||
| trickle ICE is used. | ||||
| Such middleboxes need to make sure that they remain | ||||
| in the signaling path of the INFO requests and | ||||
| understand the INFO request body. | ||||
| </t> | ||||
| </section> | ||||
| <section anchor="IANA" numbered="true" toc="default"> | ||||
| <name>IANA Considerations</name> | ||||
| <section anchor="sec-eoc-iana" toc="default" numbered="true"> | ||||
| <name>SDP "end-of-candidates" Attribute</name> | ||||
| <t> | ||||
| This section defines a new SDP media-level and session-level attribute | ||||
| <xref target="RFC4566" format="default"/> "end-of-candidates". "end-of-can | ||||
| didates" is a property attribute | ||||
| <xref target="RFC4566" format="default"/> and hence has no value. | ||||
| </t> | ||||
| <ul empty="true"><li> | ||||
| <dl newline="false" spacing="normal"> | ||||
| <dt>Name:</dt><dd>end-of-candidates</dd> | ||||
| <dt>Value:</dt><dd>N/A</dd> | ||||
| <dt>Usage Level:</dt><dd>media and session</dd> | ||||
| <dt>Charset Dependent:</dt><dd>no</dd> | ||||
| <dt>Purpose:</dt><dd>The sender indicates that it will not trickle | ||||
| further ICE candidates.</dd> | ||||
| <dt>O/A Procedures:</dt><dd>RFC XXXX defines the detailed | ||||
| SDP Offer/Answer procedures for | ||||
| the "end-of-candidates" attribute.</dd> | ||||
| <dt>Mux Category:</dt><dd>IDENTICAL</dd> | ||||
| <dt>Reference:</dt><dd>RFC XXXX</dd> | ||||
| <dt>Example:</dt><dd>a=end-of-candidates</dd> | ||||
| </dl></li></ul> | ||||
| </section> | ||||
| <section anchor="sdpfrag-reg" numbered="true" toc="default"> | ||||
| <name>Media Type 'application/trickle-ice-sdpfrag'</name> | ||||
| <t> | ||||
| This document defines the new Media Type 'application/trickle-ice-sdpfrag' | ||||
| in accordance with <xref target="RFC6838" format="default"/>. | ||||
| </t> | ||||
| <ul empty="true"><li> | ||||
| <dl spacing="normal"> | ||||
| <dt>Type name:</dt><dd>application</dd> | ||||
| <dt>Subtype name:</dt><dd>trickle-ice-sdpfrag</dd> | ||||
| <dt>Required parameters:</dt><dd>None.</dd> | ||||
| <dt>Optional parameters:</dt><dd>None.</dd> | ||||
| <dt>Encoding considerations:</dt><dd><t> | ||||
| The media contents follow the same rules as SDP, | ||||
| except as noted in this document. | ||||
| The media contents are text, with the grammar specified | ||||
| in <xref target="trickle_ice_sdpfrag_grammar" format="default"/>. | ||||
| </t><t> | ||||
| Although the initially defined content of a trickle-ice-sdpfrag body | ||||
| does only include ASCII characters, | ||||
| UTF-8-encoded content might be introduced via extension attributes. | ||||
| The "a=charset:" attribute may be used to signal the presence of oth | ||||
| er | ||||
| character sets in certain parts of a trickle-ice-sdpfrag body (see | ||||
| <xref target="RFC4566" format="default"/>). | ||||
| Arbitrary binary content cannot be directly represented | ||||
| in SDP or a trickle-ice-sdpfrag body. | ||||
| </t></dd> | ||||
| <dt>Security considerations:</dt><dd>See <xref target="RFC4566" format | ||||
| ="default"/> and RFC XXXX</dd> | ||||
| <dt>Interoperability considerations:</dt><dd>See RFC XXXX</dd> | ||||
| <dt>Published specification:</dt><dd>See RFC XXXX</dd> | ||||
| <dt>Applications which use this Media Type:</dt><dd>Trickle ICE</dd> | ||||
| <dt>Fragment identifier considerations:</dt><dd>N/A</dd> | ||||
| </dl> | ||||
| </li> | ||||
| </ul> | ||||
| <ul empty="true"><li> | ||||
| <dl spacing="normal"> | ||||
| <dt>Additional information:</dt><dd><t></t> | ||||
| <dl newline="false" spacing="normal" indent="6"> | ||||
| <dt>Deprecated alias names for this type:</dt><dd>N/A</dd> | ||||
| <dt> Magic number(s):</dt><dd>N/A</dd> | ||||
| <dt>File extension(s):</dt><dd>N/A</dd> | ||||
| <dt>Macintosh File Type Code(s):</dt><dd>N/A</dd> | ||||
| </dl></dd></dl></li></ul> | ||||
| <ul empty="true"><li> | ||||
| <dl newline="false" spacing="normal"> | ||||
| <dt>Person and email address to contact for further information:</dt> | ||||
| <dd>The IESG (iesg@ietf.org)</dd> | ||||
| <dt>Intended usage:</dt> | ||||
| <dd>Trickle-ICE for SIP as specified in RFC XXXX.</dd> | ||||
| <dt>Restrictions on usage:</dt><dd>N/A</dd> | ||||
| <dt>Author/Change controller:</dt><dd>The IESG (iesg@ietf.org)</dd> | ||||
| <dt>Provisional registration? (standards tree only):</dt><dd>N/A</dd> | ||||
| </dl> | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| <section anchor="package-reg" numbered="true" toc="default"> | ||||
| <name>SIP Info Package 'trickle-ice'</name> | ||||
| <t> | ||||
| This document defines a new SIP Info Package named 'trickle-ice' | ||||
| and updates the Info Packages Registry with the following entry. | ||||
| </t> | ||||
| <table anchor="table_1" align="left"> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align='center'>Name</th> | ||||
| <th align='center'>Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>trickle-ice</td> | ||||
| <td>[RFCXXXX]</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| <section anchor="optag-reg" numbered="true" toc="default"> | ||||
| <name>SIP Option Tag 'trickle-ice'</name> | ||||
| <t> | ||||
| This specification registers a new SIP option tag 'trickle-ice' | ||||
| as per the guidelines in <xref target="RFC3261" sectionFormat="of" | ||||
| section="27.1"/> | ||||
| and updates the "Option Tags" section of the | ||||
| SIP Parameter Registry with the following entry: | ||||
| </t> | ||||
| <table anchor="table_2" align="left"> | ||||
| <thead> | ||||
| <tr> | ||||
| <th align='center'>Name</th> | ||||
| <th align='center'>Description</th> | ||||
| <th align='center'>Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>trickle&nbhy;ice</td> | ||||
| <td>This option tag is used to indicate that a UA supports and understands T | ||||
| rickle ICE</td> | ||||
| <td>[RFCXXXX]</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="sec-cons" numbered="true" toc="default"> | ||||
| <name>Security Considerations</name> | ||||
| <t> | ||||
| The Security Considerations of | ||||
| <xref target="RFC6086" format="default"/>, <xref target="I-D.ietf-mmusi | ||||
| c-ice-sip-sdp" format="default"/>, and | ||||
| <xref target="I-D.ietf-ice-trickle" format="default"/> apply. | ||||
| This document clarifies how the above specifications are used together f | ||||
| or trickling | ||||
| candidates and does not create additional security risks. | ||||
| </t> | ||||
| <t> | ||||
| The new Info Package 'trickle-ice' and | ||||
| the new Media Type 'application/trickle-ice-sdpfrag' | ||||
| do not introduce additional security considerations | ||||
| when used in the context of Trickle ICE. | ||||
| Both are not intended to be used for other applications, | ||||
| so any security considerations for its use in other contexts | ||||
| is out of the scope of this document | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Acknowledgements</name> | ||||
| <t> | ||||
| The authors like to thank | ||||
| Flemming Andreasen, | ||||
| Ayush Jain, | ||||
| Paul Kyzivat, | ||||
| Jonathan Lennox, | ||||
| Simon Perreault, | ||||
| Roman Shpount, | ||||
| and | ||||
| Martin Thomson | ||||
| for reviewing and/or making various suggestions for | ||||
| improvements and optimizations. | ||||
| </t> | ||||
| <t> | ||||
| The authors also like to thank | ||||
| Flemming Andreasen for shepherding this document and | ||||
| Ben Campbell for his AD review and suggestions. | ||||
| In addition, the authors thank | ||||
| Benjamin Kaduk, | ||||
| Adam Roach, | ||||
| Mirja Kuehlewind, and | ||||
| Eric Rescorla | ||||
| for their comments and/or text proposals for improving | ||||
| the document during IESG review. | ||||
| </t> | ||||
| <t> | ||||
| Many thanks to Dale Worley for the Gen-Art review and proposed | ||||
| enhancements for several sections. | ||||
| </t> | ||||
| <t> | ||||
| Many thanks to Joerg Ott for the TSV-Art review and suggested improvemen | ||||
| ts. | ||||
| </t> | ||||
| <t> | ||||
| The authors thank Shawn Emery for the Security Directorate review. | ||||
| </t> | ||||
| </section> | ||||
| <section numbered="true" toc="default"> | ||||
| <name>Change Log</name> | ||||
| <t> | ||||
| [RFC EDITOR NOTE: Please remove this section when publishing]. | ||||
| </t> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-01 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> Editorial Clean up</li> | ||||
| <li> IANA Consideration added</li> | ||||
| <li> Security Consideration added</li> | ||||
| <li> RTCP and BUNDLE Consideration added with rules for including "a=rt | ||||
| cp-mux" and "a=group: BUNDLLE" attributes </li> | ||||
| <li> 3PCC Consideration added</li> | ||||
| <li> Clarified that 18x w/o answer is sufficient to create a dialog that | ||||
| allows for trickling to start </li> | ||||
| <li> Added remaining Info Package definition sections as outlined in <xr | ||||
| ef target="RFC6086" sectionFormat="of" section="10"/></li> | ||||
| <li> Added definition of application/sdpfrag making draft-ivov-mmusic-sd | ||||
| pfrag obsolete</li> | ||||
| <li> Added pseudo m-lines as additional separator in sdpfrag bodies for | ||||
| Trickle ICE </li> | ||||
| <li> Added ABNF for sdp-frag bodies and Trickle-ICE package </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-02 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> Removed definition of application/sdpfrag </li> | ||||
| <li> Replaced with new type application/trickle-ice-sdpfrag </li> | ||||
| <li> RTCP and BUNDLE Consideration enhanced with some examples </li> | ||||
| <li> draft-ietf-mmusic-sdp-bundle-negotiation and RFC5761 changed to nor | ||||
| mative reference </li> | ||||
| <li> Removed reference to 4566bis </li> | ||||
| <li> Addressed review comment from Simon Perreault </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-03 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> replaced reference to RFC5245 with draft-ietf-mmusic-rfc5245bis and | ||||
| draft-ietf-mmusic-ice-sip-sdp </li> | ||||
| <li> Corrected Figure 10, credits to Ayush Jain for finding the bug </l | ||||
| i> | ||||
| <li> Referencing a=rtcp and a=rtcp-mux handling from draft-ietf-mmusic-i | ||||
| ce-sip-sdp </li> | ||||
| <li> Referencing a=rtcp-mux-exclusive handling from draft-ietf-mmusic-mu | ||||
| x-exclusive, enhanced ABNF to support a=rtcp-mux-exclusive </li> | ||||
| <li> Clarifying that draft-ietf-mmusic-sdp-mux-attributes applies for th | ||||
| e application/trickle-ice-sdpfrag body </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-04 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> considered comments from Christer Holmberg </li> | ||||
| <li> corrected grammar for INFO package, such that ice-ufrag/pwd are als | ||||
| o allowed on media-level as specified in <xref target="I-D.ietf-mmusic-ice-sip-s | ||||
| dp" format="default"/> </li> | ||||
| <li> Added new ice-pacing-attribute fom <xref target="I-D.ietf-mmusic-ic | ||||
| e-sip-sdp" format="default"/> </li> | ||||
| <li> Added formal definition for the end-of-candidates attribute </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-05 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> considered further comments from Christer Holmberg </li> | ||||
| <li> editorial comments on section 3 addressed </li> | ||||
| <li> moved section 3.1 to section 10.1 and applied some edits</li> | ||||
| <li> replaced the term "previously sent candidates" with "currently know | ||||
| n and used candidates".</li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-06 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> editorial fixes</li> | ||||
| <li> additional text on the content of the INFO messages.</li> | ||||
| <li> recommendation on what to do if a previously sent candidate is une | ||||
| xpectedly missing in a subsequent INFO </li> | ||||
| <li> terminology alignment with draft-ietf-ice-trickle-07 </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-07 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> editorial fixes</li> | ||||
| <li> clarification on ordering of candidates for alignment with draft-ie | ||||
| tf-ice-trickle-12 </li> | ||||
| <li> O/A procedures for end-of-candidates attribute described here after | ||||
| corresponding procedures | ||||
| have been removed from draft-ietf-ice-trickle-11</li> | ||||
| <li> using IPv6 addresses in examples </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-08 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> editorial fixes/clarification based on Flemmings review</li> | ||||
| <li> Description of Trickle specifics in O/A procedures for initial O/A | ||||
| exchange and specification of ICE mismatch exception</li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-09 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> editorial fixes/correction of references</li> | ||||
| <li> adding missing Ref to RFC3605 in section 6, 5th para</li> | ||||
| <li> replaced remaining IPv4 adresses with IPv6 </li> | ||||
| <li> | ||||
| Added text for handling a=rtcp in case of default RTP address 0.0.0. | ||||
| 0:9 based on comment from Roman Shpount. | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-10 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> editorial fixes due to idnits output</li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-11 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> addressing comments from Ben Campell's AD review and Christer's rev | ||||
| iew | ||||
| </li> | ||||
| <li> | ||||
| Numerous editorial improvements/corrections | ||||
| </li> | ||||
| <li> | ||||
| Added [RFC8174] boiler plate and adapted usage of normative language | ||||
| </li> | ||||
| <li> | ||||
| Clarified terminology ICE modules .vs. ICE agent | ||||
| </li> | ||||
| <li> | ||||
| Added more detailed OA procedures | ||||
| </li> | ||||
| <li> | ||||
| Corrected default values in m-line | ||||
| and usage of "a=mid:" attribute explicitly mentioned for offer/answer | ||||
| </li> | ||||
| <li> Removed explicit mentioning of XMPP | ||||
| </li> | ||||
| <li> | ||||
| Added Deployment Considerations section | ||||
| </li> | ||||
| <li> | ||||
| Fixed ref for rfc5245bis | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-12 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> addressing comments from Gen-Art review, TSV-Art review and | ||||
| Security Directorate review | ||||
| </li> | ||||
| <li> | ||||
| Numerous editorial improvements/corrections/clarifications | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-13 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> added expansions for SDP,GRUU, AOR, STUN, TURN | ||||
| </li> | ||||
| <li> | ||||
| some editorial corrections | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-14 | ||||
| </t> | ||||
| <t> | ||||
| Addressing comments from IESG review | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| Clarification/enhancement in section 5 and Fig. 10 based on comments | ||||
| from Benjamin Kaduk | ||||
| </li> | ||||
| <li> | ||||
| Clarification on sequence for sending candidates, | ||||
| definition of pseudo m-lines, | ||||
| usage of a=mid attribute, | ||||
| usage of INFO as ACK for receipt of 18x based on comments from Eric Re | ||||
| scorla | ||||
| </li> | ||||
| <li> | ||||
| Removal of 3PCC Section 3.4, | ||||
| removal of NATted IPv6 addresses, | ||||
| adding more flexibility to in the grammar, | ||||
| explicit mentioning of Require: header field, | ||||
| usage of Require: header field in case of provisioning, | ||||
| text on repetition of candidates in case of RTCP mux and Bundle, | ||||
| various other editorial improvements/corrections | ||||
| based on comments from Adam Roach | ||||
| </li> | ||||
| <li> | ||||
| Modified text on rate limitation of INFO requests based on | ||||
| comments of Mirja Kuehlewind, Adam Roach and Roman Shpount | ||||
| </li> | ||||
| <li> | ||||
| some editorial corrections | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-15 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| Corrections in section 7 on Media Multiplexing | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-16 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| some editorial corrections | ||||
| </li> | ||||
| </ul> | ||||
| <t> | ||||
| Changes from draft-ietf-mmusic-trickle-ice-sip-16 | ||||
| </t> | ||||
| <ul spacing="normal"> | ||||
| <li> | ||||
| Changed IPv6 candidate example from srflx to host | ||||
| </li> | ||||
| </ul> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <displayreference target="I-D.ietf-mmusic-ice-sip-sdp" to="RFCYYY1"/> | ||||
| <displayreference target="I-D.ietf-ice-trickle" to="RFCYYY2"/> | ||||
| <displayreference target="I-D.ietf-mmusic-sdp-bundle-negotiation" to="RFCYYY3"/> | ||||
| <displayreference target="I-D.ietf-mmusic-sdp-mux-attributes" to="RFCYYY4"/> | ||||
| <displayreference target="I-D.ietf-mmusic-mux-exclusive" to="RFCYYY5"/> | ||||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.2119.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3261.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3262.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3264.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3605.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.4566.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5234.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5761.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5888.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.6086.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.6838.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.7405.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.8085.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.8174.xml"/> | ||||
| <!--Note: I-D.ietf-ice-rfc5245bis-20.xml is now RFC 8445--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.8445.xml"/> | ||||
| <!--I-D.ietf-mmusic-ice-sip-sdp-39; C238 companion doc--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refe | ||||
| rence.I-D.draft-ietf-mmusic-ice-sip-sdp-39.xml"/> | ||||
| <!--I-D.ietf-ice-trickle-21; C238 companion doc--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refe | ||||
| rence.I-D.draft-ietf-ice-trickle-21.xml"/> | ||||
| <!--I-D.ietf-mmusic-sdp-bundle-negotiation-54; C238 companion doc--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refe | ||||
| rence.I-D.draft-ietf-mmusic-sdp-bundle-negotiation-54.xml"/> | ||||
| <!--I-D.ietf-mmusic-sdp-mux-attributes-17; C238 companion doc--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refe | ||||
| rence.I-D.draft-ietf-mmusic-sdp-mux-attributes-17.xml"/> | ||||
| <!--I-D.ietf-mmusic-mux-exclusive-12; C238 companion doc--> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/refe | ||||
| rence.I-D.draft-ietf-mmusic-mux-exclusive-12.xml"/> | ||||
| </references> | ||||
| <references> | ||||
| <name>Informative References</name> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3311.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3725.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.3840.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5389.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5627.xml"/> | ||||
| <xi:include href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
| ence.RFC.5766.xml"/> | ||||
| </references> | ||||
| </references> | ||||
| </back> | ||||
| </rfc> | ||||
| End of changes. 1 change blocks. | ||||
| lines changed or deleted | lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||