Abstract: | This document defines a way for the client to indicate its active/inactive state. |
Author: | Matthew Wild |
Copyright: | © 1999 – 2018 XMPP Standards Foundation. SEE LEGAL NOTICES. |
Status: | Deferred |
Type: | Standards Track |
Version: | 0.3.0 |
Last Updated: | 2018-11-08 |
WARNING: This document has been automatically Deferred after 12 months of inactivity in its previous Experimental state. Implementation of the protocol described herein is not recommended for production systems. However, exploratory implementations are encouraged to resume the standards process.
1. Introduction
2. Requirements
3. Use Cases
3.1. User and client behaviour
3.2. Server behaviour
4. Protocol
4.1. Discovering support
4.2. Indicating state
5. Business Rules
5.1. In-order processing
5.2. Interaction with Stream Resumption
6. Security Considerations
7. IANA Considerations
8. XMPP Registrar Considerations
9. XML Schema
10. Acknowledgements
Appendices
A: Document Information
B: Author Information
C: Legal Notices
D: Relation to XMPP
E: Discussion Venue
F: Requirements Conformance
G: Notes
H: Revision History
It is common for IM clients to be logged in and 'online' even while the user is not interacting with the application. This protocol allows the client to indicate to the server when the user is not actively using the client, allowing the server to optimise traffic to the client accordingly. This can save bandwidth and resources on both the client and server.
The aim of this specification is to provide a simple and efficient protocol for the client to report its state to the server. Exactly how the server uses this information is beyond the scope of this document, although some examples are given.
Other extensions exist, such as Stanza Interception and Filtering Technology (XEP-0273) [1], which also aim to optimise the traffic between the client and server. A notable difference is that instead of being client-controlled, CSI shifts the responsibility to the server, and aims to just provide the server with enough information to implement various optimisations itself.
Juliet has an XMPP client on her phone, which is available to receive messages. However most of the time Juliet has her phone screen turned off and is not interested in the status of her contacts unless they are communicating with her.
Juliet's client informs the server when Juliet is not interacting with it. The server uses this information to suppress or reduce stanzas that are unimportant, such as status updates.
When Juliet returns to her IM client, the client again informs the server, this time to report that it is active again. The server then disables its traffic optimisations and restores the stream to its normal state.
When the server knows that the user is not engaging with their client many optimisations become possible. For example a server could:
This list is for example only, a server is not required to implement all or any of these, nor is it prevented from implementing other behaviour not listed here. Regardless of what optimisations a server implements, it SHOULD provide a way for administrators to configure them, and MAY provide such configuration to users also (e.g., through an ad-hoc command).
If the server supports CSI, it advertises it in the stream features after the client has authenticated:
<stream:features> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'/> <csi xmlns='urn:xmpp:csi:0'/> </stream:features>
A stream always begins in 'active' state. If a client wishes to inform the server that it has become inactive, it sends an <inactive/> element in the 'urn:xmpp:csi:0' namespace:
<inactive xmlns='urn:xmpp:csi:0'/>
As might be anticipated, when the client is active again it sends an <active/> element:
<active xmlns='urn:xmpp:csi:0'/>
There is no reply from the server to either of these elements (though they may indirectly cause the server to send stanzas, e.g., to update presence information when the client becomes active after a period of inactivity).
As this protocol is for indication only, clients MUST NOT make assumptions about how the server will use the active/inactive state information.
The server MUST assume all clients to be in the 'active' state until the client indicates otherwise. Also the CSI active/inactive state is unrelated to the user's presence, the server MUST treat the two independently.
This protocol is intended primarily for clients with human interaction. Due to the open-ended nature of the possible optimisations implemented by the server, it may not be suitable for non-IM purposes where the fully standard behaviour of XMPP is required.
XMPP requires stanzas to be processed in order as per RFC 6120 [3] 10.1. Especially "If the server's processing of a particular request could have an effect on its processing of subsequent data it might receive over that input stream..., it MUST suspend processing of subsequent data until it has processed the request.". As a result, all actions triggered by a CSI nonza sent to the server must happen before processing further requests from the same client to the server.
For example: A client sends a CSI active nonza, followed by an XMPP Ping request to the server. The server first changes the CSI state to active and flushes all eventually queued stanzsa. After the state has been restored to 'active' and all resulting stanzas have been put on the wire, the server sends the pong.
<!-- Client sends 'active' and a ping to the server --> <active xmlns='urn:xmpp:csi:0'/> <iq to='capulaet.lit' from='juliet@capulet.lit/balcony' id='ping1' type='get'> <ping xmlns='urn:xmpp:ping'/> </iq> <!-- Server restores stream state to active, e.g. by flushing out queued stanzas to the client. and responds to the ping with a pong --> <iq to='juliet@capulet.lit/baclony' from='capulet.lit' id='ping1' type='result'/> <!-- Stream state is now 'active' -->
After a previous stream was resumed using mechanisms like Stream Management (XEP-0198) [4], the CSI state is not restored. That is, stream resumption does not affect the current CSI state, which always defaults to 'active' for new and resumed streams. Clients wishing to immediately go to the inactive state should do so after stream resumption.
To protect the privacy of users, servers MUST NOT reveal the clients active/inactive state to other entities on the network.
This document requires no interaction with the Internet Assigned Numbers Authority (IANA) [5].
This document requires no interaction with XMPP Registrar [6].
<?xml version='1.0' encoding='UTF-8'?> <xs:schema xmlns:xs='http://www.w3.org/2001/XMLSchema' targetNamespace='urn:xmpp:csi:0' xmlns='urn:xmpp:csi:0' elementFormDefault='qualified'> <xs:element name='csi' type='empty'/> <xs:element name='active' type='empty'/> <xs:element name='inactive' type='empty'/> <xs:simpleType name='empty'> <xs:restriction base='xs:string'> <xs:enumeration value=''/> </xs:restriction> </xs:simpleType> </xs:schema>
Thanks to Florian Schmaus for his feedback.
Series: XEP
Number: 0352
Publisher: XMPP Standards Foundation
Status:
Deferred
Type:
Standards Track
Version: 0.3.0
Last Updated: 2018-11-08
Approving Body: XMPP Council
Dependencies: XMPP Core
Supersedes: None
Superseded By: None
Short Name: csi
Source Control:
HTML
This document in other formats:
XML
PDF
Email:
mwild1@gmail.com
JabberID:
me@matthewwild.co.uk
The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 6120) and XMPP IM (RFC 6121) specifications contributed by the XMPP Standards Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this document has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.
The primary venue for discussion of XMPP Extension Protocols is the <standards@xmpp.org> discussion list.
Discussion on other xmpp.org discussion lists might also be appropriate; see <http://xmpp.org/about/discuss.shtml> for a complete list.
Errata can be sent to <editor@xmpp.org>.
The following requirements 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".
1. XEP-0273: Stanza Interception and Filtering Technology <https://xmpp.org/extensions/xep-0273.html>.
2. XEP-0085: Chat State Notifications <https://xmpp.org/extensions/xep-0085.html>.
3. RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core <http://tools.ietf.org/html/rfc6120>.
4. XEP-0198: Stream Management <https://xmpp.org/extensions/xep-0198.html>.
5. 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/>.
6. The XMPP Registrar maintains a list of reserved protocol namespaces as well as registries of parameters used in the context of XMPP extension protocols approved by the XMPP Standards Foundation. For further information, see <https://xmpp.org/registrar/>.
Note: Older versions of this specification might be available at http://xmpp.org/extensions/attic/
Clarify that the CSI state is not restored when the stream is resumed.
(fs)Clarified how CSI is affected by in-order processing (Florian Schmaus).
(XEP Editor (mam))Initial published version approved by the XMPP Council.
(XEP Editor (asw))First draft.
(mw)END