2205 lines
96 KiB
Text
2205 lines
96 KiB
Text
Document: draft-cheshire-dnsext-dns-sd-04.txt Stuart Cheshire
|
||
Internet-Draft Marc Krochmal
|
||
Category: Standards Track Apple Computer, Inc.
|
||
Expires 10th February 2007 10th August 2006
|
||
|
||
DNS-Based Service Discovery
|
||
|
||
<draft-cheshire-dnsext-dns-sd-04.txt>
|
||
|
||
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.
|
||
For the purposes of this document, the term "BCP 79" refers
|
||
exclusively to RFC 3979, "Intellectual Property Rights in IETF
|
||
Technology", published March 2005.
|
||
|
||
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/1id-abstracts.html
|
||
|
||
The list of Internet-Draft Shadow Directories can be accessed at
|
||
http://www.ietf.org/shadow.html
|
||
|
||
|
||
Abstract
|
||
|
||
This document describes a convention for naming and structuring DNS
|
||
resource records. Given a type of service that a client is looking
|
||
for, and a domain in which the client is looking for that service,
|
||
this convention allows clients to discover a list of named instances
|
||
of that desired service, using only standard DNS queries. In short,
|
||
this is referred to as DNS-based Service Discovery, or DNS-SD.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 1]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
Table of Contents
|
||
|
||
1. Introduction...................................................3
|
||
2. Conventions and Terminology Used in this Document..............4
|
||
3. Design Goals...................................................4
|
||
4. Service Instance Enumeration...................................5
|
||
4.1 Structured Instance Names......................................5
|
||
4.2 User Interface Presentation....................................7
|
||
4.3 Internal Handling of Names.....................................7
|
||
4.4 What You See Is What You Get...................................8
|
||
4.5 Ordering of Service Instance Name Components...................9
|
||
5. Service Name Resolution.......................................11
|
||
6. Data Syntax for DNS-SD TXT Records............................12
|
||
6.1 General Format Rules for DNS TXT Records......................12
|
||
6.2 DNS TXT Record Format Rules for use in DNS-SD.................13
|
||
6.3 DNS-SD TXT Record Size........................................14
|
||
6.4 Rules for Names in DNS-SD Name/Value Pairs....................14
|
||
6.5 Rules for Values in DNS-SD Name/Value Pairs...................16
|
||
6.6 Example TXT Record............................................17
|
||
6.7 Version Tag...................................................17
|
||
7. Application Protocol Names....................................18
|
||
7.1 Selective Instance Enumeration................................19
|
||
7.2 Service Name Length Limits....................................20
|
||
8. Flagship Naming...............................................22
|
||
9. Service Type Enumeration......................................23
|
||
10. Populating the DNS with Information...........................24
|
||
11. Relationship to Multicast DNS.................................24
|
||
12. Discovery of Browsing and Registration Domains................25
|
||
13. DNS Additional Record Generation..............................26
|
||
14. Comparison with Alternative Service Discovery Protocols.......27
|
||
15. Real Examples.................................................29
|
||
16. User Interface Considerations.................................30
|
||
16.1 Service Advertising User-Interface Considerations.............30
|
||
16.2 Client Browsing User-Interface Considerations.................31
|
||
17. IPv6 Considerations...........................................34
|
||
18. Security Considerations.......................................34
|
||
19. IANA Considerations...........................................34
|
||
20. Acknowledgments...............................................35
|
||
21. Deployment History............................................35
|
||
22. Copyright Notice..............................................36
|
||
23. Normative References..........................................37
|
||
24. Informative References........................................37
|
||
25. Authors' Addresses............................................38
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 2]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
1. Introduction
|
||
|
||
This document describes a convention for naming and structuring DNS
|
||
resource records. Given a type of service that a client is looking
|
||
for, and a domain in which the client is looking for that service,
|
||
this convention allows clients to discover a list of named instances
|
||
of a that desired service, using only standard DNS queries. In short,
|
||
this is referred to as DNS-based Service Discovery, or DNS-SD.
|
||
|
||
This document proposes no change to the structure of DNS messages,
|
||
and no new operation codes, response codes, resource record types,
|
||
or any other new DNS protocol values. This document simply proposes
|
||
a convention for how existing resource record types can be named and
|
||
structured to facilitate service discovery.
|
||
|
||
This proposal is entirely compatible with today's existing unicast
|
||
DNS server and client software.
|
||
|
||
Note that the DNS-SD service does NOT have to be provided by the same
|
||
DNS server hardware that is currently providing an organization's
|
||
conventional host name lookup service (the service we traditionally
|
||
think of when we say "DNS"). By delegating the "_tcp" subdomain,
|
||
all the workload related to DNS-SD can be offloaded to a different
|
||
machine. This flexibility, to handle DNS-SD on the main DNS server,
|
||
or not, at the network administrator's discretion, is one of the
|
||
things that makes DNS-SD so compelling.
|
||
|
||
Even when the DNS-SD functions are delegated to a different machine,
|
||
the benefits of using DNS remain: It is mature technology, well
|
||
understood, with multiple independent implementations from different
|
||
vendors, a wide selection of books published on the subject, and an
|
||
established workforce experienced in its operation. In contrast,
|
||
adopting some other service discovery technology would require every
|
||
site in the world to install, learn, configure, operate and maintain
|
||
some entirely new and unfamiliar server software. Faced with these
|
||
obstacles, it seems unlikely that any other service discovery
|
||
technology could hope to compete with the ubiquitous deployment
|
||
that DNS already enjoys.
|
||
|
||
This proposal is also compatible with (but not dependent on) the
|
||
proposal outlined in "Multicast DNS" [mDNS].
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 3]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
2. Conventions and Terminology Used in this Document
|
||
|
||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
|
||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
|
||
document are to be interpreted as described in "Key words for use in
|
||
RFCs to Indicate Requirement Levels" [RFC 2119].
|
||
|
||
|
||
3. Design Goals
|
||
|
||
A good service discovery protocol needs to have many properties,
|
||
three of which are mentioned below:
|
||
|
||
(i) The ability to query for services of a certain type in a certain
|
||
logical domain and receive in response a list of named instances
|
||
(network browsing, or "Service Instance Enumeration").
|
||
|
||
(ii) Given a particular named instance, the ability to efficiently
|
||
resolve that instance name to the required information a client needs
|
||
to actually use the service, i.e. IP address and port number, at the
|
||
very least (Service Name Resolution).
|
||
|
||
(iii) Instance names should be relatively persistent. If a user
|
||
selects their default printer from a list of available choices today,
|
||
then tomorrow they should still be able to print on that printer --
|
||
even if the IP address and/or port number where the service resides
|
||
have changed -- without the user (or their software) having to repeat
|
||
the network browsing step a second time.
|
||
|
||
In addition, if it is to become successful, a service discovery
|
||
protocol should be so simple to implement that virtually any
|
||
device capable of implementing IP should not have any trouble
|
||
implementing the service discovery software as well.
|
||
|
||
These goals are discussed in more detail in the remainder of this
|
||
document. A more thorough treatment of service discovery requirements
|
||
may be found in "Requirements for a Protocol to Replace AppleTalk
|
||
NBP" [NBP]. That document draws upon examples from two decades of
|
||
operational experience with AppleTalk Name Binding Protocol to
|
||
develop a list of universal requirements which are broadly
|
||
applicable to any potential service discovery protocol.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 4]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
4. Service Instance Enumeration
|
||
|
||
DNS SRV records [RFC 2782] are useful for locating instances of a
|
||
particular type of service when all the instances are effectively
|
||
indistinguishable and provide the same service to the client.
|
||
|
||
For example, SRV records with the (hypothetical) name
|
||
"_http._tcp.example.com." would allow a client to discover a list of
|
||
all servers implementing the "_http._tcp" service (i.e. Web servers)
|
||
for the "example.com." domain. The unstated assumption is that all
|
||
these servers offer an identical set of Web pages, and it doesn't
|
||
matter to the client which of the servers it uses, as long as it
|
||
selects one at random according to the weight and priority rules
|
||
laid out in RFC 2782.
|
||
|
||
Instances of other kinds of service are less easily interchangeable.
|
||
If a word processing application were to look up the (hypothetical)
|
||
SRV record "_ipp._tcp.example.com." to find the list of IPP printers
|
||
at Example Co., then picking one at random and printing on it would
|
||
probably not be what the user wanted.
|
||
|
||
The remainder of this section describes how SRV records may be used
|
||
in a slightly different way to allow a user to discover the names
|
||
of all available instances of a given type of service, in order to
|
||
select the particular instance the user desires.
|
||
|
||
|
||
4.1 Structured Instance Names
|
||
|
||
This document borrows the logical service naming syntax and semantics
|
||
from DNS SRV records, but adds one level of indirection. Instead of
|
||
requesting records of type "SRV" with name "_ipp._tcp.example.com.",
|
||
the client requests records of type "PTR" (pointer from one name to
|
||
another in the DNS namespace).
|
||
|
||
In effect, if one thinks of the domain name "_ipp._tcp.example.com."
|
||
as being analogous to an absolute path to a directory in a file
|
||
system then the PTR lookup is akin to performing a listing of that
|
||
directory to find all the files it contains. (Remember that domain
|
||
names are expressed in reverse order compared to path names: An
|
||
absolute path name is read from left to right, beginning with a
|
||
leading slash on the left, and then the top level directory, then
|
||
the next level directory, and so on. A fully-qualified domain name is
|
||
read from right to left, beginning with the dot on the right -- the
|
||
root label -- and then the top level domain to the left of that, and
|
||
the second level domain to the left of that, and so on. If the fully-
|
||
qualified domain name "_ipp._tcp.example.com." were expressed as a
|
||
file system path name, it would be "/com/example/_tcp/_ipp".)
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 5]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
The result of this PTR lookup for the name "<Service>.<Domain>" is a
|
||
list of zero or more PTR records giving Service Instance Names of the
|
||
form:
|
||
|
||
Service Instance Name = <Instance> . <Service> . <Domain>
|
||
|
||
The <Instance> portion of the Service Instance Name is a single DNS
|
||
label, containing arbitrary precomposed UTF-8-encoded text [RFC
|
||
3629]. It is a user-friendly name, meaning that it is allowed to
|
||
contain any characters, without restriction, including spaces, upper
|
||
case, lower case, punctuation -- including dots -- accented
|
||
characters, non-roman text, and anything else that may be represented
|
||
using UTF-8. DNS recommends guidelines for allowable characters for
|
||
host names [RFC 1033][RFC 1034][RFC 1035], but Service Instance Names
|
||
are not host names. Service Instance Names are not intended to ever
|
||
be typed in by a normal user; the user selects a Service Instance
|
||
Name by selecting it from a list of choices presented on the screen.
|
||
|
||
Note that just because this protocol supports arbitrary UTF-8-encoded
|
||
names doesn't mean that any particular user or administrator is
|
||
obliged to make use of that capability. Any user is free, if they
|
||
wish, to continue naming their services using only letters, digits
|
||
and hyphens, with no spaces, capital letters, or other punctuation.
|
||
|
||
DNS labels are currently limited to 63 octets in length. UTF-8
|
||
encoding can require up to four octets per Unicode character, which
|
||
means that in the worst case, the <Instance> portion of a name could
|
||
be limited to fifteen Unicode characters. However, the Unicode
|
||
characters with longer UTF-8 encodings tend to be the more obscure
|
||
ones, and tend to be the ones that convey greater meaning per
|
||
character.
|
||
|
||
Note that any character in the commonly-used 16-bit Unicode space
|
||
can be encoded with no more than three octets of UTF-8 encoding. This
|
||
means that an Instance name can contain up to 21 Kanji characters,
|
||
which is a sufficiently expressive name for most purposes.
|
||
|
||
The <Service> portion of the Service Instance Name consists of a pair
|
||
of DNS labels, following the established convention for SRV records
|
||
[RFC 2782], namely: the first label of the pair is the Application
|
||
Protocol Name, and the second label is either "_tcp" or "_udp",
|
||
depending on the transport protocol used by the application.
|
||
More details are given in Section 7, "Application Protocol Names".
|
||
|
||
The <Domain> portion of the Service Instance Name specifies the DNS
|
||
subdomain within which the service names are registered. It may be
|
||
"local", meaning "link-local Multicast DNS" [mDNS], or it may be
|
||
a conventional unicast DNS domain name, such as "apple.com.",
|
||
"cs.stanford.edu.", or "eng.us.ibm.com." Because service names are
|
||
not host names, they are not constrained by the usual rules for host
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 6]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
names [RFC 1033][RFC 1034][RFC 1035], and rich-text service
|
||
subdomains are allowed and encouraged, for example:
|
||
|
||
Building 2, 1st Floor.apple.com.
|
||
Building 2, 2nd Floor.apple.com.
|
||
Building 2, 3rd Floor.apple.com.
|
||
Building 2, 4th Floor.apple.com.
|
||
|
||
In addition, because Service Instance Names are not constrained by
|
||
the limitations of host names, this document recommends that they
|
||
be stored in the DNS, and communicated over the wire, encoded as
|
||
straightforward canonical precomposed UTF-8, Unicode Normalization
|
||
Form C [UAX15]. In cases where the DNS server returns an NXDOMAIN
|
||
error for the name in question, client software MAY choose to retry
|
||
the query using "Punycode" [RFC 3492] encoding, if possible.
|
||
|
||
|
||
4.2 User Interface Presentation
|
||
|
||
The names resulting from the PTR lookup are presented to the user in
|
||
a list for the user to select one (or more). Typically only the first
|
||
label is shown (the user-friendly <Instance> portion of the name). In
|
||
the common case, the <Service> and <Domain> are already known to the
|
||
user, these having been provided by the user in the first place, by
|
||
the act of indicating the service being sought, and the domain in
|
||
which to look for it. Note: The software handling the response
|
||
should be careful not to make invalid assumptions though, since it
|
||
*is* possible, though rare, for a service enumeration in one domain
|
||
to return the names of services in a different domain. Similarly,
|
||
when using subtypes (see "Selective Instance Enumeration") the
|
||
<Service> of the discovered instance my not be exactly the same as
|
||
the <Service> that was requested.
|
||
|
||
Having chosen the desired named instance, the Service Instance
|
||
Name may then be used immediately, or saved away in some persistent
|
||
user-preference data structure for future use, depending on what is
|
||
appropriate for the application in question.
|
||
|
||
|
||
4.3 Internal Handling of Names
|
||
|
||
If the <Instance>, <Service> and <Domain> portions are internally
|
||
concatenated together into a single string, then care must be taken
|
||
with the <Instance> portion, since it is allowed to contain any
|
||
characters, including dots.
|
||
|
||
Any dots in the <Instance> portion should be escaped by preceding
|
||
them with a backslash ("." becomes "\."). Likewise, any backslashes
|
||
in the <Instance> portion should also be escaped by preceding them
|
||
with a backslash ("\" becomes "\\"). Having done this, the three
|
||
components of the name may be safely concatenated. The backslash-
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 7]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
escaping allows literal dots in the name (escaped) to be
|
||
distinguished from label-separator dots (not escaped).
|
||
|
||
The resulting concatenated string may be safely passed to standard
|
||
DNS APIs like res_query(), which will interpret the string correctly
|
||
provided it has been escaped correctly, as described here.
|
||
|
||
|
||
4.4 What You See Is What You Get
|
||
|
||
Some service discovery protocols decouple the true service identifier
|
||
from the name presented to the user. The true service identifier used
|
||
by the protocol is an opaque unique id, often represented using a
|
||
long string of hexadecimal digits, and should never be seen by the
|
||
typical user. The name presented to the user is merely one of the
|
||
ephemeral attributes attached to this opaque identifier.
|
||
|
||
The problem with this approach is that it decouples user perception
|
||
from reality:
|
||
|
||
* What happens if there are two service instances, with different
|
||
unique ids, but they have inadvertently been given the same
|
||
user-visible name? If two instances appear in an on-screen list
|
||
with the same name, how does the user know which is which?
|
||
|
||
* Suppose a printer breaks down, and the user replaces it with
|
||
another printer of the same make and model, and configures the
|
||
new printer with the exact same name as the one being replaced:
|
||
"Stuart's Printer". Now, when the user tries to print, the
|
||
on-screen print dialog tells them that their selected default
|
||
printer is "Stuart's Printer". When they browse the network to see
|
||
what is there, they see a printer called "Stuart's Printer", yet
|
||
when the user tries to print, they are told that the printer
|
||
"Stuart's Printer" can't be found. The hidden internal unique id
|
||
that the software is trying to find on the network doesn't match
|
||
the hidden internal unique id of the new printer, even though its
|
||
apparent "name" and its logical purpose for being there are the
|
||
same. To remedy this, the user typically has to delete the print
|
||
queue they have created, and then create a new (apparently
|
||
identical) queue for the new printer, so that the new queue will
|
||
contain the right hidden internal unique id. Having all this hidden
|
||
information that the user can't see makes for a confusing and
|
||
frustrating user experience, and exposing long ugly hexadecimal
|
||
strings to the user and forcing them to understand what they mean
|
||
is even worse.
|
||
|
||
* Suppose an existing printer is moved to a new department, and given
|
||
a new name and a new function. Changing the user-visible name of
|
||
that piece of hardware doesn't change its hidden internal unique
|
||
id. Users who had previously created print queues for that printer
|
||
will still be accessing the same hardware by its unique id, even
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 8]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
though the logical service that used to be offered by that hardware
|
||
has ceased to exist.
|
||
|
||
To solve these problems requires the user or administrator to be
|
||
aware of the supposedly hidden unique id, and to set its value
|
||
correctly as hardware is moved around, repurposed, or replaced,
|
||
thereby contradicting the notion that it is a hidden identifier that
|
||
human users never need to deal with. Requiring the user to understand
|
||
this expert behind-the-scenes knowledge of what is *really* going on
|
||
is just one more burden placed on the user when they are trying to
|
||
diagnose why their computers and network devices are not working as
|
||
expected.
|
||
|
||
These anomalies and counter-intuitive behaviors can be eliminated by
|
||
maintaining a tight bidirectional one-to-one mapping between what
|
||
the user sees on the screen and what is really happening "behind
|
||
the curtain". If something is configured incorrectly, then that is
|
||
apparent in the familiar day-to-day user interface that everyone
|
||
understands, not in some little-known rarely-used "expert" interface.
|
||
|
||
In summary: The user-visible name is the primary identifier for a
|
||
service. If the user-visible name is changed, then conceptually
|
||
the service being offered is a different logical service -- even
|
||
though the hardware offering the service stayed the same. If the
|
||
user-visible name doesn't change, then conceptually the service being
|
||
offered is the same logical service -- even if the hardware offering
|
||
the service is new hardware brought in to replace some old equipment.
|
||
|
||
There are certainly arguments on both sides of this debate.
|
||
Nonetheless, the designers of any service discovery protocol have
|
||
to make a choice between between having the primary identifiers be
|
||
hidden, or having them be visible, and these are the reasons that
|
||
we chose to make them visible. We're not claiming that there are no
|
||
disadvantages of having primary identifiers be visible. We considered
|
||
both alternatives, and we believe that the few disadvantages
|
||
of visible identifiers are far outweighed by the many problems
|
||
caused by use of hidden identifiers.
|
||
|
||
|
||
4.5 Ordering of Service Instance Name Components
|
||
|
||
There have been questions about why services are named using DNS
|
||
Service Instance Names of the form:
|
||
|
||
Service Instance Name = <Instance> . <Service> . <Domain>
|
||
|
||
instead of:
|
||
|
||
Service Instance Name = <Service> . <Instance> . <Domain>
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 9]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
There are three reasons why it is beneficial to name service
|
||
instances with the parent domain as the most-significant (rightmost)
|
||
part of the name, then the abstract service type as the next-most
|
||
significant, and then the specific instance name as the
|
||
least-significant (leftmost) part of the name:
|
||
|
||
|
||
4.5.1. Semantic Structure
|
||
|
||
The facility being provided by browsing ("Service Instance
|
||
Enumeration") is effectively enumerating the leaves of a tree
|
||
structure. A given domain offers zero or more services. For each
|
||
of those service types, there may be zero or more instances of
|
||
that service.
|
||
|
||
The user knows what type of service they are seeking. (If they are
|
||
running an FTP client, they are looking for FTP servers. If they have
|
||
a document to print, they are looking for entities that speak some
|
||
known printing protocol.) The user knows in which organizational or
|
||
geographical domain they wish to search. (The user does not want a
|
||
single flat list of every single printer on the planet, even if such
|
||
a thing were possible.) What the user does not know in advance is
|
||
whether the service they seek is offered in the given domain, or if
|
||
so, how many instances are offered, and the names of those instances.
|
||
Hence having the instance names be the leaves of the tree is
|
||
consistent with this semantic model.
|
||
|
||
Having the service types be the terminal leaves of the tree would
|
||
imply that the user knows the domain name, and already knows the
|
||
name of the service instance, but doesn't have any idea what the
|
||
service does. We would argue that this is a less useful model.
|
||
|
||
|
||
4.5.2. Network Efficiency
|
||
|
||
When a DNS response contains multiple answers, name compression works
|
||
more effectively if all the names contain a common suffix. If many
|
||
answers in the packet have the same <Service> and <Domain>, then each
|
||
occurrence of a Service Instance Name can be expressed using only
|
||
the <Instance> part followed by a two-byte compression pointer
|
||
referencing a previous appearance of "<Service>.<Domain>". This
|
||
efficiency would not be possible if the <Service> component appeared
|
||
first in each name.
|
||
|
||
|
||
4.5.3. Operational Flexibility
|
||
|
||
This name structure allows subdomains to be delegated along logical
|
||
service boundaries. For example, the network administrator at Example
|
||
Co. could choose to delegate the "_tcp.example.com." subdomain to a
|
||
different machine, so that the machine handling service discovery
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 10]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
doesn't have to be the same as the machine handling other day-to-day
|
||
DNS operations. (It *can* be the same machine if the administrator so
|
||
chooses, but the point is that the administrator is free to make that
|
||
choice.) Furthermore, if the network administrator wishes to delegate
|
||
all information related to IPP printers to a machine dedicated to
|
||
that specific task, this is easily done by delegating the
|
||
"_ipp._tcp.example.com." subdomain to the desired machine. It is
|
||
also convenient to set security policies on a per-zone/per-subdomain
|
||
basis. For example, the administrator may choose to enable DNS
|
||
Dynamic Update [RFC 2136] [RFC 3007] for printers registering
|
||
in the "_ipp._tcp.example.com." subdomain, but not for other
|
||
zones/subdomains. This easy flexibility would not exist if the
|
||
<Service> component appeared first in each name.
|
||
|
||
|
||
5. Service Name Resolution
|
||
|
||
Given a particular Service Instance Name, when a client needs to
|
||
contact that service, it sends a DNS query for the SRV record of
|
||
that name.
|
||
|
||
The result of the DNS query is a SRV record giving the port number
|
||
and target host where the service may be found.
|
||
|
||
The use of SRV records is very important. There are only 65535 TCP
|
||
port numbers available. These port numbers are being allocated
|
||
one-per-application-protocol at an alarming rate. Some protocols
|
||
like the X Window System have a block of 64 TCP ports allocated
|
||
(6000-6063). If we start allocating blocks of 64 TCP ports at a time,
|
||
we will run out even faster. Using a different TCP port for each
|
||
different instance of a given service on a given machine is entirely
|
||
sensible, but allocating large static ranges, as was done for X, is a
|
||
very inefficient way to manage a limited resource. On any given host,
|
||
most TCP ports are reserved for services that will never run on that
|
||
particular host. This is very poor utilization of the limited port
|
||
space. Using SRV records allows each host to allocate its available
|
||
port numbers dynamically to those services running on that host that
|
||
need them, and then advertise the allocated port numbers via SRV
|
||
records. Allocating the available listening port numbers locally
|
||
on a per-host basis as needed allows much better utilization of the
|
||
available port space than today's centralized global allocation.
|
||
|
||
In some environments there may be no compelling reason to assign
|
||
managed names to every host, since every available service is
|
||
accessible by name anyway, as a first-class entity in its own right.
|
||
However, the DNS packet format and record format still require a host
|
||
name to link the target host referenced in the SRV record to the
|
||
address records giving the IPv4 and/or IPv6 addresses for that
|
||
hardware. In the case where no natural host name is available, the
|
||
SRV record may give its own name as the name of the target host, and
|
||
then the requisite address records may be attached to that same name.
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 11]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
It is perfectly permissible for a single name in the DNS hierarchy
|
||
to have multiple records of different type attached. (The only
|
||
restriction being that a given name may not have both a CNAME record
|
||
and other records at the same time.)
|
||
|
||
In the event that more than one SRV is returned, clients MUST
|
||
correctly interpret the priority and weight fields -- i.e. Lower
|
||
numbered priority servers should be used in preference to higher
|
||
numbered priority servers, and servers with equal priority should be
|
||
selected randomly in proportion to their relative weights. However,
|
||
in the overwhelmingly common case, a single advertised DNS-SD service
|
||
instance is described by exactly one SRV record, and in this common
|
||
case the priority and weight fields of the SRV record SHOULD both be
|
||
set to zero.
|
||
|
||
|
||
6. Data Syntax for DNS-SD TXT Records
|
||
|
||
Some services discovered via Service Instance Enumeration may need
|
||
more than just an IP address and port number to properly identify the
|
||
service. For example, printing via the LPR protocol often specifies a
|
||
queue name. This queue name is typically short and cryptic, and need
|
||
not be shown to the user. It should be regarded the same way as the
|
||
IP address and port number -- it is one component of the addressing
|
||
information required to identify a specific instance of a service
|
||
being offered by some piece of hardware. Similarly, a file server may
|
||
have multiple volumes, each identified by its own volume name. A Web
|
||
server typically has multiple pages, each identified by its own URL.
|
||
In these cases, the necessary additional data is stored in a TXT
|
||
record with the same name as the SRV record. The specific nature of
|
||
that additional data, and how it is to be used, is service-dependent,
|
||
but the overall syntax of the data in the TXT record is standardized,
|
||
as described below. Every DNS-SD service MUST have a TXT record in
|
||
addition to its SRV record, with same name, even if the service has
|
||
no additional data to store and the TXT record contains no more than
|
||
a single zero byte.
|
||
|
||
|
||
6.1 General Format Rules for DNS TXT Records
|
||
|
||
A DNS TXT record can be up to 65535 (0xFFFF) bytes long. The total
|
||
length is indicated by the length given in the resource record header
|
||
in the DNS message. There is no way to tell directly from the data
|
||
alone how long it is (e.g. there is no length count at the start, or
|
||
terminating NULL byte at the end). (Note that when using Multicast
|
||
DNS [mDNS] the maximum packet size is 9000 bytes, which imposes an
|
||
upper limit on the size of TXT records of about 8800 bytes.)
|
||
|
||
The format of the data within a DNS TXT record is one or more
|
||
strings, packed together in memory without any intervening gaps
|
||
or padding bytes for word alignment.
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 12]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
The format of each constituent string within the DNS TXT record is a
|
||
single length byte, followed by 0-255 bytes of text data.
|
||
|
||
These format rules are defined in Section 3.3.14 of RFC 1035, and are
|
||
not specific to DNS-SD. DNS-SD simply specifies a usage convention
|
||
for what data should be stored in those constituent strings.
|
||
|
||
An empty TXT record containing zero strings is disallowed by RFC
|
||
1035. DNS-SD implementations MUST NOT emit empty TXT records.
|
||
DNS-SD implementations receiving empty TXT records MUST treat them
|
||
as equivalent to a one-byte TXT record containing a single zero byte
|
||
(i.e. a single empty string).
|
||
|
||
|
||
6.2 DNS TXT Record Format Rules for use in DNS-SD
|
||
|
||
DNS-SD uses DNS TXT records to store arbitrary name/value pairs
|
||
conveying additional information about the named service. Each
|
||
name/value pair is encoded as its own constituent string within the
|
||
DNS TXT record, in the form "name=value". Everything up to the first
|
||
'=' character is the name. Everything after the first '=' character
|
||
to the end of the string (including subsequent '=' characters, if
|
||
any) is the value. Specific rules governing names and values are
|
||
given below. Each author defining a DNS-SD profile for discovering
|
||
instances of a particular type of service should define the base set
|
||
of name/value attributes that are valid for that type of service.
|
||
|
||
Using this standardized name/value syntax within the TXT record makes
|
||
it easier for these base definitions to be expanded later by defining
|
||
additional named attributes. If an implementation sees unknown
|
||
attribute names in a service TXT record, it MUST silently ignore
|
||
them.
|
||
|
||
The TCP (or UDP) port number of the service, and target host name,
|
||
are given in the SRV record. This information -- target host name and
|
||
port number -- MUST NOT be duplicated using name/value attributes in
|
||
the TXT record.
|
||
|
||
The intention of DNS-SD TXT records is to convey a small amount of
|
||
useful additional information about a service. Ideally it SHOULD NOT
|
||
be necessary for a client to retrieve this additional information
|
||
before it can usefully establish a connection to the service. For a
|
||
well-designed TCP-based application protocol, it should be possible,
|
||
knowing only the host name and port number, to open a connection
|
||
to that listening process, and then perform version- or feature-
|
||
negotiation to determine the capabilities of the service instance.
|
||
For example, when connecting to an AppleShare server over TCP, the
|
||
client enters into a protocol exchange with the server to determine
|
||
which version of the AppleShare protocol the server implements, and
|
||
which optional features or capabilities (if any) are available. For a
|
||
well-designed application protocol, clients should be able to connect
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 13]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
and use the service even if there is no information at all in the TXT
|
||
record. In this case, the information in the TXT record should be
|
||
viewed as a performance optimization -- when a client discovers many
|
||
instances of a service, the TXT record allows the client to know some
|
||
rudimentary information about each instance without having to open a
|
||
TCP connection to each one and interrogate every service instance
|
||
separately. Extreme care should be taken when doing this to ensure
|
||
that the information in the TXT record is in agreement with the
|
||
information retrieved by a client connecting over TCP.
|
||
|
||
There are legacy protocols which provide no feature negotiation
|
||
capability, and in these cases it may be useful to convey necessary
|
||
information in the TXT record. For example, when printing using the
|
||
old Unix LPR (port 515) protocol, the LPR service provides no way
|
||
for the client to determine whether a particular printer accepts
|
||
PostScript, or what version of PostScript, etc. In this case it is
|
||
appropriate to embed this information in the TXT record, because the
|
||
alternative is worse -- passing around written instructions to the
|
||
users, arcane manual configuration of "/etc/printcap" files, etc.
|
||
|
||
|
||
6.3 DNS-SD TXT Record Size
|
||
|
||
The total size of a typical DNS-SD TXT record is intended to be small
|
||
-- 200 bytes or less.
|
||
|
||
In cases where more data is justified (e.g. LPR printing), keeping
|
||
the total size under 400 bytes should allow it to fit in a single
|
||
standard 512-byte DNS message. (This standard DNS message size is
|
||
defined in RFC 1035.)
|
||
|
||
In extreme cases where even this is not enough, keeping the size of
|
||
the TXT record under 1300 bytes should allow it to fit in a single
|
||
1500-byte Ethernet packet.
|
||
|
||
Using TXT records larger than 1300 bytes is NOT RECOMMENDED at this
|
||
time.
|
||
|
||
|
||
6.4 Rules for Names in DNS-SD Name/Value Pairs
|
||
|
||
The "Name" MUST be at least one character. Strings beginning with an
|
||
'=' character (i.e. the name is missing) SHOULD be silently ignored.
|
||
|
||
The characters of "Name" MUST be printable US-ASCII values
|
||
(0x20-0x7E), excluding '=' (0x3D).
|
||
|
||
Spaces in the name are significant, whether leading, trailing, or in
|
||
the middle -- so don't include any spaces unless you really intend
|
||
that!
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 14]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
Case is ignored when interpreting a name, so "papersize=A4",
|
||
"PAPERSIZE=A4" and "Papersize=A4" are all identical.
|
||
|
||
If there is no '=', then it is a boolean attribute, and is simply
|
||
identified as being present, with no value.
|
||
|
||
A given attribute name may appear at most once in a TXT record.
|
||
The reason for this simplifying rule is to facilitate the creation
|
||
of client libraries that parse the TXT record into an internal data
|
||
structure, such as a hash table or dictionary object that maps from
|
||
names to values, and then make that abstraction available to client
|
||
code. The rule that a given attribute name may not appear more than
|
||
once simplifies these abstractions because they aren't required to
|
||
support the case of returning more than one value for a given key.
|
||
|
||
If a client receives a TXT record containing the same attribute name
|
||
more than once, then the client MUST silently ignore all but the
|
||
first occurrence of that attribute. For client implementations that
|
||
process a DNS-SD TXT record from start to end, placing name/value
|
||
pairs into a hash table, using the name as the hash table key, this
|
||
means that if the implementation attempts to add a new name/value
|
||
pair into the table and finds an entry with the same name already
|
||
present, then the new entry being added should be silently discarded
|
||
instead. For client implementations that retrieve name/value pairs by
|
||
searching the TXT record for the requested name, they should search
|
||
the TXT record from the start, and simply return the first matching
|
||
name they find.
|
||
|
||
When examining a TXT record for a given named attribute, there are
|
||
therefore four broad categories of results which may be returned:
|
||
|
||
* Attribute not present (Absent)
|
||
|
||
* Attribute present, with no value
|
||
(e.g. "Anon Allowed" -- server allows anonymous connections)
|
||
|
||
* Attribute present, with empty value (e.g. "Installed PlugIns=" --
|
||
server supports plugins, but none are presently installed)
|
||
|
||
* Attribute present, with non-empty value
|
||
(e.g. "Installed PlugIns=JPEG,MPEG2,MPEG4")
|
||
|
||
Each author defining a DNS-SD profile for discovering instances of a
|
||
particular type of service should define the interpretation of these
|
||
different kinds of result. For example, for some keys, there may be
|
||
a natural true/false boolean interpretation:
|
||
|
||
* Present implies 'true'
|
||
* Absent implies 'false'
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 15]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
For other keys it may be sensible to define other semantics, such as
|
||
value/no-value/unknown:
|
||
|
||
* Present with value implies that value.
|
||
E.g. "Color=4" for a four-color ink-jet printer,
|
||
or "Color=6" for a six-color ink-jet printer.
|
||
|
||
* Present with empty value implies 'false'. E.g. Not a color printer.
|
||
|
||
* Absent implies 'Unknown'. E.g. A print server connected to some
|
||
unknown printer where the print server doesn't actually know if the
|
||
printer does color or not -- which gives a very bad user experience
|
||
and should be avoided wherever possible.
|
||
|
||
(Note that this is a hypothetical example, not an example of actual
|
||
name/value keys used by DNS-SD network printers.)
|
||
|
||
As a general rule, attribute names that contain no dots are defined
|
||
as part of the open-standard definition written by the person or
|
||
group defining the DNS-SD profile for discovering that particular
|
||
service type. Vendor-specific extensions should be given names of the
|
||
form "keyname.company.com=value", using a domain name legitimately
|
||
registered to the person or organization creating the vendor-specific
|
||
key. This reduces the risk of accidental conflict if different
|
||
organizations each define their own vendor-specific keys.
|
||
|
||
|
||
6.5 Rules for Values in DNS-SD Name/Value Pairs
|
||
|
||
If there is an '=', then everything after the first '=' to the end
|
||
of the string is the value. The value can contain any eight-bit
|
||
values including '='. Leading or trailing spaces are part of the
|
||
value, so don't put them there unless you intend them to be there.
|
||
Any quotation marks around the value are part of the value, so don't
|
||
put them there unless you intend them to be part of the value.
|
||
|
||
The value is opaque binary data. Often the value for a particular
|
||
attribute will be US-ASCII (or UTF-8) text, but it is legal for a
|
||
value to be any binary data. For example, if the value of a key is an
|
||
IPv4 address, that address should simply be stored as four bytes of
|
||
binary data, not as a variable-length 7-15 byte ASCII string giving
|
||
the address represented in textual dotted decimal notation.
|
||
|
||
Generic debugging tools should generally display all attribute values
|
||
as a hex dump, with accompanying text alongside displaying the UTF-8
|
||
interpretation of those bytes, except for attributes where the
|
||
debugging tool has embedded knowledge that the value is some other
|
||
kind of data.
|
||
|
||
Authors defining DNS-SD profiles SHOULD NOT convert binary attribute
|
||
data types into printable text (e.g. using hexadecimal, Base-64 or UU
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 16]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
encoding) merely for the sake of making the data be printable text
|
||
when seen in a generic debugging tool. Doing this simply bloats the
|
||
size of the TXT record, without actually making the data any more
|
||
understandable to someone looking at it in a generic debugging tool.
|
||
|
||
|
||
6.6 Example TXT Record
|
||
|
||
The TXT record below contains three syntactically valid name/value
|
||
pairs. (The meaning of these name/value pairs, if any, would depend
|
||
on the definitions pertaining to the service in question that is
|
||
using them.)
|
||
|
||
---------------------------------------------------------------
|
||
| 0x0A | name=value | 0x08 | paper=A4 | 0x0E | DNS-SD Is Cool |
|
||
---------------------------------------------------------------
|
||
|
||
|
||
6.7 Version Tag
|
||
|
||
It is recommended that authors defining DNS-SD profiles include an
|
||
attribute of the form "txtvers=xxx" in their definition, and require
|
||
it to be the first name/value pair in the TXT record. This
|
||
information in the TXT record can be useful to help clients maintain
|
||
backwards compatibility with older implementations if it becomes
|
||
necessary to change or update the specification over time. Even if
|
||
the profile author doesn't anticipate the need for any future
|
||
incompatible changes, having a version number in the specification
|
||
provides useful insurance should incompatible changes become
|
||
unavoidable. Clients SHOULD ignore TXT records with a txtvers number
|
||
higher (or lower) than the version(s) they know how to interpret.
|
||
|
||
Note that the version number in the txtvers tag describes the version
|
||
of the TXT record specification being used to create this TXT record,
|
||
not the version of the application protocol that will be used if the
|
||
client subsequently decides to contact that service. Ideally, every
|
||
DNS-SD TXT record specification starts at txtvers=1 and stays that
|
||
way forever. Improvements can be made by defining new keys that older
|
||
clients silently ignore. The only reason to increment the version
|
||
number is if the old specification is subsequently found to be so
|
||
horribly broken that there's no way to do a compatible forward
|
||
revision, so the txtvers number has to be incremented to tell all the
|
||
old clients they should just not even try to understand this new TXT
|
||
record.
|
||
|
||
If there is a need to indicate which version number(s) of the
|
||
application protocol the service implements, the recommended key
|
||
name for this is "protovers".
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 17]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
7. Application Protocol Names
|
||
|
||
The <Service> portion of a Service Instance Name consists of a pair
|
||
of DNS labels, following the established convention for SRV records
|
||
[RFC 2782], namely: the first label of the pair is an underscore
|
||
character followed by the Application Protocol Name, and the second
|
||
label is either "_tcp" or "_udp".
|
||
|
||
Application Protocol Names may be no more than fourteen characters
|
||
(not counting the mandatory underscore), conforming to normal DNS
|
||
host name rules: Only lower-case letters, digits, and hyphens; must
|
||
begin and end with lower-case letter or digit.
|
||
|
||
Wise selection of an Application Protocol Name is very important,
|
||
and the choice is not always as obvious as it may appear.
|
||
|
||
In some cases, the Application Protocol Name merely names and refers
|
||
to the on-the-wire message format and semantics being used. FTP is
|
||
"ftp", IPP printing is "ipp", and so on.
|
||
|
||
However, it is common to "borrow" an existing protocol and repurpose
|
||
it for a new task. This is entirely sensible and sound engineering
|
||
practice, but that doesn't mean that the new protocol is providing
|
||
the same semantic service as the old one, even if it borrows the same
|
||
message formats. For example, the local network music playing
|
||
protocol implemented by iTunes on Macintosh and Windows is little
|
||
more than "HTTP GET" commands. However, that does *not* mean that it
|
||
is sensible or useful to try to access one of these music servers by
|
||
connecting to it with a standard web browser. Consequently, the
|
||
DNS-SD service advertised (and browsed for) by iTunes is "_daap._tcp"
|
||
(Digital Audio Access Protocol), not "_http._tcp". Advertising
|
||
"_http._tcp" service would cause iTunes servers to show up in
|
||
conventional Web browsers (Safari, Camino, OmniWeb, Opera, Netscape,
|
||
Internet Explorer, etc.) which is little use since it offers no pages
|
||
containing human-readable content. Similarly, browsing for
|
||
"_http._tcp" service would cause iTunes to find generic web servers,
|
||
such as the embedded web servers in devices like printers, which is
|
||
little use since printers generally don't have much music to offer.
|
||
|
||
Similarly, NFS is built on top of SUN RPC, but that doesn't mean it
|
||
makes sense for an NFS server to advertise that it provides "SUN RPC"
|
||
service. Likewise, Microsoft SMB file service is built on top of
|
||
Netbios running over IP, but that doesn't mean it makes sense for
|
||
an SMB file server to advertise that it provides "Netbios-over-IP"
|
||
service. The DNS-SD name of a service needs to encapsulate both the
|
||
"what" (semantics) and the "how" (protocol implementation) of the
|
||
service, since knowledge of both is necessary for a client to
|
||
usefully use the service. Merely advertising that a service was
|
||
built on top of SUN RPC is no use if the client has no idea what
|
||
the service actually does.
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 18]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
Another common mistake is to assume that the service type advertised
|
||
by iTunes should be "_daap._http._tcp." This is also incorrect.
|
||
Similarly, a protocol designer implementing a network service that
|
||
happens to use Simple Object Access Protocol [SOAP] should not feel
|
||
compelled to have "_soap" appear somewhere in the Application
|
||
Protocol Name. Part of the confusion here is that the presence of
|
||
"_tcp" or "_udp" in the <Service> portion of a Service Instance Name
|
||
has led people to assume that the structure of a service name has to
|
||
reflect the internal structure of how the protocol was implemented.
|
||
This is not correct. All that is required is that the service be
|
||
identified by a unique Application Protocol Name. Making the
|
||
Application Protocol Name at least marginally descriptive of
|
||
what the service does is desirable, though not essential.
|
||
|
||
The "_tcp" or "_udp" should be regarded as little more than
|
||
boilerplate text, and care should be taken not to attach too much
|
||
importance to it. Some might argue that the "_tcp" or "_udp" should
|
||
not be there at all, but this format is defined by RFC 2782, and
|
||
that's not going to change. In addition, the presence of "_tcp" has
|
||
the useful side-effect that it provides a convenient delegation point
|
||
to hand off responsibility for service discovery to a different DNS
|
||
server, if so desired.
|
||
|
||
|
||
7.1. Selective Instance Enumeration
|
||
|
||
This document does not attempt to define an arbitrary query language
|
||
for service discovery, nor do we believe one is necessary.
|
||
|
||
However, there are some circumstances where narrowing the list of
|
||
results may be useful. A hypothetical Web browser client that is able
|
||
to retrieve HTML documents via HTTP and display them may also be able
|
||
to retrieve HTML documents via FTP and display them, but only in the
|
||
case of FTP servers that allow anonymous login. For that Web browser,
|
||
discovering all FTP servers on the network is not useful. The Web
|
||
browser only wants to discover FTP servers that it is able to talk
|
||
to. In this case, a subtype of "_ftp._tcp" could be defined. Instead
|
||
of issuing a query for "_ftp._tcp.<Domain>", the Web browser issues a
|
||
query for "_anon._sub._ftp._tcp.<Domain>", where "_anon" is a defined
|
||
subtype of "_ftp._tcp". The response to this query only includes the
|
||
names of SRV records for FTP servers that are willing to allow
|
||
anonymous login.
|
||
|
||
Note that the FTP server's Service Instance Name is unchanged -- it
|
||
is still something of the form "The Server._ftp._tcp.example.com."
|
||
The subdomain in which FTP server SRV records are registered defines
|
||
the namespace within which FTP server names are unique. Additional
|
||
subtypes (e.g. "_anon") of the basic service type (e.g. "_ftp._tcp")
|
||
serve to narrow the list of results, not to create more namespace.
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 19]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
Subtypes are appropriate when it is desirable for different kinds
|
||
of clients to be able to browse for services at two levels of
|
||
granularity. In the example above, we hypothesize two classes of
|
||
ftp client: clients that can provide username and password when
|
||
connecting, and clients that can only do anonymous login. The set of
|
||
ftp servers on the network is the same in both cases; the difference
|
||
is that the more capable client wants to discover all of them,
|
||
whereas the more limited client only wants to find the subset of
|
||
those ftp servers that it can talk to. Subtypes are only appropriate
|
||
in two-level scenarios such as this one, where some clients want to
|
||
find the full set of services of a given type, and at the same time
|
||
other clients only want to find some subset. Generally speaking, if
|
||
there is no client that wants to find the entire set, then it's
|
||
neither necessary nor desirable to use the subtype mechanism. If all
|
||
clients are browsing for some particular subtype, and no client
|
||
exists that browses for the parent type, then an Application Protocol
|
||
Name representing the logical service should be defined, and software
|
||
should simply advertise and browse for that particular service type
|
||
directly. In particular, just because a particular network service
|
||
happens to be implemented in terms of some other underlying protocol,
|
||
like HTTP, Sun RPC, or SOAP, doesn't mean that it's sensible for that
|
||
service to be defined as a subtype of "_http", "_sunrpc", or "_soap".
|
||
That would only be useful if there were some class of client for
|
||
which it is sensible to say, "I want to discover a service on the
|
||
network, and I don't care what it does, as long as it does it using
|
||
the SOAP XML RPC mechanism."
|
||
|
||
As with the TXT record name/value pairs, the list of possible
|
||
subtypes, if any, are defined and specified separately for each basic
|
||
service type. Note that the example given here using "_ftp" is a
|
||
hypothetical one. The "_ftp" service type does not (currently) have
|
||
any subtypes defined. Subtypes are currently a little-used feature
|
||
of DNS-SD, and experience will show whether or not they ultimately
|
||
prove to have broad applicability.
|
||
|
||
|
||
7.2 Service Name Length Limits
|
||
|
||
As described above, application protocol names are allowed to be up
|
||
to fourteen characters long. The reason for this limit is to leave
|
||
as many bytes of the domain name as possible available for use
|
||
by both the network administrator (choosing service domain names)
|
||
and the end user (choosing instance names).
|
||
|
||
A domain name may be up to 255 bytes long, including the final
|
||
terminating root label at the end. Domain names used by DNS-SD
|
||
take the following forms:
|
||
|
||
<Instance>.<app>._tcp.<servicedomain>.<parentdomain>.
|
||
<sub>._sub.<app>._tcp.<servicedomain>.<parentdomain>.
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 20]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
The first example shows a service instance name, i.e. the name of the
|
||
service's SRV and TXT records. The second shows a subtype browsing
|
||
name, i.e. the name of a PTR record pointing to service instance
|
||
names (see "Selective Instance Enumeration").
|
||
|
||
The instance name <Instance> may be up to 63 bytes. Including the
|
||
length byte used by the DNS format when the name is stored in a
|
||
packet, that makes 64 bytes.
|
||
|
||
When using subtypes, the subtype identifier is allowed to be up to
|
||
63 bytes, plus the length byte, making 64. Including the "_sub"
|
||
and its length byte, this makes 69 bytes.
|
||
|
||
The application protocol name <app> may be up to 14 bytes, plus the
|
||
underscore and length byte, making 16. Including the "_udp" or "_tcp"
|
||
and its length byte, this makes 21 bytes.
|
||
|
||
Typically, DNS-SD service records are placed into subdomains of their
|
||
own beneath a company's existing domain name. Since these subdomains
|
||
are intended to be accessed through graphical user interfaces, not
|
||
typed on a command-line they are frequently long and descriptive.
|
||
Including the length byte, the user-visible service domain may be up
|
||
to 64 bytes.
|
||
|
||
The terminating root label at the end counts as one byte.
|
||
|
||
Of our available 255 bytes, we have now accounted for 69+21+64+1 =
|
||
155 bytes. This leaves 100 bytes to accommodate the organization's
|
||
existing domain name <parentdomain>. When used with Multicast DNS,
|
||
<parentdomain> is "local", which easily fits. When used with parent
|
||
domains of 100 bytes or less, the full functionality of DNS-SD is
|
||
available without restriction. When used with parent domains longer
|
||
than 100 bytes, the protocol risks exceeding the maximum possible
|
||
length of domain names, causing failures. In this case, careful
|
||
choice of short <servicedomain> names can help avoid overflows.
|
||
If the <servicedomain> and <parentdomain> are too long, then service
|
||
instances with long instance names will not be discoverable or
|
||
resolvable, and applications making use of long subtype names
|
||
may fail.
|
||
|
||
Because of this constraint, we choose to limit Application Protocol
|
||
Names to 14 characters or less. Allowing more characters would not
|
||
add to the expressive power of the protocol, and would needlessly
|
||
lower the limit on the maximum <parentdomain> length that may be
|
||
safely used.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 21]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
8. Flagship Naming
|
||
|
||
In some cases, there may be several network protocols available
|
||
which all perform roughly the same logical function. For example,
|
||
the printing world has the LPR protocol, and the Internet Printing
|
||
Protocol (IPP), both of which cause printed sheets to be emitted
|
||
from printers in much the same way. In addition, many printer vendors
|
||
send their own proprietary page description language (PDL) data
|
||
over a TCP connection to TCP port 9100, herein referred to as the
|
||
"pdl-datastream" protocol. In an ideal world we would have only one
|
||
network printing protocol, and it would be sufficiently good that no
|
||
one felt a compelling need to invent a different one. However, in
|
||
practice, multiple legacy protocols do exist, and a service discovery
|
||
protocol has to accommodate that.
|
||
|
||
Many printers implement all three printing protocols: LPR, IPP, and
|
||
pdl-datastream. For the benefit of clients that may speak only one of
|
||
those protocols, all three are advertised.
|
||
|
||
However, some clients may implement two, or all three of those
|
||
printing protocols. When a client looks for all three service types
|
||
on the network, it will find three distinct services -- an LPR
|
||
service, an IPP service, and a pdl-datastream service -- all of which
|
||
cause printed sheets to be emitted from the same physical printer.
|
||
|
||
In the case of multiple protocols like this that all perform
|
||
effectively the same function, the client should suppress duplicate
|
||
names and display each name only once. When the user prints to a
|
||
given named printer, the printing client is responsible for choosing
|
||
the protocol which will best achieve the desired effect, without, for
|
||
example, requiring the user to make a manual choice between LPR and
|
||
IPP.
|
||
|
||
As described so far, this all works very well. However, consider some
|
||
future printer that only supports IPP printing, and some other future
|
||
printer that only supports pdl-datastream printing. The name spaces
|
||
for different service types are intentionally disjoint -- it is
|
||
acceptable and desirable to be able to have both a file server called
|
||
"Sales Department" and a printer called "Sales Department". However,
|
||
it is not desirable, in the common case, to have two different
|
||
printers both called "Sales Department", just because those printers
|
||
are implementing different protocols.
|
||
|
||
To help guard against this, when there are two or more network
|
||
protocols which perform roughly the same logical function, one of
|
||
the protocols is declared the "flagship" of the fleet of related
|
||
protocols. Typically the flagship protocol is the oldest and/or
|
||
best-known protocol of the set.
|
||
|
||
If a device does not implement the flagship protocol, then it instead
|
||
creates a placeholder SRV record (priority=0, weight=0, port=0,
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 22]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
target host = hostname of device) with that name. If, when it
|
||
attempts to create this SRV record, it finds that a record with the
|
||
same name already exists, then it knows that this name is already
|
||
taken by some entity implementing at least one of the protocols from
|
||
the class, and it must choose another. If no SRV record already
|
||
exists, then the act of creating it stakes a claim to that name so
|
||
that future devices in the same class will detect a conflict when
|
||
they try to use it. The SRV record needs to contain the target host
|
||
name in order for the conflict detection rules to operate. If two
|
||
different devices were to create placeholder SRV records both using a
|
||
null target host name (just the root label), then the two SRV records
|
||
would be seen to be in agreement so no conflict would be registered.
|
||
|
||
By defining a common well-known flagship protocol for the class,
|
||
future devices that may not even know about each other's protocols
|
||
establish a common ground where they can coordinate to verify
|
||
uniqueness of names.
|
||
|
||
No PTR record is created advertising the presence of empty flagship
|
||
SRV records, since they do not represent a real service being
|
||
advertised.
|
||
|
||
|
||
9. Service Type Enumeration
|
||
|
||
In general, clients are not interested in finding *every* service on
|
||
the network, just the services that the client knows how to talk to.
|
||
(Software designers may *think* there's some value to finding *every*
|
||
service on the network, but that's just wooly thinking.)
|
||
|
||
However, for problem diagnosis and network management tools, it may
|
||
be useful for network administrators to find the list of advertised
|
||
service types on the network, even if those service names are just
|
||
opaque identifiers and not particularly informative in isolation.
|
||
|
||
For this reason, a special meta-query is defined. A DNS query for
|
||
PTR records with the name "_services._dns-sd._udp.<Domain>" yields
|
||
a list of PTR records, where the rdata of each PTR record is the
|
||
name of a service type. A subsequent query for PTR records with
|
||
one of those names yields a list of instances of that service type.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 23]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
10. Populating the DNS with Information
|
||
|
||
How the SRV and PTR records that describe services and allow them to
|
||
be enumerated make their way into the DNS is outside the scope of
|
||
this document. However, it can happen easily in any of a number of
|
||
ways, for example:
|
||
|
||
On some networks, the administrator might manually enter the records
|
||
into the name server's configuration file.
|
||
|
||
A network monitoring tool could output a standard zone file to be
|
||
read into a conventional DNS server. For example, a tool that can
|
||
find Apple LaserWriters using AppleTalk NBP could find the list
|
||
of printers, communicate with each one to find its IP address,
|
||
PostScript version, installed options, etc., and then write out a
|
||
DNS zone file describing those printers and their capabilities using
|
||
DNS resource records. That information would then be available to
|
||
DNS-SD clients that don't implement AppleTalk NBP, and don't want to.
|
||
|
||
Future IP printers could use Dynamic DNS Update [RFC 2136] to
|
||
automatically register their own SRV and PTR records with the DNS
|
||
server.
|
||
|
||
A printer manager device which has knowledge of printers on the
|
||
network through some other management protocol could also use Dynamic
|
||
DNS Update [RFC 2136].
|
||
|
||
Alternatively, a printer manager device could implement enough of
|
||
the DNS protocol that it is able to answer DNS queries directly,
|
||
and Example Co.'s main DNS server could delegate the
|
||
_ipp._tcp.example.com subdomain to the printer manager device.
|
||
|
||
Zeroconf printers answer Multicast DNS queries on the local link
|
||
for appropriate PTR and SRV names ending with ".local." [mDNS]
|
||
|
||
|
||
11. Relationship to Multicast DNS
|
||
|
||
DNS-Based Service Discovery is only peripherally related to Multicast
|
||
DNS, in that the standard unicast DNS queries used by DNS-SD may also
|
||
be performed using multicast when appropriate, which is particularly
|
||
beneficial in Zeroconf environments [ZC].
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 24]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
12. Discovery of Browsing and Registration Domains (Domain Enumeration)
|
||
|
||
One of the main reasons for DNS-Based Service Discovery is so that
|
||
when a visiting client (e.g. a laptop computer) arrives at a new
|
||
network, it can discover what services are available on that network
|
||
without manual configuration. This logic that applies to discovering
|
||
services without manual configuration also applies to discovering the
|
||
domains in which services are registered without requiring manual
|
||
configuration.
|
||
|
||
This discovery is performed recursively, using Unicast or Multicast
|
||
DNS. Five special RR names are reserved for this purpose:
|
||
|
||
b._dns-sd._udp.<domain>.
|
||
db._dns-sd._udp.<domain>.
|
||
r._dns-sd._udp.<domain>.
|
||
dr._dns-sd._udp.<domain>.
|
||
lb._dns-sd._udp.<domain>.
|
||
|
||
By performing PTR queries for these names, a client can learn,
|
||
respectively:
|
||
|
||
o A list of domains recommended for browsing
|
||
|
||
o A single recommended default domain for browsing
|
||
|
||
o A list of domains recommended for registering services using
|
||
Dynamic Update
|
||
|
||
o A single recommended default domain for registering services.
|
||
|
||
o The final query shown yields the "legacy browsing" domain.
|
||
Sophisticated client applications that care to present choices
|
||
of domain to the user, use the answers learned from the previous
|
||
four queries to discover those domains to present. In contrast,
|
||
many current applications browse without specifying an explicit
|
||
domain, allowing the operating system to automatically select an
|
||
appropriate domain on their behalf. It is for this class of
|
||
application that the "legacy browsing" query is provided, to allow
|
||
the network administrator to communicate to the client operating
|
||
systems which domain should be used for these applications.
|
||
|
||
These domains are purely advisory. The client or user is free to
|
||
browse and/or register services in any domains. The purpose of these
|
||
special queries is to allow software to create a user-interface that
|
||
displays a useful list of suggested choices to the user, from which
|
||
they may make a suitable selection, or ignore the offered suggestions
|
||
and manually enter their own choice.
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 25]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
The <domain> part of the name may be "local" (meaning "perform the
|
||
query using link-local multicast) or it may be learned through some
|
||
other mechanism, such as the DHCP "Domain" option (option code 15)
|
||
[RFC 2132] or the DHCP "Domain Search" option (option code 119)
|
||
[RFC 3397].
|
||
|
||
The <domain> part of the name may also be derived from the host's IP
|
||
address. The host takes its IP address, and calculates the logical
|
||
AND of that address and its subnet mask, to derive the 'base' address
|
||
of the subnet. It then constructs the conventional DNS "reverse
|
||
mapping" name corresponding to that base address, and uses that
|
||
as the <domain> part of the name for the queries described above.
|
||
For example, if a host has address 192.168.12.34, with subnet mask
|
||
255.255.0.0, then the 'base' address of the subnet is 192.168.0.0,
|
||
and to discover the recommended legacy browsing domain for devices
|
||
on this subnet, the host issues a DNS PTR query for the name
|
||
"lb._dns-sd._udp.0.0.168.192.in-addr.arpa."
|
||
|
||
Sophisticated clients may perform domain enumeration queries both in
|
||
"local" and in one or more unicast domains, and then present the user
|
||
with an aggregate result, combining the information received from all
|
||
sources.
|
||
|
||
|
||
13. DNS Additional Record Generation
|
||
|
||
DNS has an efficiency feature whereby a DNS server may place
|
||
additional records in the Additional Section of the DNS Message.
|
||
These additional records are typically records that the client did
|
||
not explicitly request, but the server has reasonable grounds to
|
||
expect that the client might request them shortly.
|
||
|
||
This section recommends which additional records should be generated
|
||
to improve network efficiency for both unicast and multicast DNS-SD
|
||
responses.
|
||
|
||
|
||
13.1 PTR Records
|
||
|
||
When including a PTR record in a response packet, the
|
||
server/responder SHOULD include the following additional records:
|
||
|
||
o The SRV record(s) named in the PTR rdata.
|
||
o The TXT record(s) named in the PTR rdata.
|
||
o All address records (type "A" and "AAAA") named in the SRV rdata.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 26]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
13.2 SRV Records
|
||
|
||
When including an SVR record in a response packet, the
|
||
server/responder SHOULD include the following additional records:
|
||
|
||
o All address records (type "A" and "AAAA") named in the SRV rdata.
|
||
|
||
|
||
13.3 TXT Records
|
||
|
||
When including a TXT record in a response packet, no additional
|
||
records are required.
|
||
|
||
|
||
13.4 Other Record Types
|
||
|
||
In response to address queries, or other record types, no additional
|
||
records are required by this document.
|
||
|
||
|
||
14. Comparison with Alternative Service Discovery Protocols
|
||
|
||
Over the years there have been many proposed ways to do network
|
||
service discovery with IP, but none achieved ubiquity in the
|
||
marketplace. Certainly none has achieved anything close to the
|
||
ubiquity of today's deployment of DNS servers, clients, and other
|
||
infrastructure.
|
||
|
||
The advantage of using DNS as the basis for service discovery is
|
||
that it makes use of those existing servers, clients, protocols,
|
||
infrastructure, and expertise. Existing network analyzer tools
|
||
already know how to decode and display DNS packets for network
|
||
debugging.
|
||
|
||
For ad-hoc networks such as Zeroconf environments, peer-to-peer
|
||
multicast protocols are appropriate. The Zeroconf host profile [ZCHP]
|
||
requires the use of a DNS-like protocol over IP Multicast for host
|
||
name resolution in the absence of DNS servers. Given that Zeroconf
|
||
hosts will have to implement this Multicast-based DNS-like protocol
|
||
anyway, it makes sense for them to also perform service discovery
|
||
using that same Multicast-based DNS-like software, instead of also
|
||
having to implement an entirely different service discovery protocol.
|
||
|
||
In larger networks, a high volume of enterprise-wide IP multicast
|
||
traffic may not be desirable, so any credible service discovery
|
||
protocol intended for larger networks has to provide some facility to
|
||
aggregate registrations and lookups at a central server (or servers)
|
||
instead of working exclusively using multicast. This requires some
|
||
service discovery aggregation server software to be written,
|
||
debugged, deployed, and maintained. This also requires some service
|
||
discovery registration protocol to be implemented and deployed for
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 27]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
clients to register with the central aggregation server. Virtually
|
||
every company with an IP network already runs a DNS server, and DNS
|
||
already has a dynamic registration protocol [RFC 2136]. Given that
|
||
virtually every company already has to operate and maintain a DNS
|
||
server anyway, it makes sense to take advantage of this instead of
|
||
also having to learn, operate and maintain a different service
|
||
registration server. It should be stressed again that using the
|
||
same software and protocols doesn't necessarily mean using the same
|
||
physical piece of hardware. The DNS-SD service discovery functions
|
||
do not have to be provided by the same piece of hardware that
|
||
is currently providing the company's DNS name service. The
|
||
"_tcp.<Domain>" subdomain may be delegated to a different piece of
|
||
hardware. However, even when the DNS-SD service is being provided
|
||
by a different piece of hardware, it is still the same familiar DNS
|
||
server software that is running, with the same configuration file
|
||
syntax, the same log file format, and so forth.
|
||
|
||
Service discovery needs to be able to provide appropriate security.
|
||
DNS already has existing mechanisms for security [RFC 2535].
|
||
|
||
In summary:
|
||
|
||
Service discovery requires a central aggregation server.
|
||
DNS already has one: It's called a DNS server.
|
||
|
||
Service discovery requires a service registration protocol.
|
||
DNS already has one: It's called DNS Dynamic Update.
|
||
|
||
Service discovery requires a query protocol
|
||
DNS already has one: It's called DNS.
|
||
|
||
Service discovery requires security mechanisms.
|
||
DNS already has security mechanisms: DNSSEC.
|
||
|
||
Service discovery requires a multicast mode for ad-hoc networks.
|
||
Zeroconf environments already require a multicast-based DNS-like
|
||
name lookup protocol for mapping host names to addresses, so it
|
||
makes sense to let one multicast-based protocol do both jobs.
|
||
|
||
It makes more sense to use the existing software that every network
|
||
needs already, instead of deploying an entire parallel system just
|
||
for service discovery.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 28]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
15. Real Examples
|
||
|
||
The following examples were prepared using standard unmodified
|
||
nslookup and standard unmodified BIND running on GNU/Linux.
|
||
|
||
Note: In real products, this information is obtained and presented to
|
||
the user using graphical network browser software, not command-line
|
||
tools, but if you wish you can try these examples for yourself as you
|
||
read along, using the command-line tools already available on your
|
||
own Unix machine.
|
||
|
||
15.1 Question: What FTP servers are being advertised from dns-sd.org?
|
||
|
||
nslookup -q=ptr _ftp._tcp.dns-sd.org.
|
||
_ftp._tcp.dns-sd.org
|
||
name = Apple\032QuickTime\032Files._ftp._tcp.dns-sd.org
|
||
_ftp._tcp.dns-sd.org
|
||
name = Microsoft\032Developer\032Files._ftp._tcp.dns-sd.org
|
||
_ftp._tcp.dns-sd.org
|
||
name = Registered\032Users'\032Only._ftp._tcp.dns-sd.org
|
||
|
||
Answer: There are three, called "Apple QuickTime Files",
|
||
"Microsoft Developer Files" and "Registered Users' Only".
|
||
|
||
Note that nslookup escapes spaces as "\032" for display purposes,
|
||
but a graphical DNS-SD browser does not.
|
||
|
||
15.2 Question: What FTP servers allow anonymous access?
|
||
|
||
nslookup -q=ptr _anon._sub._ftp._tcp.dns-sd.org
|
||
_anon._sub._ftp._tcp.dns-sd.org
|
||
name = Apple\032QuickTime\032Files._ftp._tcp.dns-sd.org
|
||
_anon._sub._ftp._tcp.dns-sd.org
|
||
name = Microsoft\032Developer\032Files._ftp._tcp.dns-sd.org
|
||
|
||
Answer: Only "Apple QuickTime Files" and "Microsoft Developer Files"
|
||
allow anonymous access.
|
||
|
||
15.3 Question: How do I access "Apple QuickTime Files"?
|
||
|
||
nslookup -q=any "Apple\032QuickTime\032Files._ftp._tcp.dns-sd.org."
|
||
Apple\032QuickTime\032Files._ftp._tcp.dns-sd.org
|
||
text = "path=/quicktime"
|
||
Apple\032QuickTime\032Files._ftp._tcp.dns-sd.org
|
||
priority = 0, weight = 0, port= 21 host = ftp.apple.com
|
||
ftp.apple.com internet address = 17.254.0.27
|
||
ftp.apple.com internet address = 17.254.0.31
|
||
ftp.apple.com internet address = 17.254.0.26
|
||
|
||
Answer: You need to connect to ftp.apple.com, port 21, path
|
||
"/quicktime". The addresses for ftp.apple.com are also given.
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 29]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
16. User Interface Considerations
|
||
|
||
DNS-Based Service Discovery was designed by first giving careful
|
||
consideration to what constitutes a good user experience for service
|
||
discovery, and then designing a protocol with the features necessary
|
||
to enable that good user experience. This section covers two issues
|
||
in particular: Choice of factory-default names (and automatic
|
||
renaming behavior) for devices advertising services, and the
|
||
"continuous live update" user-experience model for clients
|
||
browsing to discover services.
|
||
|
||
|
||
16.1 Service Advertising User-Interface Considerations
|
||
|
||
When a DNS-SD service is advertised using Multicast DNS [mDNS],
|
||
automatic name conflict and resolution will occur if there is already
|
||
another service of the same type advertising with the same name.
|
||
As described in the Multicast DNS specification [mDNS], upon a
|
||
conflict, the service should:
|
||
|
||
1. Automatically select a new name (typically by appending
|
||
or incrementing a digit at the end of the name),
|
||
2. try advertising with the new name, and
|
||
3. upon success, record the new name in persistent storage.
|
||
|
||
This renaming behavior is very important, because it is the key
|
||
to providing user-friendly service names in the out-of-the-box
|
||
factory-default configuration. Some product developers may not
|
||
have realized this, because there are some products today where
|
||
the factory-default name is distinctly unfriendly, containing
|
||
random-looking strings of characters, like the device's Ethernet
|
||
address in hexadecimal. This is unnecessary, and undesirable, because
|
||
the point of the user-visible name is that it should be friendly and
|
||
useful to human users. If the name is not unique on the local network
|
||
the protocol will rememdy this as necessary. It is ironic that many
|
||
of the devices with this mistake are network printers, given that
|
||
these same printers also simultaneously support AppleTalk-over-
|
||
Ethernet, with nice user-friendly default names (and automatic
|
||
conflict detection and renaming). Examples of good factory-default
|
||
names are as follows:
|
||
|
||
Brother 5070N
|
||
Canon W2200 [ Apologies to makers of ]
|
||
HP LaserJet 4600 [ DNS-SD/mDNS printers ]
|
||
Lexmark W840 [ not listed. Email ]
|
||
Okidata C5300 [ the authors and we'll ]
|
||
Ricoh Aficio CL7100 [ add you to the list. ]
|
||
Xerox Phaser 6200DX
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 30]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
To complete the case for why adding long ugly serial numbers to
|
||
the end of names is neither necessary nor desirable, consider
|
||
the cases where the user has (a) only one network printer,
|
||
(b) two network printers, and (c) many network printers.
|
||
|
||
(a) In the case where the user has only one network printer, a simple
|
||
name like (to use a vendor-neutral example) "Printer" is more
|
||
user-friendly than an ugly name like "Printer 0001E68C74FB".
|
||
Appending ugly hexadecimal goop to the end of the name to make
|
||
sure the name is unique is irrelevant to a user who only has one
|
||
printer anyway.
|
||
|
||
(b) In the case where the user gets a second network printer,
|
||
having it detect that the name "Printer" is already in use
|
||
and automatically instead name itself "Printer (2)" provides a
|
||
good user experience. For the users, remembering that the old
|
||
printer is "Printer" and the new one is "Printer (2)" is easy
|
||
and intuitive. Seeing two printers called "Printer 0001E68C74FB"
|
||
and "Printer 00306EC3FD1C" is a lot less helpful.
|
||
|
||
(c) In the case of a network with ten network printers, seeing a
|
||
list of ten names all of the form "Printer xxxxxxxxxxxx" has
|
||
effectively taken what was supposed to be a list of user-friendly
|
||
rich-text names (supporting mixed case, spaces, punctuation,
|
||
non-Roman characters and other symbols) and turned it into
|
||
just about the worst user-interface imaginable: a list of
|
||
incomprehensible random-looking strings of letters and digits.
|
||
In a network with a lot of printers, it would be desirable for
|
||
the people setting up the printers to take a moment to give each
|
||
one a descriptive name, but in the event they don't, presenting
|
||
the users with a list of sequentially-numbered printers is a much
|
||
more desirable default user experience than showing a list of raw
|
||
Ethernet addresses.
|
||
|
||
|
||
16.2 Client Browsing User-Interface Considerations
|
||
|
||
Of particular concern in the design of DNS-SD was the dynamic nature
|
||
of service discovery in a changing network environment. Other service
|
||
discovery protocols have been designed with an implicit unstated
|
||
assumption that the usage model is:
|
||
|
||
(a) client calls the service discovery code
|
||
(b) client gets list of discovered services
|
||
as of a particular instant in time, and then
|
||
(c) client displays list for user to select from
|
||
|
||
Superficially this usage model seems reasonable, but the problem is
|
||
that it's too optimistic. It only considers the success case, where
|
||
the user successfully finds the service they're looking for. In the
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 31]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
case where the user is looking for (say) a particular printer, and
|
||
that printer's not turned on or not connected, the user first has
|
||
to attempt to remedy the problem, and then has to click a "refresh"
|
||
button to retry the service discovery (or, worse, dismiss the
|
||
browsing window entirely, and open a new one to initiate a new
|
||
network search attempt) to find out whether they were successful.
|
||
Because nothing happens instantaneously in networking, and packets
|
||
can be lost, necessitating some number of retransmissions, a service
|
||
discovery search typically takes a few seconds. A fairly typical user
|
||
experience model is:
|
||
|
||
(a) display an empty window,
|
||
(b) display some animation like a searchlight
|
||
sweeping back and forth for ten seconds, and then
|
||
(c) at the end of the ten-second search, display
|
||
a static list showing what was discovered.
|
||
|
||
Every time the user clicks the "refresh" button they have to endure
|
||
another ten-second wait, and every time the discovered list is
|
||
finally shown at the end of the ten-second wait, the moment it's
|
||
displayed on the screen it's already beginning to get stale and
|
||
out-of-date.
|
||
|
||
The service discovery user experience that the DNS-SD designers had
|
||
in mind has some rather different properties:
|
||
|
||
1. Displaying a list of discovered services should be effectively
|
||
instantaneous -- i.e. typically 1/10 second, not 10 seconds.
|
||
|
||
2. The list of discovered services should not be getting stale
|
||
and out-of-date from the moment it's displayed. The list
|
||
should be 'live' and should continue to update as new services
|
||
are discovered. Because of the delays, packet losses, and
|
||
retransmissions inherent in networking, it is to be expected
|
||
that sometimes, after the initial list is displayed showing
|
||
the majority of discovered services, a few remaining stragglers
|
||
may continue to trickle in during the subsequent few seconds.
|
||
Even after this initial stable list has been built and displayed,
|
||
the list should remain 'live' and should continue to update.
|
||
At any future time, be it minutes, hours, or even days later,
|
||
if a new service of the desired type is discovered, it should be
|
||
displayed in the list automatically, without the user having to
|
||
click a "refresh" button or take any other explicit action to
|
||
update the display.
|
||
|
||
3. With users getting to be in the habit of leaving service discovery
|
||
windows open, and coming to expect to be able to rely on them
|
||
to show a continuous 'live' view of current network reality,
|
||
this creates a new requirement for us: deletion of stale services.
|
||
When a service discovery list shows just a static snapshot at a
|
||
moment in time, then the situation is simple: either a service was
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 32]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
discovered and appears in the list, or it was not, and does not.
|
||
However, when our list is live and updates continuously with the
|
||
discovery of new services, then this implies the corollary: when
|
||
a service goes away, it needs to *disappear* from the service
|
||
discovery list. Otherwise, the result would be unacceptable: the
|
||
service discovery list would simply grow monotonically over time,
|
||
and would require a periodic "refresh" (or complete dismissal and
|
||
recreation) to clear out old stale data.
|
||
|
||
4. With users getting to be in the habit of leaving service discovery
|
||
windows open, these windows need to update not only in response
|
||
to services coming and going, but also in response to changes
|
||
in configuration and connectivity of the client machine itself.
|
||
For example, if a user opens a service discovery window when no
|
||
Ethernet cable is connected to the client machine, and the window
|
||
appears empty with no discovered services, then when the user
|
||
connects the cable the window should automatically populate with
|
||
discovered services without requiring any explicit user action.
|
||
If the user disconnects the Ethernet cable, all the services
|
||
discovered via that network interface should automatically
|
||
disappear. If the user switches from one 802.11 wireless base
|
||
station to another, the service discovery window should
|
||
automatically update to remove all the services discovered
|
||
via the old wireless base station, and add all the services
|
||
discovered via the new one.
|
||
|
||
If these requirements seem to be setting an arbitrary and
|
||
unreasonably high standard for service discovery, bear in mind that
|
||
while it may have seemed that way to some, back in the 1990s when
|
||
these ideas were first proposed, in the years since then Apple and
|
||
other companies have shipped multiple implementations of DNS-SD/mDNS
|
||
that meet and exceed these requirements. In the years since Apple
|
||
shipped Mac OS X 10.2 Jaguar with the Open Source mDNSResponder
|
||
daemon, this service discovery "live browsing" paradigm has been
|
||
adopted and implemented in a wide range of Apple and third-party
|
||
applications, including printer discovery, Safari discovery of
|
||
devices with embedded web servers (for status and configuration),
|
||
iTunes music sharing, iPhoto photo sharing, the iChat Bonjour buddy
|
||
list, SubEthaEdit multi-user document editing, etc.
|
||
|
||
With so many different applications demonstrating that the "live
|
||
browsing" paradigm is clearly achievable, these four requirements
|
||
should not be regarded as idealistic unattainable goals, but
|
||
instead as the bare minimum baseline functionality that any
|
||
credible service discovery protocol needs to achieve.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 33]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
17. IPv6 Considerations
|
||
|
||
IPv6 has no significant differences, except that the address of the
|
||
SRV record's target host is given by the appropriate IPv6 address
|
||
records instead of the IPv4 "A" record.
|
||
|
||
|
||
18. Security Considerations
|
||
|
||
DNSSEC [RFC 2535] should be used where the authenticity of
|
||
information is important. Since DNS-SD is just a naming and usage
|
||
convention for records in the existing DNS system, it has no specific
|
||
additional security requirements over and above those that already
|
||
apply to DNS queries and DNS updates.
|
||
|
||
|
||
19. IANA Considerations
|
||
|
||
This protocol builds on DNS SRV records [RFC 2782], and similarly
|
||
requires IANA to assign unique application protocol names.
|
||
Unfortunately, the "IANA Considerations" section of RFC 2782 says
|
||
simply, "The IANA has assigned RR type value 33 to the SRV RR.
|
||
No other IANA services are required by this document."
|
||
Due to this oversight, IANA is currently prevented from carrying
|
||
out the necessary function of assigning these unique identifiers.
|
||
|
||
This document proposes the following IANA allocation policy for
|
||
unique application protocol names:
|
||
|
||
Allowable names:
|
||
* Must be no more than fourteen characters long
|
||
* Must consist only of:
|
||
- lower-case letters 'a' - 'z'
|
||
- digits '0' - '9'
|
||
- the hyphen character '-'
|
||
* Must begin and end with a lower-case letter or digit.
|
||
* Must not already be assigned to some other protocol in the
|
||
existing IANA "list of assigned application protocol names
|
||
and port numbers" [ports].
|
||
|
||
These identifiers are allocated on a First Come First Served basis.
|
||
In the event of abuse (e.g. automated mass registrations, etc.),
|
||
the policy may be changed without notice to Expert Review [RFC 2434].
|
||
|
||
The textual nature of service/protocol names means that there are
|
||
almost infinitely many more of them available than the finite set of
|
||
65535 possible port numbers. This means that developers can produce
|
||
experimental implementations using unregistered service names with
|
||
little chance of accidental collision, providing service names are
|
||
chosen with appropriate care. However, this document strongly
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 34]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
advocates that on or before the date a product ships, developers
|
||
should properly register their service names.
|
||
|
||
Some developers have expressed concern that publicly registering
|
||
their service names (and port numbers today) with IANA before a
|
||
product ships may give away clues about that product to competitors.
|
||
For this reason, IANA should consider allowing service name
|
||
applications to remain secret for some period of time, much as US
|
||
patent applications remain secret for two years after the date of
|
||
filing.
|
||
|
||
This proposed IANA allocation policy is not in force until this
|
||
document is published as an RFC. In the meantime, unique application
|
||
protocol names may be registered according to the instructions at
|
||
<http://www.dns-sd.org/ServiceTypes.html>. As of August 2006, there
|
||
are roughly 300 application protocols in currently shipping products
|
||
that have been so registered as using DNS-SD for service discovery.
|
||
|
||
|
||
20. Acknowledgments
|
||
|
||
The concepts described in this document have been explored, developed
|
||
and implemented with help from Richard Brown, Erik Guttman, Paul
|
||
Vixie, and Bill Woodcock.
|
||
|
||
Special thanks go to Bob Bradley, Josh Graessley, Scott Herscher,
|
||
Roger Pantos and Kiren Sekar for their significant contributions.
|
||
|
||
|
||
21. Deployment History
|
||
|
||
The first implementations of DNS-Based Service Discovery and
|
||
Multicast DNS were initially developed during the late 1990s,
|
||
but the event that put them into the media spotlight was Steve Jobs
|
||
demonstrating it live on stage in his keynote presentation opening
|
||
Apple's annual Worldwide Developers Conference in May 2002, and
|
||
announcing Apple's adoption of the technology throughout its hardware
|
||
and software product line. Three months later, in August 2002, Apple
|
||
shipped Mac OS X 10.2 Jaguar, and millions of end-users got their
|
||
first exposure to Zero Configuration Networking with DNS-SD/mDNS
|
||
in applications like Safari, iChat, and printer setup. A month later,
|
||
in September 2002, Apple released the entire source code for the
|
||
mDNS Responder daemon under its Darwin Open Source project, with
|
||
code not just for Mac OS X, but also for a range of other platforms
|
||
including Windows, VxWorks, Linux, Solaris, FreeBSD, etc.
|
||
|
||
Many hardware makers were quick to see the benefits of Zero
|
||
Configuration Networking. Printer makers especially were enthusiastic
|
||
early adopters, and within a year every major printer manufacturer
|
||
was shipping DNS-SD/mDNS-enabled network printers. If you've bought
|
||
any network printer at all in the last few years, it was probably one
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 35]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
that supports DNS-SD/mDNS, even if you didn't know that at the time.
|
||
For Mac OS X users, telling if you have DNS-SD/mDNS printers on your
|
||
network is easy because they automatically appear in the "Bonjour"
|
||
submenu in the "Print" dialog of every Mac application. Microsoft
|
||
Windows users can get a similar experience by installing Bonjour for
|
||
Windows (takes about 90 seconds, no restart required) and running the
|
||
Bonjour for Windows Printer Setup Wizard [B4W].
|
||
|
||
The Open Source community has produced several independent
|
||
implementations of DNS-Based Service Discovery and Multicast DNS,
|
||
some in C like Apple's mDNSResponder daemon, and others in a variety
|
||
of different languages including Java, Python, Perl, and C#/Mono.
|
||
|
||
|
||
22. Copyright Notice
|
||
|
||
Copyright (C) The Internet Society (2006).
|
||
|
||
This document is subject to the rights, licenses and restrictions
|
||
contained in BCP 78, and except as set forth therein, the authors
|
||
retain all their rights. For the purposes of this document,
|
||
the term "BCP 78" refers exclusively to RFC 3978, "IETF Rights
|
||
in Contributions", published March 2005.
|
||
|
||
This document and the information contained herein are provided on an
|
||
"AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS
|
||
OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET
|
||
ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED,
|
||
INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE
|
||
INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED
|
||
WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 36]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
23. Normative References
|
||
|
||
[ports] IANA list of assigned application protocol names and port
|
||
numbers <http://www.iana.org/assignments/port-numbers>
|
||
|
||
[RFC 1033] Lottor, M., "Domain Administrators Operations Guide",
|
||
RFC 1033, November 1987.
|
||
|
||
[RFC 1034] Mockapetris, P., "Domain Names - Concepts and
|
||
Facilities", STD 13, RFC 1034, November 1987.
|
||
|
||
[RFC 1035] Mockapetris, P., "Domain Names - Implementation and
|
||
Specifications", STD 13, RFC 1035, November 1987.
|
||
|
||
[RFC 2119] Bradner, S., "Key words for use in RFCs to Indicate
|
||
Requirement Levels", RFC 2119, March 1997.
|
||
|
||
[RFC 2782] Gulbrandsen, A., et al., "A DNS RR for specifying the
|
||
location of services (DNS SRV)", RFC 2782, February 2000.
|
||
|
||
[RFC 3629] Yergeau, F., "UTF-8, a transformation format of ISO
|
||
10646", RFC 3629, November 2003.
|
||
|
||
[UAX15] "Unicode Normalization Forms"
|
||
http://www.unicode.org/reports/tr15/
|
||
|
||
|
||
24. Informative References
|
||
|
||
[B4W] Bonjour for Windows <http://www.apple.com/bonjour/>
|
||
|
||
[mDNS] Cheshire, S., and M. Krochmal, "Multicast DNS",
|
||
Internet-Draft (work in progress),
|
||
draft-cheshire-dnsext-multicastdns-06.txt, August 2006.
|
||
|
||
[NBP] Cheshire, S., and M. Krochmal,
|
||
"Requirements for a Protocol to Replace AppleTalk NBP",
|
||
Internet-Draft (work in progress),
|
||
draft-cheshire-dnsext-nbp-05.txt, August 2006.
|
||
|
||
[RFC 2132] Alexander, S., and Droms, R., "DHCP Options and BOOTP
|
||
Vendor Extensions", RFC 2132, March 1997.
|
||
|
||
[RFC 2136] Vixie, P., et al., "Dynamic Updates in the Domain Name
|
||
System (DNS UPDATE)", RFC 2136, April 1997.
|
||
|
||
[RFC 2434] Narten, T., and H. Alvestrand, "Guidelines for Writing
|
||
an IANA Considerations Section in RFCs", RFC 2434,
|
||
October 1998.
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 37]
|
||
|
||
Internet Draft DNS-Based Service Discovery 10th August 2006
|
||
|
||
|
||
[RFC 2535] Eastlake, D., "Domain Name System Security Extensions",
|
||
RFC 2535, March 1999.
|
||
|
||
[RFC 3007] Wellington, B., et al., "Secure Domain Name System (DNS)
|
||
Dynamic Update", RFC 3007, November 2000.
|
||
|
||
[RFC 3397] Aboba, B., and Cheshire, S., "Dynamic Host Configuration
|
||
Protocol (DHCP) Domain Search Option", RFC 3397, November
|
||
2002.
|
||
|
||
[SOAP] Nilo Mitra, "SOAP Version 1.2 Part 0: Primer",
|
||
W3C Proposed Recommendation, 24 June 2003
|
||
http://www.w3.org/TR/2003/REC-soap12-part0-20030624
|
||
|
||
[ZC] Williams, A., "Requirements for Automatic Configuration
|
||
of IP Hosts", Internet-Draft (work in progress),
|
||
draft-ietf-zeroconf-reqts-12.txt, September 2002.
|
||
|
||
[ZCHP] Guttman, E., "Zeroconf Host Profile Applicability
|
||
Statement", Internet-Draft (work in progress),
|
||
draft-ietf-zeroconf-host-prof-01.txt, July 2001.
|
||
|
||
|
||
25. Authors' Addresses
|
||
|
||
Stuart Cheshire
|
||
Apple Computer, Inc.
|
||
1 Infinite Loop
|
||
Cupertino
|
||
California 95014
|
||
USA
|
||
|
||
Phone: +1 408 974 3207
|
||
EMail: rfc [at] stuartcheshire [dot] org
|
||
|
||
|
||
Marc Krochmal
|
||
Apple Computer, Inc.
|
||
1 Infinite Loop
|
||
Cupertino
|
||
California 95014
|
||
USA
|
||
|
||
Phone: +1 408 974 4368
|
||
EMail: marc [at] apple [dot] com
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
Expires 10th February 2007 Cheshire & Krochmal [Page 38]
|