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 Jabber Software 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.


XEP Information

Status: Experimental
Type: Standards Track
Number: 0176
Version: 0.5
Last Updated: 2006-10-31
Publishing Organization: Jabber Software Foundation
Approving Body: XMPP Council
Dependencies: XMPP Core, XEP-0166
Supersedes: None
Superseded By: None
Short Name: ice
Wiki Page: <http://wiki.jabber.org/index.php/Jingle ICE Transport (XEP-0176)>

Author Information

Peter Saint-Andre

Email: stpeter@jabber.org
JID: stpeter@jabber.org

Joe Beda

Email: jbeda@google.com
JID: jbeda@google.com

Scott Ludwig

Email: scottlu@google.com
JID: scottlu@google.com

Joe Hildebrand

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

Sean Egan

Email: seanegan@google.com
JID: seanegan@google.com

Legal Notice

This XMPP Extension Protocol is copyright 1999 - 2006 by the Jabber Software Foundation (JSF) and is in full conformance with the JSF'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-JIG discussion list: <http://mail.jabber.org/mailman/listinfo/standards-jig>.

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 Jabber Software 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. Service Discovery
6. Deployment Notes
7. Security Considerations
7.1. End-to-End Data Encryption
8. IANA Considerations
9. XMPP Registrar Considerations
9.1. Protocol Namespaces
9.2. Jingle Transport Methods
9.3. Service Discovery Identity
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 Interactive Connectivity Establishment (ICE) [2] methodology currently being developed within the IETF.

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

Note: This document depends on the IETF's Interactive Connectivity Establishment (ICE) 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 12 (hereafter referred to as "ICE-12"). The interested reader is referred to the ICE-12 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-12 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://jabber.org/protocol/jingle/transport/ice' namespace.

Example 1. Initiation

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='jingle1' type='set'>
  <jingle xmlns='http://jabber.org/protocol/jingle' 
          action='session-initiate' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <content name='this-is-the-audio-content'>
      <description xmlns='http://jabber.org/protocol/jingle/description/audio'>
        ...
      </description>
      <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'/>
    </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. Initiating Entity Sends a Candidate Transport

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info1' type='set'>
  <jingle xmlns='http://jabber.org/protocol/jingle' 
          action='transport-info'
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </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-12 Component ID value in a=candidate line 1
foundation A Foundation as defined in ICE-12 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-12 [5] Priority value in a=candidate line 9909
protocol The protocol to be used; allowable values are: "udp" (when standard ICE-12 is used); "tcp", "tcp-act", and "tcp-pass" (when TCP Candidates with Interactive Connectivity Establishment (ICE) [6] is used); and "ssltcp" (definition to follow) Transport protocol field in a=candidate line udp
pwd A Password as defined in ICE-12 a=ice-pwd line asd88fgpdd777uzjYhagZg
type A Candidate Type as defined in ICE-12; the allowable values are "host" for host candidates, "srflx" for server reflexive candidates, "prflx" for peer reflexive candidates, and "relay" for relayed candidates Typ field in a=candidate line srflx
ufrag A User Fragment as defined in ICE-12 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.1 of ICE-12 and prioritized by following the procedure specified in Section 5.2 of ICE-12. 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, client SHOULD follow the procedure specified in Section 7 of ICE-12.

Example 4. Initiating Entity Sends a Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info1' type='set'>
  <jingle xmlns='http://jabber.org/protocol/jingle' 
          action='transport-info'
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </jingle>
</iq>
      

Example 5. Initiating Entity Sends a Second Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info2' type='set'>
  <jingle xmlns='http://jabber.org/protocol/jingle' 
          action='transport-info' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </jingle>
</iq>
      

Example 6. Initiating Entity Sends a Third Candidate

<iq to='juliet@capulet.com/balcony' from='romeo@montague.net/orchard' id='info3' type='set'>
  <jingle xmlns='http://jabber.org/protocol/jingle' 
          action='transport-info' 
          initiator='romeo@montague.net/orchard'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </jingle>
</iq>
      

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

