%ents; ]>
Roster Sequencing This specification proposes a modification to the XMPP roster management protocol to support sequencing of roster changes for more efficient downloading of the roster information. &LEGALNOTICE; 0237 Experimental Standards Track Standards Council XMPP Core XMPP IM NOT-YET-ASSIGNED &stpeter; 0.3 2008-04-21 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.

0.2 2008-03-06 psa

Renamed to roster sequencing; clarified server behavior.

0.1 2008-03-05 psa

Initial published version; per Council consensus, removed optionality regarding semantics of the version attribute.

0.0.3 2008-03-05 psa

Corrected semantics of version attribute (should be a strictly increasing sequence number but may be any unique identifier).

0.0.2 2008-03-04 psa

Clarified description of roster diff; added diff attribute and specified its use in roster results; specified use of version attribute in roster pushes.

0.0.1 2008-03-04 psa

First draft.

&RFC3921BISNOTE;

RFC 3921 specifies that an XMPP client must retrieve the entire roster on login. However, XMPP rosters can be quite large and often the roster has not changed since it was last retrieved. If the client could cache the roster and retrieve only changes to the roster, the login process could be significantly streamlined, which could be especially valuable over low-bandwidth connections such as those common in mobile environments. This document defines a method for such streamlining, via the concept of roster sequencing.

Note: This document is provided for discussion purposes in order to improve roster management in XMPP systems. It is not meant to supersede the text in RFC 3921. However, the recommendations in this document may be folded into rfc3921bis.

This document specifies the addition of a 'sequence' attribute to the &QUERY; element qualified by the 'jabber:iq:roster' namespace.

The value of the 'sequence' attribute MUST be a non-negative integer representing a strictly increasing sequence number that is increased (but not necessarily incremented-by-one) with any change to the roster. The server shall increase the sequence number even if a particular connected resource does not support this extension. The sequence 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.

The 'sequence' attribute is used as described in the following sections.

If a server supports roster sequencing, it MUST inform the client when returning stream features during the stream setup process, at the latest when informing the client that resource binding is required. This is done by including a <roster-sequencing/> element qualified by the 'urn:xmpp:tmp:roster-sequencing' namespace &NSNOTE;.

]]>

If a client supports roster sequencing and knows that the server does so, it SHOULD include the 'sequence' attribute in its request for the roster, set to the sequence number associated with its last cache of the roster.

]]>

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 sequencing, it SHOULD include the 'sequence' attribute set to a value of zero (0).

Naturally, if the client does not support roster sequencing or does not wish to bootstrap use of roster sequencing, it will behave like an RFC-3921-compliant client by not including the 'sequence' attribute.

If the roster has not changed since the version enumerated by the client, the server MUST return an empty IQ-result.

]]>

If the roster version has increased since the version enumerated by the client, the server MUST return a &QUERY; element that includes the latest sequence number.

The &QUERY; element MUST either contain the complete roster (including the sequence 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 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.

Servants ]]>

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.

]]> ]]>

The interim roster pushes can be understood as follows:

  1. Imagine that the client had an active presence session for the entire time between its cached roster version (in this case, 305) and the new roster version (317).
  2. During that time, the client might have received roster pushes related to roster sequence numbers 306, 307, 310, 311, 313, 314, 315, and 317 (the sequence numbers must be strictly increasing but there is no requirement that the sequence shall be continuous).
  3. However, some of those roster pushes might have contained intermediate updates to the same roster item (e.g., changes in the subscription state for bill@shakespeare.lit from "none" to "to" and from "to" to "both").
  4. The interim roster pushes would not include all of the intermediate steps, only the final result of all changes applied while the client was in fact offline.

The client can determine when the interim roster pushes have ended by comparing the sequence number it received on the empty &QUERY; element against the sequence number it receives in roster pushes.

When the server sends subsequent roster pushes to the client, it MUST include the updated roster sequence number. Roster pushes MUST occur in sequence order.

]]>

It is possible that caching of the roster (rather than holding it in memory only for the life of the session) could introduce new vulnerabilities. Client implementations should take care to appropriately protect the cached roster information.

This document requires no interaction with &IANA;.

Until this specification advances to a status of Draft, the associated namespace for its stream feature shall be "urn:xmpp:tmp:roster-sequencing"; upon advancement of this specification, the ®ISTRAR; shall issue a permanent namespace in accordance with the process defined in Section 4 of &xep0053;.

If this modification to the roster management protocol is added to rfc3921bis and approved by the IESG in the specification that supersedes RFC 3921, the schema for the roster management namespace would be changed as follows.

]]>
]]>

Thanks to Dave Cridland, Richard Dobson, Fabio Forno, Alexander Gnauck, Juha Hartikainen, Joe Hildebrand, Justin Karneges, and Pedro Melo for their comments.