XEP-0176: Jingle ICE Transport

This document defines a Jingle transport method that results in sending data between two entities using the Interactive Connectivity Establishment (ICE) methodology.


WARNING: This Standards-Track document is Experimental. Publication as an XMPP Extension Protocol does not imply approval of this proposal by the XMPP Standards Foundation. Implementation of the protocol described herein is encouraged in exploratory implementations, but production systems should not deploy implementations of this protocol until it advances to a status of Draft.


Document Information

Series: XEP
Number: 0176
Publisher: XMPP Standards Foundation
Status: Experimental
Type: Standards Track
Version: 0.7
Last Updated: 2007-03-23
Approving Body: XMPP Council
Dependencies: XMPP Core, XEP-0166
Supersedes: None
Superseded By: None
Short Name: TO BE ASSIGNED
Wiki Page: <http://wiki.jabber.org/index.php/Jingle ICE Transport (XEP-0176)>

Author Information

Peter Saint-Andre

Email: stpeter@jabber.org
JabberID: stpeter@jabber.org

Joe Beda

Email: jbeda@google.com
JabberID: jbeda@google.com

Scott Ludwig

Email: scottlu@google.com
JabberID: scottlu@google.com

Joe Hildebrand

Email: jhildebrand@jabber.com
JabberID: hildjj@jabber.org

Sean Egan

Email: seanegan@google.com
JabberID: seanegan@google.com

Legal Notice

This XMPP Extension Protocol is copyright 1999 - 2007 by the XMPP Standards Foundation (XSF) and is in full conformance with the XSF's Intellectual Property Rights Policy <http://www.xmpp.org/extensions/ipr-policy.shtml>. This material may be distributed only subject to the terms and conditions set forth in the Creative Commons Attribution License (<http://creativecommons.org/licenses/by/2.5/>).

Discussion Venue

The preferred venue for discussion of this document is the Standards discussion list: <http://mail.jabber.org/mailman/listinfo/standards>.

Relation to XMPP

The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 3920) and XMPP IM (RFC 3921) specifications contributed by the XMPP Standards Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this document has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.

Conformance Terms

The following keywords as used in this document are to be interpreted as described in RFC 2119: "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT"; "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY", "OPTIONAL".


Table of Contents


1. Introduction
2. Requirements
3. Glossary
4. Protocol Description
    4.1. Transport Initiation
    4.2. Receiver Response
    4.3. ICE Negotiation
       4.3.1. Syntax of Candidate Element
       4.3.2. Negotiation Flow
    4.4. Acceptance of Successful Candidate
5. Determining Support
6. Deployment Notes
7. Security Considerations
8. IANA Considerations
9. XMPP Registrar Considerations
    9.1. Protocol Namespaces
    9.2. Jingle Transport Methods
10. XML Schemas
Notes
Revision History


1. Introduction

Jingle [1] defines a framework for negotiating and managing out-of-band data sessions over XMPP. In order to provide a flexible framework, the base Jingle specification defines neither data transport methods nor content formats, leaving that up to separate specifications. The current document defines a transport method for establishing and managing data connections between XMPP entities, using the ICE methodology currently being developed within the IETF.

The process for ICE negotiation is largely the same in Jingle as it is in ICE-14. There are several differences:

Note: This document depends on the IETF's Interactive Connectivity Establishment (ICE) [3] specification, which is a work in progress. Every effort has been made to keep this document synchronized with draft-ietf-mmusic-ice, for which the latest published version is 14 (hereafter referred to as "ICE-14"). The interested reader is referred to ICE-14 for a detailed description of the ICE methodology, which for the most part this document merely maps to XMPP syntax.

2. Requirements

The Jingle transport method defined herein is designed to meet the following requirements:

  1. Make it possible to establish and manage out-of-band connections between two XMPP entities, even if they are behind Network Address Translators (NATs) or firewalls.
  2. Make it relatively easy to implement support in standard Jabber/XMPP clients.
  3. Where communication with non-XMPP entities is needed, push as much complexity as possible onto server-side gateways between the XMPP network and the non-XMPP network.

3. Glossary

The reader is referred to ICE-14 for a description of various terms used in the context of ICE. Those terms are not reproduced here.

4. Protocol Description

4.1 Transport Initiation

In order for the initiator in a Jingle exchange to start the negotiation, it MUST send a Jingle "session-initiate" stanza as described in XEP-0166. This stanza MUST include at least one transport method. If the initiator wishes to negotiate the ICE transport, it MUST include an empty <transport/> child element qualified by the 'http://www.xmpp.org/extensions/xep-0176.html#ns' namespace (see Protocol Namespaces regarding issuance of a permanent namespace).

Example 1. Initiation

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='jingle1' type='set'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns' 
          action='session-initiate' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content name='this-is-the-audio-content'>
      <description xmlns='http://www.xmpp.org/extensions/xep-0167.html#ns'>
        ...
      </description>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'/>
    </content>
  </jingle>
</iq>
    

4.2 Receiver Response

As described in XEP-0166, to provisionally accept the session initiation request, the responder returns an IQ-result:

Example 2. Receiver Provisionally Accepts the Session Request

<iq type='result' from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard' id='jingle1'/>
    

4.3 ICE Negotiation

If the responder provisionally accepts the session initiation request as shown above, both initiator and responder MUST immediately negotiate connectivity over the ICE transport by exchanging XML-formatted candidate transports for the channel. This negotiation proceeds immediately in order to maximize the possibility that media can be exchanged as quickly as possible. [4]

The candidate syntax and negotiation flow are described below.

4.3.1 Syntax of Candidate Element

The following is an example of the candidate format:

Example 3. Initiator Sends a Candidate Transport

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info1' type='set'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns' 
          action='transport-info'
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='1'
                   foundation='1'
                   generation='0' 
                   ip='10.0.1.1' 
                   network='0'
                   port='8998'
                   priority='2114978302'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='local'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
</iq>
      

The attributes of the <candidate/> element are described in the following table:

Table 1: Candidate Attributes

Name Description SDP Syntax Example
component A Component ID as defined in ICE-14. Component ID value in a=candidate line 1
foundation A Foundation as defined in ICE-14. Foundation value in a=candidate line 1
generation An index, starting at 0, that enables the parties to keep track of updates to the candidate throughout the life of the session. N/A 0
ip The Internet Protocol (IP) address for the candidate transport mechanism; this may be either an IPv4 address or an IPv6 address. IP Address value in a=candidate line 10.0.1.1
network An index, starting at 0, referencing which network this candidate is on for a given peer (used for diagnostic purposes if the calling hardware has more than one Network Interface Card or NIC). N/A 0
port The port at the candidate IP address. Port value in a=candidate line 8998
priority A Priority as defined in ICE-14 [5] Priority value in a=candidate line 9909
protocol The protocol to be used. The allowable values are: "udp" (when standard ICE-14 is used); "tcp-act", "tcp-pass", and "tcp-so" (when TCP Candidates with Interactive Connectivity Establishment (ICE) [6] is used); and "ssltcp" (definition to follow in a separate specification). Transport protocol field in a=candidate line udp
pwd A Password as defined in ICE-14. a=ice-pwd line asd88fgpdd777uzjYhagZg
type A Candidate Type as defined in ICE-14. The allowable values are "host" for host candidates, "prflx" for peer reflexive candidates, "relay" for relayed candidates, and "srflx" for server reflexive candidates. Typ field in a=candidate line srflx
ufrag A User Fragment as defined in ICE-14. a=ice-ufrag line 8hhy

4.3.2 Negotiation Flow

The first step in negotiating connectivity is for each client to immediately begin sending candidate transport methods to the other client. These candidates SHOULD be gathered by following the procedure specified in Section 5.3 of ICE-14 and prioritized by following the procedure specified in Section 5.4 of ICE-14. Each candidate MUST be sent in a <jingle/> element with an action of "transport-info".

If the responder receives and can successfully process a given candidate, it returns an IQ-result (if not, for example because the candidate data is improperly formatted, it returns an error).

Note well that the responder is only indicating receipt of the candidate, not telling the initiator that the candidate will be used.

The initiator keeps sending candidates, one after the other (without stopping to receive an acknowledgement of receipt from the responder for each candidate) until it has exhausted its supply of possible or desirable candidate transports. (Because certain candidates may be more "expensive" in terms of bandwidth or processing power, the initiator may not want to advertise their existence unless necessary.) For each candidate, the responder acknowledges receipt.

At the same time (i.e., immediately after provisionally accepting the session, not waiting for the initiator to begin or finish sending candidates), the responder also begins sending candidates that may work for it. As above, the initiator acknowledges receipt of the candidates.

As the initiator and responder receive candidates, they probe the various candidate transports for connectivity. In performing these connectivity checks, a client SHOULD follow the procedure specified in Section 7 of ICE-14.

Example 4. Initiator Sends a Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info1' type='set'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns' 
          action='transport-info'
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='1'
                   foundation='1'
                   generation='0' 
                   ip='10.0.1.1' 
                   network='0'
                   port='8998'
                   priority='2114978302'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='local'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
</iq>
      

Example 5. Initiator Sends a Second Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info2' type='set'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns' 
          action='transport-info' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='2'
                   foundation='1'
                   generation='0' 
                   ip='192.0.2.3' 
                   network='1'
                   port='45664'
                   priority='1107821052'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='srflx'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
</iq>
      

Example 6. Initiator Sends a Third Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info3' type='set'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns' 
          action='transport-info' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='2'
                   foundation='1'
                   generation='0' 
                   ip='208.245.212.67' 
                   network='2'
                   port='53267'
                   priority='1107558908'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='srflx'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
</iq>
      

For each candidate received, the other party MUST acknowledge receipt or return an error:

Example 7. Responder Acknowledges Receipt

<iq from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard' id='info1' type='result'/>

<iq from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard' id='info2' type='result'/>

<iq from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard' id='info3' type='result'/>
      

4.4 Acceptance of Successful Candidate

If, based on STUN connectivity checks, the responder determines that it will be able to establish a connection using a given candidate, it sends a <jingle/> element with an action of 'content-accept' (or 'session-accept') to the initiator, specifying the candidate that succeeded:

Example 8. Juliet Definitively Accepts the Successful Candidate

<iq type='set' from='juliet@capulet.com/balcony' to='romeo@montague.net/orchard' id='accept1'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns'
          action='content-accept' 
          initiator='romeo@montague.net/orchard'
          responder='juliet@capulet.com/balcony'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='2'
                   foundation='1'
                   generation='0' 
                   ip='192.0.2.3' 
                   network='1'
                   port='45664'
                   priority='1107821052'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='srflx'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
</iq>
    

The <jingle/> element in the content-accept stanza SHOULD possess a 'responder' attribute that explicitly specifies the full JID of the responding entity. If provided, all future commmunications SHOULD be sent to the JID provided in the 'responder' attribute.

If the initiator can also send data over that candidate, then it acknowledges the responder's acceptance:

Example 9. Romeo Acknowledges Acceptance of Successful Candidate

<iq type='result' to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='accept1'/>
    

Now the initiator and responder can begin sending data over the negotiated connection.

If a candidate succeeded for the responder but the initiator cannot send data over that candidate, it MUST return a <not-acceptable/> error in response to the responder's acceptance of the successful candidate:

Example 10. Romeo Returns Error in Response to Acceptance of Successful Candidate

<iq type='error' to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='accept1'>
  <jingle xmlns='http://www.xmpp.org/extensions/xep-0166.html#ns'
          action='transport-accept' 
          initiator='romeo@montague.net/orchard'
          responder='juliet@capulet.com/balcony'
          sid='a73sjjvkla37jfea'>
    <content creator='initiator' name='this-is-the-audio-content'>
      <transport xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'>
        <candidate component='2'
                   foundation='1'
                   generation='0' 
                   ip='192.0.2.3' 
                   network='1'
                   port='45664'
                   priority='1107821052'
                   protocol='udp'
                   pwd='asd88fgpdd777uzjYhagZg'
                   type='srflx'
                   ufrag='8hhy'/>
      </transport>
    </content>
  </jingle>
  <error type='cancel'>
    <not-acceptable xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
  </error>
</iq>
    

If the responder cannot find a suitable candidate transport or it receives a <not-acceptable/> error from the initiator in response to its acceptance of a suitable transport, it SHOULD terminate the session as described in Section 5.9 of XEP-0166.

5. Determining Support

If an entity supports the Jingle ICE transport, it MUST return a feature of "http://www.xmpp.org/extensions/xep-0176.html#ns" (see Protocol Namespaces regarding issuance of a permanent namespace) in response to Service Discovery [7] information requests.

Example 11. Service Discovery information request

<iq type='get'
    from='romeo@montague.net/orchard'
    to='juliet@capulet.com/balcony'
    id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
  

Example 12. Service Discovery information response

<iq type='result'
    from='juliet@capulet.com/balcony'
    to='romeo@montague.net/orchard'
    id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    ...
    <feature var='http://www.xmpp.org/extensions/xep-0176.html#ns'/>
    ...
  </query>
</iq>
  

6. Deployment Notes

This specification applies exclusively to Jabber/XMPP clients and places no additional requirements on Jabber/XMPP servers. However, service administrators may wish to deploy a STUN server in order to ease the client-to-client negotiation process.

7. Security Considerations

In order to secure the data stream that is negotiated via the Jingle ICE transport, implementations SHOULD use encryption methods appropriate to the transport method and media being exchanged (for details regarding audio and video exchanges via RTP, refer to XEP-0167 and XEP-0180).

8. IANA Considerations

This document requires no interaction with the Internet Assigned Numbers Authority (IANA) [8].

9. XMPP Registrar Considerations

9.1 Protocol Namespaces

Until this specification advances to a status of Draft, its associated namespace shall be "http://www.xmpp.org/extensions/xep-0176.html#ns"; upon advancement of this specification, the XMPP Registrar [9] shall issue a permanent namespace in accordance with the process defined in Section 4 of XMPP Registrar Function [10].

9.2 Jingle Transport Methods

