rfc8766xml2.original.xml | rfc8766.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='UTF-8'?> | |||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd"> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<!-- | ||||
Check output with <http://tools.ietf.org/tools/idnits/> | ||||
<!-- used by XSLT processors --> | ||||
<!-- For a complete list and description of processing instructions (PIs), | ||||
please see http://xml.resource.org/authoring/README.html. --> | ||||
<!-- Below are generally applicable Processing Instructions (PIs) that most | ||||
I-Ds might want to use. | ||||
(Here they are set differently than their defaults in xml2rfc v1.35) --> | ||||
<!-- give errors regarding ID-nits and DTD validation --> | ||||
<?rfc strict="yes" ?> | ||||
<!-- control the table of contents (ToC) --> | ||||
<!-- generate a ToC --> | ||||
<?rfc toc="yes"?> | ||||
<!-- the number of levels of subsections in ToC. default: 3 --> | ||||
<?rfc tocdepth="3"?> | ||||
<!-- control references --> | ||||
<!-- use anchors instead of numbers for refs, i.e, [RFC2119] instead of [1] | ||||
<?rfc symrefs="yes"?> | ||||
<!-- sort the reference entries alphabetically --> | ||||
<?rfc sortrefs="no" ?> | ||||
<!-- control vertical white space | ||||
(using these PIs as follows is recommended by the RFC Editor) --> | ||||
<!-- do not start each main section on a new page --> | ||||
<?rfc compact="yes" ?> | ||||
<!-- keep one blank line between list items --> | ||||
<?rfc subcompact="no" ?> | ||||
<!-- encourage use of "xml2rfc" tool --> | ||||
<?rfc rfcprocack="yes" ?> | ||||
<!-- end of list of popular I-D processing instructions --> | ||||
<rfc category="std" docName="draft-ietf-dnssd-hybrid-10" ipr="trust200902"> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" number="8766" consensus="true" | |||
category="std" docName="draft-ietf-dnssd-hybrid-10" ipr="trust200902" | ||||
obsoletes="" updates="" submissionType="IETF" xml:lang="en" | ||||
tocInclude="true" tocDepth="3" symRefs="true" sortRefs="false" | ||||
version="3"> | ||||
<front> | <front> | |||
<title abbrev='Multicast Service Discovery Proxy'>Discovery Proxy | <title abbrev="Multicast Service Discovery Proxy">Discovery Proxy | |||
for Multicast DNS-Based Service Discovery</title> | for Multicast DNS-Based Service Discovery</title> | |||
<author initials='S.' surname='Cheshire' fullname='Stuart Cheshire'> | <seriesInfo name="RFC" value="8766"/> | |||
<author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | ||||
<organization>Apple Inc.</organization> | <organization>Apple Inc.</organization> | |||
<address> | <address> | |||
<postal> | <postal> | |||
<street>One Apple Park Way</street> | <street>One Apple Park Way</street> | |||
<city>Cupertino</city> | <city>Cupertino</city> | |||
<region>California</region> | <region>California</region> | |||
<code>95014</code> | <code>95014</code> | |||
<country>USA</country> | <country>United States of America</country> | |||
</postal> | </postal> | |||
<phone>+1 (408) 996-1010</phone> | <phone>+1 (408) 996-1010</phone> | |||
<email>cheshire@apple.com</email> | <email>cheshire@apple.com</email> | |||
</address> | </address> | |||
</author> | </author> | |||
<date year='2019' month='March' day='24'/> | <date year="2020" month="June"/> | |||
<area>Internet</area> | <area>INT</area> | |||
<workgroup>Internet Engineering Task Force</workgroup> | <workgroup>DNSSD</workgroup> | |||
<keyword>Multicast DNS</keyword> | <keyword>Multicast DNS</keyword> | |||
<keyword>DNS-Based Service Discovery</keyword> | <keyword>DNS-Based Service Discovery</keyword> | |||
<keyword>RFC</keyword> | ||||
<keyword>Request for Comments</keyword> | ||||
<keyword>I-D</keyword> | ||||
<keyword>Internet-Draft</keyword> | ||||
<abstract> | <abstract> | |||
<t>This document specifies a network proxy that uses Multicast DNS | <t>This document specifies a network proxy that uses Multicast DNS | |||
to automatically populate the wide-area unicast Domain Name System | to automatically populate the wide-area unicast Domain Name System | |||
namespace | namespace | |||
with records describing devices and services found on the local | with records describing devices and services found on the local | |||
link.</t> | link.</t> | |||
</abstract> | </abstract> | |||
</front> | </front> | |||
<middle> | <middle> | |||
<?rfc needLines="31" ?> | <section numbered="true" toc="default"> | |||
<section title="Introduction"> | <name>Introduction</name> | |||
<t><xref target="RFC6762">Multicast DNS</xref> and its companion | <t>Multicast DNS <xref target="RFC6762" format="default"></xref> and its | |||
technology | companion technology DNS-based Service Discovery <xref target="RFC6763" | |||
DNS-based Service Discovery <xref target="RFC6763"/> were created to | format="default"/> were created to provide IP networking with the ease | |||
provide | of use and autoconfiguration for which AppleTalk was well known <xref | |||
IP networking with the ease-of-use and autoconfiguration for which | target="RFC6760" format="default"/> <xref target="ZC" format="default"/> | |||
AppleTalk was well known <xref target="RFC6760"/> <xref target="ZC"/> | <xref target="I-D.cheshire-dnssd-roadmap" format="default"/>.</t> | |||
<xref target="Roadmap"/>.</t> | ||||
<t>For a small home network consisting of just a single link (or a few | <t>For a small home network consisting of just a single link (or a few | |||
physical links bridged together to appear as a single logical link from | physical links bridged together to appear as a single logical link from | |||
the point of view of IP) | the point of view of IP), Multicast DNS <xref target="RFC6762" | |||
<xref target="RFC6762">Multicast DNS</xref> is sufficient for client | format="default"></xref> is sufficient for client devices | |||
devices | ||||
to look up the ".local" host names of peers on the same home network, | to look up the ".local" host names of peers on the same home network, | |||
and | and to use Multicast DNS-based | |||
to use Multicast <xref target="RFC6763">DNS-Based Service Discovery | Service Discovery (DNS-SD) <xref target="RFC6763" | |||
(DNS-SD)</xref> | format="default"></xref> to discover services offered on that | |||
to discover services offered on that home network.</t> | home network.</t> | |||
<t>For a larger network consisting of multiple links that are | <t>For a larger network consisting of multiple links that are | |||
interconnected using IP-layer routing instead of link-layer bridging, | interconnected using IP-layer routing instead of link-layer bridging, | |||
link-local Multicast DNS alone is insufficient because link-local | link-local Multicast DNS alone is insufficient because link-local | |||
Multicast DNS packets, by design, are not propagated onto other | Multicast DNS packets, by design, are not propagated onto other | |||
links.</t> | links.</t> | |||
<t>Using link-local multicast packets for Multicast DNS was a conscious | ||||
<t>Using link-local multicast packets for Multicast DNS | design choice <xref target="RFC6762" format="default"/>. Even when | |||
was a conscious design choice <xref target="RFC6762"/>. | limited to a single link, multicast traffic is still generally | |||
Even when limited to a single link, multicast traffic is still | considered to be more expensive than unicast, because multicast traffic | |||
generally considered to be more expensive than unicast, because | impacts many devices instead of just a single recipient. In addition, | |||
multicast traffic impacts many devices, instead of just a single | with some technologies like Wi-Fi <xref target="IEEE-11" | |||
recipient. | format="default"></xref>, multicast traffic is inherently less | |||
In addition, with some technologies like <xref | efficient and less reliable than unicast, because Wi-Fi multicast | |||
target="IEEE-11">Wi-Fi</xref>, | traffic is sent at lower data rates, and is not acknowledged <xref | |||
multicast traffic is inherently less efficient and less reliable than | target="I-D.ietf-mboned-ieee802-mcast-problems" format="default"/>. | |||
unicast, because | Increasing the amount of expensive multicast traffic by flooding it | |||
Wi-Fi multicast traffic is sent at lower data rates, and is not | across multiple links would make the traffic load even worse.</t> | |||
acknowledged <xref target="Mcast"/>. | ||||
Increasing the amount of expensive multicast traffic by flooding | ||||
it across multiple links would make the traffic load even worse.</t> | ||||
<t>Partitioning the network into many small links curtails the spread | <t>Partitioning the network into many small links curtails the spread | |||
of expensive multicast traffic, but limits the discoverability of | of expensive multicast traffic but limits the discoverability of | |||
services. | services. | |||
At the opposite end of the spectrum, using a very large local link with | At the opposite end of the spectrum, using a very large local link with | |||
thousands of hosts enables better | thousands of hosts enables better | |||
service discovery, but at the cost of larger amounts of multicast | service discovery but at the cost of larger amounts of multicast | |||
traffic.</t> | traffic.</t> | |||
<t>Performing DNS-based Service Discovery using purely Unicast DNS is | ||||
<t>Performing DNS-Based Service Discovery using purely Unicast DNS is | more efficient and doesn't require large multicast domains but does | |||
more efficient and doesn't require large multicast domains, but does | ||||
require that the relevant data be available in the Unicast DNS | require that the relevant data be available in the Unicast DNS | |||
namespace. | namespace. | |||
The Unicast DNS namespace in question could fall within a traditionally | The Unicast DNS namespace in question could fall within a traditionally | |||
assigned globally unique domain name, or could use a private local | assigned globally unique domain name, or it could be within a private | |||
unicast domain name such as ".home.arpa" <xref target="RFC8375"/>.</t> | local | |||
unicast domain name such as ".home.arpa" <xref target="RFC8375" | ||||
<t>In the <xref target="RFC6763">DNS-SD specification</xref>, | format="default"/>.</t> | |||
Section 10 ("Populating the DNS with Information") | <t>In the DNS-SD specification <xref target="RFC6763" | |||
discusses various possible ways that a service's PTR, SRV, TXT and | sectionFormat="comma" section="10"/> ("Populating | |||
address records can make their way into the Unicast DNS namespace, | the DNS with Information") discusses various possible ways that a | |||
including manual zone file configuration | service's PTR, SRV, TXT, and address records can make their way into the | |||
<xref target="RFC1034"/> <xref target="RFC1035"/>, | Unicast DNS namespace, including manual zone file configuration <xref | |||
DNS Update <xref target="RFC2136"/> <xref target="RFC3007"/> | target="RFC1034" format="default"/> <xref target="RFC1035" | |||
and proxies of various kinds.</t> | format="default"/>, DNS Update <xref target="RFC2136" | |||
format="default"/> <xref target="RFC3007" format="default"/>, and | ||||
proxies | ||||
of various kinds.</t> | ||||
<t>Making the relevant data available in the Unicast DNS namespace | <t>One option is to make the relevant data available in the Unicast DNS | |||
by manual DNS configuration is one option. This option has been used | namespace by | |||
for many years at IETF meetings to advertise the IETF Terminal Room | manual DNS configuration. This option has been used for | |||
printer. | many years at IETF meetings to advertise the IETF terminal room printer. | |||
Details of this example are given in Appendix A of | Details of this example are given in <xref | |||
<xref target="Roadmap">the Roadmap document</xref>. | target="I-D.cheshire-dnssd-roadmap" sectionFormat="of" section="A">the | |||
However, this manual DNS configuration is labor intensive, | Roadmap document</xref>. However, this manual DNS configuration is | |||
error prone, and requires a reasonable degree of DNS expertise.</t> | labor intensive, error prone, and requires a reasonable degree of DNS | |||
expertise.</t> | ||||
<t>Populating the Unicast DNS namespace via DNS Update by the | <t>Another option is to populate the Unicast DNS namespace by having | |||
devices offering the services themselves is another option <xref | the devices offering the services do that themselves, using DNS Update | |||
target="RegProt"/> <xref target="DNS-UL"/>. | <xref target="I-D.sctl-service-registration" format="default"/> | |||
<xref target="I-D.sekar-dns-ul" format="default"/>. | ||||
However, this requires configuration | However, this requires configuration | |||
of DNS Update keys on those devices, which has proven onerous and | of DNS Update keys on those devices, which has proven onerous and | |||
impractical for simple devices like printers and network cameras.</t> | impractical for simple devices like printers and network cameras.</t> | |||
<t>Hence, to facilitate efficient and reliable DNS-based Service | ||||
<t>Hence, to facilitate efficient and reliable DNS-Based Service | ||||
Discovery, | Discovery, | |||
a compromise is needed that combines the ease-of-use of | a hybrid is needed that combines the ease of use of | |||
Multicast DNS with the efficiency and scalability of Unicast DNS.</t> | Multicast DNS with the efficiency and scalability of Unicast DNS.</t> | |||
<t>This document specifies a type of proxy called a "Discovery Proxy" | <t>This document specifies a type of proxy called a "Discovery Proxy" | |||
that uses <xref target="RFC6762">Multicast DNS</xref> to discover | that uses Multicast DNS <xref target="RFC6762" format="default"></xref> | |||
Multicast DNS records on its local link, and makes corresponding | to discover | |||
Multicast DNS records on its local link on demand, and makes | ||||
corresponding | ||||
DNS records visible in the Unicast DNS namespace.</t> | DNS records visible in the Unicast DNS namespace.</t> | |||
<t>In principle, similar mechanisms could be defined | ||||
<t>In principle, similar mechanisms could be defined using other | for other local discovery protocols, by creating a proxy that | |||
local service discovery protocols, to discover local information | (i) uses the protocol in question to discover local information on | |||
and then make corresponding DNS records visible in the Unicast | demand, and then | |||
DNS namespace. Such mechanisms for other local service discovery | (ii) makes corresponding DNS records visible in the Unicast | |||
DNS namespace. Such mechanisms for other local discovery | ||||
protocols could be addressed in future documents.</t> | protocols could be addressed in future documents.</t> | |||
<t>The design of the Discovery Proxy is guided by the previously | <t>The design of the Discovery Proxy is guided by the previously | |||
published | published DNS-based Service Discovery requirements document | |||
<xref target="RFC7558">requirements document</xref>.</t> | <xref target="RFC7558" format="default"></xref>.</t> | |||
<t>In simple terms, a descriptive DNS name is chosen for | <t>In simple terms, a descriptive DNS name is chosen for | |||
each link in an organization. | each link in an organization. | |||
Using a DNS NS record, responsibility for that DNS name is delegated to | Using a DNS NS record, responsibility for that DNS name is delegated to | |||
a Discovery Proxy physically attached to that link. | a Discovery Proxy physically attached to that link. | |||
Now, when a remote client issues a unicast query for a name falling | When a remote client issues a unicast query for a name falling | |||
within | within | |||
the delegated subdomain, the normal DNS delegation mechanism | the delegated subdomain, the normal DNS delegation mechanism | |||
results in the unicast query arriving at the Discovery Proxy, | results in the unicast query arriving at the Discovery Proxy, | |||
since it has been declared authoritative for those names. | since it has been declared authoritative for those names. | |||
Now, instead of consulting a textual zone file on disk to discover | Now, instead of consulting a textual zone file on disk to discover | |||
the answer to the query, as a traditional DNS server would, | the answer to the query as a traditional authoritative DNS server would, | |||
a Discovery Proxy consults its local link, using Multicast DNS, | a Discovery Proxy consults its local link, using Multicast DNS, | |||
to find the answer to the question.</t> | to find the answer to the question.</t> | |||
<t>For fault tolerance reasons there may be more than one | <t>For fault tolerance reasons, there may be more than one | |||
Discovery Proxy serving a given link.</t> | Discovery Proxy serving a given link.</t> | |||
<t>Note that the Discovery Proxy uses a "pull" model. | <t>Note that the Discovery Proxy uses a "pull" model. | |||
The local link is not queried using Multicast DNS until some remote | Until some remote client has requested data, | |||
client has requested that data. In the idle state, in the absence | the local link is not queried using Multicast DNS. | |||
In the idle state, in the absence | ||||
of client requests, the Discovery Proxy sends no packets and imposes | of client requests, the Discovery Proxy sends no packets and imposes | |||
no burden on the network. It operates purely "on demand".</t> | no burden on the network. It operates purely "on demand".</t> | |||
<t>An alternative proposal that has been discussed is a proxy that | <t>An alternative proposal that has been discussed is a proxy that | |||
performs | performs DNS updates to a remote DNS server on behalf of the Multicast | |||
DNS updates to a remote DNS server on behalf of the Multicast DNS | DNS devices on the local network. The difficulty with this is that | |||
devices on the local network. | Multicast DNS devices do not routinely announce their records on the | |||
The difficulty with this is is that | network. Generally, they remain silent until queried. This means that | |||
Multicast DNS devices do not routinely announce their records | the complete set of Multicast DNS records in use on a link can only be | |||
on the network. Generally they remain silent until queried. | discovered by active querying, not by passive listening. Because of | |||
This means that the complete set of Multicast DNS records in use on a | this, a proxy can only know what names exist on a link by issuing | |||
link can only be discovered by active querying, not by passive | queries for them, and since it would be impractical to issue queries for | |||
listening. | every possible name just to find out which names exist and which do not, | |||
Because of this, a proxy can only know what names exist on a link | there is no reasonable way for a proxy to programmatically learn all the | |||
by issuing queries for them, and since it would be impractical to | answers it would need to push up to the remote DNS server using DNS | |||
issue queries for every possible name just to find out which names | Update. Even if such a mechanism were possible, it would risk | |||
exist and which do not, there is no reasonable way for a proxy to | generating high load on the network continuously, even when there are no | |||
programmatically learn all the answers it would need to push up to | clients with any interest in that data.</t> | |||
the remote DNS server using DNS Update. | ||||
Even if such a mechanism were possible, it would risk generating | ||||
high load on the network continuously, even when there are | ||||
no clients with any interest in that data.</t> | ||||
<t>Hence, having a model where the query comes to the Discovery Proxy | <t>Hence, having a model where the query comes to the Discovery Proxy | |||
is much more efficient than | is much more efficient than | |||
a model where the Discovery Proxy pushes the answers out | a model where the Discovery Proxy pushes the answers out | |||
to some other remote DNS server.</t> | to some other remote DNS server.</t> | |||
<t>A client seeking to discover services and other information performs | ||||
<t>A client seeking to discover services and other information | this by sending traditional DNS queries to the Discovery Proxy or by | |||
achieves this by sending traditional DNS queries to the Discovery Proxy, | sending DNS Push Notification subscription requests <xref | |||
or by sending | target="RFC8765" format="default"></xref>.</t> | |||
<xref target="Push">DNS Push Notification subscription | <t>How a client discovers what domain name(s) to use for its | |||
requests</xref>.</t> | DNS-based Service Discovery queries | |||
(and, consequently, what Discovery Proxy or Proxies to use) | ||||
<t>How a client discovers what domain name(s) to use for its service | is described in <xref target="dom-enum" format="default"/>.</t> | |||
discovery queries, | ||||
(and consequently what Discovery Proxy or Proxies to use) | ||||
is described in <xref target="dom-enum"/>.</t> | ||||
<t>The diagram below illustrates a network topology using a | <t>The diagram below illustrates a network topology using a | |||
Discovery Proxy to provide discovery service to a remote client.</t> | Discovery Proxy to provide discovery service to a remote client.</t> | |||
<figure><artwork> | <figure> | |||
+--------+ Unicast +-----------+ +---------+ +---------+ | <name>Example Deployment</name> | |||
| Remote | Communcation | Discovery | | Network | | Network | | <artwork name="" type="" align="center" alt=""><![CDATA[ | |||
| Client |---- . . . -----| Proxy | | Printer | | Camera | | +--------+ Unicast +-----------+ +---------+ +---------+ | |||
+--------+ +-----------+ +---------+ +---------+ | | Remote | Communication | Discovery | | Network | | Network | | |||
| | | | | Client |---- . . . ----| Proxy | | Printer | | Camera | | |||
-------------------------------------------- | +--------+ +-----------+ +---------+ +---------+ | |||
| | | | | ||||
------------ -------------------------------------------- | ||||
Multicast-capable LAN segment (e.g., Ethernet) | Multicast-capable LAN segment (e.g., Ethernet) | |||
</artwork></figure> | ||||
<?rfc needLines="31" ?> | ]]></artwork> | |||
</section> | </figure> | |||
<section title="Operational Analogy"> | <t>Note that there need not be any Discovery Proxy on the link | |||
<t>A Discovery Proxy does not operate as a multicast relay, or multicast | to which the remote client is directly attached. | |||
forwarder. | The remote client communicates directly with the Discovery Proxy | |||
There is no danger of multicast forwarding loops that result in traffic | using normal unicast TCP/IP communication mechanisms, | |||
storms, | potentially spanning multiple IP hops, | |||
because no multicast packets are forwarded. | possibly including VPN tunnels and other similar | |||
A Discovery Proxy operates as a *proxy* for a remote client, | long-distance communication channels. | |||
performing queries on its behalf and reporting the results back.</t> | </t> | |||
<t>A reasonable analogy is making a telephone call to a colleague | </section> | |||
at your workplace and saying, "I'm out of the office right now. Would | ||||
you | <section numbered="true" toc="default"> | |||
<name>Operational Analogy</name> | ||||
<t>A Discovery Proxy does not operate as a multicast relay or multicast | ||||
forwarder. There is no danger of multicast forwarding loops that result | ||||
in traffic storms, because no multicast packets are forwarded. A | ||||
Discovery Proxy operates as a <em>proxy</em> for remote clients, | ||||
performing | ||||
queries on their behalf and reporting the results back.</t> | ||||
<t>A reasonable analogy is making a telephone call to a colleague at | ||||
your workplace and saying, "I'm out of the office right now. Would you | ||||
mind bringing up a printer browser window and telling me the names of | mind bringing up a printer browser window and telling me the names of | |||
the | the printers you see?" That entails no risk of a forwarding loop causing | |||
printers you see?" That entails no risk of a forwarding loop causing a | a traffic storm, because no multicast packets are sent over the | |||
traffic storm, because no multicast packets are sent over the telephone | telephone call.</t> | |||
call.</t> | ||||
<t>A similar analogy, instead of enlisting another human being | <t>A similar analogy, instead of enlisting another human being | |||
to initiate the service discovery operation on your behalf, is | to initiate the service discovery operation on your behalf, is | |||
to log into your own desktop work computer using screen sharing, | to log in to your own desktop work computer using screen sharing | |||
and then run the printer browser yourself to see the list of printers. | and then run the printer browser yourself to see the list of printers. | |||
Or log in using ssh and type "dns-sd -B _ipp._tcp" and observe the | Or, log in using Secure Shell (ssh) and type "dns-sd -B _ipp._tcp" and | |||
observe the | ||||
list of discovered printer names. In neither case is there any risk | list of discovered printer names. In neither case is there any risk | |||
of a forwarding loop causing a traffic storm, because no multicast | of a forwarding loop causing a traffic storm, because no multicast | |||
packets are being sent over the screen sharing or ssh connection.</t> | packets are being sent over the screen-sharing or ssh connection.</t> | |||
<t>The Discovery Proxy provides another way of performing remote | <t>The Discovery Proxy provides another way of performing remote | |||
queries, | queries, | |||
except using a different protocol instead of screen sharing or ssh.</t> | which uses a different protocol instead of screen sharing or ssh. | |||
The Discovery Proxy mechanism can be thought of as a custom Remote | ||||
Procedure Call (RPC) protocol that allows a remote client to exercise | ||||
the Multicast DNS APIs on the Discovery Proxy device, just as a local | ||||
client running on the Discovery Proxy device would use those APIs.</t> | ||||
<t>When the Discovery Proxy software performs Multicast DNS | <t>When the Discovery Proxy software performs Multicast DNS | |||
operations, the exact same Multicast DNS caching mechanisms are | operations, the exact same Multicast DNS caching mechanisms are | |||
applied as when any other client software on that Discovery Proxy | applied as when any other client software on that Discovery Proxy | |||
device performs Multicast DNS operations, whether that be running | device performs Multicast DNS operations, regardless of whether that be | |||
a printer browser client locally, or a remote user running the | running | |||
printer browser client via a screen sharing connection, or a remote | a printer browser client locally, a remote user running the | |||
printer browser client via a screen-sharing connection, a remote | ||||
user logged in via ssh running a command-line tool like "dns-sd", | user logged in via ssh running a command-line tool like "dns-sd", | |||
or a remote user sending DNS requests that cause a Discovery Proxy | or a remote user sending DNS requests that cause a Discovery Proxy | |||
to perform discovery operations on its behalf.</t> | to perform discovery operations on its behalf.</t> | |||
<?rfc needLines="15" ?> | ||||
</section> | </section> | |||
<section title="Conventions and Terminology Used in this Document"> | <section numbered="true" toc="default"> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | <name>Conventions and Terminology Used in This Document</name> | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY",<vspace | ||||
/> | <t> | |||
and "OPTIONAL" in this document are to be interpreted as | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
described<vspace /> | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
in "Key words for use in RFCs to Indicate Requirement Levels",<vspace /> | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
when, and only when, they appear in all capitals, as shown here<vspace | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
/> | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
<xref target="RFC2119"/> <xref target="RFC8174"/>.</t> | to be interpreted as | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | ||||
when, and only when, they appear in all capitals, as shown here. | ||||
</t> | ||||
<t>The Discovery Proxy builds on Multicast DNS, | <t>The Discovery Proxy builds on Multicast DNS, | |||
which works between hosts on the same link. | which works between hosts on the same link. | |||
For the purposes of this document | For the purposes of this document, | |||
a set of hosts is considered to be "on the same link" if: | a set of hosts is considered to be "on the same link" if: | |||
<list style='symbols'> | </t> | |||
<t>when any host from that set sends a packet to any other host | ||||
<ul spacing="normal"> | ||||
<li>when any host from that set sends a packet to any other host | ||||
in that set, using unicast, multicast, or broadcast, the entire | in that set, using unicast, multicast, or broadcast, the entire | |||
link-layer packet payload arrives unmodified, and</t> | link-layer packet payload arrives unmodified, and</li> | |||
<t>a broadcast sent over that link, by any host from that set of | <li>a broadcast sent over that link, by any host from that set of | |||
hosts, | hosts, | |||
can be received by every other host in that set.</t> | can be received by every other host in that set.</li> | |||
</list> | </ul> | |||
<t> | ||||
The link-layer *header* may be modified, such as in | The link-layer <em>header</em> may be modified, such as in Token Ring | |||
<xref target="IEEE-5">Token Ring Source Routing</xref>, | Source Routing | |||
but not the link-layer *payload*. | <xref target="IEEE-5" format="default"></xref>, | |||
but not the link-layer <em>payload</em>. | ||||
In particular, if any device forwarding a packet modifies any | In particular, if any device forwarding a packet modifies any | |||
part of the IP header or IP payload then the packet is no longer | part of the IP header or IP payload, then the packet is no longer | |||
considered to be on the same link. This means that the packet may | considered to be on the same link. This means that the packet may | |||
pass through devices such as repeaters, bridges, hubs or switches | pass through devices such as repeaters, bridges, hubs, or switches | |||
and still be considered to be on the same link for the purpose of | and still be considered to be on the same link for the purpose of | |||
this document, but not through a device such as an IP router that | this document, but not through a device such as an IP router that | |||
decrements the IP TTL or otherwise modifies the IP header.</t> | decrements the IP TTL or otherwise modifies the IP header.</t> | |||
</section> | </section> | |||
<section anchor="compatibility" title="Compatibility Considerations"> | <section anchor="compatibility" numbered="true" toc="default"> | |||
<name>Compatibility Considerations</name> | ||||
<t>No changes to existing devices are required to work with a Discovery | <t>No changes to existing devices are required to work with a Discovery | |||
Proxy.</t> | Proxy.</t> | |||
<t>Existing devices that advertise services using Multicast DNS work | <t>Existing devices that advertise services using Multicast DNS work | |||
with Discovery Proxy.</t> | with a Discovery Proxy.</t> | |||
<t>Existing clients that support DNS-Based Service Discovery over | ||||
Unicast DNS | ||||
work with Discovery Proxy. | ||||
Service Discovery over Unicast DNS was introduced in Mac OS X 10.4 in | ||||
April 2005, | ||||
as is included in Apple products introduced since then, including iPhone | ||||
and iPad, | ||||
as well as products from other vendors, such as Microsoft Windows | ||||
10.</t> | ||||
<t>An overview of the larger collection of related Service Discovery | ||||
technologies, and how Discovery Proxy relates to those, is given in | ||||
<xref target="Roadmap">the Service Discovery Road Map | ||||
document</xref>.</t> | ||||
<?rfc needLines="22" ?> | <t>Existing clients that support DNS-based Service Discovery over | |||
Unicast DNS work with a Discovery Proxy. DNS-based Service Discovery | ||||
over Unicast | ||||
DNS was introduced in Mac OS X 10.4 Tiger in April 2005 and has been | ||||
included in | ||||
Apple products introduced since then, including the iPhone and iPad. | ||||
It has also been included in | ||||
products from other vendors, such as Microsoft Windows 10.</t> | ||||
<t>An overview of the larger collection of associated DNS-based Service | ||||
Discovery | ||||
technologies, and how the Discovery Proxy technology relates to those, | ||||
is given in the | ||||
Service Discovery Road Map document <xref | ||||
target="I-D.cheshire-dnssd-roadmap" format="default"></xref>.</t> | ||||
</section> | </section> | |||
<section anchor="operation" title="Discovery Proxy Operation"> | <section anchor="operation" numbered="true" toc="default"> | |||
<name>Discovery Proxy Operation</name> | ||||
<t>In a typical configuration, a Discovery Proxy is configured | <t>In a typical configuration, a Discovery Proxy is configured | |||
to be authoritative <xref target="RFC1034"/> <xref target="RFC1035"/> | to be authoritative <xref target="RFC1034" format="default"/> <xref | |||
for four or more DNS subdomains, and authority | target="RFC1035" format="default"/> | |||
for these subdomains is delegated to it via NS records: | for four or more DNS subdomains, listed below. | |||
<list style="hanging"> | Authority for these subdomains is delegated | |||
<t hangText="A DNS subdomain for service discovery records."><vspace | from the parent domain to the Discovery Proxy | |||
/> | in the usual way for DNS delegation, via NS records. | |||
</t> | ||||
<dl newline="true" spacing="normal"> | ||||
<dt>A DNS subdomain for DNS-based Service Discovery records.</dt> | ||||
<dd> | ||||
This subdomain name may contain rich text, including | This subdomain name may contain rich text, including | |||
spaces and other punctuation. This is because this | spaces and other punctuation. This is because this | |||
subdomain name is used only in graphical user interfaces, | subdomain name is used only in graphical user interfaces, | |||
where rich text is appropriate.</t> | where rich text is appropriate.</dd> | |||
<t hangText="A DNS subdomain for host name records."><vspace /> | <dt>A DNS subdomain for host name records.</dt> | |||
This subdomain name SHOULD be limited to letters, digits and | <dd> | |||
hyphens, | This subdomain name <bcp14>SHOULD</bcp14> be limited to letters, | |||
to facilitate convenient use of host names in command-line | digits, and | |||
interfaces.</t> | hyphens in order to facilitate the convenient use of host | |||
<t hangText="One or more DNS subdomains for IPv4 Reverse Mapping | names in | |||
records."><vspace /> | command-line | |||
These subdomains will have names that ends in "in-addr.arpa."</t> | interfaces.</dd> | |||
<t hangText="One or more DNS subdomains for IPv6 Reverse Mapping | <dt>One or more DNS subdomains for IPv4 Reverse Mapping records.</dt> | |||
records."><vspace /> | <dd> | |||
These subdomains will have names that ends in "ip6.arpa."</t> | These subdomains will have names that end in "in-addr.arpa".</dd> | |||
</list> | <dt>One or more DNS subdomains for IPv6 Reverse Mapping records.</dt> | |||
</t> | <dd> | |||
These subdomains will have names that end in "ip6.arpa".</dd> | ||||
<t>In an enterprise network the naming and delegation of these | </dl> | |||
<t>In an enterprise network, the naming and delegation of these | ||||
subdomains | subdomains | |||
is typically performed by conscious action of the network administrator. | is typically performed by conscious action of the network administrator. | |||
In a home network naming and delegation would typically be performed | In a home network, naming and delegation would typically be performed | |||
using some automatic configuration mechanism such as HNCP | using some automatic configuration mechanism such as Home Networking | |||
<xref target="RFC7788"/>.</t> | Control Protocol (HNCP) | |||
<xref target="RFC7788" format="default"/>.</t> | ||||
<t>These three varieties of delegated subdomains | <t>These three varieties of delegated subdomains | |||
(service discovery, host names, and reverse mapping) are described below | (service discovery, host names, and reverse mapping) are described below | |||
in | in Sections <xref target="dom-sd" format="counter"/>, <xref | |||
<xref target="dom-sd"/>, | target="dom-host" format="counter"/>, and <xref target="dom-rev" | |||
<xref target="dom-host"/> and | format="counter"/>.</t> | |||
<xref target="dom-rev"/>.</t> | <t>How a client discovers where to issue its DNS-based Service Discovery | |||
queries | ||||
<t>How a client discovers where to issue its service discovery queries | is described in <xref target="dom-enum" format="default"/>.</t> | |||
is described | <section anchor="dom-sd" numbered="true" toc="default"> | |||
below in <xref target="dom-enum"/>.</t> | <name>Delegated Subdomain for DNS-based Service Discovery | |||
Records</name> | ||||
<?rfc needLines="28" ?> | <t>In its simplest form, each link in an organization | |||
<section anchor="dom-sd" title="Delegated Subdomain for Service | is assigned a unique Unicast DNS domain name such as | |||
Discovery Records"> | ||||
<t>In its simplest form, each link in an organization | ||||
is assigned a unique Unicast DNS domain name, such as | ||||
"Building 1.example.com" or | "Building 1.example.com" or | |||
"2nd Floor.Building 3.example.com". | "2nd Floor.Building 3.example.com". | |||
Grouping multiple links under a single Unicast DNS domain | Grouping multiple links under a single Unicast DNS domain | |||
name is to be specified in a future companion document, but for | name is to be specified in a future companion document, but for | |||
the purposes of this document, assume that each link has its own | the purposes of this document, assume that each link has its own | |||
unique Unicast DNS domain name. | unique Unicast DNS domain name. | |||
In a graphical user interface these names are not displayed | In a graphical user interface these names are not displayed | |||
as strings with dots as shown above, but something more | as strings with dots as shown above, but something more | |||
akin to a typical file browser graphical user interface | akin to a typical file browser graphical user interface | |||
(which is harder to illustrate in a text-only document) | (which is harder to illustrate in a text-only document) | |||
showing folders, subfolders and files in a file system. | showing folders, subfolders, and files in a file system. | |||
<figure align="left" anchor="browser" title="Illustrative | </t> | |||
GUI"><artwork><![CDATA[ | ||||
<figure anchor="browser"> | ||||
<name>Illustrative GUI | ||||
</name> | ||||
<artwork align="center" name="" type="" alt=""><![CDATA[ | ||||
+---------------+--------------+-------------+-------------------+ | +---------------+--------------+-------------+-------------------+ | |||
| *example.com* | Building 1 | 1st Floor | Alice's printer | | | *example.com* | Building 1 | 1st Floor | Alice's printer | | |||
| | Building 2 | *2nd Floor* | Bob's printer | | | | Building 2 | *2nd Floor* | Bob's printer | | |||
| | *Building 3* | 3rd Floor | Charlie's printer | | | | *Building 3* | 3rd Floor | Charlie's printer | | |||
| | Building 4 | 4th Floor | | | | | Building 4 | 4th Floor | | | |||
| | Building 5 | | | | | | Building 5 | | | | |||
| | Building 6 | | | | | | Building 6 | | | | |||
+---------------+--------------+-------------+-------------------+]]></artwork> | +---------------+--------------+-------------+-------------------+ | |||
</figure> | ||||
</t> | ||||
<t>Each named link in an organization has one or more Discovery Proxies | ||||
which | ||||
serve it. This Discovery Proxy function for each link could be performed | ||||
by a | ||||
device like a router or switch that is physically attached to that link. | ||||
In the parent domain, NS records | ||||
are used to delegate ownership of each defined link name | ||||
(e.g., "Building 1.example.com") | ||||
to the one or more Discovery Proxies that serve the named link. | ||||
In other words, the Discovery Proxies are the authoritative name | ||||
servers for that subdomain. | ||||
As in the rest of DNS-Based Service Discovery, all names are represented | ||||
as-is | ||||
using plain UTF-8 encoding, and, as described in <xref | ||||
target="notrans"/>, | ||||
no text encoding translations are performed.</t> | ||||
<t>With appropriate <xref target="IEEE-1Q">VLAN configuration</xref> | ]]></artwork> | |||
a single Discovery Proxy device could have a logical presence on | </figure> | |||
many links, and serve as the Discovery Proxy for all those links. | ||||
In such a configuration the Discovery Proxy device would have a single | ||||
physical <xref target="IEEE-3">Ethernet</xref> port, configured as a | ||||
VLAN trunk port, which would appear to software on that device as | ||||
multiple | ||||
virtual Ethernet interfaces, one connected to each of the VLAN | ||||
links.</t> | ||||
<t>As an alternative to using VLAN technology, using a | <t>Each named link in an organization has one or more Discovery | |||
<xref target="Relay">Multicast DNS Discovery Relay</xref> | Proxies that serve it. This Discovery Proxy function | |||
could be performed by a device like a router or switch that is | ||||
physically attached to that link. In the parent domain, NS records | ||||
are used to delegate ownership of each defined link name | ||||
(e.g., "Building 1.example.com") to one or more | ||||
Discovery Proxies that serve the named link. In other words, the | ||||
Discovery Proxies are the authoritative name servers for that | ||||
subdomain. As in the rest of DNS-based Service Discovery, all names | ||||
are represented as-is using plain UTF-8 encoding and, as described in | ||||
<xref target="notrans" format="default"/>, no text-encoding | ||||
translations are performed.</t> | ||||
<t>With appropriate VLAN | ||||
configuration <xref target="IEEE-1Q" format="default"></xref>, a | ||||
single Discovery Proxy device could have a | ||||
logical presence on many links and serve as the Discovery Proxy for | ||||
all those links. In such a configuration, the Discovery Proxy device | ||||
would have a single physical Ethernet <xref target="IEEE-3" | ||||
format="default"></xref> port, configured as a VLAN trunk | ||||
port, which would appear to software on that device as multiple | ||||
virtual Ethernet interfaces, one connected to each of the VLAN | ||||
links.</t> | ||||
<t>As an alternative to using VLAN technology, using a Multicast DNS | ||||
Discovery Relay | ||||
<xref target="I-D.sctl-dnssd-mdns-relay" format="default"></xref> | ||||
is another way that a Discovery Proxy can have | is another way that a Discovery Proxy can have | |||
a ‘virtual’ presence on a remote link.</t> | a "virtual" presence on a remote link.</t> | |||
<t>When a DNS-SD client issues a Unicast DNS query to discover | ||||
<?rfc needLines="6" ?> | services in a particular Unicast DNS subdomain | |||
<t>When a DNS-SD client issues a Unicast DNS query to discover services | (e.g., "_ipp._tcp.Building 1.example.com. PTR ?"), | |||
in a particular Unicast DNS subdomain | the normal DNS delegation mechanism results in that query being | |||
(e.g., "_printer._tcp.Building 1.example.com. PTR ?") | forwarded until it reaches the delegated authoritative name server for | |||
the normal DNS delegation mechanism results in that query being | that subdomain, namely, the Discovery Proxy on the link in question. | |||
forwarded until it reaches the delegated authoritative name server | Like a conventional Unicast DNS server, a Discovery Proxy implements | |||
for that subdomain, namely the Discovery Proxy on the link in question. | the usual Unicast DNS protocol <xref target="RFC1034" | |||
Like a conventional Unicast DNS server, | format="default"/> <xref target="RFC1035" format="default"/> over UDP | |||
a Discovery Proxy implements the usual Unicast DNS protocol | and TCP. However, unlike a conventional Unicast DNS server that | |||
<xref target="RFC1034"/> <xref target="RFC1035"/> over UDP and TCP. | generates answers from the data in its manually configured zone file, | |||
However, unlike a conventional Unicast DNS server that | a Discovery Proxy learns answers using Multicast DNS. A Discovery | |||
generates answers from the data in its manually-configured zone file, | Proxy does this by consulting its Multicast DNS cache and/or issuing | |||
a Discovery Proxy generates answers using Multicast DNS. | Multicast DNS queries, as appropriate according to the usual protocol | |||
A Discovery Proxy does this by consulting | rules of Multicast DNS <xref target="RFC6762" | |||
its Multicast DNS cache and/or issuing Multicast DNS queries, | format="default"></xref>, | |||
as appropriate, according to the usual protocol | for the corresponding Multicast DNS name, type, and class, with the | |||
rules of <xref target="RFC6762">Multicast DNS</xref>, | delegated zone part of the name replaced with ".local" (e.g., in | |||
for the corresponding Multicast DNS name, type and class, | this case, "_ipp._tcp.local. PTR ?"). Then, from the | |||
with the delegated zone part of the name replaced with ".local" | received Multicast DNS data, the Discovery Proxy synthesizes the | |||
(e.g., in this case, "_printer._tcp.local. PTR ?"). | appropriate Unicast DNS response, with the ".local" top-level label | |||
Then, from the received Multicast DNS data, the Discovery Proxy | of the owner name | |||
synthesizes the appropriate Unicast DNS response, with the | replaced with the name of the delegated zone. | |||
".local" top-level label replaced with with the name of the delegated | Further details of the name translation rules are | |||
zone. | described in <xref target="translation" format="default"/>. | |||
How long the Discovery Proxy should wait to accumulate Multicast DNS | Rules specifying how long the Discovery | |||
responses before sending its unicast reply is described below in <xref | Proxy should wait to accumulate Multicast DNS responses before sending | |||
target="aggregation"/>.</t> | its unicast reply are described in <xref target="aggregation" | |||
format="default"/>. | ||||
<t>The existing Multicast DNS caching mechanism is used | </t> | |||
to minimize unnecessary Multicast DNS queries on the wire. | <t>The existing Multicast DNS caching mechanism is used to minimize | |||
The Discovery Proxy is acting as a client of the underlying Multicast | unnecessary Multicast DNS queries on the wire. The Discovery Proxy is | |||
DNS | acting as a client of the underlying Multicast DNS subsystem and | |||
subsystem, and benefits from the same caching and efficiency | benefits from the same caching and efficiency measures as any other | |||
measures as any other client using that subsystem.</t> | client using that subsystem.</t> | |||
<t>Note that the contents of the delegated zone, generated as it is by | ||||
<t>Note that the contents of the delegated zone, | performing ".local" Multicast DNS queries, mirrors the records | |||
generated as it is by performing ".local" Multicast DNS queries, | available on the local link via Multicast DNS very closely, but not | |||
mirrors the records available on the local link via Multicast DNS | precisely. There is not a full bidirectional equivalence between the | |||
very closely, but not precisely. | two. Certain records that are available via Multicast DNS may not | |||
There is not a full bidirectional equivalence between the two. | have equivalents in the delegated zone possibly because they are | |||
Certain records that are available via Multicast DNS may not have | invalid or not relevant in the delegated zone or because they are | |||
equivalents in the delegated zone, | being suppressed because they are unusable outside the local link (see | |||
possibly because they are invalid or not relevant in the delegated zone, | <xref target="unusable" format="default"/>). Conversely, certain | |||
or | records that appear in the delegated zone may not have corresponding | |||
because they are being supressed because they are unusable outside the | records available on the local link via Multicast DNS. In particular, | |||
local link | there are certain administrative SRV records (see <xref target="admin" | |||
(see <xref target="unusable"/>). | format="default"/>) that logically fall within the delegated zone but | |||
Conversely, certain records that appear in the delegated zone may not | semantically represent metadata <em>about</em> the zone rather than | |||
have | records | |||
corresponding records available on the local link via Multicast DNS. | <em>within</em> the zone. Consequently, these administrative records | |||
In particular there are certain administrative SRV records | in | |||
(see <xref target="admin"/>) that logically fall within the delegated | the delegated zone do not have any corresponding counterparts in the | |||
zone, | Multicast DNS namespace of the local link.</t> | |||
but semantically represent metadata *about* the zone rather than records | </section> | |||
*within* the zone, and consequently these administrative records in the | ||||
delegated zone | ||||
do not have any corresponding counterparts in the Multicast DNS | ||||
namespace of the local link.</t> | ||||
<?rfc needLines="26" ?> | <section anchor="dom-enum" numbered="true" toc="default"> | |||
</section> | <name>Domain Enumeration</name> | |||
<t>A DNS-SD client performs Domain Enumeration <xref target="RFC6763" | ||||
format="default"/> via certain PTR queries, using both unicast and | ||||
multicast.</t> | ||||
<section anchor="dom-enum" title="Domain Enumeration"> | <t>If a DNS-SD client receives a Domain Name configuration via DHCP | |||
<t>A DNS-SD client performs Domain Enumeration <xref | then it issues | |||
target="RFC6763"/> | unicast queries derived from this domain name. It also issues unicast | |||
via certain PTR queries, using both unicast and multicast. | queries using | |||
If it receives a Domain Name configuration via | names derived from its IPv4 subnet address(es) and IPv6 prefix(es). | |||
<xref target="RFC2132">DHCP option 15</xref>, | These unicast Domain Enumeration queries are described | |||
then it issues unicast queries using this domain. | in <xref target="unicast" format="default"/>. | |||
It issues unicast queries using names derived from its | A DNS-SD client | |||
IPv4 subnet address(es) and | also issues multicast Domain Enumeration queries in the "local" domain | |||
IPv6 prefix(es). | <xref target="RFC6762" format="default"/>, as described in | |||
These are described below in <xref target="unicast"/>. | <xref target="multicast" format="default"/>. The results of all the | |||
It also issues multicast Domain Enumeration queries in the "local" | Domain Enumeration queries are combined for DNS-based Service | |||
domain | Discovery | |||
<xref target="RFC6762"/>. | purposes.</t> | |||
These are described below in <xref target="multicast"/>. | ||||
The results of all the Domain Enumeration queries are combined for | ||||
Service Discovery purposes.</t> | ||||
<section anchor="unicast" title="Domain Enumeration via Unicast | <section anchor="unicast" numbered="true" toc="default"> | |||
Queries"> | <name>Domain Enumeration via Unicast Queries</name> | |||
<t>The administrator creates Domain Enumeration | <t>The (human or automated) administrator creates | |||
PTR records <xref target="RFC6763"/> | Unicast DNS Domain Enumeration PTR records <xref | |||
to inform clients of available service discovery domains. | target="RFC6763" format="default"/> to inform clients of available | |||
Two varieties of such Domain Enumeration PTR records exist; | service discovery domains. Two varieties of such Unicast DNS Domain | |||
those with names derived from the domain name communicated to the | Enumeration | |||
clients via DHCP, | PTR records exist: those with names derived from the domain name | |||
and those with names derived from IPv4 subnet address(es) and IPv6 | communicated to the clients via | |||
prefix(es) in use by the clients. | <xref target="RFC2132" format="default">DHCP option 15</xref>, | |||
Below is an example showing the name-based variety:</t> | and those with names derived | |||
<figure><artwork> | from either IPv4 subnet address(es) or IPv6 prefix(es) in use by the | |||
clients. Below is an example showing the name-based variety, | ||||
where the DHCP server configured the client with the domain name | ||||
"example.com":</t> | ||||
<artwork name="" type="" align="center" alt=""><![CDATA[ | ||||
b._dns-sd._udp.example.com. PTR Building 1.example.com. | b._dns-sd._udp.example.com. PTR Building 1.example.com. | |||
PTR Building 2.example.com. | PTR Building 2.example.com. | |||
PTR Building 3.example.com. | PTR Building 3.example.com. | |||
PTR Building 4.example.com. | PTR Building 4.example.com. | |||
db._dns-sd._udp.example.com. PTR Building 1.example.com. | db._dns-sd._udp.example.com. PTR Building 1.example.com. | |||
lb._dns-sd._udp.example.com. PTR Building | lb._dns-sd._udp.example.com. PTR Building 1.example.com.]]></artwork> | |||
1.example.com.</artwork></figure> | <t>The meaning of these records is defined in the <xref | |||
target="RFC6763" | ||||
<t>The meaning of these records is defined in the | format="default">DNS-based Service | |||
<xref target="RFC6763">DNS Service Discovery specification</xref> | Discovery specification</xref> but, for convenience, is repeated | |||
but for convenience is repeated here. | here. | |||
The "b" ("browse") records tell the client device the | The "b" ("browse") records tell the client device the list of | |||
list of browsing domains to display for the user to select from. | browsing domains to display for the user to select from. The "db" | |||
The "db" ("default browse") record tells the client device | ("default browse") record tells the client device which domain in | |||
which domain in that list should be selected by default. | that list should be selected by default. The "db" domain | |||
The "db" domain MUST be one of the domains in the "b" list; | <bcp14>MUST</bcp14> be one of the domains in the "b" list; if not, | |||
if not then no domain is selected by default. | then no domain is selected by default. The "lb" ("legacy browse") | |||
The "lb" ("legacy browse") record tells the client device which domain | record tells the client device which domain to automatically browse | |||
to automatically browse on behalf of applications that don't implement | on behalf of applications that don't implement user interface for | |||
UI for multi-domain browsing (which is most of them, at the time of | multi-domain | |||
writing). | browsing (which is most of them at the time of writing). The "lb" | |||
The "lb" domain is often the same as the "db" domain, or sometimes | domain is often the same as the "db" domain, or sometimes the "db" | |||
the "db" domain plus one or more others that should be included in | domain plus one or more others that should be included in the list | |||
the list of automatic browsing domains for legacy clients.</t> | of automatic browsing domains for legacy clients.</t> | |||
<t>Note that in the example above, for clarity, space characters in | ||||
<t>Note that in the example above, for clarity, | names are shown as actual spaces. If this data is manually entered | |||
space characters in names are shown as actual spaces. | into a textual zone file for authoritative server software such as | |||
If this data is manually entered into a textual zone file for | BIND, care must be taken because the space character is used as a | |||
authoritative server | field separator, and other characters like dot ('.'), semicolon | |||
software such as BIND, care must be taken because the space character | (';'), dollar ('$'), backslash ('\'), etc., also have special | |||
is used as | meaning. These characters have to be escaped when entered into a | |||
a field separator, and other characters like dot ('.'), semicolon | textual zone file, following the rules in <xref target="RFC1035" | |||
(';'), | sectionFormat="of" section="5.1">the DNS specification</xref>. For | |||
dollar ('$'), backslash ('\'), etc., also have special meaning. | example, a literal space in a name is represented in the textual | |||
These characters have to be escaped when entered into a textual zone | zone file using '\032', so "Building 1.example.com" is entered | |||
file, | as "Building\0321.example.com".</t> | |||
following the rules in Section 5.1 of the | ||||
<xref target="RFC1035">DNS specification</xref>. | ||||
For example, a literal space in a name is represented in the textual | ||||
zone file | ||||
using '\032', so "Building 1.example.com." is entered as | ||||
"Building\0321.example.com."</t> | ||||
<?rfc needLines="15" ?> | <t>DNS responses are limited to a maximum size of 65535 bytes. | |||
<t>DNS responses are limited to a maximum size of 65535 bytes. | ||||
This limits the maximum number of domains that can be returned for | This limits the maximum number of domains that can be returned for | |||
a Domain Enumeration query, as follows:</t> | a Domain Enumeration query as follows:</t> | |||
<t>A DNS response header is 12 bytes. | ||||
<t>A DNS response header is 12 bytes. | ||||
That's typically followed by a single qname (up to 256 bytes) | That's typically followed by a single qname (up to 256 bytes) | |||
plus qtype (2 bytes) and qclass (2 bytes), leaving 65275 | plus qtype (2 bytes) and qclass (2 bytes), leaving 65275 | |||
for the Answer Section.</t> | for the Answer Section.</t> | |||
<t>An Answer Section Resource Record consists of: | <t>An Answer Section Resource Record consists of: | |||
<?rfc subcompact="yes" ?> | </t> | |||
<list style='symbols'> | ||||
<t>Owner name, encoded as a two-byte compression pointer</t> | ||||
<t>Two-byte rrtype (type PTR)</t> | ||||
<t>Two-byte rrclass (class IN)</t> | ||||
<t>Four-byte ttl</t> | ||||
<t>Two-byte rdlength</t> | ||||
<t>rdata (domain name, up to 256 bytes)</t> | ||||
</list> | ||||
<?rfc subcompact="no" ?> | ||||
</t> | ||||
<t>This means that each Resource Record in the Answer Section can | <ul spacing="compact"> | |||
<li>Owner name, encoded as a compression pointer, 2 bytes</li> | ||||
<li>RRTYPE (type PTR), 2 bytes</li> | ||||
<li>RRCLASS (class IN), 2 bytes</li> | ||||
<li>TTL, 4 bytes</li> | ||||
<li>RDLENGTH, 2 bytes</li> | ||||
<li>RDATA (domain name), up to 256 bytes</li> | ||||
</ul> | ||||
<t>This means that each Resource Record in the Answer Section can | ||||
take up to 268 bytes total, which means that the Answer Section | take up to 268 bytes total, which means that the Answer Section | |||
can contain, in the worst case, no more than 243 domains.</t> | can contain, in the worst case, no more than 243 domains.</t> | |||
<t>In a more typical scenario, where the domain names are not all | ||||
<t>In a more typical scenario, where the domain names are not all | ||||
maximum-sized names, and there is some similarity between names | maximum-sized names, and there is some similarity between names | |||
so that reasonable name compression is possible, each Answer | so that reasonable name compression is possible, each Answer | |||
Section Resource Record may average 140 bytes, which means that | Section Resource Record may average 140 bytes, which means that | |||
the Answer Section can contain up to 466 domains.</t> | the Answer Section can contain up to 466 domains.</t> | |||
<t>It is anticipated that this should be sufficient for even a large | ||||
<t>It is anticipated that this should be sufficient for even a large | ||||
corporate network or university campus.</t> | corporate network or university campus.</t> | |||
<?rfc needLines="21" ?> | ||||
</section> | </section> | |||
<section anchor="multicast" numbered="true" toc="default"> | ||||
<name>Domain Enumeration via Multicast Queries</name> | ||||
<t>In the case where Discovery Proxy functionality is widely | ||||
deployed within an enterprise (either by having a Discovery Proxy | ||||
physically on | ||||
each link, or by having a Discovery Proxy with a remote "virtual" | ||||
presence on each link using VLANs or Multicast DNS Discovery Relays | ||||
<xref target="I-D.sctl-dnssd-mdns-relay" format="default"></xref>), | ||||
this offers an additional way to provide Domain Enumeration | ||||
configuration data for | ||||
clients.</t> | ||||
<section anchor="multicast" title="Domain Enumeration via Multicast | <t>Note that this function of the Discovery Proxy is | |||
Queries"> | supplementary to the primary purpose of the Discovery Proxy, | |||
which is to facilitate <em>remote</em> clients discovering services | ||||
<t>In the case where Discovery Proxy functionality is widely deployed | on the Discovery Proxy's local link. | |||
within an enterprise (either by having a Discovery Proxy on each link, | This publication of Domain Enumeration configuration data | |||
or by having a Discovery Proxy with a remote ‘virtual’ presence on | via link-local multicast on the Discovery | |||
each link | Proxy's local link is performed for the benefit of <em>local</em> | |||
using VLANs or <xref target="Relay">Multicast DNS Discovery | clients | |||
Relays</xref>) | attached to that link, and typically directs those clients to | |||
this offers an additional way to provide Domain Enumeration data for | contact other distant Discovery Proxies attached to other links. | |||
clients.</t> | Generally, a client does not need to use the local Discovery | |||
Proxy on its own link, because a client is generally able to | ||||
perform its own Multicast DNS queries on that link. | ||||
(The exception to this is when the local Wi-Fi access point is | ||||
blocking or filtering local multicast traffic, requiring even local | ||||
clients to use their local Discovery Proxy to perform local | ||||
discovery.)</t> | ||||
<t>A Discovery Proxy can be configured to generate Multicast DNS | <t>A Discovery Proxy can be configured to generate Multicast DNS | |||
responses | responses | |||
for the following Multicast DNS Domain Enumeration queries issued by | for the following Multicast DNS Domain Enumeration queries issued by | |||
clients:</t> | clients:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure><artwork> | ||||
b._dns-sd._udp.local. PTR ? | b._dns-sd._udp.local. PTR ? | |||
db._dns-sd._udp.local. PTR ? | db._dns-sd._udp.local. PTR ? | |||
lb._dns-sd._udp.local. PTR ?</artwork></figure> | lb._dns-sd._udp.local. PTR ?]]></artwork> | |||
<t>This provides the ability for Discovery Proxies to indicate | ||||
<t>This provides the ability for Discovery Proxies to indicate | recommended browsing domains to DNS-SD clients on a per-link | |||
recommended browsing domains | granularity. In some enterprises, it may be preferable to provide | |||
to DNS-SD clients on a per-link granularity. In some enterprises it | this per-link configuration information in the form of Discovery | |||
may be | Proxy | |||
preferable to provide this per-link configuration data in the form of | configuration data rather than by populating the Unicast DNS servers | |||
Discovery Proxy configuration, rather than populating the Unicast DNS | with | |||
servers | the same data (in the "ip6.arpa" or "in-addr.arpa" domains).</t> | |||
with the same data (in the "ip6.arpa" or "in-addr.arpa" domains).</t> | <t>Regardless of how the network operator chooses to provide this | |||
configuration | ||||
<t>Regardless of how the network operator chooses to provide this | ||||
configuration | ||||
data, clients will perform Domain Enumeration via both unicast and | data, clients will perform Domain Enumeration via both unicast and | |||
multicast | multicast | |||
queries, and then combine the results of these queries.</t> | queries and then combine the results of these queries.</t> | |||
<?rfc needLines="30" ?> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="dom-host" numbered="true" toc="default"> | ||||
<section anchor="dom-host" title="Delegated Subdomain for LDH Host | <name>Delegated Subdomain for LDH Host Names</name> | |||
Names"> | ||||
<t>DNS-SD service instance names and domains are allowed | <t>DNS-SD service instance names and domains are allowed | |||
to contain arbitrary <xref target="RFC5198">Net-Unicode text</xref>, | to contain arbitrary Net-Unicode text <xref target="RFC5198" | |||
encoded as <xref target="RFC3629">precomposed UTF-8</xref>.</t> | format="default"></xref>, | |||
encoded as precomposed UTF-8 <xref target="RFC3629" | ||||
format="default"></xref>.</t> | ||||
<t>Users typically interact with service discovery software by | <t>Users typically interact with service discovery software by | |||
viewing a list of discovered service instance names on a display, | viewing a list of discovered service instance names on a display | |||
and selecting one of them by pointing, touching, or clicking. | and selecting one of them by pointing, touching, or clicking. | |||
Similarly, in software that provides a multi-domain DNS-SD user | Similarly, in software that provides a multi-domain DNS-SD user | |||
interface, users view a list of offered domains on the display | interface, users view a list of offered domains on the display | |||
and select one of them by pointing, touching, or clicking. | and select one of them by pointing, touching, or clicking. | |||
To use a service, users don't have to remember domain or instance | To use a service, users don't have to remember domain or instance | |||
names, or type them; users just have to be able to recognize what | names, or type them; users just have to be able to recognize what | |||
they see on the display and touch or click on the thing they want.</t> | they see on the display and touch or click on the thing they want.</t> | |||
<t>In contrast, host names are often remembered and typed. Also, host | ||||
<t>In contrast, host names are often remembered and typed. | names have historically been used in command-line interfaces where | |||
Also, host names have historically been used in command-line | spaces can be inconvenient. For this reason, host names have | |||
interfaces | traditionally been restricted to letters, digits, and hyphens (LDH) | |||
where spaces can be inconvenient. For this reason, host names have | with no spaces or other punctuation.</t> <t>While we do want to allow | |||
traditionally been restricted to letters, digits and hyphens (LDH), | rich text for DNS-SD service instance names and domains, it is | |||
with | advisable, for maximum compatibility with existing usage, to restrict | |||
no spaces or other punctuation.</t> | host names to the traditional letter-digit-hyphen rules. This means | |||
that while the service name | ||||
<t>While we do want to allow rich text for DNS-SD service | "My Printer._ipp._tcp.Building 1.example.com" is acceptable | |||
instance names and domains, it is advisable, for maximum | and desirable (it is displayed in a graphical user interface as an | |||
compatibility with existing usage, to restrict host names | instance called "My Printer" in the domain "Building 1" at | |||
to the traditional letter-digit-hyphen rules. | "example.com"), the host name "My-Printer.Building 1.example.com" | |||
This means that while a service name | is less desirable (because of the space in "Building 1").</t> | |||
"My Printer._ipp._tcp.Building 1.example.com" | <t>To accommodate this difference in allowable characters, a Discovery | |||
is acceptable and desirable | Proxy <bcp14>SHOULD</bcp14> support having two separate subdomains | |||
(it is displayed in a graphical user interface as an instance called | delegated to it for each link it serves: one whose name is allowed to | |||
"My Printer" in the domain "Building 1" at "example.com"), | contain arbitrary Net-Unicode text <xref target="RFC5198" | |||
a host name "My-Printer.Building 1.example.com" is less desirable | format="default"/>, and a second more constrained subdomain whose name | |||
(because of the space in "Building 1").</t> | is restricted to contain only letters, digits, and hyphens, to be used | |||
for host name records (names of 'A' and 'AAAA' address records). The | ||||
<t>To accomodate this difference in allowable characters, a Discovery | restricted names may be any valid name consisting of only letters, | |||
Proxy | digits, and hyphens, including Punycode-encoded names <xref | |||
SHOULD support having two separate subdomains delegated to it | target="RFC3492" format="default"/>. | |||
for each link it serves, one whose name | ||||
is allowed to contain arbitrary Net-Unicode text <xref | ||||
target="RFC5198"/>, | ||||
and a second more constrained subdomain whose name is restricted to | ||||
contain | ||||
only letters, digits, and hyphens, to be used for host name records | ||||
(names of 'A' and 'AAAA' address records). | ||||
The restricted names may be any valid name consisting of only | ||||
letters, digits, and hyphens, including Punycode-encoded names <xref | ||||
target="RFC3492"/>. | ||||
</t> | </t> | |||
<?rfc needLines="12" ?> | ||||
<t>For example, a Discovery Proxy could have the two subdomains | <t>For example, a Discovery Proxy could have the two subdomains | |||
"Building 1.example.com" and "bldg1.example.com" delegated to it. | "Building 1.example.com" and "bldg&nbhy;1.example.com" delegated | |||
to it. | ||||
The Discovery Proxy would then translate these two Multicast DNS | The Discovery Proxy would then translate these two Multicast DNS | |||
records:</t> | records:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure><artwork> | ||||
My Printer._ipp._tcp.local. SRV 0 0 631 prnt.local. | My Printer._ipp._tcp.local. SRV 0 0 631 prnt.local. | |||
prnt.local. A 203.0.113.2</artwork></figure> | prnt.local. A 203.0.113.2]]></artwork> | |||
<t>into Unicast DNS records as follows:</t> | <t>into Unicast DNS records as follows:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure><artwork> | ||||
My Printer._ipp._tcp.Building 1.example.com. | My Printer._ipp._tcp.Building 1.example.com. | |||
SRV 0 0 631 prnt.bldg1.example.com. | SRV 0 0 631 prnt.bldg-1.example.com. | |||
prnt.bldg1.example.com. A 203.0.113.2</artwork></figure> | prnt.bldg-1.example.com. A 203.0.113.2]]></artwork> | |||
<t>Note that the SRV record name is translated using the rich-text | <t>Note that the SRV record name is translated using the rich-text | |||
domain name ("Building 1.example.com") and the address record | domain name ("Building 1.example.com"), and the address record | |||
name is translated using the LDH domain ("bldg1.example.com").</t> | name is translated using the LDH domain ("bldg&nbhy;1.example.com"). | |||
Further details of the name translation rules are | ||||
<t>A Discovery Proxy MAY support only a single rich text Net-Unicode | described in <xref target="translation" format="default"/>.</t> | |||
domain, and | <t>A Discovery Proxy <bcp14>MAY</bcp14> support only a single | |||
use that domain for all records, including 'A' and 'AAAA' address | rich-text Net-Unicode domain and use that domain for all records, | |||
records, | including 'A' and 'AAAA' address records, but implementers choosing | |||
but implementers choosing this option should be aware that this choice | this option should be aware that this choice may produce host names | |||
may produce host names that are awkward to use in command-line | that are awkward to use in command-line environments. Whether or not | |||
environments. | this is | |||
Whether this is an issue depends on whether users in the target | an issue depends on whether users in the target environment are | |||
environment | expected to be using command-line interfaces.</t> | |||
are expected to be using command-line interfaces.</t> | <t>A Discovery Proxy <bcp14>MUST NOT</bcp14> be restricted to support | |||
only a | ||||
<t>A Discovery Proxy MUST NOT be restricted to support only a | ||||
letter-digit-hyphen | letter-digit-hyphen | |||
subdomain, because that results in an unnecessarily poor user | subdomain, because that results in an unnecessarily poor user | |||
experience.</t> | experience.</t> | |||
<t>As described above in <xref target="unicast"/>, for clarity, | <t>As described in <xref target="unicast" format="default"/>, for | |||
space characters in names are shown as actual spaces. | clarity, in examples here space characters in names are shown as | |||
If this data were to be manually entered into a textual zone file | actual spaces. If | |||
(which it isn't) | this dynamically discovered data were to be manually entered into a | |||
then spaces would need to be represented using '\032', so | textual zone file (which | |||
"My Printer._ipp._tcp.Building 1.example.com." would become | it isn't), then spaces would need to be represented using '\032', so | |||
"My\032Printer._ipp._tcp.Building\0321.example.com."<vspace /> | "My Printer._ipp._tcp.Building 1.example.com" would become | |||
Note that the '\032' representation does not appear | "My\032Printer._ipp._tcp.Building\0321.example.com".</t> | |||
in the network packets sent over the air. | <t> | |||
In the wire format of DNS messages, spaces are sent as spaces, not as | Note that the '\032' representation does not appear in DNS messages | |||
'\032', | sent over the air. In the wire format of DNS messages, spaces are sent as | |||
and likewise, in a graphical user interface at the client device, | spaces, not as '\032', and likewise, in a graphical user interface at the | |||
spaces are shown as spaces, not as '\032'. | client device, spaces are shown as spaces, not as '\032'. | |||
</t> | </t> | |||
</section> | ||||
<?rfc needLines="36" ?> | ||||
</section> | ||||
<section anchor="dom-rev" title="Delegated Subdomain for Reverse | <section anchor="dom-rev" numbered="true" toc="default"> | |||
Mapping"> | <name>Delegated Subdomain for Reverse Mapping</name> | |||
<t>A Discovery Proxy can facilitate easier management of reverse | <t>A Discovery Proxy can facilitate easier management of reverse | |||
mapping domains, particularly for IPv6 addresses where manual | mapping domains, particularly for IPv6 addresses where manual | |||
management may be more onerous than it is for IPv4 addresses.</t> | management may be more onerous than it is for IPv4 addresses.</t> | |||
<t>To achieve this, in the parent domain, NS records are used to | <t>To achieve this, in the parent domain, NS records are used to | |||
delegate ownership of the appropriate reverse mapping domain to | delegate ownership of the appropriate reverse mapping domain to | |||
the Discovery Proxy. In other words, the Discovery Proxy becomes the | the Discovery Proxy. In other words, the Discovery Proxy becomes the | |||
authoritative name server for the reverse mapping domain. | authoritative name server for the reverse mapping domain. | |||
For fault tolerance reasons there may be more than one | For fault tolerance reasons, there may be more than one | |||
Discovery Proxy serving a given link.</t> | Discovery Proxy serving a given link.</t> | |||
<t>If a given link is using the IPv4 subnet 203.0.113/24, | ||||
<t>If a given link is using the IPv4 subnet 203.0.113/24,<vspace/> | then the domain "113.0.203.in-addr.arpa" | |||
then the domain "113.0.203.in-addr.arpa"<vspace/> | ||||
is delegated to the Discovery Proxy for that link.</t> | is delegated to the Discovery Proxy for that link.</t> | |||
<t>If a given link is using the | ||||
<t>For example, if a given link is using the<vspace/> | IPv6 prefix 2001:0DB8:1234:5678::/64, | |||
IPv6 prefix 2001:0DB8:1234:5678/64,<vspace/> | then the domain "8.7.6.5.4.3.2.1.8.b.d.0.1.0.0.2.ip6.arpa" | |||
then the domain "8.7.6.5.4.3.2.1.8.b.d.0.1.0.0.2.ip6.arpa"<vspace/> | ||||
is delegated to the Discovery Proxy for that link.</t> | is delegated to the Discovery Proxy for that link.</t> | |||
<t>When a reverse mapping query arrives at the Discovery Proxy, it | <t>When a reverse mapping query arrives at the Discovery Proxy, it | |||
issues | issues the identical query on its local link, as a Multicast DNS | |||
the identical query on its local link as a Multicast DNS query. | query. | |||
The mechanism to force an apparently unicast name to be resolved | The mechanism to force an apparently unicast name to be resolved using | |||
using link-local Multicast DNS varies depending on the API set being | link-local Multicast DNS varies depending on the API set being used. | |||
used. | For example, in the "dns_sd.h" APIs (available on macOS, iOS, Bonjour | |||
For example, in the "dns_sd.h" APIs<vspace/> | for Windows, Linux, and Android), using kDNSServiceFlagsForceMulticast | |||
(available on macOS, iOS, Bonjour for Windows, Linux and Android), | indicates that the DNSServiceQueryRecord() call should perform the | |||
using kDNSServiceFlagsForceMulticast | query using Multicast DNS. Other API sets have different ways of | |||
indicates that the DNSServiceQueryRecord() | forcing multicast queries. When the host owning that IPv4 or IPv6 | |||
call should perform the query using Multicast DNS. | address responds with a name of the form "something.local", the | |||
Other APIs sets have different ways of forcing multicast queries. | Discovery Proxy rewrites it to use its configured LDH host name | |||
When the host owning that IPv4 or IPv6 address responds | domain instead of ".local" and returns the response to the caller.</t> | |||
with a name of the form "something.local", the Discovery Proxy | ||||
rewrites that to use its configured LDH host name domain instead | ||||
of "local", and returns the response to the caller.</t> | ||||
<?rfc needLines="15" ?> | ||||
<t>For example, a Discovery Proxy with the two subdomains | <t>For example, a Discovery Proxy with the two subdomains | |||
"113.0.203.in&nbhy;addr.arpa" and "bldg1.example.com" delegated to it | "113.0.203.in&nbhy;addr.arpa" and "bldg&nbhy;1.example.com" delegated | |||
to it | ||||
would translate this Multicast DNS record:</t> | would translate this Multicast DNS record:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
<figure><artwork> | 2.113.0.203.in-addr.arpa. PTR prnt.local.]]></artwork> | |||
2.113.0.203.in-addr.arpa. PTR prnt.local.</artwork></figure> | ||||
<t>into this Unicast DNS response:</t> | <t>into this Unicast DNS response:</t> | |||
<artwork name="" type="" align="left" alt=""><![CDATA[ | ||||
2.113.0.203.in-addr.arpa. PTR prnt.bldg-1.example.com.]]></artwork> | ||||
<figure><artwork> | <t>In this example the "prnt.local" host name is translated | |||
2.113.0.203.in-addr.arpa. PTR prnt.bldg1.example.com.</artwork></figure> | using the delegated LDH subdomain, as described in | |||
<xref target="translation" format="default"/>.</t> | ||||
<t>Subsequent queries for the prnt.bldg1.example.com address | <t>Subsequent queries for the prnt.bldg&nbhy;1.example.com address | |||
record, falling as it does within the bldg1.example.com domain, | record, falling as it does within the bldg&nbhy;1.example.com domain, | |||
which is delegated to the Discovery Proxy, will arrive at the | which is delegated to this Discovery Proxy, will arrive at this | |||
Discovery Proxy, where they are answered by issuing Multicast DNS | Discovery Proxy where they are answered by issuing Multicast DNS | |||
queries | queries | |||
and using the received Multicast DNS answers to synthesize Unicast | and using the received Multicast DNS answers to synthesize Unicast | |||
DNS responses, as described above.</t> | DNS responses, as described above.</t> | |||
<t>Note that this description assumes that all addresses on a given | ||||
<t>Note that this design assumes that all addresses on a given | IPv4 subnet or IPv6 prefix are mapped to host names using the | |||
IPv4 subnet or IPv6 prefix are mapped to hostnames using the Discovery | Discovery | |||
Proxy mechanism. | Proxy mechanism. | |||
It would be possible to implement a Discovery Proxy that can be | It would be possible to implement a Discovery Proxy that can be | |||
configured | configured | |||
so that some address-to-name mappings are performed using Multicast | so that some address-to-name mappings are performed using Multicast | |||
DNS | DNS | |||
on the local link, while other address-to-name mappings within the | on the local link, while other address-to-name mappings within the | |||
same | same | |||
IPv4 subnet or IPv6 prefix are configured manually.</t> | IPv4 subnet or IPv6 prefix are configured manually.</t> | |||
<?rfc needLines="46" ?> | ||||
</section> | </section> | |||
<section title="Data Translation"> | <section anchor="translation" numbered="true" toc="default"> | |||
<t>Generating the appropriate Multicast DNS queries involves,<vspace/> | <name>Data Translation</name> | |||
at the very least, translating from the configured DNS domain | ||||
<t>For the delegated rich-text and LDH subdomains, | ||||
generating appropriate Multicast DNS queries | ||||
involves translating from the configured DNS domain | ||||
(e.g., "Building 1.example.com") on the Unicast DNS side | (e.g., "Building 1.example.com") on the Unicast DNS side | |||
to "local" on the Multicast DNS side.</t> | to ".local" on the Multicast DNS side.</t> | |||
<t>Generating the appropriate Unicast DNS responses involves | <t>For the delegated reverse-mapping subdomain, | |||
translating back from "local" to the appropriate configured DNS | generating appropriate Multicast DNS queries | |||
Unicast domain.</t> | involves using the appropriate API mechanism to | |||
indicate that a query should be performed using | ||||
Multicast DNS, as described in | ||||
<xref target="dom-rev" format="default"/>.</t> | ||||
<t>Other beneficial translation and filtering operations are described | <t>Generating appropriate Unicast DNS responses from the | |||
below.</t> | received Multicast DNS answers involves translating back | |||
from ".local" to the appropriate configured Unicast DNS | ||||
domain as necessary, as described below.</t> | ||||
<section anchor="ttl" title="DNS TTL limiting"> | <t>In the examples below, the delegated subdomains are as follows:</t> | |||
<t>For efficiency, Multicast DNS typically uses moderately high | ||||
DNS TTL values. For example, the typical TTL on DNS-SD PTR records | ||||
is 75 minutes. What makes these moderately high TTLs acceptable | ||||
is the cache coherency mechanisms built in to the Multicast DNS | ||||
protocol which protect against stale data persisting for too long. | ||||
When a service shuts down gracefully, it sends goodbye packets | ||||
to remove its PTR records immediately from neighboring caches. | ||||
If a service shuts down abruptly without sending goodbye packets, | ||||
the Passive Observation Of Failures (POOF) mechanism described | ||||
in Section 10.5 of the <xref target="RFC6762">Multicast DNS | ||||
specification</xref> | ||||
comes into play to purge the cache of stale data.</t> | ||||
<t>A traditional Unicast DNS client on a distant remote link does | <artwork name="" type="" align="left" alt=""> | |||
not get to participate | Delegated subdomain for rich-text names Building 1.example.com. | |||
in these Multicast DNS cache coherency mechanisms on the local link. | Delegated subdomain for LDH names bldg&nbhy;1.example.com. | |||
For traditional Unicast DNS queries | Delegated subdomain for IPv4 reverse mapping 113.0.203.in-addr.arpa.</artwork> | |||
(those received without using Long-Lived Query <xref target="LLQ"/> | ||||
or DNS Push Notification subscriptions <xref target="Push"/>) | ||||
the DNS TTLs reported in the resulting Unicast DNS response | ||||
MUST be capped to be no more than ten seconds.</t> | ||||
<t>Similarly, for negative responses, the negative caching TTL | <t>Names in Multicast DNS answers that do not end in ".local" | |||
indicated | do not require any translation.</t> | |||
in the SOA record <xref target="RFC2308"/> should also be ten | ||||
seconds | ||||
(<xref target="soa"/>).</t> | ||||
<t>This value of ten seconds is chosen based on user-experience | <t>Names in Multicast DNS answers that end in ".local" | |||
considerations.</t> | are only meaningful on the local link, and require translation | |||
to make them useable by clients outside the local link.</t> | ||||
<t>For negative caching, suppose a user is attempting to access a | <t>Names that end in ".local" may appear both as the | |||
remote | owner names of received Multicast DNS answer records, | |||
device (e.g., a printer), and they are unsuccessful because that | and in the RDATA of received Multicast DNS answer records.</t> | |||
device | ||||
is powered off. Suppose they then place a telephone call and ask for | <t>In a received Multicast DNS answer record, | |||
the | if the owner name ends with ".local", | |||
device to be powered on. We want the device to become available to | then the ".local" top-level label is replaced with the name | |||
the | of the delegated subdomain as was used in the originating query.</t> | |||
user within a reasonable time period. It is reasonable to expect it | ||||
to | <t>In a received Multicast DNS answer record, | |||
take on the order of ten seconds for a simple device with a simple | if a name in the RDATA ends with ".local", | |||
embedded operating system to power on. Once the device is powered on | then the name is translated according to the delegated subdomain | |||
and | that was used in the originating query, as explained below.</t> | |||
has announced its presence on the network via Multicast DNS, we | ||||
would | <t>For queries in subdomains delegated for LDH host names, | |||
like it to take no more than a further ten seconds for stale | ".local" names in RDATA | |||
negative | are translated to that delegated LDH subdomain. | |||
cache entries to expire from Unicast DNS caches, making the device | For example, a query for "thing.bldg&nbhy;1.example.com" will be | |||
available to the user desiring to access it.</t> | translated to a | |||
Multicast DNS query for "thing.local". If that query returns this | ||||
CNAME record:</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
thing.local. CNAME prnt.local.</artwork> | ||||
<t>then both the owner name and the name in the RDATA | ||||
are translated from ".local" to the LDH subdomain | ||||
"bldg&nbhy;1.example.com":</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
thing.bldg&nbhy;1.example.com. CNAME prnt.bldg&nbhy;1.example.com.</artwork> | ||||
<t>For queries in subdomains delegated for reverse mapping names, | ||||
".local" names in RDATA | ||||
are translated to the delegated LDH subdomain, if one is configured, | ||||
or to the delegated rich-text subdomain otherwise. | ||||
For example, consider a reverse mapping query that returns this PTR | ||||
record:</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
2.113.0.203.in-addr.arpa. PTR prnt.local.</artwork> | ||||
<t>The owner name is not translated because it does not end in | ||||
".local". | ||||
The name in the RDATA is | ||||
translated from ".local" to the LDH subdomain | ||||
"bldg&nbhy;1.example.com":</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
2.113.0.203.in-addr.arpa. PTR prnt.bldg&nbhy;1.example.com.</artwork> | ||||
<t>For queries in subdomains delegated for rich-text names, | ||||
".local" names in RDATA | ||||
are translated according to whether or not they represent host names | ||||
(i.e., RDATA names that are the owner names of A and AAAA DNS | ||||
records). | ||||
RDATA names ending in ".local" that represent host names | ||||
are translated to the delegated LDH subdomain, if one is configured, | ||||
or to the delegated rich-text subdomain otherwise. | ||||
All other RDATA names ending in ".local" | ||||
are translated to the delegated rich-text subdomain. | ||||
For example, consider a DNS-SD service browsing PTR query | ||||
that returns this PTR record for IPP printing:</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
_ipp._tcp.local. PTR My Printer._ipp._tcp.local.</artwork> | ||||
<t>Both the owner name and the name in the RDATA | ||||
are translated from ".local" to the rich-text subdomain:</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
_ipp._tcp.Building 1.example.com. | ||||
PTR My Printer._ipp._tcp.Building 1.example.com.</artwork> | ||||
<t>In contrast, consider a query | ||||
that returns this SRV record for a specific IPP printing instance:</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
My Printer._ipp._tcp.local. SRV 0 0 631 prnt.local.</artwork> | ||||
<t>As for all queries, the owner name | ||||
is translated to the delegated subdomain of the originating query, | ||||
the delegated rich-text subdomain "Building 1.example.com". | ||||
However, the ".local" name in the RDATA | ||||
is the target host name field of an SRV record, | ||||
a field that is used exclusively for host names. | ||||
Consequently it is translated to the LDH subdomain | ||||
"bldg&nbhy;1.example.com", | ||||
if configured, instead of the rich-text subdomain: | ||||
</t> | ||||
<artwork name="" type="" align="left" alt=""> | ||||
My Printer._ipp._tcp.Building 1.example.com. | ||||
SRV 0 0 631 prnt.bldg&nbhy;1.example.com.</artwo | ||||
rk> | ||||
<t>Other beneficial translation and filtering operations are described | ||||
below.</t> | ||||
<section anchor="ttl" numbered="true" toc="default"> | ||||
<name>DNS TTL Limiting</name> | ||||
<t>For efficiency, Multicast DNS typically uses moderately high DNS | ||||
TTL values. For example, the typical TTL on DNS-SD service browsing | ||||
PTR records is 75 | ||||
minutes. What makes these moderately high TTLs acceptable is the | ||||
cache coherency mechanisms built in to the Multicast DNS protocol, | ||||
which protect against stale data persisting for too long. When a | ||||
service shuts down gracefully, it sends goodbye packets to remove | ||||
its service browsing PTR record(s) immediately from neighboring | ||||
caches. If a service | ||||
shuts down abruptly without sending goodbye packets, the Passive | ||||
Observation Of Failures (POOF) mechanism described in <xref | ||||
target="RFC6762" sectionFormat="of" section="10.5">the Multicast DNS | ||||
specification</xref> comes into play to purge the cache of stale | ||||
data.</t> | ||||
<t>A traditional Unicast DNS client on a distant remote link does | ||||
not get to participate in these Multicast DNS cache coherency | ||||
mechanisms on the local link. For traditional Unicast DNS queries | ||||
(those received without using Long-Lived Queries (LLQ) <xref | ||||
target="RFC8764" format="default"/> or DNS Push | ||||
Notification subscriptions <xref target="RFC8765" | ||||
format="default"/>), the DNS TTLs reported in the resulting Unicast | ||||
DNS response <bcp14>MUST</bcp14> be capped to be no more than ten | ||||
seconds.</t> | ||||
<t>Similarly, for negative responses, the negative caching TTL | ||||
indicated in the SOA record <xref target="RFC2308" | ||||
format="default"/> should also be ten seconds (see <xref | ||||
target="soa" | ||||
format="default"/>).</t> | ||||
<t>This value of ten seconds is chosen based on user-experience | ||||
considerations.</t> | ||||
<t>For negative caching, suppose a user is attempting to access a | ||||
remote device (e.g., a printer), and they are unsuccessful because | ||||
that device is powered off. Suppose they then place a telephone call | ||||
and ask for the device to be powered on. We want the device to | ||||
become available to the user within a reasonable time period. It is | ||||
reasonable to expect it to take on the order of ten seconds for a | ||||
simple device with a simple embedded operating system to power | ||||
on. Once the device is powered on and has announced its presence on | ||||
the network via Multicast DNS, we would like it to take no more than | ||||
a further ten seconds for stale negative cache entries to expire | ||||
from Unicast DNS caches, making the device available to the user | ||||
desiring to access it.</t> | ||||
<t>Similar reasoning applies to capping positive TTLs at ten | <t>Similar reasoning applies to capping positive TTLs at ten | |||
seconds. | seconds. | |||
In the event of a device moving location, getting a new DHCP | In the event of a device moving location, getting a new DHCP | |||
address, | address, | |||
or other renumbering events, we would like the updated information | or other renumbering events, we would like the updated information | |||
to | to | |||
be available to remote clients in a relatively timely fashion.</t> | be available to remote clients in a relatively timely fashion.</t> | |||
<t>However, network administrators should be aware that many | <t>However, network administrators should be aware that many | |||
recursive | recursive | |||
(caching) DNS servers by default are configured to impose a minimum | resolvers by default are configured to impose a minimum | |||
TTL of | TTL of | |||
30 seconds. If stale data appears to be persisting in the network to | 30 seconds. If stale data appears to be persisting in the network to | |||
the | the | |||
extent that it adversely impacts user experience, network | extent that it adversely impacts user experience, network | |||
administrators | administrators | |||
are advised to check the configuration of their recursive DNS | are advised to check the configuration of their recursive | |||
servers.</t> | resolvers.</t> | |||
<t>For received Unicast DNS queries that use LLQ <xref | <t>For received Unicast DNS queries that use LLQ <xref | |||
target="LLQ"/> or | target="RFC8764" format="default"/> or | |||
DNS Push Notifications <xref target="Push"/>, the Multicast DNS | DNS Push Notifications <xref target="RFC8765" format="default"/>, | |||
record's TTL SHOULD be | the Multicast DNS | |||
returned unmodified, because the Push Notification channel exists | record's TTL <bcp14>SHOULD</bcp14> be | |||
returned unmodified, because the notification channel exists | ||||
to inform the remote client as records come and go. | to inform the remote client as records come and go. | |||
For further details about Long-Lived Queries, and its newer | For further details about Long-Lived Queries and its newer | |||
replacement, | replacement, | |||
DNS Push Notifications, see <xref target="aggregation"/>.</t> | DNS Push Notifications, see <xref target="aggregation" | |||
format="default"/>.</t> | ||||
</section> | </section> | |||
<section anchor="unusable" numbered="true" toc="default"> | ||||
<section anchor="unusable" title="Suppressing Unusable Records"> | <name>Suppressing Unusable Records</name> | |||
<t>A Discovery Proxy SHOULD offer a configurable option, | <t>A Discovery Proxy <bcp14>SHOULD</bcp14> offer a configurable | |||
option, | ||||
enabled by default, to suppress Unicast DNS answers | enabled by default, to suppress Unicast DNS answers | |||
for records that are not useful outside the local link. | for records that are not useful outside the local link. | |||
When the option to suppress unusable records is enabled: | When the option to suppress unusable records is enabled: | |||
<list style='symbols'> | </t> | |||
<ul spacing="normal"> | ||||
<t>DNS A and AAAA records for | <li>For a Discovery Proxy that is serving only clients outside the | |||
IPv4 link-local addresses <xref target="RFC3927"/> | local link, | |||
DNS A and AAAA records for | ||||
IPv4 link-local addresses <xref target="RFC3927" | ||||
format="default"/> | ||||
and | and | |||
IPv6 link-local addresses <xref target="RFC4862"/> | IPv6 link-local addresses <xref target="RFC4862" | |||
SHOULD be suppressed.</t> | format="default"/> | |||
<bcp14>SHOULD</bcp14> be suppressed.</li> | ||||
<t>Similarly, for sites that have multiple private address | <li>Similarly, for sites that have multiple private address | |||
realms <xref target="RFC1918"/>, | realms <xref target="RFC1918" format="default"/>, | |||
in cases where the Discovery Proxy can determine that the | in cases where the Discovery Proxy can determine that the | |||
querying client | querying client | |||
is in a different address realm, private addresses SHOULD NOT be | is in a different address realm, private addresses <bcp14>SHOULD | |||
communicated to that client.</t> | NOT</bcp14> be | |||
communicated to that client.</li> | ||||
<t><xref target="RFC4193">IPv6 Unique Local Addresses</xref> | <li> | |||
SHOULD be suppressed | IPv6 Unique Local Addresses <xref target="RFC4193" | |||
format="default"></xref> | ||||
<bcp14>SHOULD</bcp14> be suppressed | ||||
in cases where the Discovery Proxy can determine that the | in cases where the Discovery Proxy can determine that the | |||
querying client | querying client | |||
is in a different IPv6 address realm.</t> | is in a different IPv6 address realm.</li> | |||
<li>By the same logic, DNS SRV records that reference target host | ||||
<t>By the same logic, DNS SRV records that reference target host | ||||
names that have no addresses usable by the requester should be | names that have no addresses usable by the requester should be | |||
suppressed, and likewise, DNS PTR records that point to unusable | suppressed, and likewise, DNS-SD service browsing PTR records | |||
SRV records should be similarly be suppressed.</t> | that point to unusable | |||
</list> | SRV records should similarly be suppressed.</li> | |||
</t> | </ul> | |||
<?rfc needLines="8" ?> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="NSEC and NSEC3 queries"> | <name>NSEC and NSEC3 Queries</name> | |||
<t>Multicast DNS devices do not routinely announce their records | <t>Multicast DNS devices do not routinely announce their records | |||
on the network. Generally they remain silent until queried. | on the network. Generally, they remain silent until queried. | |||
This means that the complete set of Multicast DNS records in use on | This means that the complete set of Multicast DNS records in use on | |||
a | a | |||
link can only be discovered by active querying, not by passive | link can only be discovered by active querying, not by passive | |||
listening. | listening. | |||
Because of this, a Discovery Proxy can only know what names exist on | Because of this, a Discovery Proxy can only know what names exist on | |||
a link | a link | |||
by issuing queries for them, and since it would be impractical to | by issuing queries for them, and since it would be impractical to | |||
issue queries for every possible name just to find out which names | issue queries for every possible name just to find out which names | |||
exist and which do not, a Discovery Proxy cannot programmatically | exist and which do not, a Discovery Proxy cannot programmatically | |||
generate the traditional | generate the traditional Unicast DNS | |||
<xref target="RFC4034">NSEC</xref> and | NSEC <xref target="RFC4034" format="default"></xref> and | |||
<xref target="RFC5155">NSEC3</xref> records | NSEC3 <xref target="RFC5155" format="default"></xref> records | |||
which assert the nonexistence of a large range of names.</t> | that assert the nonexistence of a large range of names.</t> | |||
<t>When queried for an NSEC or NSEC3 record type, the Discovery | <t>When queried for an NSEC or NSEC3 record type, the Discovery | |||
Proxy issues | Proxy issues | |||
a qtype "ANY" query using Multicast DNS on the local link, and then | a qtype "ANY" query using Multicast DNS on the local link and then | |||
generates an NSEC or NSEC3 response with a Type Bit Map signifying | generates an NSEC or NSEC3 response with a Type Bit Map signifying | |||
which record types do and do not exist for just the specific name | which record types do and do not exist for just the specific name | |||
queried, | queried, | |||
and no other names.</t> | and no other names.</t> | |||
<t>Multicast DNS NSEC records received on the local link | <t>Multicast DNS NSEC records received on the local link | |||
MUST NOT be forwarded unmodified to a unicast querier, because there | <bcp14>MUST NOT</bcp14> be forwarded unmodified to a unicast | |||
are | querier, because there | |||
are | ||||
slight differences in the NSEC record data. | slight differences in the NSEC record data. | |||
In particular, Multicast DNS NSEC records do not have the NSEC | In particular, Multicast DNS NSEC records do not have the NSEC | |||
bit set in the Type Bit Map, whereas conventional Unicast DNS | bit set in the Type Bit Map, whereas conventional Unicast DNS | |||
NSEC records do have the NSEC bit set.</t> | NSEC records do have the NSEC bit set.</t> | |||
</section> | </section> | |||
<section anchor="notrans" numbered="true" toc="default"> | ||||
<section anchor="notrans" title="No Text Encoding Translation"> | <name>No Text-Encoding Translation</name> | |||
<t>A Discovery Proxy does no translation between text encodings. | <t>A Discovery Proxy does no translation between text encodings. | |||
Specifically, a Discovery Proxy does no translation between | Specifically, a Discovery Proxy does no translation between Punycode | |||
<xref target="RFC3492">Punycode encoding</xref> and | encoding <xref | |||
<xref target="RFC3629">UTF-8 encoding</xref>, | target="RFC3492" format="default"></xref> and UTF-8 encoding <xref | |||
either in the owner name of DNS records, or anywhere in the RDATA of | target="RFC3629" format="default"></xref>, either in | |||
DNS records | the owner name of DNS records or anywhere in the RDATA of DNS | |||
(such as the RDATA of PTR records, SRV records, NS records, or other | records (such as the RDATA of PTR records, SRV records, NS records, | |||
record types | or other record types like TXT, where it is ambiguous whether the | |||
like TXT, where it is ambiguous whether the RDATA may contain DNS | RDATA may contain DNS names). All bytes are treated as-is with no | |||
names). | attempt at text-encoding translation. A client implementing | |||
All bytes are treated as-is, with no attempt at text encoding | DNS-based Service Discovery <xref target="RFC6763" | |||
translation. | format="default"/> will use UTF-8 encoding for its unicast DNS-based | |||
A client implementing DNS-based Service Discovery <xref | Service Discovery | |||
target="RFC6763"/> | queries, which the Discovery Proxy passes through without any | |||
will use UTF-8 encoding for its service discovery queries, which the | text-encoding translation to the Multicast DNS subsystem. Responses | |||
Discovery Proxy passes through without any text encoding translation | from the Multicast DNS subsystem are similarly returned, without any | |||
to the Multicast DNS subsystem. | text-encoding translation, back to the requesting unicast | |||
Responses from the Multicast DNS subsystem are similarly returned, | client.</t> | |||
without any text encoding translation, back to the requesting | ||||
client.</t> | ||||
<?rfc needLines="13" ?> | ||||
</section> | </section> | |||
<section title="Application-Specific Data Translation"> | <section numbered="true" toc="default"> | |||
<name>Application-Specific Data Translation</name> | ||||
<t>There may be cases where Application-Specific Data Translation is | <t>There may be cases where Application-Specific Data Translation is | |||
appropriate.</t> | appropriate.</t> | |||
<t>For example, AirPrint printers tend to advertise fairly verbose | <t>For example, AirPrint printers tend to advertise fairly verbose | |||
information about their capabilities in their DNS-SD TXT record. | information about their capabilities in their DNS-SD TXT record. | |||
TXT record sizes in the range 500-1000 bytes are not uncommon. | TXT record sizes in the range of 500-1000 bytes are not uncommon. | |||
This information is a legacy from LPR printing, because LPR does not | This information is a legacy from lineprinter (LPR) printing, | |||
have in-band capability negotiation, so all of this information is | because LPR does not have in-band capability negotiation, so all of | |||
conveyed using the DNS-SD TXT record instead. | this information is conveyed using the DNS-SD TXT record instead. | |||
IPP printing does have in-band capability negotiation, but for | Internet Printing Protocol (IPP) printing does have in-band | |||
convenience printers tend to include the same capability information | capability negotiation, but for convenience, printers tend to | |||
in their IPP DNS-SD TXT records as well. For local mDNS use this | include | |||
extra TXT record information is inefficient, but not fatal. | the same capability information in their IPP DNS-SD TXT records as | |||
However, when a Discovery Proxy aggregates data from multiple | well. For local Multicast DNS (mDNS) use, this extra TXT record | |||
printers | information is | |||
on a link, and sends it via unicast (via UDP or TCP) | wasteful but not fatal. However, when a Discovery Proxy | |||
this amount of unnecessary TXT record information can | aggregates data from multiple printers on a link, and sends it via | |||
result in large responses. | unicast (via UDP or TCP), this amount of unnecessary TXT record | |||
A DNS reply over TCP carrying information about 70 printers | information can result in large responses. A DNS reply over TCP | |||
with an average of 700 bytes per printer adds up to about | carrying information about 70 printers with an average of 700 bytes | |||
50 kilobytes of data. | per printer adds up to about 50 kilobytes of data. Therefore, a | |||
Therefore, a Discovery Proxy that is aware of | Discovery Proxy that is aware of the specifics of an | |||
the specifics of an application-layer protocol such as | application-layer protocol such as AirPrint (which uses IPP) can | |||
AirPrint (which uses IPP) can elide unnecessary key/value pairs from | elide unnecessary key/value pairs from the DNS-SD TXT record for | |||
the DNS-SD TXT record for better network efficiency.</t> | better network efficiency.</t> | |||
<t>Also, the DNS-SD TXT record for many printers contains an | <t>Also, the DNS-SD TXT record for many printers contains an | |||
"adminurl" | "adminurl" key (e.g., | |||
key something like "adminurl=http://printername.local/status.html". | "adminurl=http://printername.local/status.html"). For this URL to | |||
For this URL to be useful outside the local link, the embedded | be | |||
".local" | useful outside the local link, the embedded ".local" host name needs | |||
hostname needs to be translated to an appropriate name with larger | to be translated to an appropriate name with larger scope. It is | |||
scope. | easy to translate ".local" names when they appear in well-defined | |||
It is easy to translate ".local" names when they appear in | places: as a record's owner name, or in domain name fields in the | |||
well-defined places, | RDATA of record types | |||
either as a record's name, or in the rdata of record types like PTR | like PTR and SRV. In the printing case, some application-specific | |||
and SRV. | knowledge about the semantics of the "adminurl" key is needed for | |||
In the printing case, some application-specific knowledge about the | the Discovery Proxy to know that it contains a name that needs to be | |||
semantics of the "adminurl" key is needed for the Discovery Proxy | translated. This is somewhat analogous to the need for NAT gateways | |||
to know that it contains a name that needs to be translated. | to contain ALGs (Application-Level Gateways) to facilitate the | |||
This is somewhat analogous to the need for NAT gateways to contain | correct translation of protocols that embed addresses in unexpected | |||
ALGs | places.</t> | |||
(Application-Specific Gateways) to facilitate the correct | ||||
translation | ||||
of protocols that embed addresses in unexpected places.</t> | ||||
<t>To avoid the need for application-specific knowledge about the | <t>To avoid the need for application-specific knowledge about the | |||
semantics of particular TXT record keys, protocol designers are | semantics of particular TXT record keys, protocol designers are | |||
advised to avoid | advised to avoid placing link-local names or link-local IP addresses | |||
placing link-local names or link-local IP addresses in TXT record | in TXT record keys if translation of those names or addresses would | |||
keys, | be required for off-link operation. In the printing case, the | |||
if translation of those names or addresses would be required for | consequence of failing to translate the "adminurl" key | |||
off-link operation. | correctly would be that, when accessed from a different link, | |||
In the printing case, the operational failure of failing to | printing | |||
translate | will still work, but clicking the "Admin" user interface button will | |||
the "adminurl" key correctly is that, when accessed from a different | fail to | |||
link, | open the printer's administration page. Rather than duplicating the | |||
printing will still work, but clicking the "Admin" UI button | host name from the service's SRV record in its "adminurl" key, | |||
will fail to open the printer's administration page. | thereby having the same host name appear in two places, a better | |||
Rather than duplicating the host name from the service's SRV record | design might have been to omit the host name from the "adminurl" | |||
in its | key and instead have the client implicitly substitute the target | |||
"adminurl" key, thereby having the same host name appear in two | host name from the service's SRV record in place of a missing host | |||
places, | name in the "adminurl" key. That way, the desired host name only | |||
a better design might have been to omit the host name from the | appears once and is in a well-defined place where software like | |||
"adminurl" key, | the Discovery Proxy is expecting to find it.</t> | |||
and instead have the client implicitly substitute the target host | ||||
name from the service's SRV record in place of a missing host name | ||||
in the "adminurl" key. | ||||
That way the desired host name only appears once, and it is in a | ||||
well-defined place | ||||
where software like the Discovery Proxy is expecting to find it.</t> | ||||
<t>Note that this kind of Application-Specific Data Translation is | <t>Note that this kind of Application-Specific Data Translation is | |||
expected to be very rare. It is the exception, rather than the rule. | expected to be very rare; it is the exception rather than the rule. | |||
This is an example of a common theme in computing. | This is an example of a common theme in computing. It is frequently | |||
It is frequently the case that it is wise to start with a clean, | the case that it is wise to start with a clean, layered design with | |||
layered design, with clear boundaries. Then, in certain special | clear boundaries. Then, in certain special cases, those layer | |||
cases, | boundaries may be violated where the performance and efficiency | |||
those layer boundaries may be violated, where the performance and | benefits outweigh the inelegance of the layer violation.</t> | |||
efficiency benefits outweigh the inelegance of the layer | ||||
violation.</t> | ||||
<t>These layer violations are optional. They are done primarily for | <t>These layer violations are optional. They are done primarily for | |||
efficiency | efficiency reasons and generally should not be required for correct | |||
reasons, and generally should not be required for correct operation. | operation. A Discovery Proxy <bcp14>MAY</bcp14> operate solely at | |||
A Discovery Proxy MAY operate solely at the mDNS layer, | the mDNS layer without any knowledge of semantics at the DNS-SD | |||
without any knowledge of semantics at the DNS-SD layer or above.</t> | layer or above.</t> | |||
</section> | ||||
<?rfc needLines="30" ?> | ||||
</section> | </section> | |||
</section> | <section anchor="aggregation" numbered="true" toc="default"> | |||
<name>Answer Aggregation</name> | ||||
<section anchor="aggregation" title="Answer Aggregation"> | ||||
<t>In a simple analysis, simply gathering multicast answers and | <t>In a simple analysis, simply gathering multicast answers and | |||
forwarding them | forwarding them in a unicast response seems adequate, but it raises | |||
in a unicast response seems adequate, but it raises the | the question of how long the Discovery Proxy should wait to be sure | |||
question of how long the Discovery Proxy should wait to be sure that | that it has received all the Multicast DNS answers it needs to form a | |||
it has received | complete Unicast DNS response. If it waits too little time, then it | |||
all the Multicast DNS answers it needs to form a complete Unicast DNS | risks its Unicast DNS response being incomplete. If it waits too | |||
response. | long, then it creates a poor user experience at the client end. In | |||
If it waits too little time, then it risks its Unicast DNS response | fact, there may be no time that is both short enough to produce a | |||
being incomplete. | good user experience and at the same time long enough to reliably | |||
If it waits too long, then it creates a poor user experience at the | produce complete results.</t> | |||
client end. | <t>Similarly, the Discovery Proxy (the authoritative name server for | |||
In fact, there may be no time which is both short enough to produce a | the subdomain in question) needs to decide what DNS TTL to report | |||
good | for these records. If the TTL is too long, then the recursive | |||
user experience and at the same time long enough to reliably produce | resolvers issuing queries on behalf of their clients risk | |||
complete results.</t> | caching stale data for too long. If the TTL is too short, then the | |||
amount of network traffic will be more than necessary. In fact, there | ||||
<t>Similarly, the Discovery Proxy | may be no TTL that is both short enough to avoid undesirable stale | |||
-- the authoritative name server for the subdomain in question -- | data and, at the same time, long enough to be efficient on the | |||
needs to decide what DNS TTL to report for these records. | network.</t> | |||
If the TTL is too long then the recursive (caching) name servers | <t>Both these dilemmas are solved by the use of DNS Long-Lived Queries | |||
issuing queries on behalf of their clients risk caching stale | (LLQ) | |||
data for too long. If the TTL is too short then the amount of | <xref target="RFC8764" format="default"/> or its newer replacement, | |||
network traffic will be more than necessary. | DNS Push Notifications <xref target="RFC8765" | |||
In fact, there may be no TTL which is both short enough to avoid | format="default"></xref>.</t> | |||
undesirable stale data and at the same time long enough to be | <t>Clients supporting unicast DNS-based Service Discovery | |||
efficient on the network.</t> | <bcp14>SHOULD</bcp14> implement | |||
DNS Push Notifications <xref target="RFC8765" format="default"></xref> | ||||
<t>Both these dilemmas are solved by use of DNS Long-Lived Queries | ||||
(DNS LLQ) | ||||
<xref target="LLQ"/> or its newer replacement, | ||||
<xref target="Push">DNS Push Notifications</xref>.</t> | ||||
<t>Clients supporting unicast DNS Service Discovery SHOULD implement | ||||
<xref target="Push">DNS Push Notifications</xref> | ||||
for improved user experience.</t> | for improved user experience.</t> | |||
<t>Clients and Discovery Proxies MAY support both DNS LLQ and | <t>Clients and Discovery Proxies <bcp14>MAY</bcp14> support both | |||
DNS Push, | LLQ and DNS Push Notifications, and when talking to a | |||
and when talking to a Discovery Proxy that supports both, the client | Discovery Proxy that supports both, the client may use either | |||
may use either protocol, as it chooses, though it is expected | protocol, as it chooses, though it is expected that only | |||
that only DNS Push will continue to be supported in the long | DNS Push Notifications will continue to be supported in the long | |||
run.</t> | run.</t> | |||
<t>When a Discovery Proxy receives a query using DNS LLQ or | <t>When a Discovery Proxy receives a query using LLQ | |||
DNS Push Notifications, it responds immediately using the | or DNS Push Notifications, it responds immediately using the Multicast | |||
Multicast DNS records it already has in its cache (if any). | DNS records it already has in its cache (if any). This provides a | |||
This provides a good client user experience by providing a | good client user experience by providing a near-instantaneous | |||
near-instantaneous | ||||
response. Simultaneously, the Discovery Proxy issues a Multicast DNS | response. Simultaneously, the Discovery Proxy issues a Multicast DNS | |||
query on the | query on the local link to discover if there are any additional | |||
local link to discover if there are any additional Multicast DNS | Multicast DNS records it did not already know about. Should additional | |||
records it | Multicast DNS responses be received, these are then delivered to the | |||
did not already know about. Should additional Multicast DNS responses | client using additional LLQ or DNS Push Notification update | |||
be | messages. The timeliness of such update messages is limited only by | |||
received, these are then delivered to the client using additional | the timeliness of the device responding to the Multicast DNS query. If | |||
DNS LLQ | the Multicast DNS device responds quickly, then the update message is | |||
or DNS Push Notification update messages. | delivered quickly. If the Multicast DNS device responds slowly, then | |||
The timeliness of such update messages is limited only by the | the update message is delivered slowly. The benefit of using multiple | |||
timeliness of the | update | |||
device responding to the Multicast DNS query. If the Multicast DNS | messages to deliver results as they become available is that the | |||
device | Discovery | |||
responds quickly, then the update message is delivered quickly. If the | Proxy can respond promptly because it doesn't have to deliver all the | |||
Multicast | results in a single response that needs to be delayed to allow for the | |||
DNS device responds slowly, then the update message is delivered | expected worst-case delay for receiving all the Multicast DNS | |||
slowly. | responses.</t> | |||
The benefit of using update messages is that the Discovery Proxy can | ||||
respond promptly | ||||
because it doesn't have to delay its unicast response to allow for | ||||
the expected worst-case delay for receiving all the Multicast DNS | ||||
responses. | ||||
Even if a proxy were to try to provide reliability by assuming an | ||||
excessively pessimistic worst-case time (thereby giving a very | ||||
poor user experience) there would still be the risk of a slow | ||||
Multicast DNS device taking even longer than that (e.g., a device | ||||
that is not even powered on until ten seconds after the initial | ||||
query is received) resulting in incomplete responses. Using update | ||||
message solves | ||||
this dilemma: even very late responses are not lost; they are | ||||
delivered | ||||
in subsequent update messages.</t> | ||||
<?rfc needLines="16" ?> | <t>With a proxy that supported only standard DNS queries, even if it | |||
<t>There are two factors that determine specifically how responses | were to try to provide reliability by assuming an | |||
excessively pessimistic worst-case time (thereby giving a very poor | ||||
user experience), there would still be the risk of a slow Multicast | ||||
DNS device taking even longer than that worst-case time (e.g., a | ||||
device that is not | ||||
even powered on until ten seconds after the initial query is | ||||
received), | ||||
resulting in incomplete responses. | ||||
Using update messages to deliver subsequent asynchronous replies | ||||
solves this | ||||
dilemma: even very late responses are not lost; they are delivered in | ||||
subsequent update messages.</t> | ||||
<t>Note that while normal DNS queries are generally received via the | ||||
client's configured | ||||
recursive resolver, LLQ and DNS Push Notification subscriptions may be | ||||
received directly from the client.</t> | ||||
<t>There are two factors that determine how unicast responses | ||||
are generated:</t> | are generated:</t> | |||
<t>The first factor is whether the query from the client used | <t>The first factor is whether or not the Discovery Proxy already has | |||
LLQ or DNS Push Notifications | at least one record in its cache that answers the question. | |||
(used for long-lived service browsing PTR queries) | </t> | |||
or not (used for one-shot operations like SRV or address record | <t> | |||
queries). | The second factor is whether the client used a normal DNS query, | |||
Note that queries using LLQ or DNS Push Notifications are received | or established a subscription using LLQ or DNS Push Notifications. | |||
directly | Normal DNS queries | |||
from the client. | are typically used for one-shot operations like SRV or address record | |||
Queries not using LLQ or DNS Push Notifications are generally received | queries. | |||
via the | LLQ and DNS Push Notification subscriptions | |||
client's configured recursive (caching) name server.</t> | are typically used for long-lived service browsing PTR queries. | |||
Normal DNS queries and LLQ each have different response timing depending | ||||
on the cache state, yielding the first four cases listed below. | ||||
DNS Push Notifications, the newer protocol, has uniform behavior | ||||
regardless of cache state, yielding the fifth case listed below.</t> | ||||
<t>The second factor is whether the Discovery Proxy already has at | <ul spacing="normal"> | |||
least | <li> | |||
one record in its cache that positively answers the question. | <t>Standard DNS query; no answer in | |||
<list style='symbols'> | cache:</t> | |||
<t>Not using LLQ or Push Notifications; no answer in | <t> | |||
cache:<vspace/> | Issue an mDNS query on the local link, exactly as a local client | |||
Issue an mDNS query, exactly as a local client would issue an mDNS | would issue an mDNS query, for the desired record name, type, and | |||
query on the local link for the desired record name, type and | class, including retransmissions, as appropriate, according to the | |||
class, including retransmissions, as appropriate, according to | established mDNS retransmission schedule <xref target="RFC6762" | |||
the established mDNS retransmission schedule <xref | format="default"/>. The Discovery Proxy awaits Multicast DNS | |||
target="RFC6762"/>. | responses.</t> | |||
As soon as any Multicast DNS response packet is received that | <t> | |||
contains one or more positive answers to that question | As soon as any Multicast DNS response packet | |||
(with or without the Cache Flush bit <xref target="RFC6762"/> | is received that contains one or more positive answers to that | |||
set), | question (with or without the Cache Flush bit <xref | |||
or a negative answer (signified via a Multicast DNS NSEC record | target="RFC6762" format="default"/> set) or a negative answer | |||
<xref target="RFC6762"/>), | (signified via a Multicast DNS NSEC record <xref target="RFC6762" | |||
the Discovery Proxy generates a Unicast DNS response packet | format="default"/>), the Discovery Proxy generates a Unicast DNS | |||
containing the | response message containing the corresponding (filtered and | |||
corresponding (filtered and translated) answers and sends it to | translated) answers and sends it to the remote client.</t> | |||
the remote | <t> | |||
client. If after six seconds no Multicast DNS answers have been | If after | |||
received, | six seconds no relevant Multicast DNS answers have been received, | |||
cancel the mDNS query and | cancel | |||
return a negative response to the remote client. | the mDNS query and return a negative response to the remote | |||
Six seconds is enough time to transmit three mDNS queries, | client. Six seconds is enough time | |||
and allow some time for responses to arrive.<vspace/> | for the underlying Multicast DNS subsystem | |||
DNS TTLs in responses MUST be capped to at most ten | to transmit three mDNS queries | |||
seconds.<vspace/> | and allow some time for responses to arrive.</t> | |||
<t> | ||||
(Reasoning: Queries not using LLQ or Push Notifications are | (Reasoning: Queries not using LLQ or Push Notifications are | |||
generally queries | generally queries | |||
that that expect an answer from only one device, | that expect an answer from only one device, | |||
so the first response is also the only response.) | so the first response is also the only response.)</t> | |||
<vspace blankLines="1"/> | <t> | |||
</t> | DNS TTLs in responses <bcp14>MUST</bcp14> be capped to at most ten | |||
seconds.</t> | ||||
</li> | ||||
<t>Not using LLQ or Push Notifications; at least one answer in | <li> | |||
cache:<vspace/> | <t>Standard DNS query; at least one answer in | |||
Send response right away to minimise delay.<vspace/> | cache:</t> | |||
DNS TTLs in responses MUST be capped to at most ten | <t> | |||
seconds.<vspace/> | No local mDNS queries are performed.</t> | |||
No local mDNS queries are performed.<vspace/> | <t> | |||
The Discovery Proxy generates a Unicast DNS | ||||
response message containing the answer(s) from the cache right | ||||
away, to minimize delay.</t> | ||||
<t> | ||||
(Reasoning: Queries not using LLQ or Push Notifications are | (Reasoning: Queries not using LLQ or Push Notifications are | |||
generally queries | generally queries | |||
that that expect an answer from only one device. | that expect an answer from only one device. | |||
Given RRSet TTL harmonisation, if the proxy has | Given RRSet TTL harmonization, if the proxy has | |||
one Multicast DNS answer in its cache, it can reasonably | one Multicast DNS answer in its cache, it can reasonably | |||
assume that it has all of them.)</t> | assume that it has the whole set.)</t> | |||
<t> | ||||
DNS TTLs in responses <bcp14>MUST</bcp14> be capped to at most ten | ||||
seconds.</t> | ||||
</li> | ||||
<t>Using LLQ or Push Notifications; no answer in cache:<vspace/> | <li> | |||
As in the case above with no answer in the cache, perform mDNS | <t>Long-Lived Query (LLQ); no answer in cache:</t> | |||
querying for six seconds, and send a response to the remote | <t> | |||
client as soon as any relevant mDNS response is received.<vspace/> | As in the case above with no answer in the cache, plan to perform | |||
If after six seconds no relevant mDNS response has been received, | mDNS | |||
return negative response to the remote client | querying for six seconds, returning an LLQ response message to the | |||
(for LLQ; not applicable for Push Notifications).<vspace/> | remote | |||
client as soon as any relevant mDNS response is received.</t> | ||||
<t> | ||||
If after six seconds no relevant mDNS answers have been received, | ||||
and the client has not cancelled its Long-Lived Query, | ||||
return a negative LLQ response message to the remote client.</t> | ||||
<t> | ||||
(Reasoning: We don't need to rush to send an empty | (Reasoning: We don't need to rush to send an empty | |||
answer.)<vspace/> | answer.)</t> | |||
Whether or not a relevant mDNS response is received within | <t> | |||
six seconds, the query remains active for as long as the | Regardless of whether or not a relevant mDNS response is received | |||
client maintains the LLQ or Push Notification state, and if mDNS | within | |||
answers are | six seconds, the Long-Lived Query remains active for as long as | |||
received later, LLQ or Push Notification messages are | the | |||
sent.<vspace/> | client maintains the LLQ state, and results in the ongoing | |||
transmission of mDNS queries until the Long-Lived Query is | ||||
cancelled. | ||||
If the set of mDNS answers changes, LLQ Event Response messages | ||||
are sent.</t> | ||||
<t> | ||||
DNS TTLs in responses are returned unmodified.</t> | DNS TTLs in responses are returned unmodified.</t> | |||
</li> | ||||
<t>Using LLQ or Push Notifications; at least one answer in | <li> | |||
cache:<vspace/> | <t>Long-Lived Query (LLQ); at least one answer in | |||
As in the case above with at least one answer in cache, | cache:</t> | |||
send response right away to minimise delay.<vspace/> | <t> | |||
The query remains active for as long as the client | As in the case above with at least one answer in the cache, | |||
maintains the LLQ or Push Notification state, and | the Discovery Proxy generates a unicast LLQ | |||
results in transmission of mDNS queries, with appropriate Known | response message containing the answer(s) from the cache right | |||
Answer lists, | away, to minimize delay.</t> | |||
<t> | ||||
The Long-Lived Query remains active for as long as the client | ||||
maintains the LLQ state, | ||||
and results in the transmission of mDNS queries | ||||
(with appropriate Known Answer lists) | ||||
to determine if further answers are available. | to determine if further answers are available. | |||
If additional mDNS answers are | If the set of mDNS answers changes, LLQ Event Response messages | |||
received later, LLQ or Push Notification messages are | are sent.</t> | |||
sent.<vspace/> | <t> | |||
(Reasoning: We want UI that is displayed very rapidly, yet | (Reasoning: We want a user interface that is displayed very | |||
continues | rapidly yet | |||
to remain accurate even as the network environment | continues to remain accurate even as the network environment | |||
changes.)<vspace/> | changes.)</t> | |||
<t> | ||||
DNS TTLs in responses are returned unmodified.</t> | DNS TTLs in responses are returned unmodified.</t> | |||
</list> | </li> | |||
</t> | ||||
<t>The "negative responses" referred to above are | <li> | |||
"no error no answer" negative responses, not NXDOMAIN. | <t>Push Notification Subscription</t> | |||
This is because the Discovery Proxy cannot know all the Multicast | <t> | |||
DNS domain names that may exist on a link at any given time, | The Discovery Proxy acknowledges the subscription request | |||
so any name with no answers may have child names that do exist, | immediately.</t> | |||
making it an "empty nonterminal" name.</t> | <t> | |||
If one or more answers are already available in the cache, | ||||
those answers are then sent in an immediately following DNS PUSH | ||||
message.</t> | ||||
<t> | ||||
The Push Notification subscription remains active until the client | ||||
cancels the subscription, | ||||
and results in the transmission of mDNS queries | ||||
(with appropriate Known Answer lists) | ||||
to determine if further answers are available. | ||||
If the set of mDNS answers changes, further DNS PUSH messages are | ||||
sent.</t> | ||||
<t> | ||||
(Reasoning: We want a user interface that is displayed very | ||||
rapidly yet | ||||
continues to remain accurate even as the network environment | ||||
changes.)</t> | ||||
<t> | ||||
DNS TTLs in responses are returned unmodified.</t> | ||||
</li> | ||||
</ul> | ||||
<?rfc needLines="30" ?> | <t>Where the text above refers to returning "a negative response to | |||
the remote client", it is describing returning a "no error no answer" | ||||
negative response, not NXDOMAIN. This is because the Discovery Proxy | ||||
cannot know all the Multicast DNS domain names that may exist on a | ||||
link at any given time, so any name with no answers may have child | ||||
names that do exist, making it an "empty non-terminal" name.</t> | ||||
<t>Note that certain aspects of the behavior described here | <t>Note that certain aspects of the behavior described here | |||
do not have to be implemented overtly by the Discovery Proxy; | do not have to be implemented overtly by the Discovery Proxy; | |||
they occur naturally as a result of using existing Multicast DNS | they occur naturally as a result of using existing Multicast DNS | |||
APIs.</t> | APIs.</t> | |||
<t>For example, in the first case above (standard DNS query and no | ||||
answers in the cache), if a new Multicast DNS query is requested | ||||
(either by a local client on the Discovery Proxy device, or by the | ||||
Discovery Proxy software on that device on behalf of a remote client), | ||||
and there is not already an identical Multicast DNS query active and | ||||
there are no matching answers already in the Multicast DNS cache on | ||||
the Discovery Proxy device, then this will cause a series of Multicast | ||||
DNS query packets to be issued with exponential backoff. The | ||||
exponential backoff sequence in some implementations starts at one | ||||
second and then doubles for each retransmission (0, 1, 3, 7 seconds, | ||||
etc.), and in others, it starts at one second and then triples for | ||||
each retransmission (0, 1, 4, 13 seconds, etc.). In either case, if | ||||
no response has been received after six seconds, that is long enough | ||||
that the underlying Multicast DNS implementation will have sent three | ||||
query packets without receiving any response. At that point, the | ||||
Discovery Proxy cancels its Multicast DNS query (so no further | ||||
Multicast DNS query packets will be sent for this query) and returns a | ||||
negative response to the remote client via unicast.</t> | ||||
<t>The six-second delay is chosen to be long enough to give enough | ||||
time for devices to respond, yet short enough not to be too onerous | ||||
for a human user waiting for a response. For example, using the "dig" | ||||
DNS debugging tool, the current default settings result in it waiting | ||||
a total of 15 seconds for a reply (three transmissions of the DNS UDP | ||||
query packet, with a wait of 5 seconds after each packet), which is | ||||
ample time for it to have received a negative reply from a Discovery | ||||
Proxy after six seconds.</t> | ||||
<t>For example, | <t>The text above states that for a standard DNS query, | |||
in the first case above (no LLQ or Push Notifications, and no answers | if at least one answer is already available in the cache, then a | |||
in the cache) | Discovery Proxy should not issue additional mDNS query packets. | |||
if a new Multicast DNS query is requested | This also occurs naturally as a result of using existing | |||
(either by a local client, or by the Discovery Proxy on behalf of a | Multicast DNS APIs. | |||
remote client), | If a new Multicast DNS query is requested | |||
and there is not already an identical Multicast DNS query active, | (either locally, or by the Discovery Proxy on behalf of a remote client) | |||
and there are no matching answers already in the | for which there are relevant answers already in the Multicast DNS | |||
Multicast DNS cache on the Discovery Proxy device, | cache on the Discovery Proxy device, and after the answers are | |||
then this will cause a series | delivered the Multicast DNS query is immediately cancelled, then | |||
of Multicast DNS query packets to be issued with exponential backoff. | no Multicast DNS query packets will be generated for this query. | |||
The exponential backoff sequence in some implementations starts at one | </t> | |||
second | ||||
and then doubles for each retransmission (0, 1, 3, 7 seconds, etc.) | ||||
and in others starts at one second | ||||
and then triples for each retransmission (0, 1, 4, 13 seconds, etc.). | ||||
In either case, if no response has been received after six seconds, | ||||
that is long enough that the underlying Multicast DNS implementation | ||||
will have sent three query packets without receiving any response. | ||||
At that point the Discovery Proxy cancels its Multicast DNS query | ||||
(so no further Multicast DNS query packets will be sent for this | ||||
query) | ||||
and returns a negative response to the remote client via unicast.</t> | ||||
<t>The six-second delay is chosen to be | ||||
long enough to give enough time for devices to respond, yet | ||||
short enough not to be too onerous for a human user waiting for a | ||||
response. | ||||
For example, using the "dig" DNS debugging tool, the current default | ||||
settings | ||||
result in it waiting a total of 15 seconds for a reply | ||||
(three transmissions of the query packet, with a wait of 5 seconds | ||||
after each packet) | ||||
which is ample time for it to have received a negative reply from a | ||||
Discovery Proxy | ||||
after six seconds.</t> | ||||
<t>The statement that for a one-shot query (i.e., no LLQ or Push | ||||
Notifications requested), | ||||
if at least one answer is already available in the cache | ||||
then a Discovery Proxy should not issue additional mDNS query packets, | ||||
also occurs naturally as a result of using existing Multicast DNS | ||||
APIs. | ||||
If a new Multicast DNS query is requested | ||||
(either locally, or by the Discovery Proxy on behalf of a remote | ||||
client), | ||||
for which there are relevant answers already in the | ||||
Multicast DNS cache on the Discovery Proxy device, | ||||
and after the answers are delivered the Multicast DNS query is then | ||||
cancelled immediately, | ||||
then no Multicast DNS query packets will be generated for this | ||||
query.</t> | ||||
<?rfc needLines="19" ?> | </section> | |||
</section> | </section> | |||
</section> | ||||
<section anchor="admin" title="Administrative DNS Records"> | ||||
<section anchor="soa" title="DNS SOA (Start of Authority) Record"> | ||||
<t>The MNAME field SHOULD contain the host name of the Discovery Proxy | <section anchor="admin" numbered="true" toc="default"> | |||
<name>Administrative DNS Records</name> | ||||
<section anchor="soa" numbered="true" toc="default"> | ||||
<name>DNS SOA (Start of Authority) Record</name> | ||||
<t>The MNAME field <bcp14>SHOULD</bcp14> contain the host name of the | ||||
Discovery Proxy | ||||
device | device | |||
(i.e., the same domain name as the rdata of the NS record delegating | (i.e., the same domain name as the RDATA of the NS record delegating | |||
the | the | |||
relevant zone(s) to this Discovery Proxy device).</t> | relevant zone(s) to this Discovery Proxy device).</t> | |||
<t>The RNAME field <bcp14>SHOULD</bcp14> contain the mailbox of the | ||||
<t>The RNAME field SHOULD contain the mailbox of the person | person | |||
responsible | responsible | |||
for administering this Discovery Proxy device.</t> | for administering this Discovery Proxy device.</t> | |||
<t>The SERIAL field <bcp14>MUST</bcp14> be zero.</t> | ||||
<t>The SERIAL field MUST be zero.</t> | ||||
<t>Zone transfers are undefined for Discovery Proxy zones, and | <t>Zone transfers are undefined for Discovery Proxy zones, and | |||
consequently the | consequently, the REFRESH, RETRY, and EXPIRE fields have no useful | |||
REFRESH, RETRY and EXPIRE fields have no useful meaning for Discovery | meaning for Discovery Proxy zones. These fields <bcp14>SHOULD</bcp14> | |||
Proxy zones. | contain reasonable default values. The <bcp14>RECOMMENDED</bcp14> | |||
These fields SHOULD contain reasonable default values. | values are: REFRESH 7200, RETRY 3600, and EXPIRE 86400.</t> | |||
The RECOMMENDED values are: REFRESH 7200, RETRY 3600, EXPIRE | ||||
86400.</t> | ||||
<t>The MINIMUM field (used to control the lifetime of negative cache | <t>The MINIMUM field (used to control the lifetime of negative cache | |||
entries) | entries) | |||
SHOULD contain the value 10. | <bcp14>SHOULD</bcp14> contain the value 10. | |||
The value of ten seconds is chosen based on user-experience | This value is chosen based on user-experience | |||
considerations | considerations | |||
(see <xref target="ttl"/>).</t> | (see <xref target="ttl" format="default"/>).</t> | |||
<t>In the event that there are multiple Discovery Proxy devices on a | <t>In the event that there are multiple Discovery Proxy devices on a | |||
link for fault tolerance reasons, this will result in clients | link for fault tolerance reasons, this will result in clients | |||
receiving inconsistent SOA records (different MNAME, and possibly | receiving inconsistent SOA records (different MNAME and possibly | |||
RNAME) | RNAME) depending on which Discovery Proxy answers their SOA query. | |||
depending on which Discovery Proxy answers their SOA query. | ||||
However, since clients generally have no reason to use the MNAME or | However, since clients generally have no reason to use the MNAME or | |||
RNAME | RNAME data, this is unlikely to cause any problems.</t> | |||
data, this is unlikely to cause any problems.</t> | ||||
<?rfc needLines="22" ?> | ||||
</section> | </section> | |||
<section anchor="ns" numbered="true" toc="default"> | ||||
<section anchor="ns" title="DNS NS Records"> | <name>DNS NS Records</name> | |||
<t>In the event that there are multiple Discovery Proxy devices on a | <t>In the event that there are multiple Discovery Proxy devices on a | |||
link for fault tolerance reasons, the parent zone MUST | link for fault tolerance reasons, the parent zone <bcp14>MUST</bcp14> | |||
be configured with NS records giving the names | be configured with NS records giving the names | |||
of all the Discovery Proxy devices on the link.</t> | of all the Discovery Proxy devices on the link.</t> | |||
<t>Each Discovery Proxy device <bcp14>MUST</bcp14> be configured to | ||||
<t>Each Discovery Proxy device MUST be configured to answer NS queries | answer NS queries | |||
for the zone apex name by giving its own NS record, | for the zone apex name by giving its own NS record, | |||
and the NS records of its fellow Discovery Proxy devices on the same | and the NS records of its fellow Discovery Proxy devices on the same | |||
link, so that it can return the correct answers for NS queries.</t> | link, so that it can return the correct answers for NS queries.</t> | |||
<t>The target host name in the RDATA of an NS record <bcp14>MUST | ||||
<t>The target host name in the RDATA of an NS record MUST NOT | NOT</bcp14> | |||
reference | reference | |||
a name that falls within any zone delegated to a Discovery Proxy. | a name that falls within any zone delegated to a Discovery Proxy. | |||
Apart from the zone apex name, | Apart from the zone apex name, | |||
all other host names that fall within a zone delegated to a Discovery | all other host names (names of A and AAAA DNS records) | |||
that fall within a zone delegated to a Discovery | ||||
Proxy | Proxy | |||
correspond to local Multicast DNS host names, | correspond to local Multicast DNS host names, | |||
which logically belong to the respective Multicast DNS hosts defending | which logically belong to the respective Multicast DNS hosts defending | |||
those names, | those names, | |||
not the Discovery Proxy. | not the Discovery Proxy. | |||
Generally speaking, the Discovery Proxy does not own or control the | Generally speaking, the Discovery Proxy does not own or control the | |||
delegated zone; | delegated zone; | |||
it is merely a conduit to the corresponding ".local" namespace, | it is merely a conduit to the corresponding ".local" namespace, | |||
which is controlled by the Multicast DNS hosts on that link. | which is controlled by the Multicast DNS hosts on that link. | |||
If an NS record were to reference a manually-determined host name | If an NS record were to reference a manually determined host name | |||
that falls within a delegated zone, | that falls within a delegated zone, | |||
that manually-determined host name may inadvertently conflict with a | that manually determined host name may inadvertently conflict with a | |||
corresponding | corresponding | |||
".local" host name that is owned and controlled by some device on that | ".local" host name that is owned and controlled by some device on that | |||
link. | link. | |||
</t> | </t> | |||
</section> | </section> | |||
<section anchor="delegation" numbered="true" toc="default"> | ||||
<section anchor="delegation" title="DNS Delegation Records"> | <name>DNS Delegation Records</name> | |||
<t>Since the <xref target="RFC6762">Multicast DNS specification</xref> | <t>Since the <xref target="RFC6762" format="default">Multicast DNS | |||
states that there can be no delegation (subdomains) within a ".local" | specification</xref> states that there can be no delegation | |||
namespace, | (subdomains) within a ".local" namespace, this implies that any name | |||
this implies that | within a zone delegated to a Discovery Proxy (except for the zone apex | |||
any name within a zone delegated to a Discovery Proxy | name itself) cannot have any answers for any DNS queries for RRTYPEs | |||
(except for the zone apex name itself) | SOA, NS, or DS. Consequently: | |||
cannot have any answers for any DNS queries for RRTYPEs SOA, NS, or | ||||
DS. | ||||
Consequently: | ||||
<list style='symbols'> | ||||
<t>for any query for the zone apex name of a zone delegated to a | ||||
Discovery Proxy, | ||||
the Discovery Proxy MUST generate the appropriate immediate | ||||
answers as described above, and</t> | ||||
<t>for any query for RRTYPEs SOA, NS, or DS, | ||||
for any name within a zone delegated to a Discovery Proxy, | ||||
other than the zone apex name, | ||||
instead of translating the query to its corresponding Multicast | ||||
DNS ".local" equivalent, | ||||
a Discovery Proxy MUST generate an immediate negative answer.</t> | ||||
</list> | ||||
</t> | </t> | |||
<ul spacing="normal"> | ||||
<li>for any query for the zone apex name of a zone delegated to a | ||||
Discovery Proxy, the Discovery Proxy <bcp14>MUST</bcp14> generate | ||||
the appropriate immediate answers as described above, and</li> | ||||
<li> | ||||
for any query for any name below the zone apex, for RRTYPEs SOA, NS, | ||||
or DS, | ||||
the Discovery Proxy <bcp14>MUST</bcp14> generate | ||||
an immediate negative answer. | ||||
</li> | ||||
</ul> | ||||
</section> | </section> | |||
<section anchor="srv" title="DNS SRV Records"> | <section anchor="srv" numbered="true" toc="default"> | |||
<t>There are certain special DNS records that logically | <name>DNS SRV Records</name> | |||
fall within the delegated unicast DNS subdomain, | <t>There are certain special DNS records that logically fall within | |||
but rather than mapping to their corresponding ".local" namesakes, | the delegated Unicast DNS subdomain, but rather than mapping to their | |||
they actually contain metadata pertaining to the operation | corresponding ".local" namesakes, they actually contain metadata | |||
of the delegated unicast DNS subdomain itself. | pertaining to the operation of the delegated Unicast DNS subdomain | |||
They do not exist in the corresponding ".local" namespace of the local | itself. They do not exist in the corresponding ".local" namespace of | |||
link. | the local link. For these queries, a Discovery Proxy | |||
For these queries a Discovery Proxy MUST generate immediate answers, | <bcp14>MUST</bcp14> generate immediate answers, whether positive or | |||
whether positive or negative, to avoid delays while clients wait for | negative, to avoid delays while clients wait for their query to be | |||
their query to be answered. | answered.</t> | |||
For example, if a Discovery Proxy does not implement | ||||
<xref target="LLQ">Long-Lived Queries</xref> | ||||
then it MUST return an immediate negative answer to tell the client | ||||
this without delay, | ||||
instead of passing the query through to the local network as a query | ||||
for | ||||
<spanx style="verb">_dns&nbhy;llq._udp.local.</spanx>, | ||||
and then waiting unsuccessfully for answers that will not be | ||||
forthcoming.</t> | ||||
<t>If a Discovery Proxy implements | <t>For example, if a Discovery Proxy implements Long-Lived Queries | |||
<xref target="LLQ">Long-Lived Queries</xref> | <xref target="RFC8764" format="default"></xref>, then it | |||
then it MUST positively respond to | <bcp14>MUST</bcp14> positively respond to | |||
<spanx style="verb">_dns&nbhy;llq._udp.<zone> SRV</spanx> | <tt>_dns&nbhy;llq._udp.<zone> SRV</tt> queries, | |||
queries, | <tt>_dns&nbhy;llq._tcp.<zone> SRV</tt> queries, and | |||
<spanx style="verb">_dns&nbhy;llq._tcp.<zone> SRV</spanx> | <tt>_dns&nbhy;llq&nbhy;tls._tcp.<zone> SRV</tt> queries as | |||
queries, and | appropriate. If it does not implement Long-Lived Queries, it | |||
<spanx | <bcp14>MUST</bcp14> return an immediate negative answer for those | |||
style="verb">_dns&nbhy;llq&nbhy;tls._tcp.<zone> SRV</spanx | queries, instead of passing those queries through to the local network | |||
> | as Multicast DNS queries and then waiting unsuccessfully for answers | |||
queries as appropriate, | that will not be forthcoming.</t> | |||
else it MUST return an immediate negative answer for those | ||||
queries.</t> | ||||
<t>If a Discovery Proxy implements | <t>If a Discovery Proxy implements | |||
<xref target="Push">DNS Push Notifications</xref> | DNS Push Notifications <xref target="RFC8765" | |||
then it MUST positively respond to | format="default"></xref>, | |||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx> | then it <bcp14>MUST</bcp14> positively respond to | |||
queries, | <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> | |||
else it MUST return an immediate negative answer for those | queries. | |||
Otherwise, it <bcp14>MUST</bcp14> return an immediate negative answer | ||||
for those | ||||
queries.</t> | queries.</t> | |||
<t>A Discovery Proxy <bcp14>MUST</bcp14> return an immediate negative | ||||
<t>A Discovery Proxy MUST return an immediate negative answer for | answer for | |||
<spanx | <tt>_dns&nbhy;update._udp.<zone> SRV</tt> | |||
style="verb">_dns&nbhy;update._udp.<zone> SRV</spanx> | ||||
queries, | queries, | |||
<spanx | <tt>_dns&nbhy;update._tcp.<zone> SRV</tt> | |||
style="verb">_dns&nbhy;update._tcp.<zone> SRV</spanx> | ||||
queries, and | queries, and | |||
<spanx | <tt>_dns&nbhy;update-tls._tcp.<zone> SRV</tt> | |||
style="verb">_dns&nbhy;update-tls._tcp.<zone> SRV</spanx> | ||||
queries, | queries, | |||
since using <xref target="RFC2136">DNS Update</xref> to change | since using DNS Update <xref target="RFC2136" format="default"></xref> | |||
to change | ||||
zones generated dynamically from local Multicast DNS data is not | zones generated dynamically from local Multicast DNS data is not | |||
possible.</t> | possible.</t> | |||
<?rfc needLines="29" ?> | ||||
</section> | </section> | |||
</section> | ||||
<section anchor="DNSSEC" title="DNSSEC Considerations"> | <section numbered="true" toc="default"> | |||
<name>Domain Enumeration Records</name> | ||||
<t>If the network operator chooses to use address-based | ||||
unicast Domain Enumeration queries for client configuration | ||||
(see <xref target="unicast" format="default"/>), | ||||
and the network operator also chooses to delegate the enclosing | ||||
reverse mapping subdomain to a Discovery Proxy, | ||||
then that Discovery Proxy becomes responsible for serving | ||||
the answers to those address-based unicast Domain Enumeration | ||||
queries.</t> | ||||
<section title="On-line signing only"> | <t>As with the SRV metadata records described above, a Discovery Proxy | |||
configured with delegated reverse mapping subdomains is responsible | ||||
for generating immediate (positive or negative) answers for | ||||
address-based unicast Domain Enumeration queries, rather than | ||||
passing them though to the underlying Multicast DNS subsystem and | ||||
then waiting unsuccessfully for answers that will not be | ||||
forthcoming.</t> | ||||
</section> | ||||
</section> | ||||
<section anchor="DNSSEC" numbered="true" toc="default"> | ||||
<name>DNSSEC Considerations</name> | ||||
<section numbered="true" toc="default"> | ||||
<name>Online Signing Only</name> | ||||
<t>The Discovery Proxy acts as the authoritative name server for | <t>The Discovery Proxy acts as the authoritative name server for | |||
designated subdomains, and if DNSSEC is to be used, the Discovery | designated subdomains, and if DNSSEC is to be used, the Discovery | |||
Proxy needs to | Proxy needs to possess a copy of the signing keys in order to | |||
possess a copy of the signing keys, in order to generate authoritative | generate authoritative signed data from the local Multicast DNS | |||
signed data from the local Multicast DNS responses it receives. | responses it receives. Offline signing is not applicable to | |||
Off-line signing is not applicable to Discovery Proxy.</t> | Discovery Proxy.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="NSEC and NSEC3 Records"> | <name>NSEC and NSEC3 Records</name> | |||
<t>In DNSSEC | <t>In DNSSEC, | |||
<xref target="RFC4034">NSEC</xref> and | NSEC and NSEC3 records | |||
<xref target="RFC5155">NSEC3</xref> records | ||||
are used to assert the nonexistence of certain names, | are used to assert the nonexistence of certain names, | |||
also described as "authenticated denial of existence".</t> | also described as "authenticated denial of existence" | |||
<xref target="RFC4034" format="default"></xref> | ||||
<xref target="RFC5155" format="default"></xref>.</t> | ||||
<t>Since a Discovery Proxy only knows what names exist on the local | <t>Since a Discovery Proxy only knows what names exist on the local | |||
link | link by issuing queries for them, and since it would be impractical to | |||
by issuing queries for them, and since it would be impractical to | ||||
issue queries for every possible name just to find out which names | issue queries for every possible name just to find out which names | |||
exist and which do not, a Discovery Proxy cannot programmatically | exist and which do not, a Discovery Proxy cannot programmatically | |||
synthesize the traditional NSEC and NSEC3 records which assert the | synthesize the traditional NSEC and NSEC3 records that assert the | |||
nonexistence of a large range of names. | nonexistence of a large range of names. Instead, when generating a | |||
Instead, when generating a negative response, | negative response, a Discovery Proxy programmatically synthesizes a | |||
a Discovery Proxy programmatically synthesizes a single NSEC record | single NSEC record asserting the nonexistence of just the specific | |||
assert the nonexistence of just the specific name queried, and no | name queried and no others. Since the Discovery Proxy has the zone | |||
others. | signing key, it can do this on demand. Since the NSEC record asserts | |||
Since the Discovery Proxy has the zone signing key, it can do this on | the nonexistence of only a single name, zone walking is not a concern, | |||
demand. | and NSEC3 is therefore not necessary.</t> | |||
Since the NSEC record asserts the nonexistence of only a single name, | ||||
zone walking is not a concern, so NSEC3 is not necessary.</t> | ||||
<t>Note that this applies only to traditional immediate DNS queries, | <t>Note that this applies only to traditional immediate DNS queries, | |||
which may return immediate negative answers when | which may return immediate negative answers when no immediate positive | |||
no immediate positive answer is available. | answer is available. When used with a DNS Push Notification | |||
When used with a | subscription <xref target="RFC8765" | |||
<xref target="Push">DNS Push Notification subscription</xref> | format="default"></xref>, there are no negative answers, merely the | |||
there are no negative answers, merely the absence of answers so far, | absence of answers so far, which may change in the future if answers | |||
which may change in the future if answers become available.</t> | become available.</t> | |||
<?rfc needLines="19" ?> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IPv6 Considerations"> | <name>IPv6 Considerations</name> | |||
<t>An IPv4-only host and an IPv6-only host behave as "ships that pass in | <t>An IPv4-only host and an IPv6-only host behave as "ships that pass in | |||
the night". Even if they are on the same <xref | the night". Even if they are on the same Ethernet <xref target="IEEE-3" | |||
target="IEEE-3">Ethernet</xref>, neither is aware | format="default"></xref>, neither is aware of the other's traffic. For | |||
of the other's traffic. For this reason, each link may have | this reason, each link may have <em>two</em> unrelated ".local." zones: | |||
*two* unrelated ".local." zones, one for IPv4 and one for IPv6. | one for | |||
Since for practical purposes, a group of IPv4-only hosts and a group | IPv4 and one for IPv6. Since, for practical purposes, a group of | |||
of IPv6-only hosts on the same Ethernet act as if they were on two | IPv4-only hosts and a group of IPv6-only hosts on the same Ethernet act | |||
entirely separate Ethernet segments, it is unsurprising that their | as if they were on two entirely separate Ethernet segments, it is | |||
use of the ".local." zone should occur exactly as it would if | unsurprising that their use of the ".local." zone should occur exactly | |||
they really were on two entirely separate Ethernet segments.</t> | as it would if they really were on two entirely separate Ethernet | |||
segments.</t> | ||||
<t>It will be desirable to have a mechanism to 'stitch' together | <t>It will be desirable to have a mechanism to "stitch" together | |||
these two unrelated ".local." zones so that they appear as one. | these two unrelated ".local." zones so that they appear as one. | |||
Such mechanism will need to be able to differentiate between a | Such a mechanism will need to be able to differentiate between a | |||
dual-stack (v4/v6) host participating in both ".local." | dual-stack (v4/v6) host participating in both ".local." | |||
zones, and two different hosts, one IPv4-only and the other IPv6-only, | zones, and two different hosts: one IPv4-only and the other IPv6-only, | |||
which are both trying to use the same name(s). Such a mechanism | which are both trying to use the same name(s). Such a mechanism | |||
will be specified in a future companion document.</t> | will be specified in a future companion document.</t> | |||
<t>At present, it is <bcp14>RECOMMENDED</bcp14> that a Discovery Proxy | ||||
<t>At present, it is RECOMMENDED that a Discovery Proxy be configured | be configured | |||
with a single domain name for both the IPv4 and IPv6 ".local." zones | with a single domain name for both the IPv4 and IPv6 ".local." zones | |||
on the local link, and when a unicast query is received, it should | on the local link, and when a unicast query is received, it should | |||
issue Multicast DNS queries using both IPv4 and IPv6 on the local link, | issue Multicast DNS queries using both IPv4 and IPv6 on the local link | |||
and then combine the results.</t> | and then combine the results.</t> | |||
<?rfc needLines="25" ?> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Security Considerations"> | <name>Security Considerations</name> | |||
<section title="Authenticity"> | <section numbered="true" toc="default"> | |||
<name>Authenticity</name> | ||||
<t>A service proves its presence on a link by its ability to | <t>A service proves its presence on a link by its ability to | |||
answer link-local multicast queries on that link. | answer link-local multicast queries on that link. | |||
If greater security is desired, then the Discovery Proxy mechanism | If greater security is desired, then the Discovery Proxy mechanism | |||
should not be used, and something with stronger security should | should not be used, and something with stronger security should | |||
be used instead, such as authenticated secure DNS Update | be used instead such as authenticated secure DNS Update | |||
<xref target="RFC2136"/> <xref target="RFC3007"/>.</t> | <xref target="RFC2136" format="default"/> <xref target="RFC3007" | |||
format="default"/>.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Privacy"> | <name>Privacy</name> <t>The Domain Name System is, generally speaking, | |||
<t>The Domain Name System is, generally speaking, a global public | a global public database. Records that exist in the Domain Name | |||
database. | System name hierarchy can be queried by name from, in principle, | |||
Records that exist in the Domain Name System name hierarchy | anywhere in the world. If services on a mobile device (like a laptop | |||
can be queried by name from, in principle, anywhere in the world. | computer) are made visible via the Discovery Proxy mechanism, then | |||
If services on a mobile device (like a laptop computer) are made | when those services become visible in a domain such as | |||
visible | "My House.example.com", it might indicate to (potentially | |||
via the Discovery Proxy mechanism, then when those services become | hostile) observers that the mobile device is in the owner's home. | |||
visible | When those | |||
in a domain such as "My House.example.com" that might indicate to | services disappear from "My House.example.com", that change could | |||
(potentially hostile) observers that the mobile device is in my house. | be used by observers to infer when the mobile device (and possibly its | |||
When those services disappear from "My House.example.com" | owner) may have left the house. The privacy of this information may | |||
that change could be used by observers to infer when the | be protected using techniques like firewalls, split-view DNS, and | |||
mobile device (and possibly its owner) may have left the house. | Virtual Private Networks (VPNs), as are customarily used today to | |||
The privacy of this information may be protected using techniques | protect the privacy of corporate DNS information.</t> | |||
like firewalls, split-view DNS, and Virtual Private Networks (VPNs), | ||||
as are customarily used today | ||||
to protect the privacy of corporate DNS information.</t> | ||||
<t>The privacy issue is particularly serious for the IPv4 and IPv6 | <t>The privacy issue is particularly serious for the IPv4 and IPv6 | |||
reverse zones. | reverse zones. | |||
If the public delegation of the reverse zones points to the | If the public delegation of the reverse zones points to the | |||
Discovery Proxy, and the Discovery Proxy is reachable globally, | Discovery Proxy, and the Discovery Proxy is reachable globally, | |||
then it could leak a significant amount of information. | then it could leak a significant amount of information. | |||
Attackers could discover hosts that otherwise might | Attackers could discover hosts that otherwise might | |||
not be easy to identify, and learn their hostnames. | not be easy to identify, and learn their host names. | |||
Attackers could also discover the existence of links | Attackers could also discover the existence of links | |||
where hosts frequently come and go.</t> | where hosts frequently come and go.</t> | |||
<t>The Discovery Proxy could provide sensitive records only to | ||||
<t>The Discovery Proxy could also provide sensitive records only to | ||||
authenticated | authenticated | |||
users. This is a general DNS problem, not specific to the Discovery | users. This is a general DNS problem, not specific to the Discovery | |||
Proxy. | Proxy. | |||
Work is underway in the IETF to tackle this problem <xref | Work is underway in the IETF to tackle this problem <xref | |||
target="RFC7626"/>.</t> | target="RFC7626" format="default"/>.</t> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Denial of Service"> | <name>Denial of Service</name> | |||
<t>A remote attacker could use a rapid series of unique Unicast DNS | <t>A remote attacker could use a rapid series of unique Unicast DNS | |||
queries to induce a Discovery Proxy to generate a rapid series of | queries to induce a Discovery Proxy to generate a rapid series of | |||
corresponding Multicast DNS queries on one or more of its local links. | corresponding Multicast DNS queries on one or more of its local links. | |||
Multicast traffic is generally more expensive than unicast traffic | Multicast traffic is generally more expensive than unicast traffic, | |||
-- especially on Wi-Fi links -- | especially on Wi-Fi links | |||
which makes this attack particularly serious. | <xref target="I-D.ietf-mboned-ieee802-mcast-problems" | |||
To limit the damage that can be caused by such attacks, a Discovery | format="default"/>, | |||
Proxy | which makes this attack particularly | |||
(or the underlying Multicast DNS subsystem which it utilizes) MUST | serious. To limit the damage that can be caused by such attacks, a | |||
implement Multicast DNS query rate limiting appropriate to the link | Discovery Proxy (or the underlying Multicast DNS subsystem that it | |||
technology in question. For today's 802.11b/g/n/ac Wi-Fi links | utilizes) <bcp14>MUST</bcp14> implement Multicast DNS query rate | |||
(for which approximately 200 multicast packets per second is | limiting appropriate to the link technology in question. For today's | |||
sufficient | 802.11b/g/n/ac Wi-Fi links (for which approximately 200 multicast | |||
to consume approximately 100% of the wireless spectrum) | packets per second is sufficient to consume approximately 100% of the | |||
a limit of 20 Multicast DNS query packets per second is RECOMMENDED. | wireless spectrum), a limit of 20 Multicast DNS query packets per | |||
On other link technologies like Gigabit Ethernet higher limits | second is <bcp14>RECOMMENDED</bcp14>. On other link technologies like | |||
may be appropriate. | Gigabit Ethernet, higher limits may be appropriate. A consequence of | |||
A consequence of this rate limiting is that a rogue remote client | this rate limiting is that a rogue remote client could issue an | |||
could issue an excessive number of queries, resulting in denial of | excessive number of queries resulting in denial of service to other | |||
service to other legitimate remote clients attempting to use that | legitimate remote clients attempting to use that Discovery Proxy. | |||
Discovery Proxy. | ||||
However, this is preferable to a rogue remote client being able to | However, this is preferable to a rogue remote client being able to | |||
inflict even greater harm on the local network, which could impact | inflict even greater harm on the local network, which could impact the | |||
the correct operation of all local clients on that network.</t> | correct operation of all local clients on that network.</t> | |||
<?rfc needLines="28" ?> | ||||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
<t>This document has no IANA Considerations.</t> | <t>This document has no IANA actions.</t> | |||
</section> | </section> | |||
<section title="Acknowledgments"> | ||||
<t>Thanks to Markus Stenberg for helping develop the policy | ||||
regarding the four styles of unicast response according to what | ||||
data is immediately available in the cache. | ||||
Thanks to | ||||
Anders Brandt, | ||||
Ben Campbell, | ||||
Tim Chown, | ||||
Alissa Cooper, | ||||
Spencer Dawkins, | ||||
Ralph Droms, | ||||
Joel Halpern, | ||||
Ray Hunter, | ||||
Joel Jaeggli, | ||||
Warren Kumari, | ||||
Ted Lemon, | ||||
Alexey Melnikov, | ||||
Kathleen Moriarty, | ||||
Tom Pusateri, | ||||
Eric Rescorla, | ||||
Adam Roach, | ||||
David Schinazi, | ||||
Markus Stenberg, | ||||
Dave Thaler, | ||||
and Andrew Yourtchenko for their comments.</t> | ||||
<?rfc needLines="33" ?> | ||||
</section> | ||||
</middle> | </middle> | |||
<back> | <back> | |||
<references title="Normative References"> | ||||
<?rfc include="reference.RFC.1034" ?> | ||||
<?rfc include="reference.RFC.1035" ?> | ||||
<?rfc include="reference.RFC.1918" ?> | ||||
<?rfc include="reference.RFC.2119" ?> | ||||
<?rfc include="reference.RFC.2308" ?> | ||||
<?rfc include="reference.RFC.3629" ?> | ||||
<?rfc include="reference.RFC.3927" ?> | ||||
<?rfc include="reference.RFC.4034" ?> | ||||
<?rfc include="reference.RFC.4862" ?> | ||||
<?rfc include="reference.RFC.5155" ?> | ||||
<?rfc include="reference.RFC.5198" ?> | ||||
<?rfc include="reference.RFC.6762" ?> | ||||
<?rfc include="reference.RFC.6763" ?> | ||||
<?rfc include="reference.RFC.8174" ?> | ||||
<?rfc include="reference.RFC.8490" ?> | ||||
<?rfc include="reference.I-D.ietf-dnssd-push" anchor='Push' | <displayreference target="I-D.cheshire-dnssd-roadmap" to="ROADMAP"/> | |||
?> | ||||
</references> | <displayreference target="I-D.sctl-service-registration" to="REG-PROT"/> | |||
<?rfc needLines="6" ?> | <displayreference target="I-D.sctl-dnssd-mdns-relay" to="RELAY"/> | |||
<references title="Informative References"> | ||||
<?rfc include="reference.I-D.cheshire-dnssd-roadmap" | <displayreference target="I-D.ietf-mboned-ieee802-mcast-problems" to="MCAST"/> | |||
anchor='Roadmap' ?> | ||||
<?rfc include="reference.I-D.sekar-dns-ul" | ||||
anchor='DNS-UL' ?> | ||||
<?rfc include="reference.I-D.sekar-dns-llq" anchor='LLQ' | ||||
?> | ||||
<?rfc include="reference.I-D.sctl-service-registration" | ||||
anchor='RegProt' ?> | ||||
<?rfc include="reference.I-D.sctl-dnssd-mdns-relay" anchor='Relay' | ||||
?> | ||||
<?rfc include="reference.I-D.ietf-mboned-ieee802-mcast-problems" | ||||
anchor='Mcast' ?> | ||||
<?rfc include="reference.RFC.2132" ?> | ||||
<?rfc include="reference.RFC.2136" ?> | ||||
<?rfc include="reference.RFC.3007" ?> | ||||
<?rfc include="reference.RFC.3492" ?> | ||||
<?rfc include="reference.RFC.4193" ?> | ||||
<?rfc include="reference.RFC.6760" ?> | ||||
<?rfc include="reference.RFC.7558" ?> | ||||
<?rfc include="reference.RFC.7626" ?> | ||||
<?rfc include="reference.RFC.7788" ?> | ||||
<?rfc include="reference.RFC.8375" ?> | ||||
<reference anchor="ohp" target="https://github.com/sbyx/ohybridproxy/"> | <displayreference target="I-D.sekar-dns-ul" to="DNS-UL"/> | |||
<front> | ||||
<title>Discovery Proxy (Hybrid Proxy) implementation for | ||||
OpenWrt</title> | ||||
<author/> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="ZC"> | <references> | |||
<name>References</name> | ||||
<references> | ||||
<name>Normative References</name> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.10 | ||||
34.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.10 | ||||
35.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.19 | ||||
18.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
19.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.23 | ||||
08.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.36 | ||||
29.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.39 | ||||
27.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.40 | ||||
34.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.48 | ||||
62.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.51 | ||||
55.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.51 | ||||
98.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.67 | ||||
62.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.67 | ||||
63.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.81 | ||||
74.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.84 | ||||
90.xml"/> | ||||
<reference anchor='RFC8765' target="https://www.rfc-editor.org/info/rfc8765"> | ||||
<front> | <front> | |||
<title>Zero Configuration Networking: The Definitive Guide</title> | <title>DNS Push Notifications | |||
<author initials="S." surname="Cheshire" fullname="Stuart | </title> | |||
Cheshire"/> | <author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | |||
<author initials="D.H." surname="Steinberg" fullname="Daniel | <organization /> | |||
H. Steinberg"/> | </author> | |||
<date year="2005" month="December"/> | <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | |||
<organization /> | ||||
</author> | ||||
<date month='June' year='2020' /> | ||||
</front> | </front> | |||
<seriesInfo name="O'Reilly Media, Inc." value=""/> | <seriesInfo name='RFC' value='8765' /> | |||
<seriesInfo name="ISBN" value="0-596-10100-7"/> | <seriesInfo name="DOI" value="10.17487/RFC8765"/> | |||
</reference> | </reference> | |||
</references> | ||||
<references> | ||||
<name>Informative References</name> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.sek | ||||
ar-dns-ul.xml"/> | ||||
<!-- Patterned after | ||||
http://xml.resource.org/public/rfc/bibxml2/_reference.IEEE.802-3.1998.xml | ||||
--> | ||||
<reference anchor="IEEE-1Q" | <reference anchor="IEEE-1Q" | |||
target="http://standards.ieee.org/getieee802/download/802-1Q-201 | target="https://ieeexplore.ieee.org/document/6991462"> | |||
4.pdf"> | <front> | |||
<front> | <title>IEEE Standard for Local and metropolitan area | |||
<title> | networks -- Bridges and Bridged Networks | |||
IEEE Standard for Local and metropolitan area networks -- | </title> | |||
Bridges and Bridged Networks | <author> | |||
</title> | <organization>IEEE</organization> | |||
<author/> | </author> | |||
<date year="2014" month="November"/> | <date year="2014"/> | |||
</front> | </front> | |||
<seriesInfo name="IEEE" value="Std 802.1Q-2014"/> | <seriesInfo name="IEEE Std" value="802.1Q-2014"/> | |||
<seriesInfo name="DOI" value="10.1109/IEEESTD.2014.6991462"/> | ||||
</reference> | </reference> | |||
<reference anchor="IEEE-3" | <reference anchor="IEEE-3" | |||
target="http://standards.ieee.org/getieee802/802.3.html"> | target="https://ieeexplore.ieee.org/document/8457469"> | |||
<front> | <front> | |||
<title> | <title> | |||
Information technology - Telecommunications and information | IEEE Standard for Ethernet | |||
exchange between systems - | </title> | |||
Local and metropolitan area networks - Specific requirements - | <seriesInfo name="IEEE Std" value="802.3-2018"/> | |||
Part 3: Carrier Sense Multiple Access with Collision Detection | <seriesInfo name="DOI" value="10.1109/IEEESTD.2018.8457469"/> | |||
(CMSA/CD) | <author> | |||
Access Method and Physical Layer Specifications | <organization>IEEE</organization> | |||
</title> | </author> | |||
<author/> | <date year="2008" month="December"/> | |||
<date year="2008" month="December"/> | </front> | |||
</front> | </reference> | |||
<seriesInfo name="IEEE" value="Std 802.3-2008"/> | ||||
</reference> | ||||
<reference anchor="IEEE-5"> | <reference anchor="IEEE-5" | |||
<front> | target="https://standards.ieee.org/standard/802_5-1998.html | |||
<title>Information technology - Telecommunications and information | "> | |||
exchange | <front> | |||
between systems - Local and metropolitan area networks - Specific | <title> | |||
requirements - | Telecommunications and information exchange between systems - Local and | |||
Part 5: Token ring access method and physical layer | metropolitan area networks - Part 5: Token ring access method and physical | |||
specification</title> | layer specifications | |||
<author><organization>Institute of Electrical and Electronics | </title> | |||
Engineers</organization></author> | <seriesInfo name="IEEE Std" value="802.5-1998"/> | |||
<date month="" year="1995" /> | <author> | |||
</front> | <organization>IEEE</organization> | |||
<seriesInfo name="IEEE" value="Std 802.5-1998"/> | </author> | |||
</reference> | <date year="1998"/> | |||
</front> | ||||
</reference> | ||||
<reference anchor="IEEE-11" | <reference anchor="IEEE-11" | |||
target="http://standards.ieee.org/getieee802/802.11.html"> | target="https://standards.ieee.org/standard/802_11-2016.htm | |||
<front> | l"> | |||
<title> | <front> | |||
<title> | ||||
Information technology - Telecommunications and information | Information technology - Telecommunications and information | |||
exchange between systems - | exchange between systems - | |||
Local and metropolitan area networks - Specific requirements - | Local and metropolitan area networks - Specific requirements - | |||
Part 11: Wireless LAN Medium Access Control (MAC) and Physical | Part 11: Wireless LAN Medium Access Control (MAC) and Physical | |||
Layer (PHY) Specifications | Layer (PHY) Specifications | |||
</title> | </title> | |||
<author/> | <seriesInfo name="IEEE Std" value="802.11-2016"/> | |||
<date year="2007" month="June"/> | <author> | |||
</front> | <organization>IEEE | |||
<seriesInfo name="IEEE" value="Std 802.11-2007"/> | </organization> | |||
</reference> | </author> | |||
<date year="2016" month="December"/> | ||||
</front> | ||||
</reference> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.iet | ||||
f-mboned-ieee802-mcast-problems.xml"/> | ||||
<reference anchor="OHP" | ||||
target="https://github.com/sbyx/ohybridproxy/"> | ||||
<front> | ||||
<title> | ||||
ohybridproxy - an mDNS/DNS hybrid-proxy based on | ||||
mDNSResponder | ||||
</title> | ||||
<author/> | ||||
<date month="June" year="2017"/> | ||||
</front> | ||||
<refcontent>commit 464d6c9</refcontent> | ||||
</reference> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.sct | ||||
l-service-registration.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.sct | ||||
l-dnssd-mdns-relay.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
32.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
36.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.30 | ||||
07.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.34 | ||||
92.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.41 | ||||
93.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.67 | ||||
60.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.75 | ||||
58.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.76 | ||||
26.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.77 | ||||
88.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.83 | ||||
75.xml"/> | ||||
<reference anchor='RFC8764' target="https://www.rfc-editor.org/info/rfc8764"> | ||||
<front> | ||||
<title>Apple's DNS Long-Lived Queries Protocol</title> | ||||
<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | ||||
<organization /> | ||||
</author> | ||||
<author initials='M' surname='Krochmal' fullname='Marc Krochmal'> | ||||
<organization /> | ||||
</author> | ||||
<date month='June' year='2020' /> | ||||
</front> | ||||
<seriesInfo name='RFC' value='8764' /> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8764"/> | ||||
</reference> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml3/reference.I-D.che | ||||
shire-dnssd-roadmap.xml"/> | ||||
<reference anchor="ZC"> | ||||
<front> | ||||
<title>Zero Configuration Networking: The Definitive Guide</title> | ||||
<seriesInfo name="ISBN" value="0-596-10100-7"/> | ||||
<author initials="S." surname="Cheshire" fullname="Stuart | ||||
Cheshire"/> | ||||
<author initials="D.H." surname="Steinberg" fullname="Daniel | ||||
H. Steinberg"/> | ||||
<date year="2005" month="December"/> | ||||
</front> | ||||
<refcontent>O'Reilly Media, Inc.</refcontent> | ||||
</reference> | ||||
</references> | ||||
</references> | </references> | |||
<?rfc needLines="40" ?> | <section anchor="implementation" numbered="true" toc="default"> | |||
<section anchor="implementation" title="Implementation Status"> | <name>Implementation Status</name> | |||
<t>Some aspects of the mechanism specified in this document already | <t>Some aspects of the mechanism specified in this document already | |||
exist in | exist in | |||
deployed software. Some aspects are new. This section outlines which | deployed software. Some aspects are new. This section outlines which | |||
aspects | aspects | |||
already exist and which are new.</t> | already exist and which are new.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="Already Implemented and Deployed"> | <name>Already Implemented and Deployed</name> | |||
<t>Domain enumeration by the client (the | <t>Domain enumeration by the client | |||
"b._dns-sd._udp" queries) is already implemented and deployed.</t> | ("b._dns-sd._udp.<zone>" queries) is already implemented and | |||
deployed.</t> | ||||
<t>Unicast queries to the indicated discovery domain is already | <t>Performing unicast queries to the indicated discovery domain is | |||
already | ||||
implemented and deployed.</t> | implemented and deployed.</t> | |||
<t>These are implemented and deployed in Mac OS X 10.4 Tiger and later | ||||
<t>These are implemented and deployed in Mac OS X 10.4 and later | (including all versions of Apple iOS, on all models of iPhones, iPads, | |||
(including all versions of Apple iOS, on all iPhone and iPads), | Apple TVs and HomePods), | |||
in Bonjour for Windows, | in Bonjour for Windows, | |||
and in Android 4.1 "Jelly Bean" (API Level 16) and later.</t> | and in Android 4.1 "Jelly Bean" (API Level 16) and later.</t> | |||
<t>Domain enumeration and unicast querying have been | <t>Domain enumeration and unicast querying have been | |||
used for several years at IETF meetings to make Terminal Room | used for several years at IETF meetings to make terminal room | |||
printers discoverable from outside the Terminal room. When an IETF | printers discoverable from outside the terminal room. When an IETF | |||
attendee presses Cmd-P on a Mac, or selects AirPrint on an iPad | attendee presses "Cmd&nbhy;P" on a Mac, or selects AirPrint on an iPad | |||
or iPhone, and the Terminal room printers appear, that is because | or iPhone, and the terminal room printers appear, it is because | |||
the client is sending unicast DNS queries to the IETF DNS servers. | the client is sending Unicast DNS queries to the IETF DNS servers. | |||
A walk-through giving the details of this particular specific example | A walk-through giving the details of this particular specific example | |||
is given in Appendix A of <xref target="Roadmap">the Roadmap | is given in <xref target="I-D.cheshire-dnssd-roadmap" | |||
sectionFormat="of" section="A">the Roadmap | ||||
document</xref>.</t> | document</xref>.</t> | |||
</section> | <t>The Long-Lived Query mechanism <xref target="RFC8764" | |||
format="default"/> | ||||
referred to in this specification exists and is deployed | ||||
but was not standardized by the IETF. | ||||
The IETF has developed a superior Long-Lived Query mechanism | ||||
called DNS Push Notifications <xref target="RFC8765" | ||||
format="default"/>, | ||||
which is built on DNS Stateful Operations <xref target="RFC8490" | ||||
format="default"/>. | ||||
DNS Push Notifications is implemented and deployed in Mac OS X 10.15 | ||||
and later, | ||||
and iOS 13 and later.</t> | ||||
<section title="Already Implemented"> | </section> | |||
<section numbered="true" toc="default"> | ||||
<name>Already Implemented</name> | ||||
<t>A minimal portable Discovery Proxy implementation has been produced | <t>A minimal portable Discovery Proxy implementation has been produced | |||
by | by | |||
Markus Stenberg and Steven Barth, which runs on OS X and several Linux | Markus Stenberg and Steven Barth, which runs on OS X and several Linux | |||
variants including OpenWrt <xref target="ohp"/>. | variants including OpenWrt <xref target="OHP" format="default"/>. | |||
It was demonstrated at the Berlin IETF in July 2013.</t> | It was demonstrated at the Berlin IETF in July 2013.</t> | |||
<t>Tom Pusateri has an implementation that runs on any Unix/Linux. | <t>Tom Pusateri has an implementation that runs on any Unix/Linux | |||
It has a RESTful interface for management and an experimental demo CLI | system. It | |||
and web interface.</t> | has a RESTful interface for management and an experimental demo | |||
command-line interface (CLI) and web interface.</t> | ||||
<t>Ted Lemon also has produced a portable implementation of Discovery | <t>Ted Lemon also has produced a portable implementation of Discovery | |||
Proxy, | Proxy, | |||
which is available in the mDNSResponder open source code.</t> | which is available in the mDNSResponder open source code.</t> | |||
<t>The Long-Lived Query mechanism <xref target="LLQ"/> | ||||
referred to in this specification exists and is deployed, | ||||
but was not standardized by the IETF. | ||||
The IETF has developed a superior Long-Lived Query mechanism | ||||
called DNS Push Notifications <xref target="Push"/>, | ||||
which is built on DNS Stateful Operations <xref target="RFC8490"/>. | ||||
The pragmatic short-term deployment approach is for vendors | ||||
to produce Discovery Proxies that implement both the deployed | ||||
Long-Lived Query mechanism <xref target="LLQ"/> | ||||
(for today's clients) and the new | ||||
DNS Push Notifications mechanism <xref target="Push"/> | ||||
as the preferred long-term direction.</t> | ||||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
<section title="Partially Implemented"> | <name>Partially Implemented</name> | |||
<t>The current APIs make multiple domains visible to client | <t>At the time of writing, | |||
software, but most client UI today lumps all discovered services | existing APIs make multiple domains visible to client software, | |||
but most client user interfaces lump all discovered services | ||||
into a single flat list. This is largely a chicken-and-egg | into a single flat list. This is largely a chicken-and-egg | |||
problem. Application writers were naturally reluctant to spend | problem. Application writers were naturally reluctant to spend | |||
time writing domain-aware UI code when few customers today would | time writing domain-aware user interface code when few customers would | |||
benefit from it. If Discovery Proxy deployment becomes common, then | benefit from it. If Discovery Proxy deployment becomes common, then | |||
application writers will have a reason to provide better UI. | application writers will have a reason to provide a better user | |||
Existing applications will work with the Discovery Proxy, but will | experience. | |||
Existing applications will work with the Discovery Proxy but will | ||||
show all services in a single flat list. Applications with | show all services in a single flat list. Applications with | |||
improved UI will group services by domain.</t> | improved user interfaces will show services grouped by domain.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>Thanks to <contact fullname="Markus Stenberg"/> for helping develop | ||||
the policy | ||||
regarding the four styles of unicast response according to what | ||||
data is immediately available in the cache. | ||||
Thanks to | ||||
<contact fullname="Anders Brandt"/>, | ||||
<contact fullname="Ben Campbell"/>, | ||||
<contact fullname="Tim Chown"/>, | ||||
<contact fullname="Alissa Cooper"/>, | ||||
<contact fullname="Spencer Dawkins"/>, | ||||
<contact fullname="Ralph Droms"/>, | ||||
<contact fullname="Joel Halpern"/>, | ||||
<contact fullname="Ray Hunter"/>, | ||||
<contact fullname="Joel Jaeggli"/>, | ||||
<contact fullname="Warren Kumari"/>, | ||||
<contact fullname="Ted Lemon"/>, | ||||
<contact fullname="Alexey Melnikov"/>, | ||||
<contact fullname="Kathleen Moriarty"/>, | ||||
<contact fullname="Tom Pusateri"/>, | ||||
<contact fullname="Eric Rescorla"/>, | ||||
<contact fullname="Adam Roach"/>, | ||||
<contact fullname="David Schinazi"/>, | ||||
<contact fullname="Markus Stenberg"/>, | ||||
<contact fullname="Dave Thaler"/>, | ||||
and <contact fullname="Andrew Yourtchenko"/> for their comments.</t> | ||||
</section> | ||||
</back> | </back> | |||
</rfc> | </rfc> | |||
End of changes. 266 change blocks. | ||||
1494 lines changed or deleted | 1665 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |