TOC 
Network Working GroupP. Saint-Andre, Ed.
Internet-DraftXMPP Standards Foundation
Obsoletes: 3920 (if approved)June 2, 2008
Intended status: Standards Track 
Expires: December 4, 2008 


Extensible Messaging and Presence Protocol (XMPP): Core
draft-saintandre-rfc3920bis-05

Status of this Memo

By submitting this Internet-Draft, each author represents that any applicable patent or other IPR claims of which he or she is aware have been or will be disclosed, and any of which he or she becomes aware will be disclosed, in accordance with Section 6 of BCP 79.

Internet-Drafts are working documents of the Internet Engineering Task Force (IETF), its areas, and its working groups. Note that other groups may also distribute working documents as Internet-Drafts.

Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as “work in progress.”

The list of current Internet-Drafts can be accessed at http://www.ietf.org/ietf/1id-abstracts.txt.

The list of Internet-Draft Shadow Directories can be accessed at http://www.ietf.org/shadow.html.

This Internet-Draft will expire on December 4, 2008.

Copyright Notice

Copyright © The IETF Trust (2008).

Abstract

This document defines the core features of the Extensible Messaging and Presence Protocol (XMPP), a technology for streaming Extensible Markup Language (XML) elements in order to exchange structured information in close to real time between any two or more network-aware entities. XMPP provides a generalized, extensible framework for incrementally exchanging XML data, upon which a variety of applications can be built. The framework includes methods for stream setup and teardown, channel encryption, authentication of a client to a server and of one server to another server, and primitives for push-style messages, publication of network availability information ("presence"), and request-response interactions between any two XMPP entities. This document also specifies the format for XMPP addresses, which are fully internationalizable.

This document obsoletes RFC 3920.



Table of Contents

1.  Introduction
    1.1.  Overview
    1.2.  Functional Summary
    1.3.  Conventions
    1.4.  Discussion Venue
2.  Architecture
    2.1.  Overview
    2.2.  Server
    2.3.  Client
    2.4.  Network
3.  Addresses
    3.1.  Overview
    3.2.  Domain Identifier
    3.3.  Node Identifier
    3.4.  Resource Identifier
    3.5.  Determination of Addresses
4.  TCP Binding
    4.1.  Scope
    4.2.  Hostname Resolution
    4.3.  Client-to-Server Communications
    4.4.  Server-to-Server Communications
    4.5.  Reconnection
    4.6.  Other Bindings
5.  XML Streams
    5.1.  Overview
    5.2.  Stream Security
    5.3.  Stream Attributes
        5.3.1.  from
        5.3.2.  to
        5.3.3.  id
        5.3.4.  xml:lang
        5.3.5.  version
        5.3.6.  Summary
    5.4.  Namespace Declarations
    5.5.  Stream Features
    5.6.  Closing Streams
        5.6.1.  With Stream Error
        5.6.2.  Without Stream Error
        5.6.3.  Handling of Idle Streams
    5.7.  Stream Errors
        5.7.1.  Rules
            5.7.1.1.  Stream Errors Are Unrecoverable
            5.7.1.2.  Stream Errors Can Occur During Setup
            5.7.1.3.  Stream Errors When the Host is Unspecified
        5.7.2.  Syntax
        5.7.3.  Defined Stream Error Conditions
            5.7.3.1.  bad-format
            5.7.3.2.  bad-namespace-prefix
            5.7.3.3.  conflict
            5.7.3.4.  connection-timeout
            5.7.3.5.  host-gone
            5.7.3.6.  host-unknown
            5.7.3.7.  improper-addressing
            5.7.3.8.  internal-server-error
            5.7.3.9.  invalid-from
            5.7.3.10.  invalid-id
            5.7.3.11.  invalid-namespace
            5.7.3.12.  invalid-xml
            5.7.3.13.  not-authorized
            5.7.3.14.  policy-violation
            5.7.3.15.  remote-connection-failed
            5.7.3.16.  resource-constraint
            5.7.3.17.  restricted-xml
            5.7.3.18.  see-other-host
            5.7.3.19.  system-shutdown
            5.7.3.20.  undefined-condition
            5.7.3.21.  unsupported-encoding
            5.7.3.22.  unsupported-stanza-type
            5.7.3.23.  unsupported-version
            5.7.3.24.  xml-not-well-formed
        5.7.4.  Application-Specific Conditions
    5.8.  Simplified Stream Examples
6.  STARTTLS Negotiation
    6.1.  Overview
    6.2.  Rules
        6.2.1.  Mechanism Preferences
        6.2.2.  Data Formatting
        6.2.3.  Order of Negotiation
    6.3.  Process
        6.3.1.  Exchange of Stream Headers and Stream Features
        6.3.2.  Initiation of STARTTLS Negotiation
            6.3.2.1.  STARTTLS Command
            6.3.2.2.  Failure Case
            6.3.2.3.  Proceed Case
        6.3.3.  TLS Negotiation
            6.3.3.1.  Rules
            6.3.3.2.  TLS Failure
            6.3.3.3.  TLS Success
7.  SASL Negotiation
    7.1.  Overview
    7.2.  Rules
        7.2.1.  Data Formatting
        7.2.2.  Security Layers
        7.2.3.  Simple Usernames
        7.2.4.  Authorization Identities
        7.2.5.  Round Trips
    7.3.  Process
        7.3.1.  Exchange of Stream Headers and Stream Features
        7.3.2.  Initiation
        7.3.3.  Challenge-Response Sequence
        7.3.4.  Abort
        7.3.5.  Failure
        7.3.6.  Success
    7.4.  SASL Definition
    7.5.  SASL Errors
        7.5.1.  aborted
        7.5.2.  account-disabled
        7.5.3.  credentials-expired
        7.5.4.  encryption-required
        7.5.5.  incorrect-encoding
        7.5.6.  invalid-authzid
        7.5.7.  invalid-mechanism
        7.5.8.  malformed-request
        7.5.9.  mechanism-too-weak
        7.5.10.  not-authorized
        7.5.11.  temporary-auth-failure
        7.5.12.  transition-needed
8.  Resource Binding
    8.1.  Overview
    8.2.  Advertising Support
    8.3.  Generation of Resource Identifiers
    8.4.  Server-Generated Resource Identifier
        8.4.1.  Success Case
        8.4.2.  Error Case
    8.5.  Client-Generated Resource Identifier
        8.5.1.  Success Case
        8.5.2.  Error Cases
            8.5.2.1.  Not Allowed
            8.5.2.2.  Bad Request
            8.5.2.3.  Conflict
    8.6.  Binding Multiple Resources
        8.6.1.  Support
        8.6.2.  Binding an Additional Resource
        8.6.3.  Unbinding a Resource
            8.6.3.1.  Success Case
            8.6.3.2.  Error Cases
        8.6.4.  From Addresses
