JEP-0174: Link-Local Messaging

This document describes how to establish XMPP-like communications over local networks using zero-configuration networking.


WARNING: This Standards-Track JEP is Experimental. Publication as a Jabber Enhancement Proposal does not imply approval of this proposal by the Jabber Software Foundation. Implementation of the protocol described herein is encouraged in exploratory implementations, but production systems should not deploy implementations of this protocol until it advances to a status of Draft.


JEP Information

Status: Experimental
Type: Standards Track
Number: 0174
Version: 0.5
Last Updated: 2006-04-14
JIG: Standards JIG
Approving Body: Jabber Council
Dependencies: XMPP Core, RFC 3927, draft-cheshire-dnsext-dns-sd, draft-cheshire-dnsext-multicastdns
Supersedes: None
Superseded By: None
Short Name: N/A
Wiki Page: <http://wiki.jabber.org/index.php/Link-Local Messaging (JEP-0174)>

Author Information

Peter Saint-Andre

Email: stpeter@jabber.org
JID: stpeter@jabber.org

Legal Notice

This Jabber Enhancement Proposal is copyright 1999 - 2006 by the Jabber Software Foundation (JSF) and is in full conformance with the JSF's Intellectual Property Rights Policy <http://www.jabber.org/jsf/ipr-policy.shtml>. This material may be distributed only subject to the terms and conditions set forth in the Creative Commons Attribution License (<http://creativecommons.org/licenses/by/2.5/>).

Discussion Venue

The preferred venue for discussion of this document is the Standards-JIG discussion list: <http://mail.jabber.org/mailman/listinfo/standards-jig>.

Given that this JEP normatively references IETF technologies, discussion on the JSF-IETF list may also be appropriate (see <http://mail.jabber.org/mailman/listinfo/jsf-ietf> for details).

Relation to XMPP

The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 3920) and XMPP IM (RFC 3921) specifications contributed by the Jabber Software 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 JEP 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.

Conformance Terms

The keywords "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in RFC 2119.


Table of Contents

1. Introduction
2. Glossary
3. DNS Records
3.1. TXT Records
4. Discovering Other Users
5. Exchanging Presence
6. Exchanging Messages
7. Going Offline
8. Implementation Notes
8.1. Multiple Network Interfaces
8.2. Buddy Icons
9. Internationalization Considerations
10. Security Considerations
11. IANA Considerations
12. Jabber Registrar Considerations
13. Acknowledgements
Notes
Revision History


1. Introduction

XMPP as defined in RFC 3920 [1] does not support direct client-to-client interactions, since it requires authentication with a server: an XMPP client is allowed access to the network only once it has authentication with a server, and the client is not granted access to the network if authentication fails for any reason. If a client attempts to communicate directly with another client, such communication will fail because all XMPP communications are sent through a server and a client cannot inject messages onto the network without first authenticating with a server.

However, it is possible to establish an XMPP-like communications system on a local network using zero-configuration networking. In this situation, the clients obviate the XMPP requirement for authentication with a server by relying on zero-configuration networking to establish link-local communiation using the _presence._tcp DNS SRV service type. Once discovery has been completed, the clients are then able to exchange messages and other structured data using the XMPP <message/> and <iq/> stanzas. Note well that such communications are restricted to the local network because of how zero-configuration networking works. It is impossible for clients that communicate via link-local addresses to insert messages into an XMPP network, which is why this kind of local "mesh" is most accurately referred to as an XMPP-like system that exists outside the context of existing XMPP networks.

Such a local "mesh" can be quite valuable in certain circumstances. For instance, participants in a trade show or conference, users of the same WiFi hotspot, or employees on the same local area network can communicate without the need for a pre-configured server. For this reason, support for link-local messaging has been built into Apple's iChat client when operating in Bonjour (formerly Rendezvous) mode. Because it is desirable for other Jabber clients to support such functionality, this document describes how to use zero-configuration networking as the basis for local Jabber communication.

2. Glossary

Table 1: Terminology

Term Description
Bonjour Apple Computer's implementation of zero-configuration networking, formerly known as Rendezvous. See <http://www.apple.com/macosx/features/bonjour/>.
DNS-SD A convention for naming and structuring DNS SRV records such that a client can dynamically discover a domain for a service using only standard DNS queries. See DNS-Based Service Discovery [2]. For a full list of registered DNS-SD records, see <http://www.dns-sd.org/ServiceTypes.html>.
Link-local address An IPv4 or IPv6 address that is valid for communication with other devices connected to the same physical or logical link. See RFC 3927 [3].
Multicast DNS (MDNS) A technology that provides the ability to perform DNS-like operations on a local link in the absence of any conventional unicast DNS server. See Multicast DNS [4].
Zero-configuration networking A set of technologies that enable the use of the Internet Protocol for local communications. See <http://www.zeroconf.org/>.

