diff options
Diffstat (limited to 'doc/rfc/rfc8839.txt')
-rw-r--r-- | doc/rfc/rfc8839.txt | 2017 |
1 files changed, 2017 insertions, 0 deletions
diff --git a/doc/rfc/rfc8839.txt b/doc/rfc/rfc8839.txt new file mode 100644 index 0000000..0729722 --- /dev/null +++ b/doc/rfc/rfc8839.txt @@ -0,0 +1,2017 @@ + + + + +Internet Engineering Task Force (IETF) M. Petit-Huguenin +Request for Comments: 8839 Impedance Mismatch +Obsoletes: 5245, 6336 S. Nandakumar +Category: Standards Track Cisco Systems +ISSN: 2070-1721 C. Holmberg + A. Keränen + Ericsson + R. Shpount + TurboBridge + January 2021 + + + Session Description Protocol (SDP) Offer/Answer Procedures for + Interactive Connectivity Establishment (ICE) + +Abstract + + This document describes Session Description Protocol (SDP) Offer/ + Answer procedures for carrying out Interactive Connectivity + Establishment (ICE) between the agents. + + This document obsoletes RFCs 5245 and 6336. + +Status of This Memo + + This is an Internet Standards Track document. + + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Further information on + Internet Standards is available in Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc8839. + +Copyright Notice + + Copyright (c) 2021 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Simplified BSD License text as described in Section 4.e of + the Trust Legal Provisions and are provided without warranty as + described in the Simplified BSD License. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + +Table of Contents + + 1. Introduction + 2. Conventions + 3. Terminology + 4. SDP Offer/Answer Procedures + 4.1. Introduction + 4.2. Generic Procedures + 4.2.1. Encoding + 4.2.2. RTP/RTCP Considerations + 4.2.3. Determining Role + 4.2.4. STUN Considerations + 4.2.5. Verifying ICE Support Procedures + 4.2.6. SDP Example + 4.3. Initial Offer/Answer Exchange + 4.3.1. Sending the Initial Offer + 4.3.2. Sending the Initial Answer + 4.3.3. Receiving the Initial Answer + 4.3.4. Concluding ICE + 4.4. Subsequent Offer/Answer Exchanges + 4.4.1. Sending Subsequent Offer + 4.4.2. Sending Subsequent Answer + 4.4.3. Receiving Answer for a Subsequent Offer + 5. Grammar + 5.1. "candidate" Attribute + 5.2. "remote-candidates" Attribute + 5.3. "ice-lite" and "ice-mismatch" Attributes + 5.4. "ice-ufrag" and "ice-pwd" Attributes + 5.5. "ice-pacing" Attribute + 5.6. "ice-options" Attribute + 6. Keepalives + 7. SIP Considerations + 7.1. Latency Guidelines + 7.1.1. Offer in INVITE + 7.1.2. Offer in Response + 7.2. SIP Option Tags and Media Feature Tags + 7.3. Interactions with Forking + 7.4. Interactions with Preconditions + 7.5. Interactions with Third Party Call Control + 8. Interactions with Application Layer Gateways and SIP + 9. Security Considerations + 9.1. IP Address Privacy + 9.2. Attacks on the Offer/Answer Exchanges + 9.3. The Voice Hammer Attack + 10. IANA Considerations + 10.1. SDP Attributes + 10.1.1. "candidate" Attribute + 10.1.2. "remote-candidates" Attribute + 10.1.3. "ice-lite" Attribute + 10.1.4. "ice-mismatch" Attribute + 10.1.5. "ice-pwd" Attribute + 10.1.6. "ice-ufrag" Attribute + 10.1.7. "ice-options" Attribute + 10.1.8. "ice-pacing" Attribute + 10.2. Interactive Connectivity Establishment (ICE) Options + Registry + 10.3. Candidate Attribute Extension Subregistry Establishment + 11. Changes from RFC 5245 + 12. References + 12.1. Normative References + 12.2. Informative References + Appendix A. Examples + Appendix B. The "remote-candidates" Attribute + Appendix C. Why Is the Conflict Resolution Mechanism Needed? + Appendix D. Why Send an Updated Offer? + Acknowledgements + Contributors + Authors' Addresses + +1. Introduction + + This document describes how Interactive Connectivity Establishment + (ICE) is used with Session Description Protocol (SDP) offer/answer + [RFC3264]. The ICE specification [RFC8445] describes procedures that + are common to all usages of ICE, and this document gives the + additional details needed to use ICE with SDP offer/answer. + + This document obsoletes RFCs 5245 and 6336. + + NOTE: Previously both the common ICE procedures, and the SDP offer/ + answer specific details, were described in [RFC5245]. [RFC8445] + obsoleted [RFC5245], and the SDP offer/answer-specific details were + removed from the document. Section 11 describes the changes to the + SDP offer/answer-specific details specified in this document. + +2. Conventions + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +3. Terminology + + Readers should be familiar with the terminology defined in [RFC3264], + in [RFC8445], and the following: + + Default Destination/Candidate: The default destination for a + component of a data stream is the transport address that would be + used by an agent that is not ICE aware. A default candidate for a + component is one whose transport address matches the default + destination for that component. For the RTP component, the + default connection address is in the "c=" line of the SDP, and the + port and transport protocol are in the "m=" line. For the RTP + Control Protocol (RTCP) component, the address and port are + indicated using the "rtcp" attribute defined in [RFC3605], if + present; otherwise, the RTCP component address is the same as the + address of the RTP component, and its port is one greater than the + port of the RTP component. + +4. SDP Offer/Answer Procedures + +4.1. Introduction + + [RFC8445] defines ICE candidate exchange as the process for ICE + agents (initiator and responder) to exchange their candidate + information required for ICE processing at the agents. For the + purposes of this specification, the candidate exchange process + corresponds to the Offer/Answer protocol [RFC3264], and the terms + "offerer" and "answerer" correspond to the initiator and responder + roles from [RFC8445] respectively. + + Once the initiating agent has gathered, pruned, and prioritized its + set of candidates [RFC8445], the candidate exchange with the peer + agent begins. + +4.2. Generic Procedures + +4.2.1. Encoding + + Section 5 provides detailed rules for constructing various SDP + attributes defined in this specification. + +4.2.1.1. Data Streams + + Each data stream [RFC8445] is represented by an SDP media description + ("m=" section). + +4.2.1.2. Candidates + + Within an "m=" section, each candidate (including the default + candidate) associated with the data stream is represented by an SDP + "candidate" attribute. + + Prior to nomination, the "c=" line associated with an "m=" section + contains the connection address of the default candidate, while the + "m=" line contains the port and transport protocol of the default + candidate for that "m=" section. + + After nomination, the "c=" line for a given "m=" section contains the + connection address of the nominated candidate (the local candidate of + the nominated candidate pair), and the "m=" line contains the port + and transport protocol corresponding to the nominated candidate for + that "m=" section. + +4.2.1.3. Username and Password + + The ICE username is represented by an SDP "ice-ufrag" attribute, and + the ICE password is represented by an SDP "ice-pwd" attribute. + +4.2.1.4. Lite Implementations + + An ICE-lite implementation [RFC8445] MUST include an SDP "ice-lite" + attribute. A full implementation MUST NOT include that attribute. + +4.2.1.5. ICE Extensions + + An agent uses the SDP "ice-options" attribute to indicate support of + ICE extensions. + + An agent compliant with this specification MUST include an SDP "ice- + options" attribute with an "ice2" attribute value [RFC8445]. If an + agent receives an SDP offer or answer that indicates ICE support, but + that does not contain an SDP "ice-options" attribute with an "ice2" + attribute value, the agent can assume that the peer is compliant to + [RFC5245]. + +4.2.1.6. Inactive and Disabled Data Streams + + If an "m=" section is marked as inactive [RFC4566], or has a + bandwidth value of zero [RFC4566], the agent MUST still include ICE- + related SDP attributes. + + If the port value associated with an "m=" section is set to zero + (implying a disabled stream) as defined in Section 8.2 of [RFC3264], + the agent SHOULD NOT include ICE-related SDP "candidate" attributes + in that "m=" section, unless an SDP extension specifying otherwise is + used. + +4.2.2. RTP/RTCP Considerations + + If an agent utilizes both RTP and RTCP, and separate ports are used + for RTP and RTCP, the agent MUST include SDP "candidate" attributes + for both the RTP and RTCP components. + + The agent includes an SDP "rtcp" attribute following the procedures + in [RFC3605]. Hence, in the cases where the RTCP port value is one + higher than the RTP port value and the RTCP component address the + same as the address of the RTP component, the SDP "rtcp" attribute + might be omitted. + + NOTE: [RFC5245] required that an agent always includes the SDP "rtcp" + attribute, even if the RTCP port value was one higher than the RTP + port value. This specification aligns the "rtcp" attribute + procedures with [RFC3605]. + + If the agent does not utilize RTCP, it indicates that by including + "RS:0" and "RR:0" SDP attributes as described in [RFC3556]. + +4.2.3. Determining Role + + The offerer acts as the initiating agent. The answerer acts as the + responding agent. The ICE roles (controlling and controlled) are + determined using the procedures in [RFC8445]. + +4.2.4. STUN Considerations + + Once an agent has provided its local candidates to its peer in an SDP + offer or answer, the agent MUST be prepared to receive STUN (Session + Traversal Utilities for NAT, [RFC5389]) connectivity check Binding + requests on those candidates. + +4.2.5. Verifying ICE Support Procedures + + An ICE agent indicates support of ICE by including at least the SDP + "ice-pwd" and "ice-ufrag" attributes in an offer or answer. An ICE + agent compliant with this specification MUST also include an SDP + "ice-options" attribute with an "ice2" attribute value. + + The agents will proceed with the ICE procedures defined in [RFC8445] + and this specification if, for each data stream in the SDP it + received, the default destination for each component of that data + stream appears in a "candidate" attribute. For example, in the case + of RTP, the connection address, port, and transport protocol in the + "c=" and "m=" lines, respectively, appear in a "candidate" attribute, + and the value in the "rtcp" attribute appears in a "candidate" + attribute. + + This specification provides no guidance on how an agent should + proceed in the cases where the above condition is not met with the + few exceptions noted below: + + 1. The presence of certain Application Layer Gateways might modify + the transport address information as described in Section 8. The + behavior of the responding agent in such a situation is + implementation dependent. Informally, the responding agent might + consider the mismatched transport address information as a + plausible new candidate learned from the peer and continue its + ICE processing with that transport address included. + Alternatively, the responding agent MAY include an "ice-mismatch" + attribute in its answer for such data streams. If an agent + chooses to include an "ice-mismatch" attribute in its answer for + a data stream, then it MUST also omit "candidate" attributes, + MUST terminate the usage of ICE procedures, and [RFC3264] + procedures MUST be used instead for this data stream. + + 2. The transport address from the peer for the default destination + is set to IPv4/IPv6 address values "0.0.0.0"/"::" and port value + of "9". This MUST NOT be considered as an ICE failure by the + peer agent, and the ICE processing MUST continue as usual. + + 3. In some cases, the controlling/initiator agent may receive an SDP + answer that may omit "candidate" attributes for the data stream, + and instead include a media-level "ice-mismatch" attribute. This + signals to the offerer that the answerer supports ICE, but that + ICE processing was not used for this data stream. In this case, + ICE processing MUST be terminated for this data stream, and + [RFC3264] procedures MUST be followed instead. + + 4. The transport address from the peer for the default destination + is an FQDN. Regardless of the procedures used to resolve FQDN or + the resolution result, this MUST NOT be considered as an ICE + failure by the peer agent, and the ICE processing MUST continue + as usual. + +4.2.6. SDP Example + + The following is an example SDP message that includes ICE attributes + (lines folded for readability): + + v=0 + o=jdoe 2890844526 2890842807 IN IP4 203.0.113.141 + s= + c=IN IP4 192.0.2.3 + t=0 0 + a=ice-options:ice2 + a=ice-pacing:50 + a=ice-pwd:asd88fgpdd777uzjYhagZg + a=ice-ufrag:8hhY + m=audio 45664 RTP/AVP 0 + b=RS:0 + b=RR:0 + a=rtpmap:0 PCMU/8000 + a=candidate:1 1 UDP 2130706431 203.0.113.141 8998 typ host + a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr + 203.0.113.141 rport 8998 + +4.3. Initial Offer/Answer Exchange + +4.3.1. Sending the Initial Offer + + When an offerer generates the initial offer, in each "m=" section it + MUST include SDP "candidate" attributes for each available candidate + associated with the "m=" section. In addition, the offerer MUST + include an SDP "ice-ufrag" attribute, an SDP "ice-pwd" attribute, and + an SDP "ice-options" attribute with an "ice2" attribute value in the + offer. If the offerer is a full ICE implementation, it SHOULD + include an "ice-pacing" attribute in the offer (if not included, the + default value will apply). A lite ICE implementation MUST NOT + include the "ice-pacing" attribute in the offer (as it will not + perform connectivity checks). + + It is valid for an offer "m=" line to include no SDP "candidate" + attributes and have the default destination set to the IP address + values "0.0.0.0"/"::" and the port value to "9". This implies that + the offering agent is only going to use peer-reflexive candidates or + will provide additional candidates in subsequent signaling messages. + + Note: Within the scope of this document, "initial offer" refers to + the first SDP offer that is sent in order to negotiate usage of + ICE. It might, or might not, be the initial SDP offer of the SDP + session. + + Note: The procedures in this document only consider "m=" sections + associated with data streams where ICE is used. + +4.3.2. Sending the Initial Answer + + When an answerer receives an initial offer indicating that the + offerer supports ICE, and if the answerer accepts the offer and the + usage of ICE, the answerer MUST include in each "m=" section within + the answer the SDP "candidate" attributes for each available + candidate associated with the "m=" section. In addition, the + answerer MUST include an SDP "ice-ufrag" attribute, an SDP "ice-pwd" + attribute, and an SDP "ice-options" attribute with an "ice2" + attribute value in the answer. If the answerer is a full ICE + implementation, it SHOULD include an "ice-pacing" attribute in the + answer (if not included, the default value will apply). A lite ICE + implementation MUST NOT include the "ice-pacing" attribute in the + answer (as it will not perform connectivity checks). + + In each "m=" line, the answerer MUST use the same transport protocol + as was used in the offer "m=" line. If none of the candidates in the + "m=" line in the answer uses the same transport protocol as indicated + in the offer "m=" line, then, in order to avoid ICE mismatch, the + default destination MUST be set to IP address values "0.0.0.0"/"::" + and port value of "9". + + It is also valid for an answer "m=" line to include no SDP + "candidate" attributes and have the default destination set to the IP + address values "0.0.0.0"/"::" and the port value to "9". This + implies that the answering agent is only going to use peer-reflexive + candidates or that additional candidates would be provided in + subsequent signaling messages. + + Once the answerer has sent the answer, it can start performing + connectivity checks towards the peer candidates that were provided in + the offer. + + If the offer does not indicate support of ICE (Section 4.2.5), the + answerer MUST NOT accept the usage of ICE. If the answerer still + accepts the offer, the answerer MUST NOT include any ICE-related SDP + attributes in the answer. Instead, the answerer will generate the + answer according to normal offer/answer procedures [RFC3264]. + + If the answerer detects a possibility of an ICE mismatch, procedures + described in Section 4.2.5 are followed. + +4.3.3. Receiving the Initial Answer + + When an offerer receives an initial answer that indicates that the + answerer supports ICE, it can start performing connectivity checks + towards the peer candidates that were provided in the answer. + + If the answer does not indicate that the answerer supports ICE, or if + the answerer included "ice-mismatch" attributes for all the active + data streams in the answer, the offerer MUST terminate the usage of + ICE for the entire session, and [RFC3264] procedures MUST be followed + instead. + + On the other hand, if the answer indicates support for ICE but + includes "ice-mismatch" in certain active data streams, then the + offerer MUST terminate the usage of ICE procedures, and [RFC3264] + procedures MUST be used instead for only these data streams. Also, + ICE procedures MUST be used for data streams where an "ice-mismatch" + attribute was not included. + + If the offerer detects an ICE mismatch for one or more data streams + in the answer, as described in Section 4.2.5, the offerer MUST + terminate the usage of ICE for the entire session. The subsequent + actions taken by the offerer are implementation dependent and are out + of the scope of this specification. + +4.3.4. Concluding ICE + + Once the agent has successfully nominated a pair [RFC8445], the state + of the checklist associated with the pair is set to Completed. Once + the state of each checklist is set to either Completed or Failed, for + each Completed checklist, the agent checks whether the nominated pair + matches the default candidate pair. If there are one or more pairs + that do not match, and the peer did not indicate support for the + 'ice2' ice-option, the controlling agent MUST generate a subsequent + offer in which the connection address, port, and transport protocol + in the "c=" and "m=" lines associated with each data stream match the + corresponding local information of the nominated pair for that data + stream (Section 4.4.1.2.2). If the peer did indicate support for the + 'ice2' ice-option, the controlling agent does not immediately need to + generate an updated offer in order to align a connection address, + port, and protocol with a nominated pair. However, later in the + session, whenever the controlling agent does send a subsequent offer, + it MUST do the alignment as described above. + + If there are one or more checklists with the state set to Failed, the + controlling agent MUST generate a subsequent offer in order to remove + the associated data streams by setting the port value of the data + streams to zero (Section 4.4.1.1.2), even if the peer did indicate + support for the 'ice2' ice-option. If needed, such offer is used to + align the connection address, port, and transport protocol, as + described above. + + As described in [RFC8445], once the controlling agent has nominated a + candidate pair for a checklist, the agent MUST NOT nominate another + pair for that checklist during the lifetime of the ICE session (i.e., + until ICE is restarted). + + [RFC8863] provides a mechanism for allowing the ICE process to run + long enough in order to find working candidate pairs, by waiting for + potential peer-reflexive candidates, even though no candidate pairs + were received from the peer or all current candidate pairs associated + with a checklist have either failed or been discarded. + +4.4. Subsequent Offer/Answer Exchanges + + Either agent MAY generate a subsequent offer at any time allowed by + [RFC3264]. This section defines rules for construction of subsequent + offers and answers. + + Should a subsequent offer fail, ICE processing continues as if the + subsequent offer had never been made. + +4.4.1. Sending Subsequent Offer + +4.4.1.1. Procedures for All Implementations + +4.4.1.1.1. ICE Restart + + An agent MAY restart ICE processing for an existing data stream + [RFC8445]. + + The rules governing the ICE restart imply that setting the connection + address in the "c=" line to "0.0.0.0" (for IPv4)/ "::" (for IPv6) + will cause an ICE restart. Consequently, ICE implementations MUST + NOT utilize this mechanism for call hold, and instead MUST use + "inactive" and "sendonly" as described in [RFC3264]. + + To restart ICE, an agent MUST change both the "ice-pwd" and the "ice- + ufrag" for the data stream in an offer. However, it is permissible + to use a session-level attribute in one offer, but to provide the + same "ice-pwd" or "ice-ufrag" as a media-level attribute in a + subsequent offer. This MUST NOT be considered as ICE restart. + + An agent sets the rest of the ICE-related fields in the SDP for this + data stream as it would in an initial offer of this data stream + (Section 4.2.1). Consequently, the set of candidates MAY include + some, none, or all of the previous candidates for that data stream + and MAY include a totally new set of candidates. The agent MAY + modify the attribute values of the SDP "ice-options" and SDP "ice- + pacing" attributes, and it MAY change its role using the SDP "ice- + lite" attribute. The agent MUST NOT modify the SDP "ice-options", + "ice-pacing", and "ice-lite" attributes in a subsequent offer unless + the offer is sent in order to request an ICE restart. + +4.4.1.1.2. Removing a Data Stream + + If an agent removes a data stream by setting its port to zero, it + MUST NOT include any "candidate" attributes for that data stream and + SHOULD NOT include any other ICE-related attributes defined in + Section 5 for that data stream. + +4.4.1.1.3. Adding a Data Stream + + If an agent wishes to add a new data stream, it sets the fields in + the SDP for this data stream as if this were an initial offer for + that data stream (Section 4.2.1). This will cause ICE processing to + begin for this data stream. + +4.4.1.2. Procedures for Full Implementations + + This section describes additional procedures for full + implementations, covering existing data streams. + +4.4.1.2.1. Before Nomination + + When an offerer sends a subsequent offer; in each "m=" section for + which a candidate pair has not yet been nominated, the offer MUST + include the same set of ICE-related information that the offerer + included in the previous offer or answer. The agent MAY include + additional candidates it did not offer previously, but which it has + gathered since the last offer/answer exchange, including peer- + reflexive candidates. + + The agent MAY change the default destination for media. As with + initial offers, there MUST be a set of "candidate" attributes in the + offer matching this default destination. + +4.4.1.2.2. After Nomination + + Once a candidate pair has been nominated for a data stream, the + connection address, port, and transport protocol in each "c=" and + "m=" line associated with that data stream MUST match the data + associated with the nominated pair for that data stream. In + addition, the offerer only includes SDP "candidate" attributes (one + per component) representing the local candidates of the nominated + candidate pair. The offerer MUST NOT include any other SDP + "candidate" attributes in the subsequent offer. + + In addition, if the agent is controlling, it MUST include the + "remote-candidates" attribute for each data stream whose checklist is + in the Completed state. The attribute contains the remote candidates + corresponding to the nominated pair in the valid list for each + component of that data stream. It is needed to avoid a race + condition whereby the controlling agent chooses its pairs, but the + updated offer beats the connectivity checks to the controlled agent, + which doesn't even know these pairs are valid, let alone selected. + See Appendix B for elaboration on this race condition. + +4.4.1.3. Procedures for Lite Implementations + + If the ICE state is Running, a lite implementation MUST include all + of its candidates for each component of each data stream in + "candidate" attributes in any subsequent offer. The candidates are + formed identically to the procedures for initial offers. + + A lite implementation MUST NOT add additional host candidates in a + subsequent offer, and MUST NOT modify the username fragments and + passwords. If an agent needs to offer additional candidates, or to + modify the username fragments and passwords, it MUST request an ICE + restart (Section 4.4.1.1.1) for that data stream. + + If ICE has completed for a data stream, and if the agent is + controlled, the default destination for that data stream MUST be set + to the remote candidate of the candidate pair for that component in + the valid list. For a lite implementation, there is always just a + single candidate pair in the valid list for each component of a data + stream. Additionally, the agent MUST include a "candidate" attribute + for each default destination. + + If the ICE state is Completed, and if the agent is controlling (which + only happens when both agents are lite), the agent MUST include the + "remote-candidates" attribute for each data stream. The attribute + contains the remote candidates from the candidate pairs in the valid + list (one pair for each component of each data stream). + +4.4.2. Sending Subsequent Answer + + If ICE is Completed for a data stream, and the offer for that data + stream lacked the "remote-candidates" attribute, the rules for + construction of the answer are identical to those for the offerer, + except that the answerer MUST NOT include the "remote-candidates" + attribute in the answer. + + A controlled agent will receive an offer with the "remote-candidates" + attribute for a data stream when its peer has concluded ICE + processing for that data stream. This attribute is present in the + offer to deal with a race condition between the receipt of the offer, + and the receipt of the Binding response that tells the answerer the + candidate that will be selected by ICE. See Appendix B for an + explanation of this race condition. Consequently, processing of an + offer with this attribute depends on the winner of the race. + + The agent forms a candidate pair for each component of the data + stream by: + + * Setting the remote candidate equal to the offerer's default + destination for that component (i.e., the contents of the "m=" and + "c=" lines for RTP, and the "rtcp" attribute for RTCP) + + * Setting the local candidate equal to the transport address for + that same component in the "remote-candidates" attribute in the + offer. + + The agent then sees if each of these candidate pairs is present in + the valid list. If a particular pair is not in the valid list, the + check has "lost" the race. Call such a pair a "losing pair". + + The agent finds all the pairs in the checklist whose remote + candidates equal the remote candidate in the losing pair: + + * If none of the pairs is In-Progress, and at least one is Failed, + it is most likely that a network failure, such as a network + partition or serious packet loss, has occurred. The agent SHOULD + generate an answer for this data stream as if the "remote- + candidates" attribute had not been present, and then restart ICE + for this stream. + + * If at least one of the pairs is In-Progress, the agent SHOULD wait + for those checks to complete, and as each completes, redo the + processing in this section until there are no losing pairs. + + Once there are no losing pairs, the agent can generate the answer. + It MUST set the default destination for media to the candidates in + the "remote-candidates" attribute from the offer (each of which will + now be the local candidate of a candidate pair in the valid list). + It MUST include a "candidate" attribute in the answer for each + candidate in the "remote-candidates" attribute in the offer. + +4.4.2.1. ICE Restart + + If the offerer in a subsequent offer requested an ICE restart + (Section 4.4.1.1.1) for a data stream, and if the answerer accepts + the offer, the answerer follows the procedures for generating an + initial answer. + + For a given data stream, the answerer MAY include the same candidates + that were used in the previous ICE session, but it MUST change the + SDP "ice-pwd" and "ice-ufrag" attribute values. + + The answerer MAY modify the attribute values of the SDP "ice-options" + and SDP "ice-pacing" attributes, and it MAY change its role using the + SDP "ice-lite" attribute. The answerer MUST NOT modify the SDP "ice- + options", "ice-pacing", and "ice-lite" attributes in a subsequent + answer unless the answer is sent for an offer that was used to + request an ICE restart (Section 4.4.1.1.1). If any of the SDP + attributes have been modified in a subsequent offer that is not used + to request an ICE restart, the answerer MUST reject the offer. + +4.4.2.2. Lite Implementation Specific Procedures + + If the received offer contains the "remote-candidates" attribute for + a data stream, the agent forms a candidate pair for each component of + the data stream by: + + * Setting the remote candidate equal to the offerer's default + destination for that component (i.e., the contents of the "m=" and + "c=" lines for RTP, and the "rtcp" attribute for RTCP). + + * Setting the local candidate equal to the transport address for + that same component in the "remote-candidates" attribute in the + offer. + + The state of the checklist associated with that data stream is set to + Completed. + + Furthermore, if the agent believed it was controlling, but the offer + contained the "remote-candidates" attribute, both agents believe they + are controlling. In this case, both would have sent updated offers + around the same time. + + However, the signaling protocol carrying the offer/answer exchanges + will have resolved this glare condition, so that one agent is always + the 'winner' by having its offer received before its peer has sent an + offer. The winner takes the role of controlling, so that the loser + (the answerer under consideration in this section) MUST change its + role to controlled. + + Consequently, if the agent was controlling based on the rules in + Section 8.2 of [RFC8445] and was going to send an updated offer, it + no longer needs to. + + Besides the potential role change, change in the valid list, and + state changes, the construction of the answer is performed + identically to the construction of an offer. + +4.4.3. Receiving Answer for a Subsequent Offer + +4.4.3.1. Procedures for Full Implementations + + There may be certain situations where the offerer receives an SDP + answer that lacks ICE candidates although the initial answer included + them. One example of such an "unexpected" answer might happen when + an ICE-unaware Back-to-Back User Agent (B2BUA) introduces a media + server during call hold using third party call control procedures + [RFC3725]. Omitting further details on how this is done, this could + result in an answer that was constructed by the B2BUA being received + at the holding UA. With the B2BUA being ICE-unaware, that answer + would not include ICE candidates. + + Receiving an answer without ICE attributes in this situation might be + unexpected, but would not necessarily impair the user experience. + + When the offerer receives an answer indicating support for ICE, the + offer performs one of the following actions: + + * If the offer was a restart, the agent MUST perform ICE restart + procedures as specified in Section 4.4.3.1.1. + + * If the offer/answer exchange removed a data stream, or an answer + rejected an offered data stream, an agent MUST flush the valid + list for that data stream. It MUST also terminate any STUN + transactions in progress for that data stream. + + * If the offer/answer exchange added a new data stream, the agent + MUST create a new checklist for it (and an empty valid list to + start of course), which in turn triggers the candidate processing + procedures [RFC8445]. + + * If the checklist state associated with a data stream is Running, + the agent recomputes the checklist. If a pair on the new + checklist was also on the previous checklist, its candidate pair + state is copied over. Otherwise, its candidate pair state is set + to Frozen. If none of the checklists are active (meaning that the + candidate pair states in each checklist are Frozen), appropriate + procedures in [RFC8445] are performed to move candidate pair(s) to + the Waiting state to further continue ICE processing. + + * If the ICE state is Completed, and the SDP answer conforms to + Section 4.4.2, the agent MUST remain in the Completed ICE state. + + However, if the ICE support is no longer indicated in the SDP answer, + the agent MUST fall back to [RFC3264] procedures and SHOULD NOT drop + the dialog because of the missing ICE support or unexpected answer. + When the agent sends a new offer, it MUST perform an ICE restart. + +4.4.3.1.1. ICE Restarts + + The agent MUST remember the nominated pair in the valid list for each + component of the data stream, called the "previous selected pair", + prior to the restart. The agent will continue to send media using + this pair, as described in Section 12 of [RFC8445]. Once these + destinations are noted, the agent MUST flush the valid lists and + checklists, and then recompute the checklist and its states, thus + triggering the candidate processing procedures [RFC8445]. + +4.4.3.2. Procedures for Lite Implementations + + If ICE is restarting for a data stream, the agent MUST create a new + valid list for that data stream. It MUST remember the nominated pair + in the previous valid list for each component of the data stream, + called the "previous selected pairs", and continue to send media + there as described in Section 12 of [RFC8445]. The state of each + checklist for each data stream MUST change to Running, and the ICE + state MUST be set to Running. + +5. Grammar + + This specification defines eight new SDP attributes -- the + "candidate", "remote-candidates", "ice-lite", "ice-mismatch", "ice- + ufrag", "ice-pwd", "ice-pacing", and "ice-options" attributes. + + This section also provides non-normative examples of the attributes + defined. + + The syntax for the attributes follow Augmented BNF as defined in + [RFC5234]. + +5.1. "candidate" Attribute + + The "candidate" attribute is a media-level attribute only. It + contains a transport address for a candidate that can be used for + connectivity checks. + + candidate-attribute = "candidate" ":" foundation SP component-id SP + transport SP + priority SP + connection-address SP ;from RFC 4566 + port ;port from RFC 4566 + SP cand-type + [SP rel-addr] + [SP rel-port] + *(SP cand-extension) + + foundation = 1*32ice-char + component-id = 1*3DIGIT + transport = "UDP" / transport-extension + transport-extension = token ; from RFC 3261 + priority = 1*10DIGIT + cand-type = "typ" SP candidate-types + candidate-types = "host" / "srflx" / "prflx" / "relay" / token + rel-addr = "raddr" SP connection-address + rel-port = "rport" SP port + cand-extension = extension-att-name SP extension-att-value + extension-att-name = token + extension-att-value = *VCHAR + ice-char = ALPHA / DIGIT / "+" / "/" + + This grammar encodes the primary information about a candidate: its + IP address, port and transport protocol, and its properties: the + foundation, component ID, priority, type, and related transport + address: + + <connection-address>: is taken from RFC 4566 [RFC4566]. It is the + IP address of the candidate, allowing for IPv4 addresses, IPv6 + addresses, and fully qualified domain names (FQDNs). When parsing + this field, an agent can differentiate an IPv4 address and an IPv6 + address by presence of a colon in its value - the presence of a + colon indicates IPv6. An agent generating local candidates MUST + NOT use FQDN addresses. An agent processing remote candidates + MUST ignore "candidate" lines that include candidates with FQDNs + or IP address versions that are not supported or recognized. The + procedures for generation and handling of FQDN candidates, as well + as, how agents indicate support for such procedures, need to be + specified in an extension specification. + + <port>: is also taken from RFC 4566 [RFC4566]. It is the port of + the candidate. + + <transport>: indicates the transport protocol for the candidate. + This specification only defines UDP. However, extensibility is + provided to allow for future transport protocols to be used with + ICE by extending the subregistry "ICE Transport Protocols" under + the "Interactive Connectivity Establishment (ICE)" registry. + + <foundation>: is composed of 1 to 32 <ice-char>s. It is an + identifier that is equivalent for two candidates that are of the + same type, share the same base, and come from the same STUN + server. The foundation is used to optimize ICE performance in the + Frozen algorithm as described in [RFC8445]. + + <component-id>: is a positive integer between 1 and 256 (inclusive) + that identifies the specific component of the data stream for + which this is a candidate. It MUST start at 1 and MUST increment + by 1 for each component of a particular candidate. For data + streams based on RTP, candidates for the actual RTP media MUST + have a component ID of 1, and candidates for RTCP MUST have a + component ID of 2. See Section 13 of [RFC8445] for additional + discussion on extending ICE to new data streams. + + <priority>: is a positive integer between 1 and (2**31 - 1) + inclusive. The procedures for computing a candidate's priority + are described in Section 5.1.2 of [RFC8445]. + + <cand-type>: encodes the type of candidate. This specification + defines the values "host", "srflx", "prflx", and "relay" for host, + server-reflexive, peer-reflexive, and relayed candidates, + respectively. Specifications for new candidate types MUST define + how, if at all, various steps in the ICE processing differ from + the ones defined by this specification. + + <rel-addr> and <rel-port>: convey transport addresses related to the + candidate, useful for diagnostics and other purposes. <rel-addr> + and <rel-port> MUST be present for server-reflexive, peer- + reflexive, and relayed candidates. If a candidate is server- + reflexive or peer-reflexive, <rel-addr> and <rel-port> are equal + to the base for that server-reflexive or peer-reflexive candidate. + If the candidate is relayed, <rel-addr> and <rel-port> are equal + to the mapped address in the Allocate response that provided the + client with that relayed candidate (see Section 6.3 of [RFC5766]). + If the candidate is a host candidate, <rel-addr> and <rel-port> + MUST be omitted. + + In some cases, e.g., for privacy reasons, an agent may not want to + reveal the related address and port. In this case the address + MUST be set to "0.0.0.0" (for IPv4 candidates) or "::" (for IPv6 + candidates) and the port to "9". + + The "candidate" attribute can itself be extended. The grammar allows + for new name/value pairs to be added at the end of the attribute. + Such extensions MUST be made through IETF Review or IESG Approval + [RFC8126], and the assignments MUST contain the specific extension + and a reference to the document defining the usage of the extension. + + An implementation MUST ignore any name/value pairs it doesn't + understand. + + The following is an example SDP line for a UDP server-reflexive + "candidate" attribute for the RTP component: + + a=candidate:2 1 UDP 1694498815 192.0.2.3 45664 typ srflx raddr + 203.0.113.141 rport 8998 + +5.2. "remote-candidates" Attribute + + The syntax of the "remote-candidates" attribute is defined using + Augmented BNF as defined in [RFC5234]. The "remote-candidates" + attribute is a media-level attribute only. + + remote-candidate-att = "remote-candidates:" remote-candidate + 0*(SP remote-candidate) + remote-candidate = component-id SP connection-address SP port + + The attribute contains a connection-address and port for each + component. The ordering of components is irrelevant. However, a + value MUST be present for each component of a data stream. This + attribute MUST be included in an offer by a controlling agent for a + data stream that is Completed, and MUST NOT be included in any other + case. + + The following is an example of "remote-candidates" SDP lines for the + RTP and RTCP components: + + a=remote-candidates:1 192.0.2.3 45664 + a=remote-candidates:2 192.0.2.3 45665 + +5.3. "ice-lite" and "ice-mismatch" Attributes + + The syntax of the "ice-lite" and "ice-mismatch" attributes, both of + which are flags, is: + + ice-lite = "ice-lite" + ice-mismatch = "ice-mismatch" + + "ice-lite" is a session-level attribute only, and indicates that an + agent is a lite implementation. "ice-mismatch" is a media-level + attribute and only reported in the answer. It indicates that the + offer arrived with a default destination for a media component that + didn't have a corresponding "candidate" attribute. Inclusion of + "ice-mismatch" attribute for a given data stream implies that even + though both agents support ICE, ICE procedures MUST NOT be used for + this data stream, and [RFC3264] procedures MUST be used instead. + +5.4. "ice-ufrag" and "ice-pwd" Attributes + + The "ice-ufrag" and "ice-pwd" attributes convey the username fragment + and password used by ICE for message integrity. Their syntax is: + + ice-pwd-att = "ice-pwd:" password + ice-ufrag-att = "ice-ufrag:" ufrag + password = 22*256ice-char + ufrag = 4*256ice-char + + The "ice-pwd" and "ice-ufrag" attributes can appear at either the + session-level or media-level. When present in both, the value in the + media-level takes precedence. Thus, the value at the session-level + is effectively a default that applies to all data streams, unless + overridden by a media-level value. Whether present at the session or + media-level, there MUST be an "ice-pwd" and "ice-ufrag" attribute for + each data stream. If two data streams have identical "ice-ufrag"s, + they MUST have identical "ice-pwd"s. + + The "ice-ufrag" and "ice-pwd" attributes MUST be chosen randomly at + the beginning of a session (the same applies when ICE is restarting + for an agent). + + [RFC8445] requires the "ice-ufrag" attribute to contain at least 24 + bits of randomness, and the "ice-pwd" attribute to contain at least + 128 bits of randomness. This means that the "ice-ufrag" attribute + will be at least 4 characters long, and the "ice-pwd" at least 22 + characters long, since the grammar for these attributes allows for 6 + bits of information per character. The attributes MAY be longer than + 4 and 22 characters, respectively, of course, up to 256 characters. + The upper limit allows for buffer sizing in implementations. Its + large upper limit allows for increased amounts of randomness to be + added over time. For compatibility with the 512-character limitation + for the STUN username attribute value and for bandwidth conservation + considerations, the "ice-ufrag" attribute MUST NOT be longer than 32 + characters when sending, but an implementation MUST accept up to 256 + characters when receiving. + + The following example shows sample "ice-ufrag" and "ice-pwd" SDP + lines: + + a=ice-pwd:asd88fgpdd777uzjYhagZg + a=ice-ufrag:8hhY + +5.5. "ice-pacing" Attribute + + The "ice-pacing" is a session-level attribute that indicates the + desired connectivity-check pacing (Ta interval), in milliseconds, + that the sender wishes to use. See Section 14.2 of [RFC8445] for + more information regarding selecting a pacing value. The syntax is: + + ice-pacing-att = "ice-pacing:" pacing-value + pacing-value = 1*10DIGIT + + If absent in an offer or answer, the default value of the attribute + is 50 ms, which is the recommended value specified in [RFC8445]. + + As defined in [RFC8445], regardless of the Ta value chosen for each + agent, the combination of all transactions from all agents (if a + given implementation runs several concurrent agents) will not be sent + more often than once every 5 ms. + + As defined in [RFC8445], once both agents have indicated the pacing + value they want to use, both agents will use the larger of the + indicated values. + + The following example shows an "ice-pacing" SDP line with value '50': + + a=ice-pacing:50 + +5.6. "ice-options" Attribute + + The "ice-options" attribute is a session-level and media-level + attribute. It contains a series of tokens that identify the options + supported by the agent. Its grammar is: + + ice-options = "ice-options:" ice-option-tag + *(SP ice-option-tag) + ice-option-tag = 1*ice-char + + The existence of an "ice-options" in an offer indicates that a + certain extension is supported by the agent, and it is willing to use + it if the peer agent also includes the same extension in the answer. + There might be further extension-specific negotiation needed between + the agents that determine how the extension gets used in a given + session. The details of the negotiation procedures, if present, MUST + be defined by the specification defining the extension + (Section 10.2). + + The following example shows an "ice-options" SDP line with 'ice2' and + 'rtp+ecn' [RFC6679] values. + + a=ice-options:ice2 rtp+ecn + +6. Keepalives + + All the ICE agents MUST follow the procedures defined in Section 11 + of [RFC8445] for sending keepalives. As defined in [RFC8445], the + keepalives will be sent regardless of whether the data stream is + currently inactive, sendonly, recvonly, or sendrecv, and regardless + of the presence or value of the bandwidth attribute. An agent can + determine that its peer supports ICE by the presence of "candidate" + attributes for each media session. + +7. SIP Considerations + + Note that ICE is not intended for NAT traversal for SIP signaling, + which is assumed to be provided via another mechanism [RFC5626]. + + When ICE is used with SIP, forking may result in a single offer + generating a multiplicity of answers. In that case, ICE proceeds + completely in parallel and independently for each answer, treating + the combination of its offer and each answer as an independent offer/ + answer exchange, with its own set of local candidates, pairs, + checklists, states, and so on. + +7.1. Latency Guidelines + + ICE requires a series of STUN-based connectivity checks to take place + between endpoints. These checks start from the answerer on + generation of its answer, and start from the offerer when it receives + the answer. These checks can take time to complete, and as such, the + selection of messages to use with offers and answers can affect + perceived user latency. Two latency figures are of particular + interest. These are the post-pickup delay and the post-dial delay. + The post-pickup delay refers to the time between when a user "answers + the phone" and when any speech they utter can be delivered to the + caller. The post-dial delay refers to the time between when a user + enters the destination address for the user and ringback begins as a + consequence of having successfully started alerting the called user + agent. + + Two cases can be considered -- one where the offer is present in the + initial INVITE and one where it is in a response. + +7.1.1. Offer in INVITE + + To reduce post-dial delays, it is RECOMMENDED that the caller begin + gathering candidates prior to actually sending its initial INVITE, so + that the candidates can be provided in the INVITE. This can be + started upon user interface cues that a call is pending, such as + activity on a keypad or the phone going off-hook. + + On the receipt of the offer, the answerer SHOULD generate an answer + in a provisional response as soon as it has completed gathering the + candidates. ICE requires that a provisional response with an SDP be + transmitted reliably. This can be done through the existing + Provisional Response Acknowledgment (PRACK) mechanism [RFC3262] or + through an ICE-specific optimization, wherein, the agent retransmits + the provisional response with the exponential backoff timers + described in [RFC3262]. Such retransmissions MUST cease on receipt + of a STUN Binding request with the transport address matching the + candidate address for one of the data streams signaled in that SDP or + on transmission of the answer in a 2xx response. If no Binding + request is received prior to the last retransmit, the agent does not + consider the session terminated. For the ICE-lite peers, the agent + MUST cease retransmitting the 18x response after sending it four + times since there will be no Binding request sent, and the number + four is arbitrarily chosen to limit the number of 18x retransmits. + + Once the answer has been sent, the agent SHOULD begin its + connectivity checks. Once candidate pairs for each component of a + data stream enter the valid list, the answerer can begin sending + media on that data stream. + + However, prior to this point, any media that needs to be sent towards + the caller (such as SIP early media [RFC3960]) MUST NOT be + transmitted. For this reason, implementations SHOULD delay alerting + the called party until candidates for each component of each data + stream have entered the valid list. In the case of a PSTN gateway, + this would mean that the setup message into the PSTN is delayed until + this point. Doing this increases the post-dial delay, but has the + effect of eliminating 'ghost rings'. Ghost rings are cases where the + called party hears the phone ring, picks up, but hears nothing and + cannot be heard. This technique works without requiring support for, + or usage of, preconditions [RFC3312]. It also has the benefit of + guaranteeing that not a single packet of media will get clipped, so + that post-pickup delay is zero. If an agent chooses to delay local + alerting in this way, it SHOULD generate a 180 response once alerting + begins. + +7.1.2. Offer in Response + + In addition to uses where the offer is in an INVITE, and the answer + is in the provisional and/or 200 OK response, ICE works with cases + where the offer appears in the response. In such cases, which are + common in third party call control [RFC3725], ICE agents SHOULD + generate their offers in a reliable provisional response (which MUST + utilize [RFC3262]), and not alert the user on receipt of the INVITE. + The answer will arrive in a PRACK. This allows for ICE processing to + take place prior to alerting, so that there is no post-pickup delay, + at the expense of increased call setup delays. Once ICE completes, + the callee can alert the user and then generate a 200 OK when they + answer. The 200 OK would contain no SDP, since the offer/answer + exchange has completed. + + Alternatively, agents MAY place the offer in a 2xx instead (in which + case the answer comes in the ACK). When this happens, the callee + will alert the user on receipt of the INVITE, and the ICE exchanges + will take place only after the user answers. This has the effect of + reducing call-setup delay, but can cause substantial post-pickup + delays and media clipping. + +7.2. SIP Option Tags and Media Feature Tags + + [RFC5768] specifies a SIP option tag and media feature tag for usage + with ICE. ICE implementations using SIP SHOULD support this + specification, which uses a feature tag in registrations to + facilitate interoperability through signaling intermediaries. + +7.3. Interactions with Forking + + ICE interacts very well with forking. Indeed, ICE fixes some of the + problems associated with forking. Without ICE, when a call forks and + the caller receives multiple incoming data streams, it cannot + determine which data stream corresponds to which callee. + + With ICE, this problem is resolved. The connectivity checks which + occur prior to transmission of media carry username fragments which + in turn are correlated to a specific callee. Subsequent media + packets that arrive on the same candidate pair as the connectivity + check will be associated with that same callee. Thus, the caller can + perform this correlation as long as it has received an answer. + +7.4. Interactions with Preconditions + + Quality of Service (QoS) preconditions, which are defined in + [RFC3312] and [RFC4032], apply only to the transport addresses listed + as the default targets for media in an offer/answer. If ICE changes + the transport address where media is received, this change is + reflected in an updated offer that changes the default destination + for media to match ICE's selection. As such, it appears like any + other re-INVITE would, and is fully treated in RFCs 3312 and 4032, + which apply without regard to the fact that the destination for media + is changing due to ICE negotiations occurring "in the background". + + Indeed, an agent SHOULD NOT indicate that QoS preconditions have been + met until the checks have completed and selected the candidate pairs + to be used for media. + + ICE also has interactions with connectivity preconditions [RFC5898]. + Those interactions are described there. Note that the procedures + described in Section 7.1 describe their own type of "preconditions", + albeit with less functionality than those provided by the explicit + preconditions in [RFC5898]. + +7.5. Interactions with Third Party Call Control + + ICE works with Flows I, III, and IV as described in [RFC3725]. Flow + I works without the controller supporting or being aware of ICE. + Flow IV will work as long as the controller passes along the ICE + attributes without alteration. Flow II is fundamentally incompatible + with ICE; each agent will believe itself to be the answerer and thus + never generate a re-INVITE. + + The flows for continued operation, as described in Section 7 of + [RFC3725], require additional behavior of ICE implementations to + support. In particular, if an agent receives a mid-dialog re-INVITE + that contains no offer, it MUST restart ICE for each data stream and + go through the process of gathering new candidates. Furthermore, + that list of candidates SHOULD include the ones currently being used + for media. + +8. Interactions with Application Layer Gateways and SIP + + Application Layer Gateways (ALGs) are functions present in a Network + Address Translation (NAT) device that inspect the contents of packets + and modify them, in order to facilitate NAT traversal for application + protocols. Session Border Controllers (SBCs) are close cousins of + ALGs, but are less transparent since they actually exist as + application-layer SIP intermediaries. ICE has interactions with SBCs + and ALGs. + + If an ALG is SIP aware but not ICE aware, ICE will work through it as + long as the ALG correctly modifies the SDP. A correct ALG + implementation behaves as follows: + + * The ALG does not modify the "m=" and "c=" lines or the "rtcp" + attribute if they contain external addresses. + + * If the "m=" and "c=" lines contain internal addresses, the + modification depends on the state of the ALG: + + - If the ALG already has a binding established that maps an + external port to an internal connection address and port + matching the values in the "m=" and "c=" lines or "rtcp" + attribute, the ALG uses that binding instead of creating a new + one. + + - If the ALG does not already have a binding, it creates a new + one and modifies the SDP, rewriting the "m=" and "c=" lines and + "rtcp" attribute. + + Unfortunately, many ALGs are known to work poorly in these corner + cases. ICE does not try to work around broken ALGs, as this is + outside the scope of its functionality. ICE can help diagnose these + conditions, which often show up as a mismatch between the set of + candidates and the "m=" and "c=" lines and "rtcp" attributes. The + "ice-mismatch" attribute is used for this purpose. + + ICE works best through ALGs when the signaling is run over TLS. This + prevents the ALG from manipulating the SDP messages and interfering + with ICE operation. Implementations that are expected to be deployed + behind ALGs SHOULD provide for TLS transport of the SDP. + + If an SBC is SIP aware but not ICE aware, the result depends on the + behavior of the SBC. If it is acting as a proper Back-to-Back User + Agent (B2BUA), the SBC will remove any SDP attributes it doesn't + understand, including the ICE attributes. Consequently, the call + will appear to both endpoints as if the other side doesn't support + ICE. This will result in ICE being disabled, and media flowing + through the SBC, if the SBC has requested it. If, however, the SBC + passes the ICE attributes without modification, yet modifies the + default destination for media (contained in the "m=" and "c=" lines + and "rtcp" attribute), this will be detected as an ICE mismatch, and + ICE processing is aborted for the call. It is outside of the scope + of ICE for it to act as a tool for "working around" SBCs. If one is + present, ICE will not be used and the SBC techniques take precedence. + +9. Security Considerations + + The generic ICE security considerations are defined in [RFC8445], and + the generic SDP offer/answer security considerations are defined in + [RFC3264]. These security considerations also apply to + implementations of this document. + +9.1. IP Address Privacy + + In some cases, e.g., for privacy reasons, an agent may not want to + reveal the related address and port. In this case the address MUST + be set to "0.0.0.0" (for IPv4 candidates) or "::" (for IPv6 + candidates) and the port to '9'. + +9.2. Attacks on the Offer/Answer Exchanges + + An attacker that can modify or disrupt the offer/answer exchanges + themselves can readily launch a variety of attacks with ICE. They + could direct media to a target of a DoS attack, they could insert + themselves into the data stream, and so on. These are similar to the + general security considerations for offer/answer exchanges, and the + security considerations in [RFC3264] apply. These require techniques + for message integrity and encryption for offers and answers, which + are satisfied by the TLS mechanism [RFC3261] when SIP is used. As + such, the usage of TLS with ICE is RECOMMENDED. + +9.3. The Voice Hammer Attack + + The voice hammer attack is an amplification attack, and can be + triggered even if the attacker is an authenticated and valid + participant in a session. In this attack, the attacker initiates + sessions to other agents, and maliciously includes the connection + address and port of a DoS target as the destination for media traffic + signaled in the SDP. This causes substantial amplification; a single + offer/answer exchange can create a continuing flood of media packets, + possibly at high rates (consider video sources). The use of ICE can + help to prevent against this attack. + + Specifically, if ICE is used, the agent receiving the malicious SDP + will first perform connectivity checks to the target of media before + sending media there. If this target is a third-party host, the + checks will not succeed, and media is never sent. The ICE extension + defined in [RFC7675] can be used to further protect against voice + hammer attacks. + + Unfortunately, ICE doesn't help if it's not used, in which case an + attacker could simply send the offer without the ICE parameters. + However, in environments where the set of clients is known, and is + limited to ones that support ICE, the server can reject any offers or + answers that don't indicate ICE support. + + SIP user agents (UA) [RFC3261] that are not willing to receive non- + ICE answers MUST include an "ice" option tag [RFC5768] in the SIP + Require header field in their offer. UAs that reject non-ICE offers + will generally use a 421 response code, together with an option tag + "ice" in the Require header field in the response. + +10. IANA Considerations + +10.1. SDP Attributes + + The original ICE specification defined seven new SDP attributes per + the procedures of Section 8.2.4 of [RFC4566]. The registration + information from the original specification is included here with + modifications to include Mux Category [RFC8859] and also defines a + new SDP attribute "ice-pacing". + +10.1.1. "candidate" Attribute + + Attribute Name: candidate + + Type of Attribute: media-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and provides one of many possible candidate + addresses for communication. These addresses are validated with + an end-to-end connectivity check using Session Traversal Utilities + for NAT (STUN). + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact Email: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: TRANSPORT + +10.1.2. "remote-candidates" Attribute + + Attribute Name: remote-candidates + + Type of Attribute: media-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and provides the identity of the remote + candidates that the offerer wishes the answerer to use in its + answer. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact Email: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: TRANSPORT + +10.1.3. "ice-lite" Attribute + + Attribute Name: ice-lite + + Type of Attribute: session-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and indicates that an agent has the minimum + functionality required to support ICE inter-operation with a peer + that has a full implementation. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact Email: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: NORMAL + +10.1.4. "ice-mismatch" Attribute + + Attribute Name: ice-mismatch + + Type of Attribute: media-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and indicates that an agent is ICE capable, + but did not proceed with ICE due to a mismatch of candidates with + the default destination for media signaled in the SDP. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact e-mail: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: NORMAL + +10.1.5. "ice-pwd" Attribute + + Attribute Name: ice-pwd + + Type of Attribute: session- or media-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and provides the password used to protect + STUN connectivity checks. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact e-mail: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: TRANSPORT + +10.1.6. "ice-ufrag" Attribute + + Attribute Name: ice-ufrag + + Type of Attribute: session- or media-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and provides the fragments used to construct + the username in STUN connectivity checks. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact e-mail: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: TRANSPORT + +10.1.7. "ice-options" Attribute + + Attribute Name: ice-options + + Long Form: ice-options + + Type of Attribute: session-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE), and indicates the ICE options or extensions + used by the agent. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact e-mail: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: NORMAL + +10.1.8. "ice-pacing" Attribute + + This specification also defines a new SDP attribute, "ice-pacing", + according to the following data: + + Attribute Name: ice-pacing + + Type of Attribute: session-level + + Subject to charset: No + + Purpose: This attribute is used with Interactive Connectivity + Establishment (ICE) to indicate desired connectivity check pacing + values. + + Appropriate Values: See Section 5 of RFC 8839. + + Contact Name: IESG + + Contact e-mail: iesg@ietf.org + + Reference: RFC 8839 + + Mux Category: NORMAL + +10.2. Interactive Connectivity Establishment (ICE) Options Registry + + IANA maintains a registry for "ice-options" identifiers under the + Specification Required policy as defined in "Guidelines for Writing + an IANA Considerations Section in RFCs" [RFC8126]. + + ICE options are of unlimited length according to the syntax in + Section 5.6; however, they are RECOMMENDED to be no longer than 20 + characters. This is to reduce message sizes and allow for efficient + parsing. ICE options are defined at the session level. + + A registration request MUST include the following information: + + * The ICE option identifier to be registered + + * Name and email address of organization or individuals having + change control + + * Short description of the ICE extension to which the option relates + + * Reference(s) to the specification defining the ICE option and the + related extensions + +10.3. Candidate Attribute Extension Subregistry Establishment + + This section creates a new subregistry, "Candidate Attribute + Extensions", under the SDP Parameters registry: + http://www.iana.org/assignments/sdp-parameters. + + The purpose of the subregistry is to register SDP "candidate" + attribute extensions. + + When a "candidate" extension is registered in the subregistry, it + needs to meet the "Specification Required" policies defined in + [RFC8126]. + + "candidate" attribute extensions MUST follow the 'cand-extension' + syntax. The attribute extension name MUST follow the 'extension-att- + name' syntax, and the attribute extension value MUST follow the + 'extension-att-value' syntax. + + A registration request MUST include the following information: + + * The name of the attribute extension. + + * Name and email address of organization or individuals having + change control + + * A short description of the attribute extension. + + * A reference to a specification that describes the semantics, usage + and possible values of the attribute extension. + +11. Changes from RFC 5245 + + [RFC8445] describes the changes made to the common SIP procedures, + including removal of aggressive nomination, modifying the procedures + for calculating candidate pair states, scheduling connectivity + checks, and the calculation of timer values. + + This document defines the following SDP offer/answer specific + changes: + + * SDP offer/answer realization and usage of 'ice2' option. + + * Definition and usage of SDP "ice-pacing" attribute. + + * Explicit text that an ICE agent must not generate candidates with + FQDNs, and must discard such candidates if received from the peer + agent. + + * Relax requirement to include SDP "rtcp" attribute. + + * Generic clarifications of SDP offer/answer procedures. + + * ICE mismatch is now optional, and an agent has an option to not + trigger mismatch and instead treat the default candidate as an + additional candidate. + + * FQDNs and "0.0.0.0"/"::" IP addresses with port "9" default + candidates do not trigger ICE mismatch. + +12. References + +12.1. Normative References + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3261] Rosenberg, J., Schulzrinne, H., Camarillo, G., Johnston, + A., Peterson, J., Sparks, R., Handley, M., and E. + Schooler, "SIP: Session Initiation Protocol", RFC 3261, + DOI 10.17487/RFC3261, June 2002, + <https://www.rfc-editor.org/info/rfc3261>. + + [RFC3262] Rosenberg, J. and H. Schulzrinne, "Reliability of + Provisional Responses in Session Initiation Protocol + (SIP)", RFC 3262, DOI 10.17487/RFC3262, June 2002, + <https://www.rfc-editor.org/info/rfc3262>. + + [RFC3264] Rosenberg, J. and H. Schulzrinne, "An Offer/Answer Model + with Session Description Protocol (SDP)", RFC 3264, + DOI 10.17487/RFC3264, June 2002, + <https://www.rfc-editor.org/info/rfc3264>. + + [RFC3312] Camarillo, G., Ed., Marshall, W., Ed., and J. Rosenberg, + "Integration of Resource Management and Session Initiation + Protocol (SIP)", RFC 3312, DOI 10.17487/RFC3312, October + 2002, <https://www.rfc-editor.org/info/rfc3312>. + + [RFC3556] Casner, S., "Session Description Protocol (SDP) Bandwidth + Modifiers for RTP Control Protocol (RTCP) Bandwidth", + RFC 3556, DOI 10.17487/RFC3556, July 2003, + <https://www.rfc-editor.org/info/rfc3556>. + + [RFC3605] Huitema, C., "Real Time Control Protocol (RTCP) attribute + in Session Description Protocol (SDP)", RFC 3605, + DOI 10.17487/RFC3605, October 2003, + <https://www.rfc-editor.org/info/rfc3605>. + + [RFC4032] Camarillo, G. and P. Kyzivat, "Update to the Session + Initiation Protocol (SIP) Preconditions Framework", + RFC 4032, DOI 10.17487/RFC4032, March 2005, + <https://www.rfc-editor.org/info/rfc4032>. + + [RFC4566] Handley, M., Jacobson, V., and C. Perkins, "SDP: Session + Description Protocol", RFC 4566, DOI 10.17487/RFC4566, + July 2006, <https://www.rfc-editor.org/info/rfc4566>. + + [RFC5234] Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax + Specifications: ABNF", STD 68, RFC 5234, + DOI 10.17487/RFC5234, January 2008, + <https://www.rfc-editor.org/info/rfc5234>. + + [RFC5389] Rosenberg, J., Mahy, R., Matthews, P., and D. Wing, + "Session Traversal Utilities for NAT (STUN)", RFC 5389, + DOI 10.17487/RFC5389, October 2008, + <https://www.rfc-editor.org/info/rfc5389>. + + [RFC5766] Mahy, R., Matthews, P., and J. Rosenberg, "Traversal Using + Relays around NAT (TURN): Relay Extensions to Session + Traversal Utilities for NAT (STUN)", RFC 5766, + DOI 10.17487/RFC5766, April 2010, + <https://www.rfc-editor.org/info/rfc5766>. + + [RFC5768] Rosenberg, J., "Indicating Support for Interactive + Connectivity Establishment (ICE) in the Session Initiation + Protocol (SIP)", RFC 5768, DOI 10.17487/RFC5768, April + 2010, <https://www.rfc-editor.org/info/rfc5768>. + + [RFC6336] Westerlund, M. and C. Perkins, "IANA Registry for + Interactive Connectivity Establishment (ICE) Options", + RFC 6336, DOI 10.17487/RFC6336, July 2011, + <https://www.rfc-editor.org/info/rfc6336>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + + [RFC8445] Keranen, A., Holmberg, C., and J. Rosenberg, "Interactive + Connectivity Establishment (ICE): A Protocol for Network + Address Translator (NAT) Traversal", RFC 8445, + DOI 10.17487/RFC8445, July 2018, + <https://www.rfc-editor.org/info/rfc8445>. + +12.2. Informative References + + [RFC3725] Rosenberg, J., Peterson, J., Schulzrinne, H., and G. + Camarillo, "Best Current Practices for Third Party Call + Control (3pcc) in the Session Initiation Protocol (SIP)", + BCP 85, RFC 3725, DOI 10.17487/RFC3725, April 2004, + <https://www.rfc-editor.org/info/rfc3725>. + + [RFC3960] Camarillo, G. and H. Schulzrinne, "Early Media and Ringing + Tone Generation in the Session Initiation Protocol (SIP)", + RFC 3960, DOI 10.17487/RFC3960, December 2004, + <https://www.rfc-editor.org/info/rfc3960>. + + [RFC5245] Rosenberg, J., "Interactive Connectivity Establishment + (ICE): A Protocol for Network Address Translator (NAT) + Traversal for Offer/Answer Protocols", RFC 5245, + DOI 10.17487/RFC5245, April 2010, + <https://www.rfc-editor.org/info/rfc5245>. + + [RFC5626] Jennings, C., Ed., Mahy, R., Ed., and F. Audet, Ed., + "Managing Client-Initiated Connections in the Session + Initiation Protocol (SIP)", RFC 5626, + DOI 10.17487/RFC5626, October 2009, + <https://www.rfc-editor.org/info/rfc5626>. + + [RFC5898] Andreasen, F., Camarillo, G., Oran, D., and D. Wing, + "Connectivity Preconditions for Session Description + Protocol (SDP) Media Streams", RFC 5898, + DOI 10.17487/RFC5898, July 2010, + <https://www.rfc-editor.org/info/rfc5898>. + + [RFC6679] Westerlund, M., Johansson, I., Perkins, C., O'Hanlon, P., + and K. Carlberg, "Explicit Congestion Notification (ECN) + for RTP over UDP", RFC 6679, DOI 10.17487/RFC6679, August + 2012, <https://www.rfc-editor.org/info/rfc6679>. + + [RFC7675] Perumal, M., Wing, D., Ravindranath, R., Reddy, T., and M. + Thomson, "Session Traversal Utilities for NAT (STUN) Usage + for Consent Freshness", RFC 7675, DOI 10.17487/RFC7675, + October 2015, <https://www.rfc-editor.org/info/rfc7675>. + + [RFC8126] Cotton, M., Leiba, B., and T. Narten, "Guidelines for + Writing an IANA Considerations Section in RFCs", BCP 26, + RFC 8126, DOI 10.17487/RFC8126, June 2017, + <https://www.rfc-editor.org/info/rfc8126>. + + [RFC8859] Nandakumar, S., "A Framework for Session Description + Protocol (SDP) Attributes When Multiplexing", RFC 8859, + DOI 10.17487/RFC8859, January 2021, + <https://www.rfc-editor.org/info/rfc8859>. + + [RFC8863] Holmberg, C. and J. Uberti, "Interactive Connectivity + Establishment Patiently Awaiting Connectivity (ICE PAC)", + RFC 8863, DOI 10.17487/RFC8863, January 2021, + <https://www.rfc-editor.org/info/rfc8863>. + +Appendix A. Examples + + For the example shown in Section 15 of [RFC8445], the resulting offer + (message 5) encoded in SDP looks like (lines folded for clarity): + + v=0 + o=jdoe 2890844526 2890842807 IN IP6 $L-PRIV-1.IP + s= + c=IN IP6 $NAT-PUB-1.IP + t=0 0 + a=ice-options:ice2 + a=ice-pacing:50 + a=ice-pwd:asd88fgpdd777uzjYhagZg + a=ice-ufrag:8hhY + m=audio $NAT-PUB-1.PORT RTP/AVP 0 + b=RS:0 + b=RR:0 + a=rtpmap:0 PCMU/8000 + a=candidate:1 1 UDP 2130706431 $L-PRIV-1.IP $L-PRIV-1.PORT typ host + a=candidate:2 1 UDP 1694498815 $NAT-PUB-1.IP $NAT-PUB-1.PORT typ + srflx raddr $L-PRIV-1.IP rport $L-PRIV-1.PORT + + The offer, with the variables replaced with their values, will look + like (lines folded for clarity): + + v=0 + o=jdoe 2890844526 2890842807 IN IP6 fe80::6676:baff:fe9c:ee4a + s= + c=IN IP6 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 + t=0 0 + a=ice-options:ice2 + a=ice-pacing:50 + a=ice-pwd:asd88fgpdd777uzjYhagZg + a=ice-ufrag:8hhY + m=audio 45664 RTP/AVP 0 + b=RS:0 + b=RR:0 + a=rtpmap:0 PCMU/8000 + a=candidate:1 1 UDP 2130706431 fe80::6676:baff:fe9c:ee4a 8998 + typ host + a=candidate:2 1 UDP 1694498815 2001:db8:8101:3a55:4858:a2a9:22ff:99b9 + 45664 typ srflx raddr fe80::6676:baff:fe9c:ee4a rport 8998 + + The resulting answer looks like: + + v=0 + o=bob 2808844564 2808844564 IN IP4 $R-PUB-1.IP + s= + c=IN IP4 $R-PUB-1.IP + t=0 0 + a=ice-options:ice2 + a=ice-pacing:50 + a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh + a=ice-ufrag:9uB6 + m=audio $R-PUB-1.PORT RTP/AVP 0 + b=RS:0 + b=RR:0 + a=rtpmap:0 PCMU/8000 + a=candidate:1 1 UDP 2130706431 $R-PUB-1.IP $R-PUB-1.PORT typ host + + With the variables filled in: + + v=0 + o=bob 2808844564 2808844564 IN IP4 192.0.2.1 + s= + c=IN IP4 192.0.2.1 + t=0 0 + a=ice-options:ice2 + a=ice-pacing:50 + a=ice-pwd:YH75Fviy6338Vbrhrlp8Yh + a=ice-ufrag:9uB6 + m=audio 3478 RTP/AVP 0 + b=RS:0 + b=RR:0 + a=rtpmap:0 PCMU/8000 + a=candidate:1 1 UDP 2130706431 192.0.2.1 3478 typ host + +Appendix B. The "remote-candidates" Attribute + + The "remote-candidates" attribute exists to eliminate a race + condition between the updated offer and the response to the STUN + Binding request that moved a candidate into the valid list. This + race condition is shown in Figure 1. On receipt of message 4, agent + L adds a candidate pair to the valid list. If there was only a + single data stream with a single component, agent L could now send an + updated offer. However, the check from agent R has not yet received + a response, and agent R receives the updated offer (message 7) before + getting the response (message 9). Thus, it does not yet know that + this particular pair is valid. To eliminate this condition, the + actual candidates at R that were selected by the offerer (the remote + candidates) are included in the offer itself, and the answerer delays + its answer until those pairs validate. + + Agent L Network Agent R + |(1) Offer | | + |------------------------------------------>| + |(2) Answer | | + |<------------------------------------------| + |(3) STUN Req. | | + |------------------------------------------>| + |(4) STUN Res. | | + |<------------------------------------------| + |(5) STUN Req. | | + |<------------------------------------------| + |(6) STUN Res. | | + |-------------------->| | + | |Lost | + |(7) Offer | | + |------------------------------------------>| + |(8) STUN Req. | | + |<------------------------------------------| + |(9) STUN Res. | | + |------------------------------------------>| + |(10) Answer | | + |<------------------------------------------| + + Figure 1: Race Condition Flow + +Appendix C. Why Is the Conflict Resolution Mechanism Needed? + + When ICE runs between two peers, one agent acts as controlled, and + the other as controlling. Rules are defined as a function of + implementation type and offerer/answerer to determine who is + controlling and who is controlled. However, the specification + mentions that, in some cases, both sides might believe they are + controlling, or both sides might believe they are controlled. How + can this happen? + + The condition when both agents believe they are controlled shows up + in third party call control cases. Consider the following flow: + + A Controller B + |(1) INV() | | + |<-------------| | + |(2) 200(SDP1) | | + |------------->| | + | |(3) INV() | + | |------------->| + | |(4) 200(SDP2) | + | |<-------------| + |(5) ACK(SDP2) | | + |<-------------| | + | |(6) ACK(SDP1) | + | |------------->| + + Figure 2: Role Conflict Flow + + This flow is a variation on flow III of RFC 3725 [RFC3725]. In fact, + it works better than flow III since it produces fewer messages. In + this flow, the controller sends an offerless INVITE to agent A, which + responds with its offer, SDP1. The agent then sends an offerless + INVITE to agent B, which it responds to with its offer, SDP2. The + controller then uses the offer from each agent to generate the + answers. When this flow is used, ICE will run between agents A and + B, but both will believe they are in the controlling role. With the + role conflict resolution procedures, this flow will function properly + when ICE is used. + + At this time, there are no documented flows that can result in the + case where both agents believe they are controlled. However, the + conflict resolution procedures allow for this case, should a flow + arise that would fit into this category. + +Appendix D. Why Send an Updated Offer? + + Section 12.1 of [RFC8445] describes rules for sending media. Both + agents can send media once ICE checks complete, without waiting for + an updated offer. Indeed, the only purpose of the updated offer is + to "correct" the SDP so that the default destination for media + matches where media is being sent based on ICE procedures (which will + be the highest-priority nominated candidate pair). + + This raises the question -- why is the updated offer/answer exchange + needed at all? Indeed, in a pure offer/answer environment, it would + not be. The offerer and answerer will agree on the candidates to use + through ICE, and then can begin using them. As far as the agents + themselves are concerned, the updated offer/answer provides no new + information. However, in practice, numerous components along the + signaling path look at the SDP information. These include entities + performing off-path QoS reservations, NAT traversal components such + as ALGs and Session Border Controllers (SBCs), and diagnostic tools + that passively monitor the network. For these tools to continue to + function without change, the core property of SDP -- that the + existing, pre-ICE definitions of the addresses used for media -- the + "m=" and "c=" lines and the "rtcp" attribute -- must be retained. + For this reason, an updated offer must be sent. + +Acknowledgements + + A large part of the text in this document was taken from [RFC5245], + authored by Jonathan Rosenberg. + + Some of the text in this document was taken from [RFC6336], authored + by Magnus Westerlund and Colin Perkins. + + Many thanks to Flemming Andreasen for shepherd review feedback. + + Thanks to following experts for their reviews and constructive + feedback: Thomas Stach, Adam Roach, Peter Saint-Andre, Roman Danyliw, + Alissa Cooper, Benjamin Kaduk, Mirja Kühlewind, Alexey Melnikov, and + Éric Vyncke for their detailed reviews. + +Contributors + + The following experts have contributed textual and structural + improvements for this work: + + Thomas Stach + + Email: thomass.stach@gmail.com + + +Authors' Addresses + + Marc Petit-Huguenin + Impedance Mismatch + + Email: marc@petit-huguenin.org + + + Suhas Nandakumar + Cisco Systems + 707 Tasman Dr + Milpitas, CA 95035 + United States of America + + Email: snandaku@cisco.com + + + Christer Holmberg + Ericsson + Hirsalantie 11 + FI-02420 Jorvas + Finland + + Email: christer.holmberg@ericsson.com + + + Ari Keränen + Ericsson + FI-02420 Jorvas + Finland + + Email: ari.keranen@ericsson.com + + + Roman Shpount + TurboBridge + 4905 Del Ray Avenue, Suite 300 + Bethesda, MD 20814 + United States of America + + Email: rshpount@turbobridge.com |