9.  XML Stanzas
    9.1.  Common Attributes
        9.1.1.  to
            9.1.1.1.  Client-to-Server Streams
            9.1.1.2.  Server-to-Server Streams
        9.1.2.  from
            9.1.2.1.  Client-to-Server Streams
            9.1.2.2.  Server-to-Server Streams
        9.1.3.  id
        9.1.4.  type
        9.1.5.  xml:lang
    9.2.  Basic Semantics
        9.2.1.  Message Semantics
        9.2.2.  Presence Semantics
        9.2.3.  IQ Semantics
    9.3.  Stanza Errors
        9.3.1.  Rules
        9.3.2.  Syntax
        9.3.3.  Defined Conditions
            9.3.3.1.  bad-request
            9.3.3.2.  conflict
            9.3.3.3.  feature-not-implemented
            9.3.3.4.  forbidden
            9.3.3.5.  gone
            9.3.3.6.  internal-server-error
            9.3.3.7.  item-not-found
            9.3.3.8.  jid-malformed
            9.3.3.9.  not-acceptable
            9.3.3.10.  not-allowed
            9.3.3.11.  not-authorized
            9.3.3.12.  not-modified
            9.3.3.13.  payment-required
            9.3.3.14.  recipient-unavailable
            9.3.3.15.  redirect
            9.3.3.16.  registration-required
            9.3.3.17.  remote-server-not-found
            9.3.3.18.  remote-server-timeout
            9.3.3.19.  resource-constraint
            9.3.3.20.  service-unavailable
            9.3.3.21.  subscription-required
            9.3.3.22.  undefined-condition
            9.3.3.23.  unexpected-request
            9.3.3.24.  unknown-sender
        9.3.4.  Application-Specific Conditions
    9.4.  Extended Content
10.  Examples
    10.1.  Client-to-Server
        10.1.1.  TLS
        10.1.2.  SASL
        10.1.3.  Resource Binding
        10.1.4.  Stanza Exchange
        10.1.5.  Close
    10.2.  Server-to-Server Examples
        10.2.1.  TLS
        10.2.2.  SASL
        10.2.3.  Stanza Exchange
        10.2.4.  Close
11.  Server Rules for Processing XML Stanzas
    11.1.  No 'to' Address
        11.1.1.  Overview
        11.1.2.  Message
        11.1.3.  Presence
        11.1.4.  IQ
    11.2.  Local Domain
        11.2.1.  Mere Domain
        11.2.2.  Resource at Domain
        11.2.3.  Node at Domain
    11.3.  Foreign Domain
        11.3.1.  Existing Stream
        11.3.2.  No Existing Stream
        11.3.3.  Error Handling
12.  XML Usage
    12.1.  Restrictions
    12.2.  XML Namespace Names and Prefixes
        12.2.1.  Streams Namespace
        12.2.2.  Default Namespace
        12.2.3.  Extended Namespaces
    12.3.  Well-Formedness
    12.4.  Validation
    12.5.  Inclusion of Text Declaration
    12.6.  Character Encoding
    12.7.  White Space
13.  Compliance Requirements
    13.1.  Servers
    13.2.  Clients
14.  Internationalization Considerations
15.  Security Considerations
    15.1.  High Security
    15.2.  Certificates
        15.2.1.  Certificate Generation
            15.2.1.1.  Server Certificates
            15.2.1.2.  Client Certificates
            15.2.1.3.  ASN.1 Object Identifier
        15.2.2.  Certificate Validation
            15.2.2.1.  Server Certificates
            15.2.2.2.  Client Certificates
    15.3.  Client-to-Server Communication
    15.4.  Server-to-Server Communication
    15.5.  Order of Layers
    15.6.  Lack of SASL Channel Binding to TLS
    15.7.  Mandatory-to-Implement Technologies
    15.8.  Firewalls
    15.9.  Use of base64 in SASL
    15.10.  Stringprep Profiles
    15.11.  Address Spoofing
        15.11.1.  Address Forging
        15.11.2.  Address Mimicking
    15.12.  Denial of Service
    15.13.  Presence Leaks
    15.14.  Directory Harvesting
16.  IANA Considerations
    16.1.  XML Namespace Name for TLS Data
    16.2.  XML Namespace Name for SASL Data
    16.3.  XML Namespace Name for Stream Errors
    16.4.  XML Namespace Name for Resource Binding
    16.5.  XML Namespace Name for Stanza Errors
    16.6.  Nodeprep Profile of Stringprep
    16.7.  Resourceprep Profile of Stringprep
    16.8.  GSSAPI Service Name
    16.9.  Port Numbers
17.  References
    17.1.  Normative References
    17.2.  Informative References
Appendix A.  Nodeprep
    A.1.  Introduction
    A.2.  Character Repertoire
    A.3.  Mapping
    A.4.  Normalization
    A.5.  Prohibited Output
    A.6.  Bidirectional Characters
Appendix B.  Resourceprep
    B.1.  Introduction
    B.2.  Character Repertoire
    B.3.  Mapping
    B.4.  Normalization
    B.5.  Prohibited Output
    B.6.  Bidirectional Characters
Appendix C.  XML Schemas
    C.1.  Streams namespace
    C.2.  Stream error namespace
    C.3.  STARTTLS namespace
    C.4.  SASL namespace
    C.5.  Resource binding namespace
    C.6.  Stanza error namespace
Appendix D.  Contact Addresses
Appendix E.  Account Provisioning
Appendix F.  Differences From RFC 3920
Appendix G.  Copying Conditions
§  Index
§  Author's Address
§  Intellectual Property and Copyright Statements




 TOC 

1.  Introduction



 TOC 

1.1.  Overview

The Extensible Messaging and Presence Protocol (XMPP) is an application profile of the Extensible Markup Language [XML] (Paoli, J., Maler, E., Sperberg-McQueen, C., Yergeau, F., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fourth Edition),” August 2006.) for streaming XML data in close to real time between any two (or more) network-aware entities. XMPP is typically used to exchange messages, share presence information, and engage in structured request-response interactions. The basic syntax and semantics of XMPP were developed originally within the Jabber open-source community, mainly in 1999. In late 2002, the XMPP Working Group was chartered with developing an adaptation of the core Jabber protocol that would be suitable as an IETF instant messaging (IM) and presence technology. As a result of work by the XMPP WG, [RFC3920] (Saint-Andre, P., Ed., “Extensible Messaging and Presence Protocol (XMPP): Core,” October 2004.) and [RFC3921] (Saint-Andre, P., Ed., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” October 2004.) were published in October 2004, representing the most complete definition of XMPP at that time.

As a result of extensive implementation and deployment experience with XMPP since 2004, as well as more formal interoperability testing carried out under the auspices of the XMPP Standards Foundation (XSF), this document reflects consensus from the XMPP developer community regarding XMPP's core XML streaming technology. In particular, this document incorporates the following backward-compatible changes from RFC 3920:

Therefore, this document defines the core features of XMPP 1.0 and obsoletes RFC 3920.

