What is mDNSResponder?
----------------------

The mDNSResponder project is a component of Bonjour,
Apple's ease-of-use IP networking initiative:
<http://developer.apple.com/bonjour/>

Apple's Bonjour software derives from the ongoing standardization
work of the IETF Zero Configuration Networking Working Group:
<http://zeroconf.org/>

The Zeroconf Working Group has identified three requirements for Zero
Configuration Networking:
1. An IP address (even when there is no DHCP server to assign one)
2. Name-to-address translation (even when there is no DNS server)
3. Discovery of Services on the network (again, without infrastucture)

Requirement 1 is met by self-assigned link-local addresses, as
described in "Dynamic Configuration of IPv4 Link-Local Addresses"
<http://files.zeroconf.org/draft-ietf-zeroconf-ipv4-linklocal.txt>

Requirement 2 is met by sending DNS-like queries via Multicast (mDNS).

Requirement 3 is met by DNS Service Dicsovery (DNS-SD).

Self-assigned link-local address capability has been available since
1998, when it first appeared in Windows '98 and in Mac OS 8.5.
Implementations for other platforms also exist.

The mDNSResponder project allows us to meet requirements 2 and 3.
It provides the ability for the user to identify hosts using names
instead of dotted-decimal IP addresses, even if the user doesn't have a
conventional DNS server set up. It also provides the ability for the
user to discover what services are being advertised on the network,
without having to know about them in advance, or configure the machines.

The name "mDNS" was chosen because this protocol is designed to be,
as much as possible, similar to conventional DNS. The main difference is
that queries are sent via multicast to all local hosts, instead of via
unicast to a specific known server. Every host on the local link runs an
mDNSResponder which is constantly listening for those multicast queries,
and if the mDNSResponder receives a query for which it knows the answer,
then it responds. The mDNS protocol uses the same packet format as
unicast DNS, and the same name structure, and the same DNS record types.
The main difference is that queries are sent to a different UDP port
(5353 instead of 53) and they are sent via multicast to address
224.0.0.251. Another important difference is that all "mDNS" names
end in ".local." When a user types "yourcomputer.local." into their Web
browser, the presence of ".local." on the end of the name tells the host
OS that the name should be looked up using local multicast instead of by
sending that name to the worldwide DNS service for resolution. This
helps reduce potential user confusion about whether a particular name
is globally unique (e.g. "www.apple.com.") or whether that name has only
local significance (e.g. "yourcomputer.local.").


About the mDNSResponder Code
----------------------------

Because Apple benefits more from widespread adoption of Bonjour than
it would benefit from keeping Bonjour proprietary, Apple is making
this code open so that other developers can use it too.

Because Apple recognises that networks are hetrogenous environments
where devices run many different kinds of OS, this code has been made
as portable as possible.

A typical mDNS program contains three components:

    +------------------+
    |   Application    |
    +------------------+
    |    mDNS Core     |
    +------------------+
    | Platform Support |
    +------------------+

The "mDNS Core" layer is absolutely identical for all applications and
all Operating Systems.

The "Platform Support" layer provides the necessary supporting routines
that are specific to each platform -- what routine do you call to send
a UDP packet, what routine do you call to join multicast group, etc.

The "Application" layer does whatever that particular application wants
to do. It calls routines provided by the "mDNS Core" layer to perform
the functions it needs --
 * advertise services,
 * browse for named instances of a particular type of service
 * resolve a named instance to a specific IP address and port number,
 * etc.
The "mDNS Core" layer in turn calls through to the "Platform Support"
layer to send and receive the multicast UDP packets to do the actual work.

Apple currently provides "Platform Support" layers for Mac OS 9, Mac OS X,
Microsoft Windows, VxWorks, and for POSIX platforms like Linux, Solaris,
FreeBSD, etc.

Note: Developers writing applications for OS X do not need to incorporate
this code into their applications, since OS X provides a system service to
handle this for them. If every application developer were to link-in the
mDNSResponder code into their application, then we would end up with a
situation like the picture below:

  +------------------+    +------------------+    +------------------+
  |   Application 1  |    |   Application 2  |    |   Application 3  |
  +------------------+    +------------------+    +------------------+
  |    mDNS Core     |    |    mDNS Core     |    |    mDNS Core     |
  +------------------+    +------------------+    +------------------+
  | Platform Support |    | Platform Support |    | Platform Support |
  +------------------+    +------------------+    +------------------+

This would not be very efficient. Each separate application would be sending
their own separate multicast UDP packets and maintaining their own list of
answers. Because of this, OS X provides a common system service which client
software should access through the "/usr/include/dns_sd.h" APIs.

The situation on OS X looks more like the picture below:

                                   -------------------
                                  /                   \
  +---------+    +------------------+    +---------+   \  +---------+
  |  App 1  |<-->|    daemon.c      |<-->|  App 2  |    ->|  App 3  |
  +---------+    +------------------+    +---------+      +---------+
                 |    mDNS Core     |
                 +------------------+
                 | Platform Support |
                 +------------------+

Applications on OS X make calls to the single mDNSResponder daemon
which implements the mDNS and DNS-SD protocols. 

Vendors of products such as printers, which are closed environments not
expecting to be running third-party application software, can reasonably
implement a single monolithic mDNSResponder to advertise all the
services of that device. Vendors of open systems which run third-party
application software should implement a system service such as the one
provided by the OS X mDNSResponder daemon, and application software on
that platform should, where possible, make use of that system service
instead of embedding their own mDNSResponder.

See ReadMe.txt in the mDNSPosix directory for specific details of
building an mDNSResponder on a POSIX Operating System.


Compiling on Older C Compilers
------------------------------

We go to some lengths to make the code portable, but //-style comments
are one of the modern conveniences we can't live without.

If your C compiler doesn't understand these comments, you can transform
them into classical K&R /* style */ comments with a quick GREP
search-and-replace pattern.

In BBEdit on the Mac:
1. Open the "Find" dialog window and make sure "Use Grep" is selected
2. Search For  : ([^:])//(.*)
3. Replace With: \1/*\2 */
4. Drag your mDNSResponder source code folder to the Multi-File search pane
5. Click "Replace All"

For the more command-line oriented, cd into your mDNSResponder source code
directory and execute the following command (all one line):

find mDNSResponder \( -name \*.c\* -or -name \*.h \) -exec sed -i .orig -e 's,^//\(.*\),/*\1 */,' -e '/\/\*/\!s,\([^:]\)//\(.*\),\1/*\2 */,' {} \;