3. DNS Records

In order to advertise its availability for link-local messaging, a client MUST publish four different kinds of DNS records:

  1. An address ("A") record of the following form:

    machine-name.local. A ip-address
          
  2. An "SRV" record (see RFC 2782 [5]) of the following form:

    _presence._tcp <ttl> IN SRV <priority> <weight> port-number username@machine-name.local. 
          
  3. A "PTR" record (see RFC 2317 [6] and RFC 1886 [7]) of the following form:

    _presence._tcp.local. port-number IN PTR username@machine-name._presence._tcp.local.
          
  4. Various "TXT" records (see RFC 1464 [8]) of the following form (see the TXT Records section of this document for an explanation of these fields):

    <owner> IN <ttl> TXT "1st=user-first-name"
    <owner> IN <ttl> TXT "email=user-email-address"
    <owner> IN <ttl> TXT "jid=user-jabber-id"
    <owner> IN <ttl> TXT "last=user-last-name"
    <owner> IN <ttl> TXT "msg=freeform-availability-status"
    <owner> IN <ttl> TXT "phsh=sha1-hash-of-avatar"
    <owner> IN <ttl> TXT "port.p2pj=5298"
    <owner> IN <ttl> TXT "status=avail-or-dnd"
    <owner> IN <ttl> TXT "txtvers=1"
    <owner> IN <ttl> TXT "vc=CU!"
          

The "machine-name" is the name of the computer, the "username" is the system username of the principal currently logged into the computer, the "port" may be any unassigned port number, and the "ip-address" is the physical address of the computer on the local network.

So, for example, if the machine name is "roundabout", the username is "stpeter", the chosen port is "5526", the IP address is "10.2.1.187", and the personal information is that associated with the author of this document, the DNS records would be as follows:

roundabout.local. A 10.2.1.187

_presence._tcp IN SRV 5526 stpeter@roundabout.local. 

_presence._tcp.local. 5526 IN PTR stpeter@roundabout._presence._tcp.local.

psa IN TXT "1st=Peter"
psa IN TXT "email=stpeter@jabber.org"
psa IN TXT "jid=stpeter@jabber.org"
psa IN TXT "last=Saint-Andre"
psa IN TXT "msg=on the phone"
psa IN TXT "phsh=a3839614e1a382bcfebbcf20464f519e81770813"
psa IN TXT "port.p2pj=5298"
psa IN TXT "status=dnd"
psa IN TXT "txtvers=1"
psa IN TXT "vc=CU!"
  

The IPv4 and IPv6 addresses associated with a machine may vary depending on the local network to which the machine is connected. For example, on an Ethernet connection the physical address might be "10.2.1.187" but when the machine is connected to a wireless network, its physical address might change to "10.10.1.179".

In the unlikely event that the "presence name" (username@machine-name) asserted by a client is already taken by another entity on the network, the client MUST choose a different presence name, which SHOULD be formed by adding the digit "1" to the end of the username string, adding the digit "2" if the resulting presence name is already taken, and incrementing the digit until a unique presence name is constructed.

3.1 TXT Records

DNS-SD enables service definitions to include various TXT keys that specify parameters to be used in the context of the service type. The TXT keys defined for the _presence._tcp service are as follows:

Table 2: TXT Records

Name Description
1st The first name of the user.
email The email address of the user.
jid The Jabber ID of the user.
last The last name of the user.
msg Natural-language text describing the user's state. This is equivalent to the XMPP <status/> element.
phsh The SHA-1 hash of the user's avatar icon or photo. [9]
port.p2pj The (hardcoded) port for peer-to-peer Jabber communications. Clients MUST use the port discovered via SRV lookups and MUST ignore the value of this TXT field.
status The presence availability of the user. Allowable values are "avail", "away", and "dnd". [10]
txtvers The version of the TXT fields supported by the client. This document describes txtvers "1".
vc A flag advertising the user's ability to engage in audio or video conferencing. If the user is able to engage in audio conferencing, the string MUST include the "A" character. If the user is able to engage in video conferencing, the string MUST include the "V" character. If the user is able to engage in conferencing with more than one participant, the string MUST include the "C" character. If the user is not currently engaged in an auudio or video conference, the string MUST include the "!" character. The order of characters in the string is immaterial.

4. Discovering Other Users

In order to discover other users, a client sends out an MDNS request for PTR record that match "_presence_tcp.local.". The client then receives replies from all machines that advertise support for link-local messaging. [11] The client MAY then find out detailed information about each machine by sending SRV and TXT queries to "username@machine-name._presence._tcp.local." for each machine (however, to preserve bandwidth, the client SHOULD NOT send these queries unless it is about to initiate communications with the other user, and it MUST cancel the queries after it has received a response). Note: The presence name to be used for display in a link-local "roster" MUST be obtained from the SRV record, not the PTR record; the client MAY display a name or nickname derived from the TXT records if available.

5. Exchanging Presence

When the _presence._tcp service is used, presence is exchanged via the format described in the TXT Records section of this document. In particular, presence information is not pushed as in XMPP (see RFC 3921 [12]). Instead, clients listen for presence announcements from other local entities. Recommended rates for sending updates can be found in draft-cheshire-dnsext-multicastdns.

6. Exchanging Messages

In order to exchange Jabber communications, the sender opens a TCP connection at the IP address and port discovered via the SRV lookup for a local entity and opens a stream to the recipient with no 'to' or 'from' address:

Example 1. Opening a Stream

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>
  

The recipient then responds with a stream header as well:

Example 2. Stream Header Response

<stream:stream xmlns='jabber:client' xmlns:stream='http://etherx.jabber.org/streams'>
  

The sender then can send messages (or IQs) by specifying 'to' and 'from' addresses using the logical local addresses: [13]

Example 3. Sending a Message

<message to='hildjj@wolfram' from='stpeter@roundabout'>
  <body>hey, testing out link-local messaging</body>
</message>
  

To end the chat, close the stream:

Example 4. Ending the Chat

</stream:stream>
  

7. Going Offline

In order to go offline, a client MUST send a Multicast DNS "Goodbye" packet for the user's PTR record. As a result, all other entities on the local network will receive a Multicast DNS "Remove" event, at which point they MUST cancel any outstanding TXT, SRV, or NULL record queries for the offline user.

8. Implementation Notes

8.1 Multiple Network Interfaces

Devices that use link-local messaging may have multiple network interfaces. As a result, it is possible to discover the same entity multiple times. Even if a client discovers the same presence name on multiple network interfaces, it MUST show only one entity in the local roster. In addition, because local IP addresses can be dynamically re-assigned, the client SHOULD NOT store the IP address to be used for communications when it discovers that address in the initial DNS lookup phase; instead, SHOULD delay sending the Multicast DNS query until the client is ready to communicate with the other entity.

8.2 Buddy Icons

If an entity has an associated icon (e.g., a user avatar or photo), its client SHOULD publish the raw binary data for that image via a DNS NULL record of the following form:

_presence._tcp.local. IN NULL raw-binary-data-here
    

Note: In accordance with RFC 1035 [14], the data MUST be 65535 octets or less.

After retrieving the "phsh" value from a Buddy's TXT record, a client SHOULD search its local picture database to learn the last recorded picture hash value for an entity and then compares it to the "phsh" value in the TXT record. If the values are equal, the client SHOULD uses the local copy of the icon. If the picture hash values are not equal, the client SHOULD issue a Multicast DNS NULL record query to retrieve the new icon. After retrieving the NULL record, the client SHOULD replace the old "phsh" value in the picture database with the new "phsh" value and save the icon to disk. If the client needs to send a Multicast DNS query in order to retrieve the icon, it MUST cancel the NULL record query immediately after receiving a response containing the new picture data.

If a user changes their picture, the user's client MUST update the NULL record with the contents of the new picture, calculate a new picture hash, and then update the "phsh" value in the TXT record with the new hash value. Since all users logged into local presence are monitoring for TXT record changes, they will see that the "phsh" value was changed; if they wish to view the new icon, their clients SHOULD issue a new Multicast DNS query to retrieve the updated picture.

9. Internationalization Considerations

The DNS does not allow characters outside of the US-ASCII [15] character set in A, SRV, PTR, or TXT records. This can pose problems when using the DNS in conjunction with XMPP-like systems, since XMPP allows virtually the full range of Unicode [16] characters in usernames and availability status messages. If any non-US-ASCII characters are to be included, they MUST be converted to percent-encoded octets following the rules specified in Section 2.6 of RFC 4395 [17].

10. Security Considerations

XMPP networks depend on TLS (RFC 2246 [18]) for channel encryption, SASL (RFC 2222 [19]) for authentication, and the Domain Name System (RFC 1034 [20]) for validation of server hostnames; these technologies help to ensure the identity of sending entities. By contrast, zero-configuration networking uses dynamic discovery and asserted machine names as the basis of sender identity. Therefore, zero-configuration networking does not result in authenticated identities in the same way that XMPP itself does, nor does it provide for an encrypted channel between local entities. (TLS could be negotiated on the local streams, but is out of scope for this specification.)