Note: The XMPP extensions required to provide the basic instant messaging and presence functionality defined in [IMP‑REQS] (Day, M., Aggarwal, S., and J. Vincent, “Instant Messaging / Presence Protocol Requirements,” February 2000.) are specified in [XMPP‑IM] (Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” July 2007.).



 TOC 

1.2.  Functional Summary

This non-normative section provides a developer-friendly, functional summary of XMPP; refer to the sections that follow for a normative definition of XMPP.

The purpose of XMPP is to enable the exchange of relatively small pieces of structured data (called "XML stanzas") over a network between any two (or more) entities. XMPP is implemented using a client-server architecture, wherein a client must connect to a server in order to gain access to the network and thus be allowed to exchange XML stanzas with other entities. The process whereby a client connects to a server, exchanges XML stanzas, and ends the connection is:

  1. Determine the hostname and port at which to connect
  2. Open a TCP connection
  3. Open an XML stream
  4. Complete TLS negotiation for channel encryption (recommended)
  5. Complete SASL negotiation for authentication
  6. Bind a resource to the stream
  7. Exchange an unbounded number of XML stanzas with other entities on the network
  8. Close the XML stream
  9. Close the TCP connection

In the sections following discussion of XMPP architecture and XMPP addresses, this document specifies how clients connect to servers and specifies the basic semantics of XML stanzas. However, this document does not define the "payloads" of the XML stanzas that might be exchanged once a connection is successfully established; instead, definition of such semantics is provided by XMPP extensionsl. For example, [XMPP‑IM] (Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” July 2007.) defines extensions for basic instant messaging and presence functionality. In addition, various specifications produced in the XSF's XEP series [XEP‑0001] (Saint-Andre, P., “XMPP Extension Protocols,” December 2006.) define extensions for a wide range of more advanced functionality.

Within the client-server architecture used by XMPP, one server may optionally connect to another server to enable inter-domain or inter-server communication. For this to happen, the two servers must negotiate a connection between themselves and then exchange XML stanzas; the process for doing so is:

  1. Determine the hostname and port at which to connect
  2. Open a TCP connection
  3. Open an XML stream
  4. Complete TLS negotiation for channel encryption (recommended)
  5. Complete SASL negotiation for authentication
  6. Exchange an unbounded number of XML stanzas both directly for the servers and indirectly on behalf of entities associated with each server (e.g., connected clients)
  7. Close the XML stream
  8. Close the TCP connection

Note: Depending on local service policies, a service may wish to use the older server dialback protocol to provide weak identity verification in cases where SASL negotiation would not result in strong authentication (e.g., because the certificate presented by the peer service during TLS negotiation is self-signed and thus provides only weak identity); for details, see [XEP‑0220] (Saint-Andre, P. and J. Miller, “Server Dialback,” July 2007.).



 TOC 

1.3.  Conventions

The following keywords are to be interpreted as described in [TERMS] (Bradner, S., “Key words for use in RFCs to Indicate Requirement Levels,” March 1997.): "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT"; "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY", "OPTIONAL".

In examples, lines have been wrapped for improved readability, "[...]" means elision, and the following prepended strings are used:



 TOC 

1.4.  Discussion Venue

The editor welcomes discussion and comments related to the topics presented in this document. The preferred forum is the <standards@xmpp.org> mailing list, for which archives and subscription information are available at <http://mail.jabber.org/mailman/listinfo/standards>.



 TOC 

2.  Architecture



 TOC 

2.1.  Overview

XMPP assumes a client-server architecture, wherein a client utilizing XMPP accesses a server (normally over a [TCP] (Postel, J., “Transmission Control Protocol,” September 1981.) connection) and servers can also communicate with each other over TCP connections.

A simplified architectural diagram for a typical deployment is shown here, where the entities have the following significance:

  example.net ---------------- im.example.com
     |                                |
     |                                |
romeo@example.net           juliet@im.example.com

Note: Architectures that employ the syntax of XML stanzas (XML Stanzas) but that establish peer-to-peer connections directly between clients using technologies based on [LINKLOCAL] (Cheshire, S., Aboba, B., and E. Guttman, “Dynamic Configuration of IPv4 Link-Local Addresses,” May 2005.) have been deployed, but such architectures are not XMPP and are best described as "XMPP-like"; for details, see [XEP‑0174] (Saint-Andre, P., “Link-Local Messaging,” June 2007.).



 TOC 

2.2.  Server

A SERVER is an entity whose primary responsibilities are to:

Depending on the application, the secondary responsibilities of an XMPP server may include:



 TOC 

2.3.  Client

A CLIENT is an entity that establiishes an XML stream with a server by authenticating using the credentials of a local account and that then completes resource binding (Resource Binding) in order to enable delivery of XML stanzas via the server to the client. A client then uses XMPP to communicate with its server, other clients, and any other accessible entities on a network. Multiple clients may connect simultaneously to a server on behalf of a local account, where each client is differentiated by the resource identifier portion of an XMPP address (e.g., <node@domain/home> vs. <node@domain/work>), as defined under Section 3 (Addresses) and Section 8 (Resource Binding). The RECOMMENDED port for TCP connections between a client and a server is 5222, as registered with the IANA (see Section 16.9 (Port Numbers)).



 TOC 

2.4.  Network

Because each server is identified by a network address and because server-to-server communication is a straightforward extension of the client-to-server protocol, in practice the system consists of a network of servers that inter-communicate. Thus, for example, <juliet@im.example.com> is able to exchange messages, presence, and other information with <romeo@example.net>. This pattern is familiar from messaging protocols (such as [SMTP] (Klensin, J., “Simple Mail Transfer Protocol,” April 2001.)) that make use of network addressing standards. Communication between any two servers is OPTIONAL. If enabled, such communication SHOULD occur over XML streams that are bound to [TCP] (Postel, J., “Transmission Control Protocol,” September 1981.) connections. The RECOMMENDED port for TCP connections between servers is 5269, as registered with the IANA (see Section 16.9 (Port Numbers)).



 TOC 

3.  Addresses



 TOC 

3.1.  Overview

An ENTITY is anything that is network-addressable and that can communicate using XMPP. For historical reasons, the native address of an XMPP entity is called a JABBER IDENTIFIER or JID. A valid JID contains a set of ordered elements formed of an XMPP domain identifier, node identifier, and resource identifier.

The syntax for a JID is defined as follows using the Augmented Backus-Naur Form as specified in [ABNF] (Crocker, D. and P. Overell, “Augmented BNF for Syntax Specifications: ABNF,” October 2005.).

   jid             = [ node "@" ] domain [ "/" resource ]
   node            = 1*(nodepoint)
                     ; a "nodepoint" is a UTF-8 encoded Unicode code
                     ; point that satisfies the Nodeprep profile of
                     ; stringprep
   domain          = fqdn / address-literal / idnlabel
   fqdn            = (idnlabel 1*("." idnlabel))
                     ; an "idnlabel" is an internationalized label
                     ; as described in RFC 3490
   address-literal = IPv4address / IPv6address
                     ; the "IPv4address" and "IPv6address" rules are
                     ; defined in Appendix B of RFC 2373
   resource        = 1*(resourcepoint)
                     ; a "resourcepoint" is a UTF-8 encoded Unicode
                     ; code point that satisfies the Resourceprep
                     ; profile of stringprep

