@ -11,7 +11,7 @@
<abstract > This specification defines a Jingle transport method that results in sending media data using raw datagram sockets via the User Datagram Protocol (UDP). This transport method is negotiated via the Interactive Connectivity Establishment (ICE) methodology defined by the IETF and thus provides robust NAT traversal for media traffic.</abstract>
&LEGALNOTICE;
<number > 0176</number>
<status > Proposed </status>
<status > Experimental </status>
<type > Standards Track</type>
<sig > Standards</sig>
<approver > Council</approver>
@ -27,6 +27,12 @@
&stpeter;
&hildjj;
&seanegan;
<revision >
<version > 0.20</version>
<date > 2008-07-31</date>
<initials > psa</initials>
<remark > <p > For consistency with XEP-0166, removed profile attribute, changed content-replace to transport-replace, and changed content-accept to transport-accept.</p> </remark>
</revision>
<revision >
<version > 0.19</version>
<date > 2008-06-04</date>
@ -200,15 +206,15 @@ INITIATOR RESPONDER
|----------------------------------->|
| STUN Binding Request |
| (dropped) |
| x--------------------------------- |
| x================================= |
| STUN Binding Request |
|----------------------------------- >|
|=================================== >|
| STUN Binding Result |
|<----------------------------------- |
|< ===================================|
| STUN Binding Request |
|<----------------------------------- |
|< ===================================|
| STUN Binding Result |
|----------------------------------- >|
|=================================== >|
| Jingle session-accept |
|<----------------------------------- |
| Jingle ack (XMPP IQ-result) |
@ -227,7 +233,7 @@ INITIATOR RESPONDER
action='session-initiate'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content name= 'this-is-the-audio-content' >
<description xmlns= 'urn:xmpp:tmp:jingle:apps:audio-rtp' >
[ ... ]
</description>
@ -238,7 +244,7 @@ INITIATOR RESPONDER
</jingle>
</iq>
]]></example>
<p > The 'pwd' and 'ufrag' attributes MUST be included in the session-initate request, in subsequent content-add and conten t-replace actions, and when offering candidates via the transport-info action. The attributes SHOULD NOT be included in a session-accept action. The values are separately generated for both the initiator and the responder, in accordance with &icecore; and as shown in the examples. The attributes are defined as follows.</p>
<p > The 'pwd' and 'ufrag' attributes MUST be included in the session-initiate request, in subsequent content-add and transpor t-replace actions, and when offering candidates via the transport-info action. The attributes SHOULD NOT be included in a session-accept action. The values are separately generated for both the initiator and the responder, in accordance with &icecore; and as shown in the examples. The attributes are defined as follows.</p>
<table caption= 'Transport Attributes' >
<tr >
<th > Name</th>
@ -393,7 +399,7 @@ INITIATOR RESPONDER
action='transport-info'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -419,7 +425,7 @@ INITIATOR RESPONDER
action='transport-info'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -461,7 +467,7 @@ INITIATOR RESPONDER
action='transport-info'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='YH75Fviy6338Vbrhrlp8Yh'
ufrag='9uB6'>
@ -508,45 +514,48 @@ INITIATOR NAT RESPONDER
| | from 192.0.2.1:3478 |
| | to 10.0.1.1:8998 |
| | (dropped) |
| | x-------------------- |
| | x==================== |
| STUN Binding Request | |
| from 10.0.1.1:8998 | |
| to 192.0.2.1:3478 | |
| USE-CANDIDATE | |
|---------------------- >| |
|====================== >| |
| | STUN Binding Request |
| | from 192.0.2.3:45664 |
| | to 192.0.2.1:3478 |
| | USE-CANDIDATE |
| |---------------------- >|
| |====================== >|
| | STUN Binding Response |
| | from 192.0.2.1:3478 |
| | to 192.0.2.3:45664 |
| |<---------------------- |
| |< ======================|
| STUN Binding Response | |
| from 192.0.2.1:3478 | |
| to 10.0.1.1:8998 | |
| map 192.0.2.3:45664 | |
|<---------------------- | |
|< ======================| |
| | |
|================RTP now can flow==============>|
| | |
| | STUN Binding Request |
| | from 192.0.2.1:3478 |
| | to 192.0.2.3:45664 |
| |<---------------------- |
| |< ======================|
| STUN Binding Request | |
| from 192.0.2.1:3478 | |
| to 10.0.1.1:8998 | |
|<---------------------- | |
|< ======================| |
| STUN Binding Response | |
| from 10.0.1.1:8998 | |
| to 192.0.2.1:3478 | |
| map 192.0.2.1:3478 | |
|---------------------- >| |
|====================== >| |
| | STUN Binding Response |
| | from 192.0.2.3:45664 |
| | to 192.0.2.1:3478 |
| | map 192.0.2.1:3478 |
| |---------------------->|
| |======================>|
| | |
|< ===============RTP now can flow===============|
| | |
]]></code>
@ -569,7 +578,7 @@ INITIATOR NAT RESPONDER
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<description xmlns= 'urn:xmpp:tmp:jingle:apps:audio-rtp' >
[ ... ]
</description>
@ -615,7 +624,7 @@ INITIATOR NAT RESPONDER
<p > If the responder cannot find a suitable candidate transport or it receives a ¬acceptable; error from the initiator in response to its acceptance of a suitable transport, it SHOULD terminate the session as described in Section 6.8 of <cite > XEP-0166</cite> .</p>
</section2>
<section2 topic= 'Modifying an Existing Candidate' anchor= 'protocol-modify' >
<p > The creator of a content type MAY modify an existing, in-use candidate at any time during the session, for example to change the IP address or port. This is done by sending a conten t-replace action with the changed candidate information, where the value of the 'generation' is incremented to specify that the candidate information is a modification to an existing candidate.</p>
<p > The creator of a content type MAY modify an existing, in-use candidate at any time during the session, for example to change the IP address or port. This is done by sending a transpor t-replace action with the changed candidate information, where the value of the 'generation' is incremented to specify that the candidate information is a modification to an existing candidate.</p>
<p > An example follows (change to IP address and port).</p>
<example caption= "Initiator modifies the in-use candidate" > < ![CDATA[
<iq from= 'romeo@montague.net/orchard'
@ -623,10 +632,10 @@ INITIATOR NAT RESPONDER
to='juliet@capulet.com/balcony'
type='set'>
<jingle xmlns= 'urn:xmpp:tmp:jingle'
action='conten t-replace'
action='transpor t-replace'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -645,27 +654,24 @@ INITIATOR NAT RESPONDER
</iq>
]]></example>
<p > The recipient then acknowledges receipt.</p>
<example caption= "Recipient acknowledges conten t-replace"> < ![CDATA[
<example caption= "Recipient acknowledges transpor t-replace"> < ![CDATA[
<iq from= 'juliet@capulet.com/balcony'
id='rep2'
to='romeo@montague.net/orchard'
type='result'/>
]]></example>
<p > If the content-replace is acceptable, the recipient then sends a conten t-accept action.</p>
<p > If the transport-replace is acceptable, the recipient then sends a transpor t-accept action.</p>
<example caption= "Responder definitively accepts the replaced candidate" > < ![CDATA[
<iq from= 'juliet@capulet.com/balcony'
id='accept2'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns= 'urn:xmpp:tmp:jingle'
action='conten t-accept'
action='transpor t-accept'
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<description xmlns= 'urn:xmpp:tmp:jingle:apps:audio-rtp' >
[ ... ]
</description>
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -703,7 +709,7 @@ INITIATOR NAT RESPONDER
action='transport-info'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -728,21 +734,18 @@ INITIATOR NAT RESPONDER
to='romeo@montague.net/orchard'
type='result'/>
]]></example>
<p > The parties SHOULD check the newly-offered candidate for connectivity, as described previously. If the parties determine that media can flow over the candidate, the initiating party shall send a conten t-replace action to the responder.</p>
<example caption= "Initiator sends conten t-replace"> < ![CDATA[
<p > The parties SHOULD check the newly-offered candidate for connectivity, as described previously. If the parties determine that media can flow over the candidate, the initiating party shall send a transpor t-replace action to the responder.</p>
<example caption= "Initiator sends transpor t-replace"> < ![CDATA[
<iq from= 'romeo@montague.net/orchard'
id='rep3'
to='juliet@capulet.com/balcony'
type='set'>
<jingle xmlns= 'urn:xmpp:tmp:jingle'
action='conten t-replace'
action='transpor t-replace'
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<description xmlns= 'urn:xmpp:tmp:jingle:apps:audio-rtp' profile= 'RTP/AVP' >
[ ... ]
</description>
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -760,28 +763,25 @@ INITIATOR NAT RESPONDER
</jingle>
</iq>
]]></example>
<p > The responder then acknowledges the replaced conten t definition.</p>
<example caption= "Responder acknowledges conten t-replace"> < ![CDATA[
<p > The responder then acknowledges the replaced transpor t definition.</p>
<example caption= "Responder acknowledges transpor t-replace"> < ![CDATA[
<iq from= 'juliet@capulet.com/balcony'
id='rep3'
to='romeo@montague.net/orchard'
type='result'/>
]]></example>
<p > The responder then accepts the replaced conten t definition.</p>
<example caption= "Responder definitively accepts the replaced conten t definition"> < ![CDATA[
<p > The responder then accepts the replaced transpor t definition.</p>
<example caption= "Responder definitively accepts the replaced transpor t definition"> < ![CDATA[
<iq from= 'juliet@capulet.com/balcony'
id='accept3'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns= 'urn:xmpp:tmp:jingle'
action='conten t-accept'
action='transpor t-accept'
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator= 'initiator' name= 'this-is-the-audio-content' profile= 'RTP/AVP' >
<description xmlns= 'urn:xmpp:tmp:jingle:apps:audio-rtp' >
[ ... ]
</description>
<content creator= 'initiator' name= 'this-is-the-audio-content' >
<transport xmlns= 'urn:xmpp:tmp:jingle:transports:ice-udp'
pwd='asd88fgpdd777uzjYhagZg'
ufrag='8hhy'>
@ -942,43 +942,44 @@ INITIATOR NAT RESPONDER
<xs:element name= 'transport' >
<xs:complexType >
<xs:sequence >
<xs:element ref= 'candidate' minOccurs= '0' maxOccurs= 'unbounded' />
<xs:element name= 'candidate'
type='candidateElementType'
minOccurs='0'
maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name= 'pwd' type= 'xs:string' use= 'optional' />
<xs:attribute name= 'ufrag' type= 'xs:string' use= 'optional' />
</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' type= 'xs:NCName' use= 'required' />
<xs:attribute name= 'rel-addr' type= 'xs:string' use= 'optional' />
<xs:attribute name= 'rel-port' type= 'xs:unsignedShort' use= 'optional' />
<xs:attribute name= 'rem-addr' type= 'xs:string' use= 'optional' />
<xs:attribute name= 'rem-port' type= 'xs:unsignedShort' use= 'optional' />
<xs:attribute name= 'type' use= 'required' >
<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:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:complexType name= 'candidateElementType' >
<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' type= 'xs:NCName' use= 'required' />
<xs:attribute name= 'rel-addr' type= 'xs:string' use= 'optional' />
<xs:attribute name= 'rel-port' type= 'xs:unsignedShort' use= 'optional' />
<xs:attribute name= 'rem-addr' type= 'xs:string' use= 'optional' />
<xs:attribute name= 'rem-port' type= 'xs:unsignedShort' use= 'optional' />
<xs:attribute name= 'type' use= 'required' >
<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:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name= 'empty' >
<xs:restriction base= 'xs:string' >