1
0
mirror of https://github.com/moparisthebest/xeps synced 2024-11-21 16:55:07 -05:00
git-svn-id: file:///home/ksmith/gitmigration/svn/xmpp/trunk@2254 4b5297f7-1745-476d-ba37-a9c6900126ab
This commit is contained in:
Peter Saint-Andre 2008-09-23 21:18:48 +00:00
parent c14207858d
commit d732682e8d

View File

@ -26,6 +26,20 @@
&robmcqueen;
&seanegan;
&hildjj;
<revision>
<version>0.30</version>
<date>2008-09-23</date>
<initials>ram/psa</initials>
<remark>
<ul>
<li>Allowed content-add in PENDING state.</li>
<li>Clarified that session-accept action accepts only the content definition(s) in the session-initiate.</li>
<li>Added optional thread element.</li>
<li>Clarified tie breaks for transport-replace.</li>
<li>Cleaned up XML schemas.</li>
</ul>
</remark>
</revision>
<revision>
<version>0.29</version>
<date>2008-07-31</date>
@ -300,19 +314,19 @@ Romeo Juliet
|---------------------------->|
| |
]]></code>
<p>Naturally, more complex scenarios are probable; such scenarios are described in other specifications, such as <cite>XEP-0167</cite> for voice chat.</p>
<p>The simplest flow might happen as follows. The example is that of a file transfer offer, where the transport method is &xep0065;.</p>
<p>Naturally, more complex scenarios are possible; such scenarios are described in other specifications, such as <cite>XEP-0167</cite> for voice chat.</p>
<p>The simplest flow might happen as follows. The example is that of a voice chat offer, where the transport method is &xep0176;.</p>
<example caption="Initiator sends session-initiate"><![CDATA[
<iq from='romeo@montague.net/orchard'
id='jingle1'
to='juliet@capulet.com/balcony'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'>
<jingle xmlns='urn:xmpp:jingle:0'>
action='session-initiate'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator='initiator' name='voice'>
<description xmlns='urn:xmpp:tmp:jingle:apps:rtp' media='audio'>
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'>
<payload-type id='96' name='speex' clockrate='16000'/>
<payload-type id='97' name='speex' clockrate='8000'/>
<payload-type id='18' name='G729'/>
@ -320,7 +334,7 @@ Romeo Juliet
<payload-type id='103' name='L16' clockrate='16000' channels='2'/>
<payload-type id='98' name='x-ISAC' clockrate='8000'/>
</description>
<transport xmlns='urn:xmpp:tmp:jingle:transports:ice-udp'/>
<transport xmlns='urn:xmpp:jingle:transports:ice-udp:0'/>
</content>
</jingle>
</iq>
@ -338,17 +352,17 @@ Romeo Juliet
id='accept1'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-accept'
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator='initiator' name='voice'>
<description xmlns='urn:xmpp:tmp:jingle:apps:rtp' media='audio'>
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'>
<payload-type id='97' name='speex' clockrate='8000'/>
<payload-type id='18' name='G729'/>
</description>
<transport xmlns='urn:xmpp:tmp:jingle:transports:ice-udp'>
<transport xmlns='urn:xmpp:jingle:transports:ice-udp:0'>
<candidate component='1'
foundation='1'
generation='0'
@ -373,13 +387,13 @@ Romeo Juliet
type='result'/>
]]></example>
<p>The initiator and responder would then exchange media using any of the acceptable codecs.</p>
<p>Eventually, one of the parties (here the responder) can terminate the sessio.</p>
<p>Eventually, one of the parties (here the responder) will terminate the session.</p>
<example caption="Responder terminates the session"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -405,16 +419,16 @@ Romeo Juliet
<li>Make it possible to manage a wide variety of peer-to-peer sessions (including but not limited to voice and video) within XMPP.</li>
<li>When a peer-to-peer connection cannot be negotiated, make it possible to fall back to relayed communications.</li>
<li>Clearly separate the signalling channel (XMPP) from the data channel.</li>
<li>Clearly separate the application formats (e.g., video) from the transport methods (e.g., RTP).</li>
<li>Make it possible to add, modify, and remove both application types and transport methods in relation to an existing session.</li>
<li>Clearly separate the application formats (e.g., audio) from the transport methods (e.g., RTP).</li>
<li>Make it possible to add, modify, and remove both application types and transport methods in an existing session.</li>
<li>Make it relatively easy to implement support for the protocol in standard Jabber/XMPP clients.</li>
<li>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.</li>
</ol>
<p>This document defines the signalling protocol only. Additional documents specify the following:</p>
<ul>
<li><p>Various application formats (audio, video, etc.) and, where possible, mapping of those types to the Session Description Protocol (SDP; see &rfc4566;); examples include <cite>Jingle RTP Sessions</cite> and <cite>Jingle Video via RTP</cite>.</p></li>
<li><p>Various transport methods; examples include &xep0176; and <cite>Raw UDP Transport</cite>.</p></li>
<li><p>Procedures for mapping the Jingle signalling protocol to existing signalling standards such as the IETF's Session Initiation Protocol (SIP) and the ITU's H.323 protocol (see &h323;); these documents are forthcoming.</p></li>
<li><p>Various application formats (audio, video, etc.) and, where possible, mapping of those types to the Session Description Protocol (SDP; see &rfc4566;); examples include <cite>Jingle RTP Sessions</cite> and &xep0234;.</p></li>
<li><p>Various transport methods; examples include <cite>Jingle ICE-UDP Transport</cite> and &xep0177;.</p></li>
<li><p>Procedures for mapping the Jingle signalling protocol to existing signalling standards such as the IETF's Session Initiation Protocol (SIP) and the ITU's H.323 protocol (see &h323;); see for example &xmppsipmedia;.</p></li>
</ul>
</section1>
<section1 topic='Terminology' anchor='terms'>
@ -430,7 +444,7 @@ Romeo Juliet
</tr>
<tr>
<td>Component</td>
<td>A numbered stream of data that needs to be transmitted between the endpoints for a given content type in the context of a given session. It is up to the transport to negotiate the details of each component. Depending on the content type, multiple components may be needed (e.g., two components might be needed, one to transmit an RTP stream and another to transmit RTCP timing information).</td>
<td>A numbered stream of data that needs to be transmitted between the endpoints for a given content type in the context of a given session. It is up to the transport to negotiate the details of each component. Depending on the content type, multiple components might be needed (e.g., one to transmit an RTP stream and another to transmit RTCP timing information).</td>
</tr>
<tr>
<td>Content Type</td>
@ -438,7 +452,7 @@ Romeo Juliet
</tr>
<tr>
<td>Session</td>
<td>One or more content types negotiated between two entities. It is delimited in time by an initiate request and session ending events. During the lifetime of a session, content types can be added or removed. A session consists of at least one content type at a time.</td>
<td>One or more content types negotiated between two entities. It is delimited in time by a session-initiate action and a session-terminate action. During the lifetime of a session, content types can be added or removed. A session consists of at least one content type at a time.</td>
</tr>
<tr>
<td>Transport Method</td>
@ -450,7 +464,7 @@ Romeo Juliet
<p>In diagrams, the following conventions are used:</p>
<ul>
<li>Dashed lines (---) represent Jingle stanzas that are sent via the XMPP signalling channel.</li>
<li>Double-dashed lines (===) represent media packets that are sent via the non-XMPP media channel.</li>
<li>Double-dashed lines (===) represent media packets that are sent via the media channel, which typically is not an XMPP channel but a direct or mediated channel between the endpoints.</li>
</ul>
</section2>
</section1>
@ -464,15 +478,15 @@ Romeo Juliet
<p>This document defines the semantics and syntax for overall session management. It also provides pluggable "slots" for application formats and transport methods, which are specified in separate documents.</p>
<p>At the most basic level, the process for initial negotiation of a Jingle session is as follows (i.e., the actions that can be generated during the PENDING state):</p>
<ol>
<li>One user (the "initator") sends to another user (the "responder") a session request with at least one content definition.</li>
<li>One user (the "initiator") sends to another user (the "responder") a session initiation request with at least one content definition.</li>
<li>If the responder wants to proceed, it acknowledges the session initiation request by sending an IQ result.</li>
<li>The parties attempt to set up data transmission over the designated transport method as defined in the relevant specification (e.g., this can involve sending multiple transport-info actions).</li>
<li>Optionally, the responder can remove content definitions via the content-remove action or change the direction of the media flow via the content-modify action.</li>
<li>The parties attempt to set up data transmission over the designated transport method as defined in the relevant specification.</li>
<li>Optionally, either party can add or remove content definitions, or change the direction of the media flow.</li>
<li>Optionally, either party can send session-info actions (to inform the other party that it is attempting transport negotiation, that its device is ringing, etc.).</li>
<li>As soon as the responder determines that data can flow over the designated transport, it sends to the initiator a session-accept action.</li>
<li>The parties start sending data over the transport.</li>
</ol>
<p>After the initial session negotiation has been completed and the session is in the ACTIVE state, the parties can adjust the session definition. This can involve sending the content-modify, content-remove, content-add, and transport-replace actions. In addition, certain transport methods allow continued sending of transport-info actions while in the ACTIVE state. And naturally the parties may send session-info actions at any time.</p>
<p>After the initial session negotiation has been completed and the session is in the ACTIVE state, the parties can adjust the session definition by sending the content-modify, content-remove, content-add, and transport-replace actions. In addition, certain transport methods allow continued sending of transport-info actions while in the ACTIVE state. And naturally the parties can send session-info actions at any time.</p>
<section2 topic='Overall Session Management' anchor='concepts-session'>
<p>The state machine for overall session management (i.e., the state per Session ID) is as follows:</p>
<code>
@ -484,11 +498,12 @@ Romeo Juliet
|/ |
PENDING o----------------------+ |
| | content-accept, | |
| | content-add, | |
| | content-modify, | |
| | content-remove, | |
| | session-info, | |
| | transport-accept | |
| | transport-info | |
| | transport-accept, | |
| | transport-info, | |
| | transport-replace | |
| +-------------------+ |
| |
@ -500,8 +515,8 @@ PENDING o----------------------+ |
| | content-modify, | |
| | content-remove, | |
| | session-info, | |
| | transport-accept | |
| | transport-info | |
| | transport-accept, | |
| | transport-info, | |
| | transport-replace | |
| +-------------------+ |
| |
@ -511,83 +526,46 @@ PENDING o----------------------+ |
|
o ENDED
</code>
<p>There are three overall session states:</p>
<p>As shown, there are three overall session states:</p>
<ol>
<li>PENDING</li>
<li>ACTIVE</li>
<li>ENDED</li>
</ol>
<p>The actions related to management of the overall Jingle session are described in the following table.</p>
<table caption='Jingle Actions'>
<tr>
<th>Action</th>
<th>Description</th>
</tr>
<tr>
<td>content-accept</td>
<td>Accept a content-add action received from another party.</td>
</tr>
<tr>
<td>content-add</td>
<td>Add one or more new content definitions to the session. The sender MUST specify only the added content definition(s), not the added content definition(s) plus the existing content definition(s). Therefore it is the responsibility of the recipient to maintain a local copy of the current content definition(s). This action MUST NOT be sent while the session is in the PENDING state. If the recipient wishes to include the new content definition in the session, it MUST send a content-accept action to the other party. <note>In the event that a session contains two unidirectional streams of the same definition because a content-add was issued simultaneously by both parties, it is RECOMMENDED that participants close the duplicate stream in favor of that created by the session initiator, which should be made bidirectional via a content-modify action sent by the responder.</note></td>
</tr>
<tr>
<td>content-modify</td>
<td>Change the direction of an existing content definition thorugh modification of the 'senders' attribute. If the recipient deems the directionality of a content-modify action to be unacceptable, it MAY reply with a contrary content-modify action, terminate the session, or simply refuse to send or accept application data in the new direction. In any case, the recipient MUST NOT send a content-accept action in response to the content-modify. <note>If both parties send content-modify actions at the same time, the content-modify from the session initiator MUST trump the content-modify from the recipient and the initiator SHOULD return an &unexpected; error to the other party.</note></td>
</tr>
<tr>
<td>content-remove</td>
<td>Remove one or more content definitions from the session. The sender MUST specify only the removed content definition(s), not the removed content definition(s) plus the remaining content definition(s). Therefore it is the responsibility of the recipient to maintain a local copy of the current content definition(s). Upon receiving a content-remove from the other party, the recipient MUST NOT send a content-accept and MUST NOT continue to negotiate the transport method related to that content definition or send application data related to that content definition. The recipient MUST NOT send a content-accept in response to a content-remove. <note>A client MUST NOT return an error upon receipt of a 'content-remove' action for a content definition that is received after a 'content-remove' action has been sent but before the action has been acknowledged by the peer.</note> <note>If the content-remove results in zero content definitions for the session, the entity that receives the content-remove SHOULD send a session-terminate action to the other party (since a session with no content definitions is void).</note></td>
</tr>
<tr>
<td>session-accept</td>
<td>Definitively accept a session negotiation (implicitly this action also serves as a content-accept).</td>
</tr>
<tr>
<td>session-info</td>
<td>Send session-level information, such as (for Jingle RTP sessions) a ringing message.</td>
</tr>
<tr>
<td>session-initiate</td>
<td>Request negotiation of a new Jingle session.</td>
</tr>
<tr>
<td>session-terminate</td>
<td>End an existing session.</td>
</tr>
<tr>
<td>transport-accept</td>
<td>Accept a transport-replace action received from another party.</td>
</tr>
<tr>
<td>transport-info</td>
<td>Exchange transport candidates; it is mainly used in <cite>XEP-0176</cite> but may be used in other transport specifications.</td>
</tr>
<tr>
<td>transport-replace</td>
<td>Redefine a transport method.</td>
</tr>
</table>
<p>The actions related to management of the overall Jingle session are as follows (detailed definitions are provided in under <link url='#def-action'>Action Attribute</link>).</p>
<ul>
<li>content-accept -- Accept a content-add action received from another party.</li>
<li>content-add -- Add one or more new content definitions to the session.</li>
<li>content-modify -- Change the directionality of media sending.</li>
<li>content-remove -- Remove one or more content definitions from the session.</li>
<li>session-accept -- Definitively accept a session negotiation.</li>
<li>session-info -- Send session-level information, such as a ringing message.</li>
<li>session-initiate -- Request negotiation of a new Jingle session.</li>
<li>session-terminate -- End an existing session.</li>
<li>transport-accept -- Accept a transport-replace action received from another party.</li>
<li>transport-info -- Exchange transport candidates.</li>
<li>transport-replace -- Redefine a transport method.</li>
</ul>
</section2>
</section1>
<section1 topic='Session Flow' anchor='session'>
<p>This section defines the high-level flow of a Jingle session. More detailed descriptions are provided in the specifications for Jingle application formats and transport methods.</p>
<section2 topic='Resource Determination' anchor='session-resource'>
<p>In order to initiate a Jingle session, the initiator must determine which of the responder's XMPP resources is best for the desired application format. Methods for doing so are out of scope for this specification. However, see the <link url='#support'>Determining Support</link> section of this document (and associated specifications) for relevant information.</p>
<p>In order to initiate a Jingle session, the initiator needs to determine which of the responder's XMPP resources is best for the desired application format. Methods for doing so are out of scope for this specification. However, see the <link url='#support'>Determining Support</link> section of this document (and associated specifications) for relevant information.</p>
</section2>
<section2 topic='Initiation' anchor='protocol-initiate'>
<p>Once the initiator has discovered which of the responder's XMPP resources is ideal for the desired application format, it sends a session initiation request to the responder. This request is an IQ-set containing a &JINGLE; element qualified by the 'urn:xmpp:tmp:jingle' namespace &NSNOTE;, where the value of the 'action' attribute is "session-initiate" and where the &JINGLE; element contains one or more &CONTENT; elements. Each &CONTENT; element defines a content type to be transferred during the session, and each &CONTENT; element in turn contains one &DESCRIPTION; child element that specifies a desired application format and one &TRANSPORT; child element that specifies a potential transport method. If either party wishes to propose the use of multiple transport methods for the same application format, it must send multiple &CONTENT; elements.</p>
<p>Once the initiator has discovered which of the responder's XMPP resources is ideal for the desired application format, it sends a session initiation request to the responder. This request is an IQ-set containing a &JINGLE; element qualified by the 'urn:xmpp:jingle:0' namespace &VNOTE;, where the value of the 'action' attribute is "session-initiate" and where the &JINGLE; element contains one or more &CONTENT; elements. Each &CONTENT; element defines a content type to be transferred during the session, and each &CONTENT; element in turn contains one &DESCRIPTION; child element that specifies a desired application format and one &TRANSPORT; child element that specifies a potential transport method. If either party wishes to propose the use of multiple transport methods for the same application format, it MUST include multiple &CONTENT; elements.</p>
<example caption="Initiator sends session-initiate"><![CDATA[
<iq from='romeo@montague.net/orchard'
id='jingle1'
to='juliet@capulet.com/balcony'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'>
<jingle xmlns='urn:xmpp:jingle:0'>
action='session-initiate'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<content creator='initiator' name='voice'>
<description xmlns='urn:xmpp:tmp:jingle:apps:rtp' media='audio'>
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'>
<payload-type id='96' name='speex' clockrate='16000'/>
<payload-type id='97' name='speex' clockrate='8000'/>
<payload-type id='18' name='G729'/>
@ -595,13 +573,13 @@ PENDING o----------------------+ |
<payload-type id='103' name='L16' clockrate='16000' channels='2'/>
<payload-type id='98' name='x-ISAC' clockrate='8000'/>
</description>
<transport xmlns='urn:xmpp:tmp:jingle:transports:ice-udp'/>
<transport xmlns='urn:xmpp:jingle:transports:ice-udp:0'/>
</content>
</jingle>
</iq>
]]></example>
<p>Note: The syntax and semantics of the &DESCRIPTION; and &TRANSPORT; elements are out of scope for this specification, since they are defined in related specifications. The syntax and semantics of the &JINGLE; and &CONTENT; elements are specified in this document under <link url='#def'>Formal Definition</link>.</p>
<p>Note: In order to expedite session establishment, the initiator MAY send transport candidates (e.g., for negotiation of the ICE transport) immediately after sending the session-initiate action and before receiving acknowledgement from the responder (i.e., the initiator MUST consider the session to be PENDING even before receiving acknowledgement). Given in-order delivery, the responder should receive such transport-info actions after receiving the session-initiate action (if not, it is appropriate for the responder to return &lt;unknown-session/&gt; errors since according to its state machine the session does not exist).</p>
<p>Note: The syntax and semantics of the &DESCRIPTION; and &TRANSPORT; elements are out of scope for this document, since they are defined in related specifications. The syntax and semantics of the &JINGLE; and &CONTENT; elements are specified in this document under <link url='#def'>Formal Definition</link>.</p>
<p>Note: In order to expedite session establishment, the initiator MAY send transport candidates (e.g., for negotiation of the ICE transport) immediately after sending the session-initiate action and before receiving acknowledgement from the responder (i.e., the initiator MUST consider the session to be PENDING even before receiving acknowledgement). Given in-order delivery in accordance with &xmppcore;, the responder will receive such transport-info actions after receiving the session-initiate action (if not, it is appropriate for the responder to return &lt;unknown-session/&gt; errors since according to its state machine the session does not exist).</p>
<example caption="Responder returns unknown-session error"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='jingle1'
@ -609,7 +587,7 @@ PENDING o----------------------+ |
type='error'>
<error type='cancel'>
<bad-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<unknown-session xmlns='urn:xmpp:tmp:jingle:errors'/>
<unknown-session xmlns='urn:xmpp:jingle:errors:0'/>
</error>
</iq>
]]></example>
@ -623,8 +601,7 @@ PENDING o----------------------+ |
to='romeo@montague.net/orchard'
type='result'/>
]]></example>
<p>However, after acknowledging the session initiation request, the responder may subsequently determine that it cannot proceed with negotiation of the session (e.g., because it does not support any of the offered application formats or transport methods, because a human user is busy or unable to accept the session, because a human user wishes to formally decline the session, etc.). In these cases, the responder SHOULD immediately acknowledge the session initiation request but then terminate the session with an appropriate reason as described in the <link url='#session-terminate'>Termination</link> section of this document.</p>
<p>If the responder acknowledges receipt of the initation request, both parties must consider the session to be in the PENDING state.</p>
<p>However, after acknowledging the session initiation request, the responder might subsequently determine that it cannot proceed with negotiation of the session (e.g., because it does not support any of the offered application formats or transport methods, because a human user is busy or unable to accept the session, because a human user wishes to formally decline the session, etc.). In these cases, the responder SHOULD immediately acknowledge the session initiation request but then terminate the session with an appropriate reason as described in the <link url='#session-terminate'>Termination</link> section of this document.</p>
</section3>
<section3 topic='Errors' anchor='protocol-response-errors'>
<p>There are several reasons why the responder might immediately return an error instead of acknowledging receipt of the initiation request:</p>
@ -635,7 +612,7 @@ PENDING o----------------------+ |
<li>The responder does not have sufficient resources to participate in a session.</li>
<li>The initiation request was malformed.</li>
</ul>
<p>If the initiator is unknown to the responder (e.g., via presence subscription as defined in &rfc3921; or stanza session negotiation as defined in &xep0155;) and the responder has a policy of not communicating via Jingle with unknown entities, it SHOULD return a &unavailable; error.</p>
<p>If the initiator is unknown to the responder (e.g., via presence subscription as defined in &rfc3921; or stanza session negotiation as defined in &xep0155;) and the responder has a policy of not communicating via Jingle with unknown entities, it MUST return a &unavailable; error.</p>
<example caption="Initiator is unknown to responder"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='jingle1'
@ -657,7 +634,7 @@ PENDING o----------------------+ |
</error>
</iq>
]]></example>
<p>If the responder wishes to redirect the request to another address, it SHOULD return a &redirect; error.</p>
<p>If the responder wishes to redirect the request to another address, it MUST return a &redirect; error.</p>
<example caption="Responder redirection"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='jingle1'
@ -665,12 +642,12 @@ PENDING o----------------------+ |
type='error'>
<error type='cancel'>
<redirect xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'>
voicemail@capulet.lit
xmpp:voicemail@capulet.lit
</redirect>
</error>
</iq>
]]></example>
<p>If the responder does not have sufficient resources to participate in a session, it SHOULD return a &constraint; error.</p>
<p>If the responder does not have sufficient resources to participate in a session, it MUST return a &constraint; error.</p>
<example caption="Responder has insufficent resources"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='jingle1'
@ -701,38 +678,28 @@ PENDING o----------------------+ |
<li>Exchanging particular transport candidates via the transport-info action.</li>
<li>Modifying the communication direction for a content type via the content-modify action.</li>
<li>Changing the definition of a content type via the transport-replace action (typically to fall back to a more suitable transport).</li>
<li>Adding a content type via the content-add action (not allowed in the PENDING state).</li>
<li>Removing a content type via the content-remove action (not allowed in the PENDING state).</li>
<li>Adding a content type via the content-add action.</li>
<li>Removing a content type via the content-remove action.</li>
</ul>
</section2>
<section2 topic='Acceptance' anchor='session-acceptance'>
<p>If (after negotiation of transport methods and application formats as well as checking of transport candidates) the responder determines that it will be able to establish a connection, it sends a definitive acceptance to the initiator.</p>
<p>Note: In the session-accept stanza, the &JINGLE; element MUST contain one or more &lt;content/&gt; elements, each of which MUST contain one &lt;description/&gt; element and one &lt;transport/&gt; element. The &JINGLE; element SHOULD possess a 'responder' attribute that explicitly specifies the full JID of the responding entity; after sending acknowledgement of the session-accept, the initiator SHOULD send all future commmunications about this Jingle session to the JID provided in the 'responder' attribute and note the new JID in the user interface.</p>
<p>The initiator then acknowledges the responder's definitive acceptance, after which the parties can exchange media over the negotiated connection.</p>
<p>If one of the parties cannot find a suitable transport method or candidate, it SHOULD terminate the session as described below.</p>
</section2>
<section2 topic='Modifying an Active Session' anchor='session-modify'>
<p>Once a session is in the ACTIVE state, it may be modified via a content-add, content-modify, content-remove, or transport-info action. Examples of such modifications are shown in the specifications for various application formats and transport methods.</p>
</section2>
<section2 topic='Termination' anchor='session-terminate'>
<p>In order to gracefully end the session (which MAY be done at any point after acknowledging receipt of the initiation request, including immediately thereafter in order to decline the request), either the responder or the initiator MUST send a session-terminate action to the other party.</p>
<p>The party that terminates the session SHOULD include a &lt;reason/&gt; element that specifies why the session is being terminated. Examples follow.</p>
<p>One reason for terminating the session is that the terminating party is busy; in this case, the recommended condition is "busy".</p>
<example caption="Terminating the session (busy)"><![CDATA[
<example caption="Responder accepts the session"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='accept1'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-accept'
initiator='romeo@montague.net/orchard'
responder='juliet@capulet.com/balcony'
sid='a73sjjvkla37jfea'>
<content creator='initiator' name='voice'>
<description xmlns='urn:xmpp:tmp:jingle:apps:rtp' media='audio'>
<description xmlns='urn:xmpp:jingle:apps:rtp:0' media='audio'>
<payload-type id='97' name='speex' clockrate='8000'/>
<payload-type id='18' name='G729'/>
</description>
<transport xmlns='urn:xmpp:tmp:jingle:transports:ice-udp'>
<transport xmlns='urn:xmpp:jingle:transports:ice-udp:0'>
<candidate component='1'
foundation='1'
generation='0'
@ -748,22 +715,29 @@ PENDING o----------------------+ |
</content>
</jingle>
</iq>
]]></example>
<p>And the initiator acknowledges session acceptance:</p>
<example caption="Initiator acknowledges session acceptance"><![CDATA[
]]></example>
<p>The initiator then acknowledges the responder's definitive acceptance, after which the parties can exchange media over the negotiated connection.</p>
<example caption="Initiator acknowledges session acceptance"><![CDATA[
<iq from='romeo@montague.net/orchard'
id='accept1'
to='juliet@capulet.com/balcony'
type='result'/>
]]></example>
<p>The initiator and responder would then exchange media using any of the acceptable codecs.</p>
<p>Eventually, one of the parties (here the responder) can terminate the sessio.</p>
<example caption="Responder terminates the session"><![CDATA[
]]></example>
<p>If one of the parties cannot find a suitable transport method or candidate, it SHOULD terminate the session as described below.</p>
</section2>
<section2 topic='Modifying an Active Session' anchor='session-modify'>
<p>Once a session is in the ACTIVE state, it might be modified via a content-add, content-modify, content-remove, or transport-info action. Examples of such modifications are shown in the specifications for various application formats and transport methods.</p>
</section2>
<section2 topic='Termination' anchor='session-terminate'>
<p>In order to gracefully end the session (which can be done at any point after acknowledging receipt of the initiation request, including immediately thereafter in order to decline the request), either the responder or the initiator MUST send a session-terminate action to the other party.</p>
<p>The party that terminates the session SHOULD include a &lt;reason/&gt; element that specifies why the session is being terminated. Examples follow.</p>
<p>One reason for terminating the session is that the terminating party is busy; in this case, the recommended condition is "busy".</p>
<example caption="Terminating the session (busy)"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -776,10 +750,10 @@ PENDING o----------------------+ |
<p>Another reason for terminating the session is that the terminating party wishes to formally decline the session; in this case, the recommended condition is "decline".</p>
<example caption="Terminating the session (session formally declined)"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
id='term2'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -791,10 +765,10 @@ PENDING o----------------------+ |
<p>Another reason for terminating the session is that the terminating party already has an existing session with the other party and wishes to use that session rather than initiate a new session; in this case, the recommended condition is "alternative-session" and the terminating party SHOULD include the session ID of the atlernative session in the &lt;sid/&gt; element.</p>
<example caption="Terminating the session (existing session)"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
id='term3'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -808,10 +782,10 @@ PENDING o----------------------+ |
<p>Another reason for terminating the session is that the terminating party does not support any of the offered application formats; in this case, the recommended condition is "unsupported-applications".</p>
<example caption="Terminating the session (no offered application format supported)"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
id='term4'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -823,10 +797,10 @@ PENDING o----------------------+ |
<p>Another reason for terminating the session is that the terminating party does not support any of the offered transport methods; in this case, the recommended condition is "unsupported-transports".</p>
<example caption="Terminating the session (no offered transport method supported)"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='term1'
id='term5'
to='romeo@montague.lit/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-terminate'
initiator='romeo@montague.lit/orchard'
sid='a73sjjvkla37jfea'>
@ -840,7 +814,7 @@ PENDING o----------------------+ |
<iq from='romeo@montague.lit/orchard'
id='term1'
to='juliet@capulet.lit/balcony'
type='result'>
type='result'/>
]]></example>
<p>Note: As soon as an entity sends a session-terminate action, it MUST consider the session to be in the ENDED state (even before receiving acknowledgement from the other party). If the terminating entity receives additional Jingle-related IQ-sets from the other party after sending the session-terminate action, it MUST reply with an &lt;unknown-session/&gt; error.</p>
<p>Unfortunately, not all sessions end gracefully. In applications of Jingle that also involve the exchange of presence information, receipt of &UNAVAILABLE; from the other party MAY be considered a session-ending event. However, in this case there is nothing for the party to acknowledge.</p>
@ -852,28 +826,44 @@ PENDING o----------------------+ |
id='ringing1'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns='urn:xmpp:tmp:jingle'
<jingle xmlns='urn:xmpp:jingle:0'
action='session-info'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'>
<ringing xmlns='urn:xmpp:tmp:jingle:apps:rtp:info'/>
<ringing xmlns='urn:xmpp:jingle:apps:rtp:0:info'/>
</jingle>
</iq>
]]></example>
<p>An informational message MUST be an IQ-set containing a &JINGLE; element whose 'action' attribute is set to a value of "session-info" or "transport-info"; the &JINGLE; element MUST further contain a payload child element (specific to the session or to a transport method) that specifies the information being communicated. If the party that receives an informational message does not understand the payload, it MUST return a &feature; error with a Jingle-specific error condition of &lt;unsupported-info/&gt;.</p>
<p>An informational message MUST be an IQ-set containing a &JINGLE; element whose 'action' attribute is set to a value of "session-info" or "transport-info"; the &JINGLE; element SHOULD further contain a payload child element (specific to the application format or transport method) that specifies the information being communicated. If the party that receives an informational message does not understand the payload, it MUST return a &feature; error with a Jingle-specific error condition of &lt;unsupported-info/&gt;.</p>
<example caption="Responder returns unsupported-info error"><![CDATA[
<iq from='juliet@capulet.lit/balcony'
id='info1'
to='romeo@montague.lit/orchard'
<iq from='romeo@montague.lit/orchard'
id='ringing1'
to='juliet@capulet.lit/balcony'
type='error'>
<error type='modify'>
<feature-not-implemented xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
<unsupported-info xmlns='urn:xmpp:tmp:jingle:errors'/>
<unsupported-info xmlns='urn:xmpp:jingle:errors:0'/>
</error>
</iq>
]]></example>
<p>If either party receives an empty session-info action for an active session, it MUST send an empty IQ result; this way, an empty session-info action may be used as a "ping" to determine session vitality.</p>
<p>Informational messages are specific to a particular application type or transport method and therefore are described in specifications other than this one.</p>
<p>However, the &JINGLE; element associated with a session-info action MAY be empty. If either party receives an empty session-info action for an active session, it MUST send an empty IQ result; this usage functions as a "ping" to determine session vitality.</p>
<example caption="Responder sends session ping"><![CDATA[
<iq from='juliet@capulet.com/balcony'
id='ping1'
to='romeo@montague.net/orchard'
type='set'>
<jingle xmlns='urn:xmpp:jingle:0'
action='session-info'
initiator='romeo@montague.net/orchard'
sid='a73sjjvkla37jfea'/>
</iq>
]]></example>
<example caption="Initiator returns IQ-result"><![CDATA[
<iq from='romeo@montague.lit/orchard'
id='ping1'
to='juliet@capulet.lit/balcony'
type='result'/>
]]></example>
</section2>
</section1>
@ -889,17 +879,17 @@ PENDING o----------------------+ |
</tr>
<tr>
<td>action</td>
<td>A Jingle action as listed in this document (e.g., "session-terminate").</td>
<td>A Jingle action as described under <link url='#def-action'>Action Attribute</link>.</td>
<td>REQUIRED</td>
</tr>
<tr>
<td>initiator</td>
<td>The full JID of the entity that has initiated the session flow (which may be different from the 'from' address on the IQ-set).</td>
<td>The full JID of the entity that has initiated the session flow (which can be different from the 'from' address on the IQ-set).</td>
<td>REQUIRED</td>
</tr>
<tr>
<td>responder</td>
<td>The full JID of the entity that has replied to the initiation, which may be different from the 'to' address on the IQ-set.</td>
<td>The full JID of the entity that has replied to the initiation, which can be different from the 'to' address on the IQ-set.</td>
<td>RECOMMENDED</td>
</tr>
<tr>
@ -909,6 +899,45 @@ PENDING o----------------------+ |
</tr>
</table>
</section2>
<section2 topic='Action Attribute' anchor='def-action'>
<p>The value of the 'action' attribute SHOULD be one of the following. If an entity receives a value not defined here, it SHOULD ignore attribute and SHOULD return a &badrequest; error to the sender.</p>
<section3 topic='content-accept' anchor='def-action-content-accept'>
<p>The <strong>content-accept</strong> action is used to accept a content-add action received from another party.</p>
</section3>
<section3 topic='content-add' anchor='def-action-content-add'>
<p>The <strong>content-add</strong> action is used to add one or more new content definitions to the session. The sender MUST specify only the added content definition(s), not the added content definition(s) plus the existing content definition(s). Therefore it is the responsibility of the recipient to maintain a local copy of the current content definition(s). If the recipient wishes to include the new content definition in the session, it MUST send a content-accept action to the other party.</p>
</section3>
<section3 topic='content-modify' anchor='def-action-content-modify'>
<p>The <strong>content-modify</strong> action is used to change the direction of an existing content definition thorugh modification of the 'senders' attribute. If the recipient deems the directionality of a content-modify action to be unacceptable, it MAY reply with a contrary content-modify action, terminate the session, or simply refuse to send or accept application data in the new direction. In any case, the recipient MUST NOT send a content-accept action in response to the content-modify.</p>
</section3>
<section3 topic='content-remove' anchor='def-action-content-remove'>
<p>The <strong>content-remove</strong> action is used to remove one or more content definitions from the session. The sender MUST specify only the removed content definition(s), not the removed content definition(s) plus the remaining content definition(s). Therefore it is the responsibility of the recipient to maintain a local copy of the current content definition(s). Upon receiving a content-remove from the other party, the recipient MUST NOT send a content-accept and MUST NOT continue to negotiate the transport method related to that content definition or send application data related to that content definition. <note>If the content-remove results in zero content definitions for the session, the entity that receives the content-remove SHOULD send a session-terminate action to the other party (since a session with no content definitions is void).</note></p>
</section3>
<section3 topic='session-accept' anchor='def-action-session-accept'>
<p>The <strong>session-accept</strong> action is used to definitively accept a session negotiation (implicitly this action also serves as a content-accept). A session-accept action indicates acceptance <em>only</em> of the content definition(s) included in the session-initiate, not any content definition(s) subsequently added during the PENDING state. In the session-accept stanza, the &JINGLE; element MUST contain one or more &lt;content/&gt; elements, each of which MUST contain one &lt;description/&gt; element and one &lt;transport/&gt; element. The &JINGLE; element SHOULD possess a 'responder' attribute that explicitly specifies the full JID of the responding entity; after sending acknowledgement of the session-accept, the initiator SHOULD send all future commmunications about this Jingle session to the JID provided in the 'responder' attribute and note the new JID in the user interface.</p>
</section3>
<section3 topic='session-info' anchor='def-action-session-info'>
<p>The <strong>session-info</strong> action is used to send session-level information, such as (for Jingle RTP sessions) a ringing message.</p>
</section3>
<section3 topic='session-initiate' anchor='def-action-session-initiate'>
<p>The <strong>session-initiate</strong> action is used to request negotiation of a new Jingle session.</p>
</section3>
<section3 topic='session-terminate' anchor='def-action-session-terminate'>
<p>The <strong>session-terminate</strong> action is used to end an existing session.</p>
</section3>
<section3 topic='transport-accept' anchor='def-action-transport-accept'>
<p>The <strong>transport-accept</strong> action is used to accept a transport-replace action received from another party.</p>
</section3>
<section3 topic='transport-info' anchor='def-action-transport-info'>
<p>The <strong>transport-info</strong> action is used to exchange transport candidates; it is mainly used in <cite>XEP-0176</cite> but might be used in other transport specifications.</p>
</section3>
<section3 topic='transport-replace' anchor='def-action-transport-replace'>
<p>The <strong>transport-replace</strong> action is used to redefine a transport method.</p>
</section3>
<section3 topic='Tie Breaking Related to Jingle Actions' anchor='def-action-ties'>
<p>It is possible that two instances of certain actions can be sent at the same time in the context of an existing session, one by each party; for example, both parties might simulaneously attempt to send a content-add, content-modify, or content-remove action. In all such cases, the action sent by the initiator MUST overrule the action sent by the responder; i.e., both parties MUST accept the action sent by the initiator and the initiator MUST return an &unexpected; error to the responder for the duplicate action.</p>
</section3>
</section2>
<section2 topic='Content Element' anchor='def-content'>
<p>The attributes of the &CONTENT; element are as follows.</p>
<table caption='Attributes of Content Element'>
@ -919,17 +948,17 @@ PENDING o----------------------+ |
</tr>
<tr>
<td>creator</td>
<td>Which party originally generated the content type (used to prevent race conditions regarding modifications).</td>
<td>Which party originally generated the content type (used to prevent race conditions regarding modifications); the defined values are "initiator" and "responder" (where the default is "initiator").</td>
<td>REQUIRED</td>
</tr>
<tr>
<td>name</td>
<td>A unique name or identifier for the content type according to the creator, which MAY have semantic meaning in order to differentiate this content type from other content types (e.g., two content types containing video media could differentiate between "room-pan" and "slides").</td>
<td>A unique name or identifier for the content type according to the creator, which MAY have meaning to a human user in order to differentiate this content type from other content types (e.g., two content types containing video media could differentiate between "room-pan" and "slides").</td>
<td>REQUIRED</td>
</tr>
<tr>
<td>senders</td>
<td>Which parties in the session will be generating content; the allowable values are "initiator", "responder", or "both" (where "both" is the default).</td>
<td>Which parties in the session will be generating content; the allowable values are "initiator", "responder", or "both" (where the default is "both").</td>
<td>RECOMMENDED</td>
</tr>
</table>
@ -941,7 +970,7 @@ PENDING o----------------------+ |
<li>The &lt;reason/&gt; element MAY contain a &lt;text/&gt; element that provides human-readable information about the reason for the action.</li>
<li>The &lt;reason/&gt; element MAY contain an element qualified by some other namespace that provides more detailed machine-readable information about the reason for the action.</li>
</ul>
<p>The defined conditions are described in the folloiwing table.</p>
<p>The defined conditions are described in the following table.</p>
<table caption='Defined Conditions'>
<tr>
<th>Element</th>
@ -953,7 +982,7 @@ PENDING o----------------------+ |
</tr>
<tr>
<td>&lt;busy/&gt;</td>
<td>The party is busy and cannot accept communications.</td>
<td>The party is busy and cannot accept a session.</td>
</tr>
<tr>
<td>&lt;connectivity-error/&gt;</td>
@ -989,10 +1018,13 @@ PENDING o----------------------+ |
</tr>
</table>
</section2>
<section2 topic='Thread Element' anchor='def-thread'>
<p>The syntax and semantics of the &lt;thread/&gt; element exactly matches that of the &lt;thread/&gt; element as defined for the &MESSAGE; stanza (qualified by the 'jabber:client' namespace) as defined in &xmppim;. It is used to associate a Jingle session or sessions with an ongoing conversation, so that user interfaces with the ability to present multiple interactions in the same window can show an association between the conversation and the Jingle session(s).</p>
</section2>
</section1>
<section1 topic='Error Handling' anchor='errors'>
<p>The Jingle-specific error conditions are as follows. These condition elements are qualified by the 'urn:xmpp:tmp:jingle:errors' namespace &NSNOTE;.</p>
<p>The Jingle-specific error conditions are as follows. These condition elements are qualified by the 'urn:xmpp:jingle:errors:0' namespace &VNOTE;.</p>
<table caption='Error Conditions'>
<tr>
<th>Jingle Condition</th>
@ -1018,7 +1050,7 @@ PENDING o----------------------+ |
</section1>
<section1 topic='Determining Support' anchor='support'>
<p>If an entity supports Jingle, it MUST advertise that fact by returning a feature of "urn:xmpp:tmp:jingle" &NSNOTE; in response to a &xep0030; information request. The response MUST also include features for the application formats and transport methods supported by the responding entity, as described in the relevant specifications.</p>
<p>If an entity supports Jingle, it MUST advertise that fact by returning a feature of "urn:xmpp:jingle:0" &VNOTE; in response to a &xep0030; information request. The response MUST also include features for the application formats and transport methods supported by the responding entity, as described in the relevant specifications.</p>
<example caption="Service Discovery Information Request"><![CDATA[
<iq from='kingclaudius@shakespeare.lit/castle'
id='disco1'
@ -1034,45 +1066,45 @@ PENDING o----------------------+ |
type='result'>
<query xmlns='http://jabber.org/protocol/disco#info'>
...
<feature var='urn:xmpp:tmp:jingle'/>
<feature var='urn:xmpp:jingle:0'/>
...
</query>
</iq>
]]></example>
<p>Naturally, support MAY also be determined via the dynamic, presence-based profile of Service Discovery defined in <cite>XEP-0115</cite>.</p>
<p>In order for an application to determine whether an entity supports this protocol, where possible it SHOULD use the dynamic, presence-based profile of service discovery defined in &xep0115;. However, if an application has not received entity capabilities information from an entity, it SHOULD use explicit service discovery instead.</p>
</section1>
<section1 topic='Conformance by Using Protocols' anchor='conformance'>
<section2 topic='Application Formats' anchor='conformance-apps'>
<p>A document that specifies a Jingle application format (e.g., RTP sessions) MUST define:</p>
<ol>
<li>How successful application format negotiation occurs for encapsulation into Jingle.</li>
<li>How successful application format negotiation occurs.</li>
<li>A &DESCRIPTION; element and associated semantics for representing the application format.</li>
<li>If and how the application format can be mapped to the Session Description Protocol, including the appropriate SDP media type (see Section 8.2.1 of <cite>RFC 4566</cite>).</li>
<li>Whether the media for the application format should be sent over a stream transport method or a datagram transport method (or, if both, which is preferred).</li>
<li>Whether the media for the application format shall be sent over a stream transport method or a datagram transport method (or, if both, which is preferred).</li>
<li>Exactly how the media is to be sent and received over a stream or datagram transport.</li>
</ol>
</section2>
<section2 topic='Transport Methods' anchor='conformance-transports'>
<p>A document that specifies a Jingle transport method (e.g., Raw UDP) MUST define:</p>
<p>A document that specifies a Jingle transport method (e.g., raw UDP) MUST define:</p>
<ol>
<li>How successful transport negotiation occurs for encapsulation into Jingle.</li>
<li>How successful transport negotiation occurs.</li>
<li>A &TRANSPORT; element and associated semantics for representing the transport method.</li>
<li>Whether the transport is stream or datagram.</li>
<li>If and how the transport handles components as defined herein (e.g., for the Real Time Control Protocol).</li>
<li>If and how the transport handles "components" (e.g., for the Real Time Control Protocol).</li>
</ol>
</section2>
</section1>
<section1 topic='Security Considerations' anchor='security'>
<section2 topic='Denial of Service' anchor='security-dos'>
<p>Jingle sessions may be resource-intensive. Therefore, it is possible to launch a denial-of-service attack against an entity by burdening it with too many Jingle sessions. Care must be taken to accept sessions only from known entities and only if the entity's device is able to process such sessions.</p>
<p>Jingle sessions can be resource-intensive. Therefore, it is possible to launch a denial-of-service attack against an entity by burdening it with too many Jingle sessions. Care must be taken to accept sessions only from known entities and only if the entity's device is able to process such sessions.</p>
</section2>
<section2 topic='Communication Through Gateways' anchor='security-gateways'>
<p>Jingle communications may be enabled through gateways to non-XMPP networks, whose security characteristics may be quite different from those of XMPP networks. (For example, on some SIP networks authentication is optional and "from" addresses can be easily forged.) Care must be taken in communicating through such gateways.</p>
<p>Jingle communications can be enabled through gateways to non-XMPP networks, whose security characteristics can be quite different from those of XMPP networks. (For example, on some SIP networks authentication is optional and "from" addresses can be easily forged.) Care must be taken in communicating through such gateways.</p>
</section2>
<section2 topic='Information Exposure' anchor='security-info'>
<p>Mere negotiation of a Jingle session may expose sensitive information about the parties (e.g., IP addresses). Care must be taken in communicating such information, and end-to-end encryption should be used if the parties do not trust the intermediate servers or gateways.</p>
<p>Mere negotiation of a Jingle session can expose sensitive information about the parties (e.g., IP addresses). Care must be taken in communicating such information, and end-to-end encryption should be used if the parties do not trust the intermediate servers or gateways.</p>
</section2>
</section1>
@ -1081,30 +1113,29 @@ PENDING o----------------------+ |
</section1>
<section1 topic='XMPP Registrar Considerations' anchor='registrar'>
<section2 topic='Protocol Namespaces' anchor='ns'>
<p>Until this specification advances to a status of Draft, its associated namespaces shall be:</p>
<section2 topic='Protocol Namespaces' anchor='registrar-ns'>
<p>This specification defines the following XML namespaces:</p>
<ul>
<li>urn:xmpp:tmp:jingle</li>
<li>urn:xmpp:tmp:jingle:errors</li>
</ul>
<p>Upon advancement of this specification, the &REGISTRAR; shall issue permanent namespaces in accordance with the process defined in Section 4 of &xep0053;.</p>
<p>The following namespaces are requested, and are thought to be unique per the XMPP Registrar's requirements:</p>
<ul>
<li>urn:xmpp:jingle</li>
<li>urn:xmpp:jingle:errors</li>
<li>urn:xmpp:jingle:0</li>
<li>urn:xmpp:jingle:errors:0</li>
</ul>
<p>Upon advancement of this specification from a status of Experimental to a status of Draft, the &REGISTRAR; shall add the foregoing namespaces to the registry located at &NAMESPACES;, as described in Section 4 of &xep0053;.</p>
</section2>
<section2 topic='Namespace Versioning' anchor='registrar-versioning'>
<p>If the protocol defined in this specification undergoes a major revision that is not fully backward-compatible with an older version, or that contains significant new features, the XMPP Registrar shall increment the protocol version number found at the end of the XML namespaces defined herein, as described in Section 4 of <cite>XEP-0053</cite>.</p>
</section2>
<section2 topic='Jingle Application Formats Registry' anchor='registrar-apps'>
<p>The XMPP Registrar shall maintain a registry of Jingle application formats. All application format registrations shall be defined in separate specifications (not in this document). Application types defined within the XEP series MUST be registered with the XMPP Registrar, resulting in protocol URNs of the form "urn:xmpp:jingle:app:name" (where "name" is the registered name of the application format).</p>
&REGPROCESS;
<code><![CDATA[
<application>
<name>the name of the application format</name>
<desc>a natural-language summary of the application format</desc>
<name>The name of the application format.</name>
<desc>A natural-language summary of the application format.</desc>
<transport>
whether the media can be sent over a "stream" transport, a "datagram" transport, or "both"
Whether the media can be sent over a "stream" transport,
a "datagram" transport, or "both".
</transport>
<doc>the document in which this application format is specified</doc>
<doc>The document in which the application format is specified.</doc>
</application>
]]></code>
</section2>
@ -1128,8 +1159,8 @@ PENDING o----------------------+ |
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='urn:xmpp:tmp:jingle'
xmlns='urn:xmpp:tmp:jingle'
targetNamespace='urn:xmpp:jingle:0'
xmlns='urn:xmpp:jingle:0'
elementFormDefault='qualified'>
<xs:element name='jingle'>
@ -1143,6 +1174,10 @@ PENDING o----------------------+ |
type='reasonElementType'
minOccurs='0'
maxOccurs='1'/>
<xs:element ref='thread'
type='threadElementType'
minOccurs='0'
maxOccurs='1'/>
<xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='action' use='required'>
@ -1168,11 +1203,20 @@ PENDING o----------------------+ |
</xs:complexType>
</xs:element>
<xs:complexType name='alternativeSessionElementType'>
<xs:sequence>
<xs:element name='sid'
minOccurs='0'
maxOcccurs='1'
type='xs:NMTOKEN'/>
</xs:sequence>
</xs:complexType>
<xs:complexType name='contentElementType'>
<xs:sequence>
<xs:any namespace='##other' minOccurs='0' maxOccurs='unbounded'/>
</xs:sequence>
<xs:attribute name='creator' use='required'>
<xs:attribute name='creator' use='required' default='initiator'>
<xs:simpleType>
<xs:restriction base='xs:NCName'>
<xs:enumeration value='initiator'>
@ -1195,7 +1239,8 @@ PENDING o----------------------+ |
<xs:complexType name='reasonElementType'>
<xs:sequence>
<xs:choice>
<xs:element name='alternative-session' type='alternativeSessionElementType/>
<xs:element name='alternative-session'
type='alternativeSessionElementType'/>
<xs:element name='busy' type='empty'/>
<xs:element name='connectivity-error' type='empty'/>
<xs:element name='decline' type='empty'/>
@ -1207,16 +1252,19 @@ PENDING o----------------------+ |
<xs:element name='unsupported-applications' type='empty'/>
<xs:element name='unsupported-transports' type='empty'/>
</xs:choice>
<xs:element name='sid' type='xs:NCName' minOccurs='0' maxOccurs='1'/>
<xs:element name='text' type='xs:string' minOccurs='0' maxOccurs='1'/>
<xs:any namespace='##other' minOccurs='0' maxOccurs='1'/>
</xs:sequence>
</xs:complexType>
<xs:complexType name='alternativeSessionElementType'>
<xs:sequence>
<xs:element name='sid' type='xs:string'/>
</xs:sequence>
<xs:complexType name='threadElementType'>
<xs:simpleContent>
<xs:extension base='xs:NMTOKEN'>
<xs:attribute name='parent'
type='xs:NMTOKEN'
use='optional'/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:simpleType name='empty'>
@ -1234,8 +1282,8 @@ PENDING o----------------------+ |
<xs:schema
xmlns:xs='http://www.w3.org/2001/XMLSchema'
targetNamespace='urn:xmpp:tmp:jingle:errors'
xmlns='urn:xmpp:tmp:jingle:errors'
targetNamespace='urn:xmpp:jingle:errors:0'
xmlns='urn:xmpp:jingle:errors:0'
elementFormDefault='qualified'>
<xs:element name='out-of-order' type='empty'/>
@ -1260,10 +1308,10 @@ PENDING o----------------------+ |
<li>Recommend that all client developers implement a dual-stack (XMPP + SIP) solution.</li>
<li>Define a full-featured protocol for XMPP signalling.</li>
</ol>
<p>Implementation experience indicates that a dual-stack approach may not be feasible on all the computing platforms for which Jabber clients have been written, or even desirable on platforms where it is feasible. <note>For example, one large ISP decided to switch to a pure XMPP approach after having implemented and deployed a dual-stack client for several years.</note> Therefore, it seemed reasonable to define an XMPP signalling protocol that could provide the necessary session management semantics while also making it relatively straightforward to interoperate with existing Internet standards.</p>
<p>Implementation experience indicates that a dual-stack approach might not be feasible on all the computing platforms for which Jabber clients have been written, or even desirable on platforms where it is feasible. <note>For example, one large ISP decided to switch to a pure XMPP approach after having implemented and deployed a dual-stack client for several years.</note> Therefore, it seemed reasonable to define an XMPP signalling protocol that could provide the necessary session management semantics while also making it relatively straightforward to interoperate with existing Internet standards.</p>
<p>As a result of feedback received on <cite>XEP-0111</cite>, the original authors of this document (Joe Hildebrand and Peter Saint-Andre) began to define such a signalling protocol, code-named Jingle. Upon communication with members of the Google Talk team, <note>Google Talk is a messaging and voice chat service and client provided by Google; see &lt;<link url='http://www.google.com/talk/'>http://www.google.com/talk/</link>&gt;.</note> it was discovered that the emerging Jingle approach was conceptually (and even syntactically) quite similar to the signalling protocol used in the Google Talk application. Therefore, in the interest of interoperability and adoption, we decided to harmonize the two approaches. The signalling protocol specified herein is, therefore, substantially equivalent to the original Google Talk protocol, with several adjustments based on feedback received from implementors as well as for publication by the XMPP Standards Foundation.</p>
</section1>
<section1 topic='Acknowledgements' anchor='ack'>
<p>The authors would like to thank Rohan Mahy for his valuable input on early versions of the Jingle specifications. Thiago Camargo, Diana Cionoiu, Olivier Cr&#234;te, Dafydd Harries, Antti Ij&#228;s, Tim Julien, Lauri Kaila, Justin Karneges, Jussi Laako, Steffen Larsen, Anthony Minessale, Akito Nozaki, Matt O'Gorman, Rob Taylor, Matt Tucker, Justin Uberti, Saku Vainio, Brian West, Jeff Williams, and others have also provided helpful input. Thanks also to those who have commented on the &SSIG; and (earlier) Jingle <note>Before this specification was formally accepted by the XMPP Standards Foundation as an XMPP Extension Protocol, it was discussed on the semi-private &lt;jingle@jabber.org&gt; mailing list; although that list is no longer used since the standards@xmpp.org list is the preferred discussion venue, for historical purposes it is publicly archived at &lt;<link url='http://mail.jabber.org/pipermail/jingle/'>http://mail.jabber.org/pipermail/jingle/</link>&gt;.</note> mailing lists.</p>
<p>The authors would like to thank Rohan Mahy for his valuable input on early versions of the Jingle specifications. Thiago Camargo, Diana Cionoiu, Olivier Cr&#234;te, Dafydd Harries, Antti Ij&#228;s, Tim Julien, Lauri Kaila, Justin Karneges, Jussi Laako, Steffen Larsen, Anthony Minessale, Akito Nozaki, Matt O'Gorman, Rob Taylor, Matt Tucker, Justin Uberti, Saku Vainio, Brian West, Jeff Williams, and others have also provided helpful input. Thanks also to those who have commented on the &SSIG; and Jingle <note>Before this specification was formally accepted by the XMPP Standards Foundation as an XMPP Extension Protocol, it was discussed on the semi-private &lt;jingle@jabber.org&gt; mailing list. This list has since been resurrected as a special-purpose venue for discussion of Jingle protocols and implementation; interested developers can subscribe and access the archives at at &lt;<link url='http://mail.jabber.org/mailman/listinfo/jingle/'>http://mail.jabber.org/mailman/listinfo/jingle/</link>&gt;.</note> mailing lists.</p>
</section1>
</xep>