Note: The "IPv4address" and "IPv6address" rules are indeed provided in [RFC2373] (Hinden, R. and S. Deering, “IP Version 6 Addressing Architecture,” July 1998.) and were removed from [IPv6] (Hinden, R. and S. Deering, “IP Version 6 Addressing Architecture,” February 2006.), which supersedes RFC 2373.

All JIDs are based on the foregoing structure. One common use of this structure is to identify a messaging and presence account, the server that hosts the account, and a connected resource (e.g., a specific device) in the form of <node@domain/resource>. However, node types other than clients are possible; for example, a specific chat room offered by a multi-user conference service (see [XEP‑0045] (Saint-Andre, P., “Multi-User Chat,” April 2007.)) could be addressed as <room@service> (where "room" is the name of the chat room and "service" is the hostname of the multi-user conference service) and a specific occupant of such a room could be addressed as <room@service/nick> (where "nick" is the occupant's room nickname). Many other JID types are possible (e.g., <domain/resource> could be a server-side script or service).

Each allowable portion of a JID (node identifier, domain identifier, and resource identifier) MUST NOT be more than 1023 bytes in length, resulting in a maximum total size (including the '@' and '/' separators) of 3071 bytes.

Note: While the format of a JID is consistent with [URI] (Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” January 2005.), an entity's address on an XMPP network MUST be a JID (without a URI scheme) and not a [URI] (Berners-Lee, T., Fielding, R., and L. Masinter, “Uniform Resource Identifier (URI): Generic Syntax,” January 2005.) or [IRI] (Duerst, M. and M. Suignard, “Internationalized Resource Identifiers (IRIs),” January 2005.) as specified in [XMPP‑URI] (Saint-Andre, P., “Internationalized Resource Identifiers (IRIs) and Uniform Resource Identifiers (URIs) for the Extensible Messaging and Presence Protocol (XMPP),” February 2008.); the latter specification is provided only for use by non-XMPP applications.



 TOC 

3.2.  Domain Identifier

The DOMAIN IDENTIFIER portion of a JID is that portion after the '@' character (if any) and before the '/' character (if any); it is the primary identifier and is the only REQUIRED element of a JID (a mere domain identifier is a valid JID). Typically a domain identifier identifies the "home" server to which clients connect for XML routing and data management functionality. (Note: A single server may service multiple domain identifiers, i.e., multiple local domains.) However, it is not necessary for an XMPP domain identifier to identify an entity that provides core XMPP server functionality (e.g., a domain identifier may identity an entity such as a multi-user conference service, a publish-subscribe service, or a user directory).

The domain identifier for every server or service that will communicate over a network SHOULD be a fully qualified domain name (see [DNS] (Mockapetris, P., “Domain names - implementation and specification,” November 1987.)); while the domain identifier MAY be either an Internet Protocol (IPv4 or IPv6) address or a text label (commonly called an "unqualified hostname") that is resolvable on a local network, domain identifiers that are IP addresses may not be acceptable to other services for the sake of interdomain communication and domain identifiers that are text labels MUST NOT be used on public networks. If the domain identifier includes a final character considered to be a label separator (dot) by [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.) or [STD13] (Mockapetris, P., “Domain names - implementation and specification,” November 1987.), this character MUST be stripped from the domain identifier before the JID of which it is a part is used for the purpose of routing an XML stanza, comparing against another JID, or constructing an [XMPP‑URI] (Saint-Andre, P., “Internationalized Resource Identifiers (IRIs) and Uniform Resource Identifiers (URIs) for the Extensible Messaging and Presence Protocol (XMPP),” February 2008.); in particular, the character should be stripped before any other canonicalization steps are taken (such as application of the [NAMEPREP] (Hoffman, P. and M. Blanchet, “Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN),” March 2003.) profile of [STRINGPREP] (Hoffman, P. and M. Blanchet, “Preparation of Internationalized Strings ("stringprep"),” December 2002.) or completion of the ToASCII operation as described in [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.)).

A domain identifier MUST be an "internationalized domain name" as defined in [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.), that is, "a domain name in which every label is an internationalized label". When preparing a text label (consisting of a sequence of Unicode code points) for representation as an internationalized label in the process of constructing an XMPP domain identifier or comparing two XMPP domain identifiers, an application MUST ensure that for each text label it is possible to apply without failing the ToASCII operation specified in [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.) with the UseSTD3ASCIIRules flag set (thus forbidding ASCII code points other than letters, digits, and hyphens). If the ToASCII operation can be applied without failing, then the label is an internationalized label. An internationalized domain name (and therefore an XMPP domain identifier) is constructed from its constituent internationalized labels by following the rules specified in [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.). (Note: The ToASCII operation includes application of the [NAMEPREP] (Hoffman, P. and M. Blanchet, “Nameprep: A Stringprep Profile for Internationalized Domain Names (IDN),” March 2003.) profile of [STRINGPREP] (Hoffman, P. and M. Blanchet, “Preparation of Internationalized Strings ("stringprep"),” December 2002.) and encoding using the algorithm specified in [PUNYCODE] (Costello, A., “Punycode: A Bootstring encoding of Unicode for Internationalized Domain Names in Applications (IDNA),” March 2003.); for details, see [IDNA] (Faltstrom, P., Hoffman, P., and A. Costello, “Internationalizing Domain Names in Applications (IDNA),” March 2003.).)



 TOC 

3.3.  Node Identifier

The NODE IDENTIFIER portion of a JID is an optional secondary identifier placed before the domain identifier and separated from the latter by the '@' character. Typically a node identifier uniquely identifies the entity requesting and using network access provided by a server (i.e., a local account), although it can also represent other kinds of entities (e.g., a chat room associated with a multi-user conference service). The entity represented by an XMPP node identifier is addressed within the context of a specific domain. When the domain is an XMPP server and the entity is a local account on the server, the resulting address (of the form <node@domain>) is called a BARE JID.

A node identifier MUST be formatted such that the Nodeprep profile of [STRINGPREP] (Hoffman, P. and M. Blanchet, “Preparation of Internationalized Strings ("stringprep"),” December 2002.) can be applied without failing (see Appendix A (Nodeprep)). Before comparing two node identifiers, an application MUST first apply the Nodeprep profile to each identifier.

Note: Because the additional characters prohibited by Nodeprep (see Appendix A (Nodeprep)) are prohibited after normalization, an implementation should not enable a human user to input any Unicode code point whose decomposition includes those characters; such code points include but are not necessarily limited to the following (refer to [UNICODE] (The Unicode Consortium, “The Unicode Standard, Version 3.2.0,” 2000.) for further information).



 TOC 

3.4.  Resource Identifier

