Abstract: | This specification defines a proposed modification to the XMPP roster protocol that enables versioning of rosters such that the server will not send the roster to the client if the roster has not changed, thus saving bandwidth during session establishment. |
Author: | Peter Saint-Andre |
Copyright: | © 1999 - 2009 XMPP Standards Foundation. SEE LEGAL NOTICES. |
Status: | Proposed |
Type: | Standards Track |
Version: | 0.6 |
Last Updated: | 2009-03-31 |
NOTICE: This document is currently within Last Call or under consideration by the XMPP Council for advancement to the next stage in the XSF standards process.
1. Introduction
2. Protocol
2.1. Data Format
2.2. Client Request
2.3. Server Response With Unchanged Roster
2.4. Server Response With Changed Roster
2.5. Subsequent Roster Pushes
3. Stream Feature
4. Security Considerations
5. IANA Considerations
6. XMPP Registrar Considerations
6.1. Protocol Namespaces
7. XML Schemas
8. 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
Although XMPP rosters can become quite large, they change infrequently. Therefore it can be inefficient for the server to send the roster to the client during session establishment if the roster has not changed. This document defines a small modification to the XMPP roster protocol specified in XMPP IM [1] that enables "versioning" of roster information; when the client requests the roster it specifies its latest version, and the server will simply inform the client that it is up to date if the roster has not changed.
Note: This document describes a protocol or best practice that is intended for incorporation into the specification that will supersede RFC 3921 [2] within the Internet Standards Process, i.e., rfc3921bis [3]. This document is provided only for the purpose of open community discussion of the potential modification and will be obsoleted as soon as the relevant RFC is published.
This document adds a new 'ver' attribute to the <query/> element qualified by the 'jabber:iq:roster' namespace, defined as follows:
Definition: The 'ver' attribute is a strictly increasing sequence number that is increased (but not necessarily incremented-by-one) with any modification to the roster data. The value of the attribute MUST be a non-negative 64-bit integer, MUST be changed only by the server, and MUST be treated by the client as opaque. The server MUST ensure that each change to the roster data will result in a different sequence number and that the sequence number associated with a given roster modification will be greater than the sequence number associated with any previous roster modification. (Note: This rule effectively disallows the use of the system clock as a sequence number, since if the system time changes, e.g. because of an adjustment based on an NTP RFC 958 [4] update, the next generated value might be less than the previous one.)
For purposes of this specification, a "roster modification" is any change to the roster data that would result in a roster push to a connected client. Therefore internal states related to roster processing within the server that do not result in a roster push do not necessitate a change to the sequence number.
If a client supports roster versioning, it SHOULD include the 'ver' element in its request for the roster, where the 'ver' attribute is set to the sequence number associated with its last cache of the roster.
<iq from='romeo@montague.lit/home' id='r1' to='romeo@montague.lit' type='get'> <query xmlns='jabber:iq:roster' ver='305'/> </iq>
If the client has not yet cached the roster or the cache is lost or corrupted, but the client wishes to bootstrap the use of roster versioning, it SHOULD set the 'ver' attribute to a value of zero (0).
Naturally, if the client does not support roster versioning or does not wish to bootstrap use of roster versioning, it will behave like an RFC-3921-compliant client by not including the 'ver' attribute.
If the roster has not changed since the version enumerated by the client, the server MUST return an empty IQ-result.
<iq from='romeo@montague.lit' id='r1' to='romeo@montague.lit/home' type='result'/>
If the roster has changed since the version enumerated by the client, the server MUST return a <query/> element that includes the latest version number.
The <query/> element MUST either contain the complete roster (including the version number to indicate that the roster has changed) or be empty (indicating that roster changes will be sent as interim roster pushes).
In general, if returning the complete roster would use less bandwidth than sending individual roster pushes to the client (e.g., if the roster contains only a few items), the server SHOULD return the complete roster.
<iq from='romeo@montague.lit' id='r1' to='romeo@montague.lit/home' type='result'> <query xmlns='jabber:iq:roster' ver='317'> <item jid='bill@shakespeare.lit' subscription='both'/> <item jid='nurse@capulet.lit' name='Nurse' subscription='both'> <group>Servants</group> </item> </query> </iq>
However, if returning the complete roster would use more bandwidth than sending individual roster pushes to the client (e.g., if the roster contains many items, only a few of which have changed), the server SHOULD return an empty <query/> element, then send individual roster pushes.
<iq from='romeo@montague.lit' id='r1' to='romeo@montague.lit/home' type='result'> <query xmlns='jabber:iq:roster' ver='317'> </iq>
<iq from='romeo@montague.lit' id='p1' to='romeo@montague.lit/home' type='set'> <query xmlns='jabber:iq:roster' ver='313'> <item jid='shylock@shakespeare.lit' subscription='remove'/> </query> </iq> <iq from='romeo@montague.lit' id='p2' to='romeo@montague.lit/home' type='set'> <query xmlns='jabber:iq:roster' ver='317'> <item jid='bill@shakespeare.lit' subscription='both'/> </query> </iq>
The interim roster pushes can be understood as follows:
The client can determine when the interim roster pushes have ended by comparing the version number it received on the empty <query/> element against the version number it receives in roster pushes.
When the server sends subsequent roster pushes to the client, it MUST include the updated roster version number. Roster pushes MUST occur in sequence order. The version number contained in a roster push MUST be unique. A "change to the roster" is any addition of, update to, or removal of a roster item that would result in a roster push, including changes in subscription states, as described in RFC 3921 or rfc3921bis.
<iq from='romeo@montague.lit' id='p3' to='romeo@montague.lit/home' type='set'> <query xmlns='jabber:iq:roster' ver='319'> <item jid='muse@shakespeare.lit' name='The Muse' subscription='to'/> </query> </iq>
If a server supports roster versioning, it MUST inform the connecting entity when returning stream features during the stream negotiation process; at the latest, when informing a client that resource binding is required. This is done by including a <ver/> element qualified by the 'urn:xmpp:features:rosterver' namespace.
<stream:features> <bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'> <required/> </bind> <ver xmlns='urn:xmpp:features:rosterver'> <optional/> </ver> </stream:features>
It is possible that client-side caching of roster information (rather than holding them in memory only for the life of the session) could introduce new vulnerabilities, such as misuse by malware. Implementations are advised to appropriately protect cached roster data.
This document requires no interaction with the Internet Assigned Numbers Authority (IANA) [5].
Until this specification advances to a status of Draft, the associated namespace for its stream feature shall be "urn:xmpp:features:rosterver". Upon advancement of this specification, the XMPP Registrar [6] shall issue a permanent namespace in accordance with the process defined in Section 4 of XMPP Registrar Function [7]; the requested namespace is "urn:xmpp:seq", which is thought to be unique per the XMPP Registrar's requirements.
This specification proposes addition of the 'ver' attribute to the schema for the 'jabber:iq:roster' namespace.
Thanks to Dave Cridland, Richard Dobson, Fabio Forno, Alexander Gnauck, Juha Hartikainen, Joe Hildebrand, Justin Karneges, Curtis King, Pedro Melo, and Jiří Zárevúcký for their comments. The definition of a sequence number borrows concepts and text from RFC 4551 [8]
Series: XEP
Number: 0237
Publisher: XMPP Standards Foundation
Status:
Proposed
Type:
Standards Track
Version: 0.6
Last Updated: 2009-03-31
Approving Body: XMPP Council
Dependencies: XMPP Core, XMPP IM
Supersedes: None
Superseded By: None
Short Name: N/A
Source Control:
HTML
RSS
JabberID:
stpeter@jabber.org
URI:
https://stpeter.im/
The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 3920) and XMPP IM (RFC 3921) specifications contributed by the XMPP Standards Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this document has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.
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 may 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. RFC 3921: Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence <http://tools.ietf.org/html/rfc3921>.
2. RFC 3921: Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence <http://tools.ietf.org/html/rfc3921>.
3. rfc3921bis: proposed revisions to Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence <http://tools.ietf.org/html/draft-saintandre-rfc3921bis>. (work in progress)
4. RFC 958: Network Time Protocol (NTP) <http://tools.ietf.org/html/rfc0958>.
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 <http://xmpp.org/registrar/>.
7. XEP-0053: XMPP Registrar Function <http://xmpp.org/extensions/xep-0053.html>.
8. RFC 4551: IMAP Extension for Conditional STORE Operation or Quick Flag Changes Resynchronization <http://tools.ietf.org/html/rfc4551>.
Clarified definition of sequence number.
(psa)Reverted to a roster-specific method and modified presentation to enable incorporation into rfc3921bis.
(psa)Defined new namespace and generalized to handle service discovery and other use cases in addition to rosters.
(psa)Defined protocol solely in terms of full rosters and roster pushes (no more roster diffs); added implementation notes; clarified server behavior if cached version is unavailable.
(psa)Renamed to data sequencing; clarified server behavior.
(psa)Initial published version; per Council consensus, removed optionality regarding semantics of the version attribute.
(psa)Corrected semantics of version attribute (should be a strictly increasing sequence number but may be any unique identifier).
(psa)Clarified description of roster diff; added diff attribute and specified its use in roster results; specified use of version attribute in roster pushes.
(psa)First draft.
(psa)END