Because of the extremely different nature of a true XMPP network and a localized client "mesh", local entities MUST NOT attempt to inject local traffic onto an XMPP network and an XMPP server MUST reject communications until an entity is properly authenticated. However, a client on a local mesh MAY forward traffic to an XMPP network after having properly authenticated on such a network (e.g., to forward a message received on a local client mesh to a contact on an XMPP network).

The TXT records advertised as part of this protocol MAY result in exposure of user information (such as full name, email address, and Jabber ID). A client MUST enable a user to disable publication of this personal information.

11. IANA Considerations

The p2pj port number 5298 is not included in the IANA Port Numbers Registry [21] maintained by the Internet Assigned Numbers Authority (IANA) [22]. The author will investigate whether that port number (or some other port number) needs to be registered.

12. Jabber Registrar Considerations

This document requires no interaction with the Jabber Registrar [23].

13. Acknowledgements

Thanks to Jens Alfke, Marc Krochmal, and Justin Karneges for their input.


Notes

1. RFC 3920: Extensible Messaging and Presence Protocol (XMPP): Core <http://www.ietf.org/rfc/rfc3920.txt>.

2. DNS-Based Service Discovery <http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt>. Work in progress.

3. RFC 3927: Dynamic Configuration of IPv4 Link-Local Addresses <http://www.ietf.org/rfc/rfc3927.txt>.

4. Multicast DNS <http://files.multicastdns.org/draft-cheshire-dnsext-multicastdns.txt>. Work in progress.

5. RFC 2782: A DNS RR for specifying the location of services (DNS SRV) <http://www.ietf.org/rfc/rfc2782.txt>.

6. RFC 2317: Classless IN-ADDR.ARPA delegation <http://www.ietf.org/rfc/rfc2317.txt>.

7. RFC 1886: DNS Extensions to support IP version 6 <http://www.ietf.org/rfc/rfc1886.txt>.

8. RFC 1464: Using the Domain Name System To Store Arbitrary String Attributes <http://www.ietf.org/rfc/rfc1464.txt>.

9. The client should keep a local cache of icons keyed by hash. If the phsh value is not in the cache, the client should fetch the unknown icon and then cache it. Implementations should also include logic for expiring avatar icons.

10. These values map to mere XMPP presence (the user is available) and the XMPP <show/> values of "away" and "dnd".

11. The replies will include a record corresponding the client itself; the client MUST filter out this result.

12. RFC 3921: Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence <http://www.ietf.org/rfc/rfc3921.txt>.

13. The "JIDs" MUST be of the form "username@machine-name" as discovered via SRV (this is the <Instance> portion of the Service Instance Name).

14. RFC 1035: Domain Names - Implementation and Specification <http://www.ietf.org/rfc/rfc1035.txt>.

15. Coded Character Set - 7-bit American Standard Code for Information Interchange (American National Standards Institute X3.4, 1986).

16. The Unicode Standard, Version 3.2.0 (The Unicode Consortium, 2000).

17. RFC 4395: Guidelines and Registration Procedures for New URI Schemes <http://www.ietf.org/rfc/rfc4395.txt>.

18. RFC 2246: The TLS Protocol Version 1.0 <http://www.ietf.org/rfc/rfc2246.txt>.

19. RFC 2222: Simple Authentication and Security Layer (SASL) <http://www.ietf.org/rfc/rfc2222.txt>.

20. RFC 1034: Domain Names - Concepts and Facilities <http://www.ietf.org/rfc/rfc1034.txt>.

21. IANA registry of port numbers <http://www.iana.org/assignments/port-numbers>.

22. 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/>.

23. The Jabber Registrar maintains a list of reserved Jabber protocol namespaces as well as registries of parameters used in the context of protocols approved by the Jabber Software Foundation. For further information, see <http://www.jabber.org/registrar/>.


Revision History

Version 0.5 (2006-04-14)

Specified presence name conflict resolution procedure, offline procedure, use of DNS NULL record for icons, and handling of multiple network interfaces.

(psa)

Version 0.4 (2006-03-16)

Corrected PTR format and client discovery process.

(psa)

Version 0.3 (2006-02-23)

Added more details about DNS setup and stream initiation; specified internationalization considerations.

(psa)

Version 0.2 (2006-02-22)

Corrected information about Service Instance Name format, p2pj port, and presence discovery process.

(psa)

Version 0.1 (2006-02-09)

Initial JEP version; changed title to Link-Local Messaging.

(psa)

Version 0.0.1 (2006-02-07)

First draft.

(psa)


END