The RESOURCE IDENTIFIER portion of a JID is an optional tertiary identifier placed after the domain identifier and separated from the latter by the '/' character. A resource identifier may modify either a <node@domain> address or a mere <domain> address. Typically a resource identifier uniquely identifies a specific connection (e.g., a device or location) or object (e.g., a participant in a multi-user conference room) belonging to the entity associated with an XMPP node identifier at a local domain. XMPP entities SHOULD consider resource identifiers to be opaque strings and SHOULD NOT impute meaning to any given resource identifier. A resource identifier is negotiated between a client and a server during resource binding (Resource Binding), after which the entity is referred to as a CONNECTED RESOURCE and its address (of the form <node@domain/resource>) is referred to as a FULL JID. An entity MAY maintain multiple connected resources simultaneously, with each connected resource differentiated by a distinct resource identifier.

A resource identifier MUST be formatted such that the Resourceprep profile of [STRINGPREP] (Hoffman, P. and M. Blanchet, “Preparation of Internationalized Strings ("stringprep"),” December 2002.) can be applied without failing (see Appendix B (Resourceprep)). Before comparing two resource identifiers, an application MUST first apply the Resourceprep profile to each identifier.



 TOC 

3.5.  Determination of Addresses

After SASL negotiation (SASL Negotiation) and, if appropriate, resource binding (Resource Binding), the receiving entity for a stream MUST determine the initiating entity's JID.

For server-to-server communication, the initiating entity's JID SHOULD be the authorization identity (as defined by [SASL] (Melnikov, A. and K. Zeilenga, “Simple Authentication and Security Layer (SASL),” June 2006.)), either (1) as directly communicated by the initiating entity during SASL negotiation (SASL Negotiation) or (2) as derived from the authentication identity if no authorization identity was specified during SASL negotiation (SASL Negotiation).

For client-to-server communication, the client's bare JID (<node@domain>) SHOULD be the authorization identity (as defined by [SASL] (Melnikov, A. and K. Zeilenga, “Simple Authentication and Security Layer (SASL),” June 2006.)), either (1) as directly communicated by the initiating entity during SASL negotiation (SASL Negotiation) or (2) as derived from the authentication identity if no authorization identity was specified during SASL negotiation (SASL Negotiation). The resource identifier portion of the full JID (<node@domain/resource>) SHOULD be the resource identifier negotiated by the client and server during resource binding (Resource Binding).

The receiving entity MUST ensure that the resulting JID (including node identifier, domain identifier, resource identifier, and separator characters) conforms to the rules and formats defined earlier in this section; to meet this restriction, the receiving entity may need to replace the JID sent by the initiating entity with the canonicalized JID as determined by the receiving entity.



 TOC 

4.  TCP Binding



 TOC 

4.1.  Scope

As XMPP is defined in this specification, an initiating entity (client or server) MUST open a Transmission Control Protocol [TCP] (Postel, J., “Transmission Control Protocol,” September 1981.) connection at the receiving entity (server) before it negotiates XML streams with the receiving entity. The rules specified in the following sections apply to the TCP binding.



 TOC 

4.2.  Hostname Resolution

Before opening the TCP connection, the initiating entity first MUST resolve the Domain Name System (DNS) hostname associated with the receiving entity and determine the appropriate TCP port for communication with the receiving entity. The process is:

  1. Attempt to resolve the hostname using a [DNS‑SRV] (Gulbrandsen, A., Vixie, P., and L. Esibov, “A DNS RR for specifying the location of services (DNS SRV),” February 2000.) Service of "xmpp-client" (for client-to-server connections) or "xmpp-server" (for server-to-server connections) and Proto of "tcp", resulting in resource records such as "_xmpp-client._tcp.xmpp.example.net." or "_xmpp-server._tcp.im.example.com.". The result of the SRV lookup will be one or more combinations of a port and hostname; the initiating entity MUST resolve one of the hostnames in order to determine an IP address at which to connect.
  2. If the SRV lookup fails, the fallback SHOULD be a normal IPv4 or [IPv6] (Hinden, R. and S. Deering, “IP Version 6 Addressing Architecture,” February 2006.) address record resolution to determine the IP address, where the port used is the "xmpp-client" port of 5222 for client-to-server connections or the "xmpp-server" port 5269 for server-to-server connections.
  3. For client-to-server connections, the fallback MAY be a [DNS‑TXT] (Rosenbaum, R., “Using the Domain Name System To Store Arbitrary String Attributes,” May 1993.) lookup for alternative connection methods, for example as described in [XEP‑0156] (Hildebrand, J. and P. Saint-Andre, “Discovering Alternative XMPP Connection Methods,” June 2007.).

Note: Many XMPP servers are implemented in such a way that they can host additional services (byond those defined in this specification and [XMPP‑IM] (Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” July 2007.)) at hostnames that are subdomains of the hostname of the main XMPP service (e.g., conference.example.net for a [XEP‑0045] (Saint-Andre, P., “Multi-User Chat,” April 2007.) service associated with the example.net XMPP service) or subdomains of the first-level domain of the underlying host (e.g., muc.example.com for a [XEP‑0045] (Saint-Andre, P., “Multi-User Chat,” April 2007.) service associated with the im.example.com XMPP service). If an entity from a remote domain wishes to use such additional services, it would generate an appropriate XML stanza and the remote domain itself would attempt to resolve the service's hostname via an SRV lookup on resource records such as "_xmpp-server._tcp.conference.example.net." or "_xmpp-server._tcp.muc.example.com.". Therefore if a service wishes to enable entities from remote domains to acess these additional services it should advertise the appropriate "_xmpp-server" SRV records in addition to the "_xmpp-server" record for its main XMPP service.



 TOC 

4.3.  Client-to-Server Communications

Because a client is subordinate to a server and therefore a client authenticates to the server but the server does not authenticate to the client, it is necessary to have only one TCP connection between client and server. Thus the server MUST allow the client to share a single TCP connection for XML stanzas sent from client to server and from server to client (i.e., the inital stream and response stream as specified under Section 5 (XML Streams)).



 TOC 

4.4.  Server-to-Server Communications

Because two servers are peers and therefore each peer must authenticate with the other, the servers MUST use two TCP connections: one for XML stanzas sent from the first server to the second server and another (initiated by the second server) for XML stanzas from the second server to the first server.

This rule applies only to XML stanzas (XML Stanzas). Therefore during STARTTLS negotiation (STARTTLS Negotiation) and SASL negotiation (SASL Negotiation) the servers would use one TCP connection, but after stream setup that TCP connection would be used only for the initiating server to send XML stanzas to the receiving server. In order for the receiving server to send XML stanzas to the initiating server, the receiving server would need to reverse the roles and negotiate an XML stream from the receiving server to the initiating server.



 TOC 

4.5.  Reconnection

It can happen that an XMPP server goes offline while servicing TCP connections from local clients and from other servers. Because the number of such connections can be quite large, the reconnection algorithm employed by entities that seek to reconnect can have a significant impact on software and network performance. The following guidelines are RECOMMENDED:



 TOC 

4.6.  Other Bindings