The XMPP Registrar shall include "ice" in its registry of Jingle transport methods. The registry submission is as follows:

<transport>
  <name>ice</name>
  <desc>
    A method for negotiation of out-of-band connections with built-in NAT and firewall 
    traversal, equivalent to the IETF's Interactive Connectivity Establishment (ICE) 
    methodology.
  </desc>
  <doc>XEP-0176</doc>
</transport>
    

10. XML Schemas

<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='http://www.xmpp.org/extensions/xep-0176.html#ns'
    xmlns='http://www.xmpp.org/extensions/xep-0176.html#ns'
    elementFormDefault='qualified'>

  <xs:element name='transport'>
    <xs:complexType>
      <xs:choice>
        <xs:sequence>
          <xs:element ref='candidate' minOccurs='0' maxOccurs='1'/>
        </xs:sequence>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <xs:element name='candidate'>
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base='empty'>
          <xs:attribute name='component' type='xs:unsignedByte' use='required'/>
          <xs:attribute name='foundation' type='xs:unsignedByte' use='required'/>
          <xs:attribute name='generation' type='xs:unsignedByte' use='required'/>
          <xs:attribute name='ip' type='xs:string' use='required'/>
          <xs:attribute name='network' type='xs:unsignedByte' use='required'/>
          <xs:attribute name='port' type='xs:unsignedShort' use='required'/>
          <xs:attribute name='priority' type='xs:positiveInteger' use='required'/>
          <xs:attribute name='protocol' use='optional'>
            <xs:simpleType>
              <xs:restriction base='xs:NCName'>
                <xs:enumeration value='ssltcp'/>
                <xs:enumeration value='tcp-act'/>
                <xs:enumeration value='tcp-pass'/>
                <xs:enumeration value='tcp'/>
                <xs:enumeration value='udp'/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name='pwd' type='xs:string' use='required'/>
          <xs:attribute name='type' use='optional'>
            <xs:simpleType>
              <xs:restriction base='xs:NCName'>
                <xs:enumeration value='host'/>
                <xs:enumeration value='prflx'/>
                <xs:enumeration value='relay'/>
                <xs:enumeration value='srflx'/>
              </xs:restriction>
            </xs:simpleType>
          </xs:attribute>
          <xs:attribute name='ufrag' type='xs:string' use='required'/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name='empty'>
    <xs:restriction base='xs:string'>
      <xs:enumeration value=''/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
  

Notes

1. XEP-0166: Jingle <http://www.xmpp.org/extensions/xep-0166.html>.

2. RFC 4566: SDP: Session Description Protocol <http://tools.ietf.org/html/rfc4566>.

3. Interactive Connectivity Establishment (ICE): A Methodology for Network Address Translator (NAT) Traversal for Offer/Answer Protocols <http://www.ietf.org/internet-drafts/draft-ietf-mmusic-ice-14.txt>. Work in progress.

4. Concurrent with negotiation of the ICE candidates, it is possible for the initiator and responder to negotiate which content types the session will include, which transport methods will be tried for each content type, etc. Those negotiation flows are shown in XEP-0166. This document specifies only negotiation of the ICE transport method.

5. In accordance with the rules specified in Section 5.3 of ICE-14, the priority values shown in the examples within this document have been calculated as follows. The "type preference" for local candidates is stipulated to be "126" and for server reflexive candidates "66". The "local preference" for network 0 is stipulated to be "4096", for network 1 "2048", and for network 2 "1024".

6. TCP Candidates with Interactive Connectivity Establishment (ICE) <http://www.ietf.org/internet-drafts/draft-ietf-mmusic-ice-tcp>. Work in progress.

7. XEP-0030: Service Discovery <http://www.xmpp.org/extensions/xep-0030.html>.

8. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see <http://www.iana.org/>.

9. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see <http://www.xmpp.org/registrar/>.

10. XEP-0053: XMPP Registrar Function <http://www.xmpp.org/extensions/xep-0053.html>.


Revision History

Version 0.7 (2007-03-23)

Updated to track ICE-14 and ICE-TCP-03; moved text on discovery of STUN servers to separate specification.

(psa)

Version 0.6 (2006-12-21)

Modified spec to use provisional namespace before advancement to Draft (per XEP-0053).

(psa)

Version 0.5 (2006-10-31)

Updated to track ICE-12; corrected service discovery process; completed editorial review; removed mention of DTMF, which is for audio only.

(psa)

Version 0.4 (2006-09-13)

Updated to track ICE-10; added section on service discovery.

(psa)

Version 0.3 (2006-07-12)

Specified that DTMF must use in-band signalling (XEP-0181).

(se/psa)

Version 0.2 (2006-03-24)

Recommended use of RTP-native methods for DTMF.

(psa)

Version 0.1 (2006-03-01)

Initial version (split from XEP-0166).

(psa/jb)

END