Example 7. Receiving Entity 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 'transport-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://jabber.org/protocol/jingle'
          action='transport-accept' 
          initiator='romeo@montague.net/orchard'
          responder='juliet@capulet.com/balcony'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </jingle>
</iq>
    

The <jingle/> element in the transport-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://jabber.org/protocol/jingle'
          action='transport-accept' 
          initiator='romeo@montague.net/orchard'
          responder='juliet@capulet.com/balcony'
          sid='a73sjjvkla37jfea'>
    <transport xmlns='http://jabber.org/protocol/jingle/transport/ice'>
      <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>
  </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. Service Discovery

If an entity supports this specification, it MUST return a feature of "http://jabber.org/protocol/jingle/transport/ice" in response to Service Discovery [7] information requests.

As mentioned in the Deployment Notes of this document, the administrator of an XMPP server may wish to deploy a STUN server in order to ease the process of negotiating use of the Jingle ICE transport. A client can become aware of a STUN server in the following ways:

  1. Specified in the default settings for the client (while this may seem sub-optimal, it is acceptable at present because there are so few public STUN servers).
  2. Manually added by a human user into the client's configuration.
  3. Discovered via DNS SRV records as specified in Section 9.1 of RFC 3489 [8].
  4. Discovered via the XMPP Service Discovery [9] extension.

It is OPTIONAL for a STUN server to support XMPP for the purpose of service discovery. Therefore, client developers SHOULD NOT depend on the existence of XMPP-aware STUN servers.

If a STUN server is accessible via XMPP, it SHOULD be advertised by returning an appropriate item in response to service discovery item requests sent to the address of an XMPP server:

Example 11. Service Discovery of STUN Server (1)

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

<iq from='montague.net' to='romeo@montague.net/orchard' id='disco1' type='result'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <item jid='stun.montague.net'/>
  </query>
</iq>
  

A subsequent service discovery information request to the STUN server MUST result in a response indicating that the STUN server has a service discovery category of "proxy" and type of "stun", as well as advertisement of appropriate service discovery features (because the XMPP interaction is necessary only in order to discover the identity of the STUN server, the only feature that an XMPP-aware STUN server SHOULD advertise is "http://jabber.org/protocol/disco#info".)

Example 12. Service Discovery of STUN Server (2)

<iq from='romeo@montague.net/orchard' to='stun.montague.net' id='disco2' type='get'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>

<iq from='stun.montague.net' to='romeo@montague.net/orchard' id='disco1' type='result'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    <identity category='proxy' type='stun'/>
    <feature var='http://jabber.org/protocol/disco#info'/>
  </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

7.1 End-to-End Data Encryption

In order to secure the end-to-end data stream, implementations SHOULD use encryption methods appropriate to the transport method in use.

8. IANA Considerations

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

9. XMPP Registrar Considerations

9.1 Protocol Namespaces

The XMPP Registrar [11] shall include 'http://jabber.org/protocol/jingle/transport/ice' in its registry of protocol namespaces.

9.2 Jingle Transport Methods

The XMPP Registrar shall include "http://jabber.org/protocol/jingle/transport/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>
    

9.3 Service Discovery Identity

The XMPP Registrar shall include a Service Discovery type of "stun" within the "proxy" category.

The registry submission is as follows:

<category>
  <name>proxy</name>
  <type>
    <name>stun</name>
    <desc>a STUN (Simple Traversal of UDP through NATs) service per RFC 3489</desc>
    <doc>XEP-0176</doc>
  </type>
</category>
    

10. XML Schemas

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

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='http://jabber.org/protocol/jingle/transport/ice'
    xmlns='http://jabber.org/protocol/jingle/transport/ice'
    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. 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-12.txt>. Work in progress.

3. RFC 4566: SDP: Session Description Protocol <http://www.ietf.org/rfc/rfc4566.txt>.

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.2 of ICE-12, 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-02.txt>. Work in progress.

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

8. RFC 3489: STUN - Simple Traversal of User Datagram Protocol (UDP) Through Network Address Translators (NATs) <http://www.ietf.org/rfc/rfc3489.txt>.

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

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

11. 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 Jabber Software Foundation. For further information, see <http://www.xmpp.org/registrar/>.


Revision History

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