There is no necessary coupling of an XML stream to a TCP connection. For example, two entities could connect to each other via another transport, such as [HTTP] (Fielding, R., Gettys, J., Mogul, J., Frystyk, H., Masinter, L., Leach, P., and T. Berners-Lee, “Hypertext Transfer Protocol -- HTTP/1.1,” June 1999.) as specified in [XEP‑0124] (Paterson, I., Smith, D., and P. Saint-Andre, “Bidirectional-streams Over Synchronous HTTP (BOSH),” February 2007.) and [XEP‑0206] (Paterson, I., “XMPP Over BOSH,” June 2007.). However, this specification defines a binding of XMPP to TCP only.



 TOC 

5.  XML Streams



 TOC 

5.1.  Overview

Two fundamental concepts make possible the rapid, asynchronous exchange of relatively small payloads of structured information between presence-aware entities: XML streams and XML stanzas. These terms are defined as follows.

Definition of XML Stream:
An XML STREAM is a container for the exchange of XML elements between any two entities over a network. The start of an XML stream is denoted unambiguously by an opening STREAM HEADER (i.e., an XML <stream> tag with appropriate attributes and namespace declarations), while the end of the XML stream is denoted unambiguously by a closing XML </stream> tag. During the life of the stream, the entity that initiated it can send an unbounded number of XML elements over the stream, either elements used to negotiate the stream (e.g., to complete TLS negotiation (STARTTLS Negotiation) or SASL negotiation (SASL Negotiation)) or XML stanzas. The INITIAL STREAM is negotiated from the initiating entity (typically a client or server) to the receiving entity (typically a server), and can be seen as corresponding to the initiating entity's "connection" or "session" with the receiving entity. The initial stream enables unidirectional communication from the initiating entity to the receiving entity; in order to enable information exchange from the receiving entity to the initiating entity, the receiving entity MUST negotiate a stream in the opposite direction (the RESPONSE STREAM).
Definition of XML Stanza:
An XML STANZA is a discrete semantic unit of structured information that is sent from one entity to another over an XML stream. An XML stanza is the basic unit of meaning in XMPP. An XML stanza exists at the direct child level of the root <stream/> element and is said to be well-balanced if it matches the production [43] content of [XML] (Paoli, J., Maler, E., Sperberg-McQueen, C., Yergeau, F., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fourth Edition),” August 2006.). The start of any XML stanza is denoted unambiguously by the element start tag at depth=1 of the XML stream (e.g., <presence>), and the end of any XML stanza is denoted unambiguously by the corresponding close tag at depth=1 (e.g., </presence>); a server MUST NOT process a partial stanza and MUST NOT attach meaning to the transmission timing of any part of a stanza (before receipt of the close tag). The only XML stanzas defined herein are the <message/>, <presence/>, and <iq/> elements qualified by the default namespace for the stream, as described under Section 9 (XML Stanzas); an XML element sent for the purpose of TLS negotiation (STARTTLS Negotiation) or SASL negotiation (SASL Negotiation) is not considered to be an XML stanza. An XML stanza MAY contain child elements (with accompanying attributes, elements, and XML character data) as necessary in order to convey the desired information, which MAY be qualified by any XML namespace (see [XML‑NAMES] (Bray, T., Hollander, D., and A. Layman, “Namespaces in XML,” January 1999.) as well as Section 9.4 (Extended Content) herein).

Consider the example of a client's connection to a server. In order to connect to a server, a client MUST initiate an XML stream by sending a stream header to the server, optionally preceded by a text declaration specifying the XML version and the character encoding supported (see Section 12.5 (Inclusion of Text Declaration) and Section 12.6 (Character Encoding)). Subject to local policies and service provisioning, the server SHOULD then reply with a second XML stream back to the client, again optionally preceded by a text declaration. Once the client has completed SASL negotiation (SASL Negotiation) and resource binding (Resource Binding), the client MAY send an unbounded number of XML stanzas over the stream. When the client desires to close the stream, it simply sends a closing </stream> tag to the server (see Section 5.6 (Closing Streams)).

In essence, then, an XML stream acts as an envelope for all the XML stanzas sent during a connection. We can represent this in a simplistic fashion as follows.

+--------------------+
| <stream>           |
|--------------------|
| <presence>         |
|   <show/>          |
| </presence>        |
|--------------------|
| <message to='foo'> |
|   <body/>          |
| </message>         |
|--------------------|
| <iq to='bar'>      |
|   <query/>         |
| </iq>              |
|--------------------|
| <iq from='bar'>    |
|   <query/>         |
| </iq>              |
|--------------------|
| [ ... ]            |
|--------------------|
| </stream>          |
+--------------------+

Note: Those who are accustomed to thinking of XML in a document-centric manner may wish to view a client's connection to a server as consisting of two open-ended XML documents: one from the client to the server and one from the server to the client. From this perspective, the root <stream/> element can be considered the document entity for each "document", and the two "documents" are built up through the accumulation of XML stanzas sent over the two XML streams. However, this perspective is a convenience only; XMPP does not deal in documents but in XML streams and XML stanzas.



 TOC 

5.2.  Stream Security

For the purpose of stream security, both Transport Layer Security (see Section 6 (STARTTLS Negotiation)) and the Simple Authentication and Security Layer (see Section 7 (SASL Negotiation)) are mandatory to implement.

When negotiating XML streams in XMPP 1.0, TLS SHOULD be used as defined under Section 6 (STARTTLS Negotiation) and SASL MUST be used as defined under Section 7 (SASL Negotiation). The initial stream and the response stream MUST be secured separately, although security in both directions MAY be established via mechanisms that provide mutual authentication.

The initiating entity SHOULD NOT attempt to send XML stanzas (XML Stanzas) over the stream before the stream has been authenticated. However, if it does attempt to do so, the receiving entity MUST NOT accept such stanzas and MUST return a <not-authorized/> stream error and then terminate both the XML stream and the underlying TCP connection. Note: This applies to XML stanzas only (i.e., <message/>, <presence/>, and <iq/> elements qualified by the default namespace) and not to XML elements used for stream negotiation (e.g., elements used to complete TLS negotiation (STARTTLS Negotiation) or SASL negotiation (SASL Negotiation)).



 TOC 

5.3.  Stream Attributes

The attributes of the root <stream/> element are as follows.



 TOC 

5.3.1.  from

In client-to-server communication, the 'from' attribute SHOULD be included in the initial stream header and (if included) MUST be set to the account name (i.e., bare JID = <node@domain>) of the entity controlling the client.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

In server-to-server communication, the 'from' attribute SHOULD be included in the initial stream header and (if included) MUST be set to a hostname serviced by the initiating entity.

P: <?xml version='1.0'?>
   <stream:stream
       from='example.net'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:server'
       xmlns:stream='http://etherx.jabber.org/streams'>

In both client-to-server and server-to-server communications, the 'from' attribute MUST be included in the response stream header and MUST be set to a hostname serviced by the receiving entity that is granting access to the initiating entity.

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

Note: Each entity MUST verify the identity of the other entity before exchanging XML stanzas with it (see Section 15.3 (Client-to-Server Communication) and Section 15.4 (Server-to-Server Communication)).



 TOC 

5.3.2.  to

In both client-to-server and server-to-server communications, the 'to' attribute SHOULD be included in the initial stream header and (if included) MUST be set to a hostname serviced by the receiving entity.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

In client-to-server communication, if the client included a 'from' address in the initial stream header then the server SHOULD include a 'to' attribute in the response stream header and (if included) MUST set the 'to' attribute to the bare JID specified in the 'from' attribute of the initial stream header.

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

In server-to-server communication, if the initiating entity included a 'from' address in the initial stream header then the receiving entity SHOULD include a 'to' attribute in the response stream header and (if included) MUST set the 'to' attribute to the hostname specified in the 'from' attribute of the initial stream header.

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='g4qSvGvBxJ+xeAd7QKezOQJFFlw='
       to='example.net'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:server'
       xmlns:stream='http://etherx.jabber.org/streams'>

Note: Each entity MUST verify the identity of the other entity before exchanging XML stanzas with it (see Section 15.3 (Client-to-Server Communication) and Section 15.4 (Server-to-Server Communication)).



 TOC 

5.3.3.  id

There SHOULD NOT be an 'id' attribute in the initial stream header; however, if an 'id' attribute is included, it SHOULD be silently ignored by the receiving entity.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

The 'id' attribute MUST be included in the response XML stream header. This attribute is a unique identifier created by the receiving entity to function as a identifier for the initiating entity's two streams with the receiving entity, and MUST be unique within the receiving application (normally a server).

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

Note: The stream ID may be security-critical and therefore MUST be both unpredictable and nonrepeating (see [RANDOM] (Eastlake, D., Schiller, J., and S. Crocker, “Randomness Requirements for Security,” June 2005.) for recommendations regarding randomness for security purposes).



 TOC 

5.3.4.  xml:lang

An 'xml:lang' attribute (as defined in Section 2.12 of [XML] (Paoli, J., Maler, E., Sperberg-McQueen, C., Yergeau, F., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fourth Edition),” August 2006.)) SHOULD be included in the initial stream header to specify the default language of any human-readable XML character data it sends over that stream.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

If the attribute is included, the receiving entity SHOULD remember that value as the default for both the initial stream and the response stream; if the attribute is not included, the receiving entity SHOULD use a configurable default value for both streams, which it MUST communicate in the response stream header.

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>

For all stanzas sent over the initial stream, if the initiating entity does not include an 'xml:lang' attribute, the receiving entity SHOULD apply the default value; if the initiating entity does include an 'xml:lang' attribute, the receiving entity MUST NOT modify or delete it (see also Section 9.1.5 (xml:lang)). The value of the 'xml:lang' attribute MUST conform to the NMTOKEN datatype (as defined in Section 2.3 of [XML] (Paoli, J., Maler, E., Sperberg-McQueen, C., Yergeau, F., and T. Bray, “Extensible Markup Language (XML) 1.0 (Fourth Edition),” August 2006.)) and MUST conform to the format defined in [LANGTAGS] (Phillips, A. and M. Davis, “Tags for Identifying Languages,” September 2006.).



 TOC 

5.3.5.  version

The presence of the version attribute set to a value of at least "1.0" signals support for the stream-related protocols (including stream features) defined in this specification.

The version of XMPP specified herein is "1.0"; in particular, XMPP 1.0 encapsulates the stream-related protocols (TLS negotiation (STARTTLS Negotiation), SASL negotiation (SASL Negotiation), and stream errors (Stream Errors)), as well as the basic semantics of the three defined XML stanza types (<message/>, <presence/>, and <iq/>).

The numbering scheme for XMPP versions is "<major>.<minor>". The major and minor numbers MUST be treated as separate integers and each number MAY be incremented higher than a single digit. Thus, "XMPP 2.4" would be a lower version than "XMPP 2.13", which in turn would be lower than "XMPP 12.3". Leading zeros (e.g., "XMPP 6.01") MUST be ignored by recipients and MUST NOT be sent.

The major version number should be incremented only if the stream and stanza formats or required actions have changed so dramatically that an older version entity would not be able to interoperate with a newer version entity if it simply ignored the elements and attributes it did not understand and took the actions specified in the older specification.

The minor version number should be incremented only if significant new capabilities have been added to the core protocol (e.g., a newly defined value of the 'type' attribute for message, presence, or IQ stanzas). The minor version number MUST be ignored by an entity with a smaller minor version number, but MAY be used for informational purposes by the entity with the larger minor version number (e.g., the entity with the larger minor version number would simply note that its correspondent would not be able to understand that value of the 'type' attribute and therefore would not send it).

The following rules apply to the generation and handling of the 'version' attribute within stream headers:

  1. The initiating entity MUST set the value of the 'version' attribute in the initial stream header to the highest version number it supports (e.g., if the highest version number it supports is that defined in this specification, it MUST set the value to "1.0").
  2. The receiving entity MUST set the value of the 'version' attribute in the response stream header to either the value supplied by the initiating entity or the highest version number supported by the receiving entity, whichever is lower. The receiving entity MUST perform a numeric comparison on the major and minor version numbers, not a string match on "<major>.<minor>".
  3. If the version number included in the response stream header is at least one major version lower than the version number included in the initial stream header and newer version entities cannot interoperate with older version entities as described, the initiating entity SHOULD generate an <unsupported-version/> stream error and terminate the XML stream and underlying TCP connection.
  4. If either entity receives a stream header with no 'version' attribute, the entity MUST consider the version supported by the other entity to be "0.9" and SHOULD NOT include a 'version' attribute in the response stream header.



 TOC 

5.3.6.  Summary

We can summarize the attributes of the root <stream/> element as follows.

+----------+--------------------------+-------------------------+
|          | initiating to receiving  | receiving to initiating |
+----------+--------------------------+-------------------------+
| to       | JID of receiver          | JID of initiator        |
| from     | JID of initiator         | JID of receiver         |
| id       | silently ignored         | stream identifier       |
| xml:lang | default language         | default language        |
| version  | XMPP 1.0+ supported      | XMPP 1.0+ supported     |
+----------+--------------------------+-------------------------+

Note: The attributes of the root <stream/> element are not prepended by a 'stream:' prefix because, in accordance with Section 5.3 of [XML‑NAMES] (Bray, T., Hollander, D., and A. Layman, “Namespaces in XML,” January 1999.), the default namespace does not apply to attribute names.



 TOC 

5.4.  Namespace Declarations

The stream element MUST possess both a streams namespace declaration and a default namespace declaration (as "namespace declaration" is defined in [XML‑NAMES] (Bray, T., Hollander, D., and A. Layman, “Namespaces in XML,” January 1999.)). For detailed information regarding the streams namespace and default namespace, see Section 12.2 (XML Namespace Names and Prefixes).



 TOC 

5.5.  Stream Features

If the initiating entity includes the 'version' attribute set to a value of at least "1.0" in the initial stream header, after sending the response stream header the receiving entity MUST send a <features/> child element (prefixed by the streams namespace prefix) to the initiating entity in order to announce any stream-level features that can be negotiated (or capabilities that otherwise need to be advertised).

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>
S: <stream:features>
     <starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'>
       <required/>
     </starttls>
   </stream:features>

Stream features are used mainly to advertise TLS negotiation (STARTTLS Negotiation), SASL negotiation (SASL Negotiation), and resource binding (Resource Binding); however, stream features also can be used to advertise features associated with various XMPP extensions. If an entity does not understand or support a feature, it SHOULD silently ignore the associated feature.

If one or more security features (e.g., TLS and SASL) need to be successfully negotiated before a non-security-related feature (e.g., resource binding) can be offered, the non-security-related feature SHOULD NOT be included in the stream features that are advertised before the relevant security features have been negotiated.

If a feature must be negotiated before the initiating entity may proceed, that feature SHOULD include a <required/> child element and the receiving entity SHOULD NOT advertize any other stream features until the required feature has been negotiated.

The order of child elements contained in any given <stream:features/> element is not significant.

After completing negotiation of any stream feature (even stream features that do not require a stream restart), the receiving entity MUST send an updated list of stream features to the initiating entity. However, if there are no features to be advertised (e.g., in the stream reset initiated after successful SASL negotiation for a server-to-server connection, or after resource binding for a client-to-server stream) then the receiving entity MUST send an empty <stream:features/> element.

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>
S: <stream:features/>


 TOC 

5.6.  Closing Streams

An XML stream between two entities can be closed because a stream error has occurred or in some cases in the absence of an error. Where possible, it is preferable to trigger a stream close only because a stream error has occurred.



 TOC 

5.6.1.  With Stream Error

If a stream error has occurred, the entity that detects the error MUST close the stream as described under Section 5.7.1 (Rules).



 TOC 

5.6.2.  Without Stream Error

At any time after XML streams have been negotiated between two entities, either entity MAY close its stream to the other party in the absence of a stream error by sending a closing stream tag:

P: </stream:stream>

The entity that sends the closing stream tag SHOULD wait for the other party to also close its stream:

S: </stream:stream>

However, the entity that sends the first closing stream tag MAY consider both streams to be void if the other party does not send its closing stream tag within a reasonable amount of time (where the definition of "reasonable" is left up to the implementation or deployment).

After an entity sends a closing stream tag, it MUST NOT send further data over that stream.

After the entity that sent the first closing stream tag receives a reciprocal closing stream tag from the other party (or if it considers the stream to be void after a reasonable amount of time), it MUST terminate the underlying TCP connection or connections.



 TOC 

5.6.3.  Handling of Idle Streams

An XML stream can become idle, i.e., neither entity has sent XMPP traffic over the stream for some period of time (usually at least several minutes). A server MAY close an idle stream with a local client or remote server. The idle timeout period is a matter of implementation and local service policy; however, it is RECOMMENDED to be liberal in accepting idle streams, since experience has shown that doing so improves the reliability of communications over XMPP networks. In particular, it is typically more efficient to maintain a stream between two servers than it is to aggressively timeout such a stream, especially with regard to synchronization of presence information as described in [XMPP‑IM] (Saint-Andre, P., “Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence,” July 2007.), so it is RECOMMENDED to maintain such a stream since experience has shown that server-to-server streams are cyclical and typically need to be re-established every 24 to 48 hours if they are timed out.

An XML stream can appear idle at the XMPP level because the undelying TCP connection has become idle (e.g., a client's network connection has been lost). The typical method for detecting an idle TCP connection is to send a white space character over the TCP connection between XML stanzas, which is allowed for XML streams as described under Section 12.7 (White Space). The time between such "whitespace pings" is a matter of implementation and local service policy; however, it is RECOMMENDED that these pings be sent not more than once every 60 seconds.



 TOC 

5.7.  Stream Errors

The root stream element MAY contain an <error/> child element that is prefixed by the streams namespace prefix. The error child shall be sent by a compliant entity if it perceives that a stream-level error has occurred.



 TOC 

5.7.1.  Rules

The following rules apply to stream-level errors.



 TOC 

5.7.1.1.  Stream Errors Are Unrecoverable

Stream-level errors are unrecoverable. Therefore, if an error occurs at the level of the stream, the entity that detects the error MUST send a stream error to the other entity, send a closing </stream> tag, and immediately terminate the underlying TCP connection.

C: <message><body></message>

S: <stream:error>
     <xml-not-well-formed
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
   </stream:error>
   </stream:stream>


 TOC 

5.7.1.2.  Stream Errors Can Occur During Setup

If the error occurs while the stream is being set up, the receiving entity MUST still send the opening <stream> tag, include the <error/> element as a child of the stream element, send the closing </stream> tag, and immediately terminate the underlying TCP connection.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       to='im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://wrong.namespace.example.org/'>

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'
   <stream:error>
     <invalid-namespace
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
   </stream:error>
   </stream:stream>


 TOC 

5.7.1.3.  Stream Errors When the Host is Unspecified

If the initiating entity provides no 'to' attribute or provides an unknown host in the 'to' attribute and the error occurs during stream setup, the receiving entity SHOULD provide its authoritative hostname in the 'from' attribute of the stream header sent before termination.

C: <?xml version='1.0'?>
   <stream:stream
       from='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://wrong.namespace.example.org/'>

S: <?xml version='1.0'?>
   <stream:stream
       from='im.example.com'
       id='++TR84Sm6A3hnt3Q065SnAbbk3Y='
       to='juliet@im.example.com'
       version='1.0'
       xml:lang='en'
       xmlns='jabber:client'
       xmlns:stream='http://etherx.jabber.org/streams'>
   <stream:error>
     <invalid-namespace
         xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
   </stream:error>
   </stream:stream>


 TOC 

5.7.2.  Syntax

The syntax for stream errors is as follows, where "defined-condition" is a placeholder for one of the conditions defined under Section 5.7.3 (Defined Stream Error Conditions).

<stream:error>
  <defined-condition xmlns='urn:ietf:params:xml:ns:xmpp-streams'/>
  [<text xmlns='urn:ietf:params:xml:ns:xmpp-streams'
        xml:lang='langcode'>
    [ ... descriptive text ... ]
  </text>]
  [application-specific condition element]
</stream:error>

The <error/> element:

The <text/> element is OPTIONAL. If included, it SHOULD be used only to provide descriptive or diagnostic information that supplements the meaning of a defined condition or application-specific condition. It SHOULD NOT be interpreted programmatically by an application. It SHOULD NOT be used as the error message presented to a human user, but MAY be shown in addition to the error message associated with the included condition element or elements.



 TOC 

5.7.3.  Defined Stream Error Conditions

The following stream-level error conditions are defined.



 TOC 

5.7.3.1.  bad-format

The entity has sent XML that cannot be processed.

(In the following example, the client sends