rfc8764xml2.original.xml | rfc8764.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" version="3" category="info" docN | |||
ame="draft-sekar-dns-llq-06" indexInclude="true" ipr="trust200902" number="8764" | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | prepTime="2020-06-22T21:06:29" scripts="Common,Latin" sortRefs="true" submissio | |||
<!ENTITY RFC1035 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | nType="independent" symRefs="true" tocDepth="3" tocInclude="true" xml:lang="en"> | |||
nce.RFC.1035.xml"> | <link href="https://datatracker.ietf.org/doc/draft-sekar-dns-llq-06" rel="prev | |||
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | "/> | |||
nce.RFC.2119.xml"> | <link href="https://dx.doi.org/10.17487/rfc8764" rel="alternate"/> | |||
<!ENTITY RFC2782 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <link href="urn:issn:2070-1721" rel="alternate"/> | |||
nce.RFC.2782.xml"> | <front> | |||
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <title abbrev="Apple's DNS LLQ">Apple's DNS Long-Lived Queries Protocol</tit | |||
nce.RFC.8174.xml"> | le> | |||
<seriesInfo name="RFC" value="8764" stream="independent"/> | ||||
<!ENTITY RFC2136 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | |||
nce.RFC.2136.xml"> | <organization showOnFrontPage="true">Apple Inc.</organization> | |||
<!ENTITY RFC4787 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <address> | |||
nce.RFC.4787.xml"> | <postal> | |||
<!ENTITY RFC4953 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <street>One Apple Park Way</street> | |||
nce.RFC.4953.xml"> | <city>Cupertino</city> | |||
<!ENTITY RFC5382 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <region>CA</region> | |||
nce.RFC.5382.xml"> | <code>95014</code> | |||
<!ENTITY RFC6281 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <country>United States of America</country> | |||
nce.RFC.6281.xml"> | </postal> | |||
<!ENTITY RFC6762 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <phone>+1 (408) 996-1010</phone> | |||
nce.RFC.6762.xml"> | <email>cheshire@apple.com</email> | |||
<!ENTITY RFC6763 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | </address> | |||
nce.RFC.6763.xml"> | </author> | |||
<!ENTITY RFC6886 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <author initials="M." surname="Krochmal" fullname="Marc Krochmal"> | |||
nce.RFC.6886.xml"> | <organization showOnFrontPage="true">Apple Inc.</organization> | |||
<!ENTITY RFC6887 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <address> | |||
nce.RFC.6887.xml"> | <postal> | |||
<!ENTITY RFC6891 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <street>One Apple Park Way</street> | |||
nce.RFC.6891.xml"> | <city>Cupertino</city> | |||
<!ENTITY RFC7857 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | <region>CA</region> | |||
nce.RFC.7857.xml"> | <code>95014</code> | |||
]> | <country>United States of America</country> | |||
</postal> | ||||
<?rfc compact="yes"?> | <phone>+1 (408) 996-1010</phone> | |||
<?rfc subcompact="no"?> | <email>marc@apple.com</email> | |||
<?rfc toc="yes"?> | </address> | |||
<?rfc symrefs="yes"?> | </author> | |||
<?rfc sortrefs="yes"?> | <date month="06" year="2020"/> | |||
<keyword>Async</keyword> | ||||
<rfc docName="draft-sekar-dns-llq-06" category="info" submissionType="independen | <keyword>Asynchronous</keyword> | |||
t" ipr="trust200902"> | <keyword>Change Notification</keyword> | |||
<keyword>Push Notification</keyword> | ||||
<front> | <abstract pn="section-abstract"> | |||
<t pn="section-abstract-1"> | ||||
<title>Apple's DNS Long-Lived Queries protocol</title> | Apple's DNS Long-Lived Queries (LLQ) is a mechanism | |||
for extending the DNS protocol to support change notification, | ||||
<author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | thus allowing clients to learn about changes to DNS data | |||
<organization>Apple Inc.</organization> | without polling the server. From 2005 onwards, LLQ was | |||
<address> | implemented in Apple products including Mac OS X, Bonjour for | |||
<postal> | Windows, and AirPort wireless base stations. In 2020, the LLQ | |||
<street>One Apple Park Way</street> | protocol was superseded by the IETF Standards Track RFC 8765, | |||
<city>Cupertino</city> | "DNS | |||
<region>CA</region> | Push Notifications", which builds on experience gained with | |||
<code>95014</code> | the LLQ protocol to create a superior replacement. | |||
<country>United States of America</country> | </t> | |||
</postal> | <t pn="section-abstract-2"> | |||
<phone>+1 (408) 996-1010</phone> | The existing LLQ protocol deployed and used from 2005 to 2020 is | |||
<email>cheshire@apple.com</email> | documented here to give | |||
</address> | background regarding the operational experience that informed | |||
</author> | the development of DNS Push Notifications, and to help facilitate | |||
a smooth transition from LLQ to DNS Push Notifications. | ||||
<author initials='M.' surname='Krochmal' fullname='Marc Krochmal'> | </t> | |||
<organization>Apple Inc.</organization> | </abstract> | |||
<address> | <boilerplate> | |||
<postal> | <section anchor="status-of-memo" numbered="false" removeInRFC="false" toc= | |||
<street>One Apple Park Way</street> | "exclude" pn="section-boilerplate.1"> | |||
<city>Cupertino</city> | <name slugifiedName="name-status-of-this-memo">Status of This Memo</name | |||
<region>California</region> | > | |||
<code>95014</code> | <t pn="section-boilerplate.1-1"> | |||
<country>USA</country> | This document is not an Internet Standards Track specification; it i | |||
</postal> | s | |||
<email>marc@apple.com</email> | published for informational purposes. | |||
</address> | </t> | |||
</author> | <t pn="section-boilerplate.1-2"> | |||
This is a contribution to the RFC Series, independently of any | ||||
<date year="2019" month="August" day="22"/> | other RFC stream. The RFC Editor has chosen to publish this | |||
document at its discretion and makes no statement about its value | ||||
<abstract> | for implementation or deployment. Documents approved for | |||
<t> | publication by the RFC Editor are not candidates for any level of | |||
Apple's DNS Long-Lived Queries protocol (LLQ) is | Internet Standard; see Section 2 of RFC 7841. | |||
a protocol for extending the DNS protocol to support | </t> | |||
change notification, thus allowing clients to learn about changes | <t pn="section-boilerplate.1-3"> | |||
to | Information about the current status of this document, any | |||
DNS data without polling the server. | errata, and how to provide feedback on it may be obtained at | |||
From 2005 onwards, LLQ was implemented in Apple products | <eref target="https://www.rfc-editor.org/info/rfc8764" brackets="non | |||
including Mac OS X, Bonjour for Windows, and AirPort wireless base | e"/>. | |||
stations. In 2019, the LLQ protocol | </t> | |||
was superseded by the IETF Standards Track RFC xxxx | </section> | |||
[[RFC Editor note: Please replace xxxx with RFC number]] | <section anchor="copyright" numbered="false" removeInRFC="false" toc="excl | |||
"DNS Push Notifications", | ude" pn="section-boilerplate.2"> | |||
which builds on experience gained with the LLQ protocol to create | <name slugifiedName="name-copyright-notice">Copyright Notice</name> | |||
a superior replacement. | <t pn="section-boilerplate.2-1"> | |||
</t> | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
<t> | document authors. All rights reserved. | |||
The existing LLQ protocol deployed and used from 2005 to 2019 is documented h | </t> | |||
ere to give | <t pn="section-boilerplate.2-2"> | |||
background regarding the operational experience that informed | This document is subject to BCP 78 and the IETF Trust's Legal | |||
the development of DNS Push Notifications, and to help facilitate | Provisions Relating to IETF Documents | |||
a smooth transition from LLQ to DNS Push Notifications. | (<eref target="https://trustee.ietf.org/license-info" brackets="none | |||
</t> | "/>) in effect on the date of | |||
</abstract> | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with | ||||
</front> | respect to this document. | |||
</t> | ||||
<middle> | </section> | |||
<?rfc needLines="40" ?> | </boilerplate> | |||
<section anchor="introduction" title="Introduction"> | <toc> | |||
<t> | <section anchor="toc" numbered="false" removeInRFC="false" toc="exclude" p | |||
In dynamic environments, DNS Service Discovery <xref target="RFC6763"/> benef | n="section-toc.1"> | |||
its | <name slugifiedName="name-table-of-contents">Table of Contents</name> | |||
significantly from clients being able to learn about changes to | <ul bare="true" empty="true" indent="2" spacing="compact" pn="section-to | |||
DNS information via a mechanism that is both more timely and more | c.1-1"> | |||
efficient than simple polling. Such a mechanism enables "live | <li pn="section-toc.1-1.1"> | |||
browses" that learn when a new instance of a service appears, or when | <t keepWithNext="true" pn="section-toc.1-1.1.1"><xref derivedContent | |||
an existing service disappears from the network, and allows clients | ="1" format="counter" sectionFormat="of" target="section-1"/>. <xref derivedCon | |||
to monitor changes to a service. Multicast DNS <xref target="RFC6762"/> suppo | tent="" format="title" sectionFormat="of" target="name-introduction">Introductio | |||
rts this | n</xref></t> | |||
natively. When a host on the network publishes or deletes DNS | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
records, these changes are multicast to other hosts on the network. | n-toc.1-1.1.2"> | |||
These hosts deliver the change notifications to interested clients (applicati | <li pn="section-toc.1-1.1.2.1"> | |||
ons | <t keepWithNext="true" pn="section-toc.1-1.1.2.1.1"><xref derive | |||
running on the host). Hosts also send occasional queries to the | dContent="1.1" format="counter" sectionFormat="of" target="section-1.1"/>. <xre | |||
network in case gratuitous announcements are not received due to | f derivedContent="" format="title" sectionFormat="of" target="name-transition-to | |||
packet loss, and to detect records lost due to their publishers | -dns-push-noti">Transition to DNS Push Notifications</xref></t> | |||
crashing or having become disconnected from the network. | </li> | |||
</t> | </ul> | |||
</li> | ||||
<t> | <li pn="section-toc.1-1.2"> | |||
This document defines an Apple extension to DNS that enables a client to | <t keepWithNext="true" pn="section-toc.1-1.2.1"><xref derivedContent | |||
issue long-lived queries that allow a DNS server to notify clients | ="2" format="counter" sectionFormat="of" target="section-2"/>. <xref derivedCon | |||
about changes to DNS data. This is a more scalable and practical | tent="" format="title" sectionFormat="of" target="name-conventions-and-terminolo | |||
solution than can be achieved by polling of the name server because | gy">Conventions and Terminology Used in This Document</xref></t> | |||
a low polling rate could leave the client with stale information | </li> | |||
while a high polling rate would have an adverse impact on the network | <li pn="section-toc.1-1.3"> | |||
and server. | <t pn="section-toc.1-1.3.1"><xref derivedContent="3" format="counter | |||
</t> | " sectionFormat="of" target="section-3"/>. <xref derivedContent="" format="titl | |||
e" sectionFormat="of" target="name-mechanisms">Mechanisms</xref></t> | ||||
<t> | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
The mechanism defined in this document is now being replaced by | n-toc.1-1.3.2"> | |||
<xref target="Push">DNS Push Notifications</xref> as explained below | <li pn="section-toc.1-1.3.2.1"> | |||
in <xref target="trans"/>. | <t pn="section-toc.1-1.3.2.1.1"><xref derivedContent="3.1" forma | |||
</t> | t="counter" sectionFormat="of" target="section-3.1"/>. <xref derivedContent="" | |||
<?rfc needLines="40" ?> | format="title" sectionFormat="of" target="name-assigned-numbers">Assigned Number | |||
<t> | s</xref></t> | |||
</t> | </li> | |||
<section anchor="trans" title="Transition to DNS Push Notificatio | <li pn="section-toc.1-1.3.2.2"> | |||
ns"> | <t pn="section-toc.1-1.3.2.2.1"><xref derivedContent="3.2" forma | |||
<t> | t="counter" sectionFormat="of" target="section-3.2"/>. <xref derivedContent="" | |||
The LLQ protocol enjoyed over a decade of useful operation, | format="title" sectionFormat="of" target="name-opt-rr-format">Opt-RR Format</xre | |||
enabling timely live updates for the service discovery user interface in | f></t> | |||
Apple's <xref target="RFC6281">Back to My Mac</xref> service. | </li> | |||
</t> | </ul> | |||
</li> | ||||
<t> | <li pn="section-toc.1-1.4"> | |||
However, some problems were discovered, as described in <xref target="problem | <t pn="section-toc.1-1.4.1"><xref derivedContent="4" format="counter | |||
s"/>. | " sectionFormat="of" target="section-4"/>. <xref derivedContent="" format="titl | |||
This operational | e" sectionFormat="of" target="name-llq-address-and-port-identi">LLQ Address and | |||
experience with LLQ informed the design of its IETF Standards | Port Identification</xref></t> | |||
Track successor, <xref target="Push">DNS Push Notifications</xref>. | </li> | |||
Since no further work is being done on the LLQ protocol, this LLQ | <li pn="section-toc.1-1.5"> | |||
specification will not be updated to remedy these problems. | <t pn="section-toc.1-1.5.1"><xref derivedContent="5" format="counter | |||
</t> | " sectionFormat="of" target="section-5"/>. <xref derivedContent="" format="titl | |||
e" sectionFormat="of" target="name-llq-setup">LLQ Setup</xref></t> | ||||
<t> | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
All existing LLQ | n-toc.1-1.5.2"> | |||
implementations are RECOMMENDED to migrate to using DNS Push Notifications in | <li pn="section-toc.1-1.5.2.1"> | |||
stead. | <t pn="section-toc.1-1.5.2.1.1"><xref derivedContent="5.1" forma | |||
</t> | t="counter" sectionFormat="of" target="section-5.1"/>. <xref derivedContent="" | |||
format="title" sectionFormat="of" target="name-setup-message-retransmissio">Setu | ||||
<t> | p Message Retransmission</xref></t> | |||
For existing LLQ servers, they are RECOMMENDED to implement and support | </li> | |||
DNS Push Notifications, so that clients can begin migrating to the | <li pn="section-toc.1-1.5.2.2"> | |||
newer protocol. | <t pn="section-toc.1-1.5.2.2.1"><xref derivedContent="5.2" forma | |||
</t> | t="counter" sectionFormat="of" target="section-5.2"/>. <xref derivedContent="" | |||
format="title" sectionFormat="of" target="name-llq-setup-four-way-handshak">LLQ | ||||
<t> | Setup Four-Way Handshake</xref></t> | |||
For existing LLQ clients, they are RECOMMENDED to query for the | <ul bare="true" empty="true" indent="2" spacing="compact" pn="se | |||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx> | ction-toc.1-1.5.2.2.2"> | |||
SRV record first, and only if DNS Push fails, then fall back to query for | <li pn="section-toc.1-1.5.2.2.2.1"> | |||
<spanx style="verb">_dns&nbhy;llq._udp.<zone></spanx> instead. | <t pn="section-toc.1-1.5.2.2.2.1.1"><xref derivedContent="5. | |||
</t> | 2.1" format="counter" sectionFormat="of" target="section-5.2.1"/>. <xref derive | |||
dContent="" format="title" sectionFormat="of" target="name-setup-request">Setup | ||||
<t> | Request</xref></t> | |||
This will cause clients to prefer the newer protocol when possible. | </li> | |||
It is RECOMMENDED that clients always attempt | <li pn="section-toc.1-1.5.2.2.2.2"> | |||
DNS Push Notifications first for every new request, and | <t pn="section-toc.1-1.5.2.2.2.2.1"><xref derivedContent="5. | |||
only if that fails, then back to using LLQ. | 2.2" format="counter" sectionFormat="of" target="section-5.2.2"/>. <xref derive | |||
Clients SHOULD NOT record that a given server only speaks LLQ and | dContent="" format="title" sectionFormat="of" target="name-setup-challenge">Setu | |||
subsequently default to LLQ for that server, since server software | p Challenge</xref></t> | |||
gets updated, and even a server that speaks only LLQ today, | </li> | |||
may be updated to support DNS Push Notifications tomorrow. | <li pn="section-toc.1-1.5.2.2.2.3"> | |||
</t> | <t pn="section-toc.1-1.5.2.2.2.3.1"><xref derivedContent="5. | |||
2.3" format="counter" sectionFormat="of" target="section-5.2.3"/>. <xref derive | ||||
<t> | dContent="" format="title" sectionFormat="of" target="name-challenge-response">C | |||
New client and server implementations are RECOMMENDED to support only | hallenge Response</xref></t> | |||
DNS Push Notifications. | </li> | |||
</t> | <li pn="section-toc.1-1.5.2.2.2.4"> | |||
<t pn="section-toc.1-1.5.2.2.2.4.1"><xref derivedContent="5. | ||||
</section> | 2.4" format="counter" sectionFormat="of" target="section-5.2.4"/>. <xref derive | |||
</section> | dContent="" format="title" sectionFormat="of" target="name-ack-answers">ACK + An | |||
swers</xref></t> | ||||
<section title="Conventions and Terminology Used in this Document"> | </li> | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | </ul> | |||
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | </li> | |||
"MAY", and "OPTIONAL" in this document are to be interpreted as | <li pn="section-toc.1-1.5.2.3"> | |||
described in BCP 14 <xref target="RFC2119"/> <xref target="R | <t pn="section-toc.1-1.5.2.3.1"><xref derivedContent="5.3" forma | |||
FC8174"/> | t="counter" sectionFormat="of" target="section-5.3"/>. <xref derivedContent="" | |||
when, and only when, they appear in all capitals, as shown here.< | format="title" sectionFormat="of" target="name-resource-record-ttls">Resource Re | |||
/t> | cord TTLs</xref></t> | |||
<?rfc needLines="40" ?> | </li> | |||
</section> | </ul> | |||
</li> | ||||
<section title="Mechanisms"> | <li pn="section-toc.1-1.6"> | |||
<t> | <t pn="section-toc.1-1.6.1"><xref derivedContent="6" format="counter | |||
DNS Long-Lived Queries (DNS&nbhy;LLQ) is implemented using the standard | " sectionFormat="of" target="section-6"/>. <xref derivedContent="" format="titl | |||
DNS message format <xref target="RFC1035"/> in conjunction with an EDNS(0) OP | e" sectionFormat="of" target="name-event-responses">Event Responses</xref></t> | |||
T | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
pseudo&nbhy;RR <xref target="RFC6891"/> with a new OPT and RDATA format speci | n-toc.1-1.6.2"> | |||
fied here. | <li pn="section-toc.1-1.6.2.1"> | |||
Encoding the LLQ request in an OPT RR allows for implementation of | <t pn="section-toc.1-1.6.2.1.1"><xref derivedContent="6.1" forma | |||
LLQ with minimal modification to a name server's front-end. | t="counter" sectionFormat="of" target="section-6.1"/>. <xref derivedContent="" | |||
If a DNS query containing an LLQ option is sent to a | format="title" sectionFormat="of" target="name-add-events">Add Events</xref></t> | |||
server that does not implement LLQ, a server that complies with | </li> | |||
the <xref target="RFC6891">EDNS(0) specification</xref> will silently ignore | <li pn="section-toc.1-1.6.2.2"> | |||
the unrecognized option and answer the request as a normal DNS query, | <t pn="section-toc.1-1.6.2.2.1"><xref derivedContent="6.2" forma | |||
without establishing any long-lived state, | t="counter" sectionFormat="of" target="section-6.2"/>. <xref derivedContent="" | |||
and without returning an LLQ option in its response. | format="title" sectionFormat="of" target="name-remove-events">Remove Events</xre | |||
If a DNS query containing an LLQ option is sent to a | f></t> | |||
server that does not implement EDNS(0) at all, | </li> | |||
the server may silently ignore the EDNS(0) OPT pseudo&nbhy;RR, | <li pn="section-toc.1-1.6.2.3"> | |||
or it may return a nonzero RCODE. | <t pn="section-toc.1-1.6.2.3.1"><xref derivedContent="6.3" forma | |||
However, in practice this issue is mostly theoretical, | t="counter" sectionFormat="of" target="section-6.3"/>. <xref derivedContent="" | |||
since having a zone's _dns&nbhy;llq._udp.<zone> SRV record | format="title" sectionFormat="of" target="name-gratuitous-response-acknowl">Grat | |||
target a host that does not implement LLQ is a configuration error. | uitous Response Acknowledgments</xref></t> | |||
</t> | </li> | |||
<t> | </ul> | |||
Note that this protocol is designed for data set sizes of a few dozen resourc | </li> | |||
e records at most, and | <li pn="section-toc.1-1.7"> | |||
change rates no more than one every ten seconds on average. Data sets in resp | <t pn="section-toc.1-1.7.1"><xref derivedContent="7" format="counter | |||
onse to queries that | " sectionFormat="of" target="section-7"/>. <xref derivedContent="" format="titl | |||
frequently exceed a single packet, or that experience a rapid change | e" sectionFormat="of" target="name-llq-lease-life-expiration">LLQ Lease-Life Exp | |||
rate, may have undesirable performance implications. | iration</xref></t> | |||
</t> | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
<?rfc needLines="20" ?> | n-toc.1-1.7.2"> | |||
<t> | <li pn="section-toc.1-1.7.2.1"> | |||
</t> | <t pn="section-toc.1-1.7.2.1.1"><xref derivedContent="7.1" forma | |||
<section title="Assigned Numbers"> | t="counter" sectionFormat="of" target="section-7.1"/>. <xref derivedContent="" | |||
<t> | format="title" sectionFormat="of" target="name-refresh-request">Refresh Request< | |||
This section describes constants uses in this document. | /xref></t> | |||
</t> | </li> | |||
<figure><artwork> | <li pn="section-toc.1-1.7.2.2"> | |||
EDNS(0) Option Code (recorded with IANA): | <t pn="section-toc.1-1.7.2.2.1"><xref derivedContent="7.2" forma | |||
LLQ 1 | t="counter" sectionFormat="of" target="section-7.2"/>. <xref derivedContent="" | |||
format="title" sectionFormat="of" target="name-llq-refresh-acknowledgment">LLQ R | ||||
LLQ-PORT 5352 (recorded with IANA) | efresh Acknowledgment</xref></t> | |||
</li> | ||||
LLQ Error Codes (specific to this LLQ EDNS(0) Option): | </ul> | |||
NO-ERROR 0 | </li> | |||
SERV-FULL 1 | <li pn="section-toc.1-1.8"> | |||
STATIC 2 | <t pn="section-toc.1-1.8.1"><xref derivedContent="8" format="counter | |||
FORMAT-ERR 3 | " sectionFormat="of" target="section-8"/>. <xref derivedContent="" format="titl | |||
NO-SUCH-LLQ 4 | e" sectionFormat="of" target="name-security-considerations">Security Considerati | |||
BAD-VERS 5 | ons</xref></t> | |||
UNKNOWN-ERR 6 | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
n-toc.1-1.8.2"> | ||||
LLQ Opcodes (specific to this LLQ EDNS(0) Option): | <li pn="section-toc.1-1.8.2.1"> | |||
LLQ-SETUP 1 | <t pn="section-toc.1-1.8.2.1.1"><xref derivedContent="8.1" forma | |||
LLQ-REFRESH 2 | t="counter" sectionFormat="of" target="section-8.1"/>. <xref derivedContent="" | |||
LLQ-EVENT 3 | format="title" sectionFormat="of" target="name-server-dos">Server DoS</xref></t> | |||
</artwork></figure> | </li> | |||
<?rfc needLines="40" ?> | <li pn="section-toc.1-1.8.2.2"> | |||
</section> | <t pn="section-toc.1-1.8.2.2.1"><xref derivedContent="8.2" forma | |||
t="counter" sectionFormat="of" target="section-8.2"/>. <xref derivedContent="" | ||||
<section title="Opt-RR Format"> | format="title" sectionFormat="of" target="name-client-packet-storms">Client Pack | |||
<t> | et Storms</xref></t> | |||
As required by the <xref target="RFC6891">EDNS(0) specification</xref>, | </li> | |||
all OPT&nbhy;RRs used in LLQs are formatted as follows: | <li pn="section-toc.1-1.8.2.3"> | |||
</t> | <t pn="section-toc.1-1.8.2.3.1"><xref derivedContent="8.3" forma | |||
t="counter" sectionFormat="of" target="section-8.3"/>. <xref derivedContent="" | ||||
<figure><artwork> | format="title" sectionFormat="of" target="name-spoofing">Spoofing</xref></t> | |||
Field Name Field Type Description | </li> | |||
NAME domain name empty (root domain) | </ul> | |||
TYPE u_int16_t OPT | </li> | |||
CLASS u_int16_t 0* | <li pn="section-toc.1-1.9"> | |||
TTL u_int32_t 0 | <t pn="section-toc.1-1.9.1"><xref derivedContent="9" format="counter | |||
RDLEN u_int16_t describes RDATA | " sectionFormat="of" target="section-9"/>. <xref derivedContent="" format="titl | |||
RDATA octet stream (see below) | e" sectionFormat="of" target="name-iana-considerations">IANA Considerations</xre | |||
</artwork></figure> | f></t> | |||
</li> | ||||
<t> | <li pn="section-toc.1-1.10"> | |||
* The CLASS field indicates, as per the <xref target="RFC6891">EDNS(0) specif | <t pn="section-toc.1-1.10.1"><xref derivedContent="10" format="count | |||
ication</xref>, the sender's UDP | er" sectionFormat="of" target="section-10"/>. <xref derivedContent="" format="ti | |||
payload size. However, clients and servers need not be required to | tle" sectionFormat="of" target="name-references">References</xref></t> | |||
determine their reassembly buffer size, path MTU, etc. to support | <ul bare="true" empty="true" indent="2" spacing="compact" pn="sectio | |||
LLQ. Thus, the sender of an LLQ Request or Response MAY set the CLASS | n-toc.1-1.10.2"> | |||
field to 0. The recipient MUST ignore the class field if it is set | <li pn="section-toc.1-1.10.2.1"> | |||
to 0. | <t pn="section-toc.1-1.10.2.1.1"><xref derivedContent="10.1" for | |||
</t> | mat="counter" sectionFormat="of" target="section-10.1"/>. <xref derivedContent= | |||
"" format="title" sectionFormat="of" target="name-normative-references">Normativ | ||||
<?rfc needLines="20" ?> | e References</xref></t> | |||
<t> | </li> | |||
RDATA Format: | <li pn="section-toc.1-1.10.2.2"> | |||
</t> | <t pn="section-toc.1-1.10.2.2.1"><xref derivedContent="10.2" for | |||
mat="counter" sectionFormat="of" target="section-10.2"/>. <xref derivedContent= | ||||
<figure><artwork> | "" format="title" sectionFormat="of" target="name-informative-references">Inform | |||
Field Name Field Type Description | ative References</xref></t> | |||
OPTION-CODE u_int16_t LLQ | </li> | |||
OPTION-LENGTH u_int16_t Length of following fields, as | </ul> | |||
appropriate | </li> | |||
VERSION u_int16_t Version of LLQ protocol implemented | <li pn="section-toc.1-1.11"> | |||
LLQ-OPCODE u_int16_t Identifies LLQ operation | <t pn="section-toc.1-1.11.1"><xref derivedContent="Appendix A" forma | |||
ERROR-CODE u_int16_t Identifies LLQ errors | t="default" sectionFormat="of" target="section-appendix.a"/>. <xref derivedCont | |||
LLQ-ID u_int64_t Identifier for an LLQ | ent="" format="title" sectionFormat="of" target="name-problems-with-the-llq-prot | |||
LEASE-LIFE u_int32_t Requested or granted life of LLQ, in | o">Problems with the LLQ Protocol</xref></t> | |||
seconds | </li> | |||
</artwork></figure> | <li pn="section-toc.1-1.12"> | |||
<t pn="section-toc.1-1.12.1"><xref derivedContent="" format="none" s | ||||
<t> | ectionFormat="of" target="section-appendix.b"/><xref derivedContent="" format="t | |||
This data format, consisting of (OPTION&nbhy;CODE, OPTION&nbhy;LENGTH, | itle" sectionFormat="of" target="name-acknowledgments">Acknowledgments</xref></t | |||
LLQ&nbhy;Metadata) tuples, may be repeated an arbitrary number of times in | > | |||
the RDATA section, with the RDLEN field set accordingly. | </li> | |||
</t> | <li pn="section-toc.1-1.13"> | |||
<t pn="section-toc.1-1.13.1"><xref derivedContent="" format="none" s | ||||
<t> | ectionFormat="of" target="section-appendix.c"/><xref derivedContent="" format="t | |||
The size and meaning of the | itle" sectionFormat="of" target="name-authors-addresses">Authors' Addresses</xre | |||
OPTION&nbhy;CODE and OPTION&nbhy;LENGTH fields are as described in the | f></t> | |||
<xref target="RFC6891">EDNS(0) specification</xref>. | </li> | |||
The remainder of the fields comprise the OPTION-DATA of the | </ul> | |||
EDNS(0) option. | </section> | |||
Since for LLQ the OPTION-DATA is a fixed size, | </toc> | |||
in LLQ EDNS(0) options the OPTION&nbhy;LENGTH field always has the value 18. | </front> | |||
</t> | <middle> | |||
<?rfc needLines="40" ?> | <section anchor="introduction" numbered="true" toc="include" removeInRFC="fa | |||
</section> | lse" pn="section-1"> | |||
</section> | <name slugifiedName="name-introduction">Introduction</name> | |||
<t pn="section-1-1"> | ||||
<section title="LLQ Address and Port Identification"> | In dynamic environments, DNS-based Service Discovery <xref target="RFC6763" | |||
<t> | format="default" sectionFormat="of" derivedContent="RFC6763"/> benefits | |||
significantly from clients being able to learn about changes to | ||||
DNS information via a mechanism that is both more timely and more | ||||
efficient than simple polling. Such a mechanism enables "live | ||||
browses" that (a) learn when a new instance of a service appears, (b) | ||||
learn when | ||||
an existing service instance disappears from the network, and (c) allows | ||||
clients | ||||
to monitor status changes to a service instance (e.g., printer ink | ||||
levels). | ||||
Multicast DNS <xref target="RFC6762" format="default" sectionFormat="of" der | ||||
ivedContent="RFC6762"/> supports this | ||||
natively. When a device on the network publishes or deletes Multicast DNS | ||||
records, these changes are multicast to other hosts on the network. | ||||
Those hosts deliver the change notifications to interested clients | ||||
(applications | ||||
running on that host). Hosts also send occasional queries to the | ||||
network, in case gratuitous announcements are not received due to | ||||
packet loss, and to detect records lost due to their publishers | ||||
crashing or having become disconnected from the network. | ||||
</t> | ||||
<t pn="section-1-2"> | ||||
This document defines an Apple extension to unicast DNS that enables a | ||||
client to | ||||
issue long-lived queries that allow a unicast DNS server to notify clients | ||||
about changes to DNS data. This is a more scalable and practical | ||||
solution than can be achieved by polling of the name server, because | ||||
a low polling rate could leave the client with stale information, | ||||
while a high polling rate would have an adverse impact on the network | ||||
and server. | ||||
</t> | ||||
<t pn="section-1-3"> | ||||
The mechanism defined in this document is now being replaced by DNS Push | ||||
Notifications <xref target="RFC8765" format="default" sectionFormat="of" deri | ||||
vedContent="RFC8765"/> as explained | ||||
in <xref target="trans" format="default" sectionFormat="of" derivedContent="S | ||||
ection 1.1"/>. | ||||
</t> | ||||
<t pn="section-1-4"> | ||||
</t> | ||||
<section anchor="trans" numbered="true" toc="include" removeInRFC="false" | ||||
pn="section-1.1"> | ||||
<name slugifiedName="name-transition-to-dns-push-noti">Transition to DNS | ||||
Push Notifications</name> | ||||
<t pn="section-1.1-1"> | ||||
The LLQ protocol enjoyed over a decade of useful operation, | ||||
enabling timely live updates for the service discovery user interface in | ||||
Apple's Back to My Mac <xref target="RFC6281" format="default" sectionFormat | ||||
="of" derivedContent="RFC6281"/> | ||||
service. | ||||
</t> | ||||
<t pn="section-1.1-2"> | ||||
However, some problems were discovered, as described in <xref target="proble | ||||
ms" format="default" sectionFormat="of" derivedContent="Appendix A"/>. | ||||
This operational | ||||
experience with LLQ informed the design of its IETF Standards | ||||
Track successor, DNS Push Notifications <xref target="RFC8765" format="defau | ||||
lt" sectionFormat="of" derivedContent="RFC8765"/>. | ||||
Since no further work is being done on the LLQ protocol, this LLQ | ||||
specification will not be updated to remedy these problems. | ||||
</t> | ||||
<t pn="section-1.1-3"> | ||||
All existing LLQ implementations are <bcp14>RECOMMENDED</bcp14> to migrate | ||||
to using DNS Push Notifications instead. | ||||
</t> | ||||
<t pn="section-1.1-4"> | ||||
Existing LLQ servers are <bcp14>RECOMMENDED</bcp14> to implement and | ||||
support | ||||
DNS Push Notifications so that clients can begin migrating to the | ||||
newer protocol. | ||||
</t> | ||||
<t pn="section-1.1-5"> | ||||
Existing LLQ clients are <bcp14>RECOMMENDED</bcp14> to query for the | ||||
<tt>_dns‑push‑tls._tcp.<zone></tt> SRV record first, and | ||||
then only if DNS Push Notifications fail, fall back to query for | ||||
<tt>_dns‑llq._udp.<zone></tt> instead. Use of the | ||||
<tt>_dns‑llq._udp.<zone></tt> SRV record is described in <xref target= | ||||
"address-port" format="default" sectionFormat="of" derivedContent="Section 4"/>. | ||||
</t> | ||||
<t pn="section-1.1-6"> | ||||
This will cause clients to prefer the newer protocol when possible. It is | ||||
<bcp14>RECOMMENDED</bcp14> that clients always attempt DNS Push | ||||
Notifications first for every new request, and only if that fails, then | ||||
fall back to using LLQ. Clients <bcp14>SHOULD NOT</bcp14> record that a | ||||
given server only speaks LLQ and subsequently default to LLQ for that | ||||
server, since server software gets updated and even a server that speaks | ||||
only LLQ today may be updated to support DNS Push Notifications tomorrow. | ||||
</t> | ||||
<t pn="section-1.1-7"> | ||||
New client and server implementations are <bcp14>RECOMMENDED</bcp14> to | ||||
support only | ||||
DNS Push Notifications. | ||||
</t> | ||||
</section> | ||||
</section> | ||||
<section numbered="true" toc="include" removeInRFC="false" pn="section-2"> | ||||
<name slugifiedName="name-conventions-and-terminology">Conventions and Ter | ||||
minology Used in This Document</name> | ||||
<t pn="section-2-1"> | ||||
The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | ||||
"<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL NOT</bcp14 | ||||
>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | ||||
"<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | ||||
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | ||||
to be interpreted as described in BCP 14 <xref target="RFC2119" format="def | ||||
ault" sectionFormat="of" derivedContent="RFC2119"/> | ||||
<xref target="RFC8174" format="default" sectionFormat="of" derivedConten | ||||
t="RFC8174"/> when, and only when, they appear in all | ||||
capitals, as shown here. | ||||
</t> | ||||
</section> | ||||
<section numbered="true" toc="include" removeInRFC="false" pn="section-3"> | ||||
<name slugifiedName="name-mechanisms">Mechanisms</name> | ||||
<t pn="section-3-1"> | ||||
DNS Long-Lived Queries (LLQ) are implemented using the standard | ||||
DNS message format <xref target="RFC1035" format="default" sectionFormat="of | ||||
" derivedContent="RFC1035"/> in | ||||
conjunction with an EDNS(0) OPT | ||||
pseudo‑RR <xref target="RFC6891" format="default" sectionFormat="of" derived | ||||
Content="RFC6891"/> with a new | ||||
OPTION‑CODE | ||||
and OPTION‑DATA format specified here. Encoding the LLQ request in | ||||
an OPT pseudo‑RR | ||||
allows for implementation of LLQ with minimal modification to a name | ||||
server's front end. If a DNS query containing an LLQ option is sent to a | ||||
server that does not implement LLQ, a server that complies with the | ||||
EDNS(0) specification <xref target="RFC6891" format="default" sectionFormat= | ||||
"of" derivedContent="RFC6891"/> will | ||||
silently ignore the unrecognized option and answer the request as a normal | ||||
DNS query without establishing any long-lived state and without | ||||
returning an LLQ option in its response. If a DNS query containing an LLQ | ||||
option is sent to a server that does not implement EDNS(0) at all, the | ||||
server may silently ignore the EDNS(0) OPT pseudo‑RR or it may | ||||
return a nonzero RCODE. However, in practice, this issue is mostly | ||||
theoretical, since having a zone's _dns‑llq._udp.<zone> SRV | ||||
record target a host that does not implement LLQ is a configuration error. | ||||
</t> | ||||
<t pn="section-3-2"> | ||||
Note that this protocol is designed for data set sizes of a few dozen | ||||
resource records at most and change rates no more than once every 10 | ||||
seconds on average. Data sets that frequently | ||||
exceed a single IP packet, or that experience a rapid change rate, may | ||||
have | ||||
undesirable performance implications. | ||||
</t> | ||||
<section numbered="true" toc="include" removeInRFC="false" pn="section-3.1 | ||||
"> | ||||
<name slugifiedName="name-assigned-numbers">Assigned Numbers</name> | ||||
<t pn="section-3.1-1"> | ||||
This section describes constants used in this document. | ||||
</t> | ||||
<ul empty="true" bare="false" spacing="normal" pn="section-3.1-2"> | ||||
<li pn="section-3.1-2.1"> | ||||
<t pn="section-3.1-2.1.1">EDNS(0) OPTION‑CODE (recorded with IANA):< | ||||
/t> | ||||
<ul empty="true" bare="false" spacing="normal" pn="section-3.1-2.1.2 | ||||
"> | ||||
<li pn="section-3.1-2.1.2.1"> | ||||
<dl indent="18" newline="false" spacing="normal" pn="section-3.1 | ||||
-2.1.2.1.1"> | ||||
<dt pn="section-3.1-2.1.2.1.1.1">LLQ | ||||
</dt> | ||||
<dd pn="section-3.1-2.1.2.1.1.2">1 | ||||
</dd> | ||||
</dl> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-3.1-2.2"> | ||||
LLQ‑PORT 5352 (recorded with IANA) | ||||
</li> | ||||
<li pn="section-3.1-2.3"> | ||||
<t pn="section-3.1-2.3.1">LLQ Opcodes (specific to this LLQ EDNS(0) | ||||
Option):</t> | ||||
<ul empty="true" bare="false" spacing="normal" pn="section-3.1-2.3.2 | ||||
"> | ||||
<li pn="section-3.1-2.3.2.1"> | ||||
<dl indent="18" spacing="compact" newline="false" pn="section-3. | ||||
1-2.3.2.1.1"> | ||||
<dt pn="section-3.1-2.3.2.1.1.1">LLQ‑SETUP | ||||
</dt> | ||||
<dd pn="section-3.1-2.3.2.1.1.2">1 | ||||
</dd> | ||||
<dt pn="section-3.1-2.3.2.1.1.3">LLQ‑REFRESH | ||||
</dt> | ||||
<dd pn="section-3.1-2.3.2.1.1.4">2 | ||||
</dd> | ||||
<dt pn="section-3.1-2.3.2.1.1.5">LLQ‑EVENT | ||||
</dt> | ||||
<dd pn="section-3.1-2.3.2.1.1.6">3 | ||||
</dd> | ||||
</dl> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
<li pn="section-3.1-2.4"> | ||||
<t pn="section-3.1-2.4.1">LLQ Error Codes (specific to this LLQ EDNS | ||||
(0) Option):</t> | ||||
<ul empty="true" bare="false" spacing="normal" pn="section-3.1-2.4.2 | ||||
"> | ||||
<li pn="section-3.1-2.4.2.1"> | ||||
<dl indent="18" spacing="compact" newline="false" pn="section-3. | ||||
1-2.4.2.1.1"> | ||||
<dt pn="section-3.1-2.4.2.1.1.1"> | ||||
NO-ERROR | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.2">0 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.3"> | ||||
SERV-FULL | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.4">1 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.5"> | ||||
STATIC | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.6">2 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.7"> | ||||
FORMAT-ERR | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.8">3 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.9"> | ||||
NO-SUCH-LLQ | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.10">4 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.11"> | ||||
BAD-VERS | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.12">5 | ||||
</dd> | ||||
<dt pn="section-3.1-2.4.2.1.1.13"> | ||||
UNKNOWN-ERR | ||||
</dt> | ||||
<dd pn="section-3.1-2.4.2.1.1.14">6 | ||||
</dd> | ||||
</dl> | ||||
</li> | ||||
</ul> | ||||
</li> | ||||
</ul> | ||||
</section> | ||||
<section numbered="true" toc="include" removeInRFC="false" pn="section-3.2 | ||||
"> | ||||
<name slugifiedName="name-opt-rr-format">Opt-RR Format</name> | ||||
<t pn="section-3.2-1"> | ||||
As required by the EDNS(0) specification <xref target="RFC6891" format="defa | ||||
ult" sectionFormat="of" derivedContent="RFC6891"/>, | ||||
all OPT pseudo‑RRs used in LLQs are formatted as follows: | ||||
</t> | ||||
<table anchor="OPT-RRs" align="center" pn="table-1"> | ||||
<name slugifiedName="name-opt-rrs-used-in-llqs">OPT-RRs Used in LLQs</ | ||||
name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left" colspan="1" rowspan="1">Field Name</th> | ||||
<th align="left" colspan="1" rowspan="1">Field Type</th> | ||||
<th align="left" colspan="1" rowspan="1">Description</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">NAME</td> | ||||
<td align="left" colspan="1" rowspan="1">domain name</td> | ||||
<td align="left" colspan="1" rowspan="1">MUST be 0 (root domain)</ | ||||
td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">TYPE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">OPT (41)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">CLASS</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">0*</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">TTL</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int32_t</td> | ||||
<td align="left" colspan="1" rowspan="1">0</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">RDLEN</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">length of all RDATA</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">RDATA</td> | ||||
<td align="left" colspan="1" rowspan="1">octet stream</td> | ||||
<td align="left" colspan="1" rowspan="1">(see below)</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-3.2-3"> | ||||
* The CLASS field indicates, as per the EDNS(0) specification <xref target=" | ||||
RFC6891" format="default" sectionFormat="of" derivedContent="RFC6891"/>, the sen | ||||
der's UDP payload | ||||
size. However, clients and servers are not required to determine their | ||||
reassembly buffer size, path MTU, etc., to support LLQ. Thus, the sender | ||||
of | ||||
an LLQ Request or Response <bcp14>MAY</bcp14> set the CLASS field to 0. | ||||
The recipient <bcp14>MUST</bcp14> ignore the class field if it is set to | ||||
0. | ||||
</t> | ||||
<t pn="section-3.2-4"> | ||||
The RDATA of an EDNS(0) OPT pseudo‑RR consists of zero or more | ||||
options | ||||
of the form { OPTION‑CODE, OPTION‑LENGTH, OPTION‑DATA } | ||||
packed together, | ||||
with the RDLEN field set accordingly to indicate the total size. | ||||
An LLQ OPTION is illustrated below. | ||||
An EDNS(0) OPT pseudo‑RR may contain zero or more LLQ OPTIONS in | ||||
addition | ||||
to zero or more other EDNS(0) options. | ||||
</t> | ||||
<table anchor="LLQ-OPT-FORMAT" align="center" pn="table-2"> | ||||
<name slugifiedName="name-llq-option">LLQ OPTION</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="left" colspan="1" rowspan="1">Field Name</th> | ||||
<th align="left" colspan="1" rowspan="1">Field Type</th> | ||||
<th align="left" colspan="1" rowspan="1">Description</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">OPTION-CODE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">LLQ (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">OPTION-LENGTH</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Length of following field | ||||
s (18)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-VERSION</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Version of LLQ protocol i | ||||
mplemented</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-OPCODE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Identifies LLQ operation< | ||||
/td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ERROR</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Identifies LLQ errors</td | ||||
> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ID</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int64_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Identifier for an LLQ</td | ||||
> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-LEASE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int32_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Requested or granted life | ||||
of LLQ, in seconds</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-3.2-6"> | ||||
The size and meaning of the OPTION‑CODE and OPTION‑LENGTH fields | ||||
are as described in the EDNS(0) specification <xref target="RFC6891" format=" | ||||
default" sectionFormat="of" derivedContent="RFC6891"/>. The remainder of the fi | ||||
elds comprise the | ||||
OPTION‑DATA of the EDNS(0) LLQ OPTION. Since for LLQ the | ||||
OPTION‑DATA is a | ||||
fixed size, in EDNS(0) LLQ OPTIONS the OPTION‑LENGTH field always has | ||||
the value 18. | ||||
</t> | ||||
<t pn="section-3.2-7"> | ||||
In keeping with Internet convention, all multi-byte numeric quantities | ||||
(u_int16_t, u_int32_t, and u_int64_t) | ||||
are represented in big endian byte order (most significant byte first). | ||||
</t> | ||||
</section> | ||||
</section> | ||||
<section numbered="true" toc="include" anchor="address-port" removeInRFC="fa | ||||
lse" pn="section-4"> | ||||
<name slugifiedName="name-llq-address-and-port-identi">LLQ Address and Por | ||||
t Identification</name> | ||||
<t pn="section-4-1"> | ||||
The client | The client | |||
requires a mechanism to determine to which server it should send LLQ operatio | requires a mechanism to determine to which server it should send LLQ | |||
ns. | operations. | |||
</t> | </t> | |||
<t> | <t pn="section-4-2"> | |||
Additionally, some firewalls block direct communication with a | Additionally, some firewalls block direct communication with a name server | |||
name server on port 53 to avoid spoof responses. However, this | on port 53 to avoid spoof responses. However, this direct communication is | |||
direct communication is necessary for LLQs. Thus, servers MAY listen | necessary for LLQs. Thus, servers <bcp14>MAY</bcp14> listen for LLQs on a | |||
for LLQs on a different port (typically 5352). Clients also therefore need a | different port (typically 5352). Clients, therefore, also need a | |||
mechanism to determine to which port to send LLQ operations. | mechanism to determine to which port to send LLQ operations. | |||
</t> | </t> | |||
<?rfc needLines="20" ?> | <t pn="section-4-3"> | |||
<t> | The client determines the server responsible for a given LLQ much as a | |||
The client determines the server responsible for a given LLQ much as | client determines to which server to send a DNS dynamic update. The client | |||
a client determines to which server to send a dynamic update. The | begins by sending a standard DNS query for the name of the LLQ, with type | |||
client begins by sending a standard DNS query for the name of the | SOA. If the record exists, then the server <bcp14>MUST</bcp14> answer with | |||
LLQ, with type SOA. The server MUST answer with that SOA record in | that SOA record in the Answer section. If a record of type SOA with the | |||
the Answer section, if the record exists. The server SHOULD include | LLQ name does not exist, then the server <bcp14>SHOULD</bcp14> include an | |||
an SOA record for that name's zone in the Authority section, if the | SOA record for that name's zone in the Authority section. For example, a | |||
LLQ name (type SOA) does not exist. For example, a query for | query for "_ftp._tcp.example.com" with type SOA, when there is no SOA | |||
"_ftp._tcp.example.com." may return an SOA record named "example.com." in the | record with that name, might return an SOA record named "example.com" in | |||
Authority section if there is no SOA record named | the Authority section. If the named SOA record does not exist and the | |||
"_ftp._tcp.example.com." If, in this case, the server does not include | server fails to include the enclosing SOA record in the Authority section, | |||
the SOA record in the Authority section, the client strips the | the client strips the leading label from the name and tries again, | |||
leading label from the name and tries again, repeating until an | repeating until an answer is received. | |||
answer is received. | </t> | |||
</t> | <t pn="section-4-4"> | |||
<t> | This iterative zone apex discovery algorithm is described in more detail in | |||
This iterative zone apex discovery algorithm is described in more detail | the DNS Push Notifications specification <xref target="RFC8765" format="defau | |||
in the <xref target="Push">DNS Push Notifications specification</xref>. | lt" sectionFormat="of" derivedContent="RFC8765"/>. | |||
</t> | </t> | |||
<t> | <t pn="section-4-5"> | |||
Upon learning the zone (SOA), the client then constructs and sends an | Upon learning the zone apex (SOA), the client then constructs and sends an | |||
SRV query for the name _dns&nbhy;llq._udp.<zone>, | SRV query for the name, "_dns‑llq._udp.<zone>", | |||
e.g., _dns&nbhy;llq._udp.example.com. | e.g., "_dns‑llq._udp.example.com". | |||
</t> | </t> | |||
<t> | <t pn="section-4-6"> | |||
A server implementing LLQ MUST answer with an SRV record <xref target="RFC278 | An authoritative server for a zone implementing LLQ <bcp14>MUST</bcp14> | |||
2"/> | answer with an SRV record <xref target="RFC2782" format="default" sectionForm | |||
at="of" derivedContent="RFC2782"/> | ||||
for this name. The SRV RDATA is as follows: | for this name. The SRV RDATA is as follows: | |||
</t> | </t> | |||
<figure><artwork> | <table anchor="SRV-RDATA" align="center" pn="table-3"> | |||
PRIORITY typically 0 | <name slugifiedName="name-srv-rdata">SRV RDATA</name> | |||
WEIGHT typically 0 | <tbody> | |||
PORT typically 53 or 5352 | <tr> | |||
TARGET name of server providing LLQs for the requested zone | <td align="left" colspan="1" rowspan="1">PRIORITY</td> | |||
</artwork></figure> | <td align="left" colspan="1" rowspan="1">typically 0</td> | |||
<t> | </tr> | |||
The server SHOULD include its address record(s) in the Additional | <tr> | |||
<td align="left" colspan="1" rowspan="1">WEIGHT</td> | ||||
<td align="left" colspan="1" rowspan="1">typically 0</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">PORT</td> | ||||
<td align="left" colspan="1" rowspan="1">typically 53 or 5352</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">TARGET</td> | ||||
<td align="left" colspan="1" rowspan="1">name of server providing LL | ||||
Qs for the requested zone</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-4-8"> | ||||
The server <bcp14>SHOULD</bcp14> include the address record(s) for the | ||||
target host in the Additional | ||||
section of the response. | section of the response. | |||
</t> | </t> | |||
<t> | <t pn="section-4-9"> | |||
If the server does not include its address record in the Additional | If the server does not include the target host's address record(s) in the | |||
section, the client SHOULD query explicitly for the address record | Additional | |||
section, the client <bcp14>SHOULD</bcp14> query explicitly for the address | ||||
record(s) | ||||
with the name of the SRV target. | with the name of the SRV target. | |||
</t> | </t> | |||
<t> | <t pn="section-4-10"> | |||
The client MUST send all LLQ requests, refreshes, and acknowledgments | The client <bcp14>MUST</bcp14> send all LLQ requests, refreshes, and | |||
to the name server specified in the SRV target, at the address | acknowledgments to the name server specified in the SRV target, at the | |||
contained in the address record for that target. Note that the | address contained in the address record for that target. Note that the | |||
queries described in this section (including those for SOA and SRV | queries described in this section (including those for SOA and SRV records) | |||
records) MAY be sent to an intermediate DNS recursive resolver -- they need n | <bcp14>MAY</bcp14> be sent to an intermediate DNS recursive resolver -- | |||
ot be | they | |||
sent directly to the name server. | need not be sent directly to the name server. | |||
</t> | </t> | |||
<t> | <t pn="section-4-11"> | |||
If, on issuing the SRV query, the client receives an NXDOMAIN | If, on issuing the SRV query, the client receives a negative | |||
response indicating that the SRV record does not exist, the client | response indicating that the SRV record does not exist, the client | |||
SHOULD conclude that the server does not support an LLQ in the | <bcp14>SHOULD</bcp14> conclude that the zone does not support LLQ. | |||
requested zone. The client then SHOULD NOT send an LLQ request for | The client then <bcp14>SHOULD NOT</bcp14> send an LLQ request for | |||
the desired name, instead utilizing the behavior for LLQ-unaware | the desired name, instead utilizing the behavior for LLQ-unaware | |||
servers described in Section 5 "LLQ Setup". | servers described in <xref target="llq-setup" format="default" sectionFormat= | |||
</t> | "of" derivedContent="Section 5"/>, "<xref target="llq-setup" format="title" sect | |||
<?rfc needLines="20" ?> | ionFormat="of" derivedContent="LLQ Setup"/>". | |||
<t> | </t> | |||
</t> | <t pn="section-4-12"> | |||
<t> | ||||
Servers should send all messages to the source address and port of | Servers should send all messages to the source address and port of | |||
the LLQ setup message received from the client. | the LLQ setup message received from the client. | |||
</t> | </t> | |||
<?rfc needLines="40" ?> | </section> | |||
</section> | <section numbered="true" toc="include" anchor="llq-setup" removeInRFC="false | |||
" pn="section-5"> | ||||
<section title="LLQ Setup"> | <name slugifiedName="name-llq-setup">LLQ Setup</name> | |||
<t> | <t pn="section-5-1"> | |||
An LLQ is initiated by a client, and is completed via a four-way | An LLQ is initiated by a client and is completed via a four-way | |||
handshake. This handshake provides resilience to packet loss, | handshake. This handshake provides resilience to packet loss, | |||
demonstrates client reachability, and reduces denial of service | demonstrates client reachability, and reduces denial-of-service | |||
attack opportunities (see Section 8 "Security Considerations"). | attack opportunities (see <xref target="security-considerations" format="defa | |||
</t> | ult" sectionFormat="of" derivedContent="Section 8"/>, "<xref target="security-co | |||
<section title="Setup Message Retransmission"> | nsiderations" format="title" sectionFormat="of" derivedContent="Security Conside | |||
<t> | rations"/>"). | |||
LLQ Setup Requests and Responses sent by the client SHOULD be | </t> | |||
retransmitted if no acknowledgments are received. The client SHOULD | <section numbered="true" toc="include" anchor="setup-message-retransmissio | |||
re&nbhy;try up to two more times (for a total of 3 attempts) before | n" removeInRFC="false" pn="section-5.1"> | |||
considering the server down or unreachable. The client MUST wait at | <name slugifiedName="name-setup-message-retransmissio">Setup Message Ret | |||
ransmission</name> | ||||
<t pn="section-5.1-1"> | ||||
LLQ Setup Requests and Responses sent by the client <bcp14>SHOULD</bcp14> | ||||
be | ||||
retransmitted if no acknowledgments are received. The client | ||||
<bcp14>SHOULD</bcp14> | ||||
retry up to two more times (for a total of 3 attempts) before | ||||
considering the server down or unreachable. The client <bcp14>MUST</bcp14> | ||||
wait at | ||||
least 2 seconds before the first retransmission and 4 seconds between | least 2 seconds before the first retransmission and 4 seconds between | |||
the first and second retransmissions. The client SHOULD listen for a | the first and second retransmissions. The client <bcp14>SHOULD</bcp14> | |||
listen for a | ||||
response for at least 8 seconds after the 3rd attempt before | response for at least 8 seconds after the 3rd attempt before | |||
considering the server down or unreachable. Upon determining a | considering the server down or unreachable. Upon determining a | |||
server to be down, a client MAY periodically attempt to re-initiate | server to be down, a client <bcp14>MAY</bcp14> periodically attempt to | |||
an LLQ setup, at a rate of not more than once per hour. | re-initiate | |||
</t> | an LLQ setup at a rate of not more than once per hour. | |||
</t> | ||||
<t> | <t pn="section-5.1-2"> | |||
Servers MUST NOT re-transmit acknowledgments that do not generate | Servers <bcp14>MUST NOT</bcp14> retransmit acknowledgments that do not | |||
responses from the client. Retransmission in setup is client-driven, | generate | |||
responses from the client. Retransmission in setup is client driven, | ||||
freeing servers from maintaining timers for incomplete LLQ setups. If | freeing servers from maintaining timers for incomplete LLQ setups. If | |||
servers receive duplicate messages from clients (perhaps due to the | servers receive duplicate messages from clients (perhaps due to the | |||
loss of the server's responses mid-flight), the server MUST re&nbhy;send | loss of the server's responses mid-flight), the server <bcp14>MUST</bcp14> | |||
its reply (possibly modifying the LEASE&nbhy;LIFE as described in Section | resend | |||
5.2.4 "ACK + Answers"). | its reply (possibly modifying the LLQ‑LEASE as described in <xref target="ack | |||
</t> | -answers" format="default" sectionFormat="of" derivedContent="Section 5.2.4"/>, | |||
"<xref target="ack-answers" format="title" sectionFormat="of" derivedContent="AC | ||||
<t> | K + Answers"/>"). | |||
Servers MUST NOT garbage collect LLQs that fail to complete the four- | </t> | |||
way handshake until the initially granted LEASE&nbhy;LIFE has elapsed. | <t pn="section-5.1-3"> | |||
</t> | Servers <bcp14>MUST NOT</bcp14> garbage collect LLQs that fail to complete | |||
</section> | the four-way handshake until the initially granted LLQ‑LEASE has | |||
<section title="LLQ Setup Four-Way Handshake"> | elapsed. | |||
<figure><artwork> | </t> | |||
The four phases of the handshake include: | </section> | |||
<section numbered="true" toc="include" anchor="four-way-handshake" removeI | ||||
1) Setup Request client to server, identifies LLQ(s) requested | nRFC="false" pn="section-5.2"> | |||
<name slugifiedName="name-llq-setup-four-way-handshak">LLQ Setup Four-Wa | ||||
2) Setup Challenge server to client, provides error(s) for | y Handshake</name> | |||
requested LLQs, and unique identifiers for | <t pn="section-5.2-1">The four phases of the handshake include: | |||
the successful requests | </t> | |||
<ul empty="true" bare="false" spacing="normal" pn="section-5.2-2"> | ||||
3) Challenge Response client to server, echoes identifier(s), | <li pn="section-5.2-2.1"> | |||
demonstrating client's reachability and | <dl indent="24" newline="false" spacing="normal" pn="section-5.2-2.1 | |||
willingness to participate | .1"> | |||
<dt pn="section-5.2-2.1.1.1">1) Setup Request | ||||
4) ACK + Answers server to client, confirms setup and | </dt> | |||
provides initial answers | <dd pn="section-5.2-2.1.1.2">client to server, identifies LLQ(s) r | |||
</artwork></figure> | equested | |||
<section title="Setup Request"> | </dd> | |||
<t> | <dt pn="section-5.2-2.1.1.3">2) Setup Challenge | |||
A request for an LLQ is formatted like a standard DNS query, but with | </dt> | |||
an OPT RR containing LLQ metadata in its Additional section. LLQ | <dd pn="section-5.2-2.1.1.4">server to client, provides | |||
setup requests are identified by the LLQ&nbhy;SETUP opcode and a | unique identifiers for successful requested LLQs, and | |||
zero&nbhy;valued LLQ&nbhy;ID. | error(s) for unsuccessful requested LLQs. | |||
</t> | </dd> | |||
<dt pn="section-5.2-2.1.1.5">3) Challenge Response | ||||
<t> | </dt> | |||
The request MAY contain multiple questions to set up multiple LLQs. | <dd pn="section-5.2-2.1.1.6">client to server, echoes identifier(s | |||
A request consisting of multiple questions MUST contain multiple LLQ | ), demonstrating client's | |||
metadata sections, one per question, with metadata sections in the | reachability and willingness to participate | |||
</dd> | ||||
<dt pn="section-5.2-2.1.1.7">4) ACK + Answers | ||||
</dt> | ||||
<dd pn="section-5.2-2.1.1.8">server to client, confirms setup and | ||||
provides initial answers | ||||
</dd> | ||||
</dl> | ||||
</li> | ||||
</ul> | ||||
<section numbered="true" toc="include" anchor="setup-request" removeInRF | ||||
C="false" pn="section-5.2.1"> | ||||
<name slugifiedName="name-setup-request">Setup Request</name> | ||||
<t pn="section-5.2.1-1"> | ||||
A request for an LLQ is formatted like a standard DNS query but with | ||||
an OPT pseudo‑RR containing LLQ metadata in its Additional | ||||
section. LLQ | ||||
Setup Requests are identified by the LLQ‑SETUP opcode and a | ||||
zero‑valued LLQ‑ID. | ||||
</t> | ||||
<t pn="section-5.2.1-2"> | ||||
The request <bcp14>MAY</bcp14> contain multiple questions to set up | ||||
multiple LLQs. | ||||
A Setup Request consisting of multiple questions <bcp14>MUST</bcp14> | ||||
contain multiple LLQ | ||||
OPTIONS, one per question, with the LLQ OPTIONS in the | ||||
same order as the questions they correspond to (i.e., the first | same order as the questions they correspond to (i.e., the first | |||
metadata section corresponds to the first question, the second | LLQ OPTION corresponds to the first question, the second | |||
metadata section corresponds to the second question, etc.) If | LLQ OPTION corresponds to the second question, etc.). If | |||
requesting multiple LLQs, clients SHOULD request the same LEASE&nbhy;LIFE | requesting multiple LLQs, clients <bcp14>SHOULD</bcp14> request the same | |||
for each LLQ. Requests over UDP MUST NOT contain multiple questions | LLQ‑LEASE | |||
if doing so would cause the message to not fit in a single packet. | for each LLQ. Requests over UDP <bcp14>MUST NOT</bcp14> contain multiple | |||
</t> | questions | |||
if doing so would cause the message to exceed a single IP packet. | ||||
<t> | </t> | |||
A client MUST NOT request multiple identical LLQs (i.e., containing | <t pn="section-5.2.1-3"> | |||
A client <bcp14>MUST NOT</bcp14> request multiple identical LLQs (i.e., | ||||
containing | ||||
the same qname/type/class) from the same source IP address and port. | the same qname/type/class) from the same source IP address and port. | |||
This requirement is to avoid unnecessary load on servers. | This requirement is to avoid unnecessary load on servers. | |||
In the case of multiple independent client implementations that | In the case of multiple independent client implementations that | |||
may run on the same device without knowledge of each other, | may run on the same device without knowledge of each other, | |||
it is allowable if they by chance send LLQ requests for the same | it is allowable if they by chance send LLQ requests for the same | |||
qname/type/class. These independent implementations on the same | qname/type/class. These independent implementations on the same | |||
client will be using different source ports. Likewise, | client will be using different source ports. Likewise, | |||
to the server, | to the server, | |||
multiple independent clients behind the same NAT gateway | multiple independent clients behind the same NAT gateway | |||
will appear as if they were | will appear as if they were | |||
multiple independent clients using different ports on the same host. | multiple independent clients using different ports on the same host, | |||
and this is also allowable. | ||||
</t> | ||||
<t> | </t> | |||
The query MUST NOT be for record type ANY (255), class ANY (255), or | <t pn="section-5.2.1-4"> | |||
The query <bcp14>MUST NOT</bcp14> be for record type ANY (255), class ANY | ||||
(255), or | ||||
class NONE (0). | class NONE (0). | |||
</t> | </t> | |||
<table anchor="OPT-RR-LLQ" align="center" pn="table-4"> | ||||
<t> | <name slugifiedName="name-setup-request-llq-option-fo">Setup Request | |||
Setup Request OPT&nbhy;RR LLQ Metadata Format: | LLQ OPTION Format</name> | |||
</t> | <thead> | |||
<tr> | ||||
<figure><artwork> | <th align="left" colspan="1" rowspan="1">Field Name</th> | |||
Field Name Field Type Description | <th align="left" colspan="1" rowspan="1">Field Type</th> | |||
OPTION-CODE u_int16_t LLQ (1) | <th align="left" colspan="1" rowspan="1">Description</th> | |||
OPTION-LENGTH u_int16_t Length of following fields (18) | </tr> | |||
VERSION u_int16_t Version of LLQ protocol implemented | </thead> | |||
by requester (1) | <tbody> | |||
LLQ-OPCODE u_int16_t LLQ-SETUP (1) | <tr> | |||
ERROR-CODE u_int16_t NOERROR (0) | <td align="left" colspan="1" rowspan="1">OPTION-CODE</td> | |||
LLQ-ID u_int64_t 0 | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
LEASE-LIFE u_int32_t Desired life of LLQ request | <td align="left" colspan="1" rowspan="1">LLQ (1)</td> | |||
</tr> | ||||
These fields MUST be repeated once for each additional query in the | <tr> | |||
<td align="left" colspan="1" rowspan="1">OPTION-LENGTH</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Length of following fie | ||||
lds (18)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-VERSION</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Version of LLQ protocol | ||||
implemented by requester (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-OPCODE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-SETUP (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ERROR</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">NO-ERROR (0)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ID</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int64_t</td> | ||||
<td align="left" colspan="1" rowspan="1">0</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-LEASE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int32_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Desired life of LLQ req | ||||
uest</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-5.2.1-6">The Setup Request LLQ OPTION <bcp14>MUST</bcp1 | ||||
4> be repeated once for each | ||||
additional query in the | ||||
Question section. | Question section. | |||
</artwork></figure> | </t> | |||
<?rfc needLines="40" ?> | </section> | |||
</section> | <section numbered="true" toc="include" anchor="setup-challenge" removeIn | |||
RFC="false" pn="section-5.2.2"> | ||||
<section title="Setup Challenge"> | <name slugifiedName="name-setup-challenge">Setup Challenge</name> | |||
<t> | <t pn="section-5.2.2-1"> | |||
Upon receiving an LLQ Setup Request, a server implementing LLQs will | Upon receiving an LLQ Setup Request, a server implementing LLQs will | |||
send a Setup Challenge to the requester (client). An LLQ Setup | send a Setup Challenge to the requester (client). An LLQ Setup | |||
Challenge is a DNS Response, with the DNS message ID matching that of | Challenge is a DNS response, with the DNS message ID matching that of | |||
the request, and with all questions contained in the request present | the Setup Request, and with all questions contained in the Setup Request | |||
present | ||||
in the Question section of the response. Additionally, the | in the Question section of the response. Additionally, the | |||
challenge contains a single OPT&nbhy;RR with an LLQ metadata section for | challenge contains a single OPT pseudo‑RR with an LLQ OPTION for | |||
each LLQ request, indicating the success or failure of each request. | each LLQ request, indicating the success or failure of each request. | |||
Metadata sections MUST be in the same order as the questions they | The LLQ OPTIONS <bcp14>MUST</bcp14> be in the same order as the questions | |||
correspond to. Note that in a request containing multiple | they | |||
questions some LLQs may succeed, while others may fail. | correspond to. Note that in a Setup Request containing multiple | |||
</t> | questions, some LLQs may succeed while others may fail. | |||
</t> | ||||
<t> | <table anchor="CHALLENGE-OPT-RR-DATA" align="center" pn="table-5"> | |||
Setup Challenge OPT&nbhy;RR RDATA Format: | <name slugifiedName="name-setup-challenge-llq-option-">Setup Challen | |||
</t> | ge LLQ OPTION Format</name> | |||
<thead> | ||||
<figure><artwork> | <tr> | |||
Field Name Field Type Description | <th align="left" colspan="1" rowspan="1">Field Name</th> | |||
OPTION-CODE u_int16_t LLQ (1) | <th align="left" colspan="1" rowspan="1">Field Type</th> | |||
OPTION-LENGTH u_int16_t Length of following fields (18) | <th align="left" colspan="1" rowspan="1">Description</th> | |||
VERSION u_int16_t Version of LLQ protocol implemented | </tr> | |||
in server (1) | </thead> | |||
LLQ-OPCODE u_int16_t LLQ-SETUP (1) | <tbody> | |||
ERROR-CODE u_int16_t [As Appropriate] | <tr> | |||
LLQ-ID u_int64_t [As Appropriate] | <td align="left" colspan="1" rowspan="1">OPTION-CODE</td> | |||
LEASE-LIFE u_int32_t [As Appropriate] | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
</artwork></figure> | <td align="left" colspan="1" rowspan="1">LLQ (1)</td> | |||
</tr> | ||||
<t> | <tr> | |||
These fields MUST be repeated once for each query in the Questions | <td align="left" colspan="1" rowspan="1">OPTION-LENGTH</td> | |||
section of the Setup Request. | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
</t> | <td align="left" colspan="1" rowspan="1">Length of following fie | |||
lds (18)</td> | ||||
<?rfc needLines="40" ?> | </tr> | |||
<t> | <tr> | |||
LLQ Metadata field descriptions: | <td align="left" colspan="1" rowspan="1">LLQ-VERSION</td> | |||
</t> | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
<td align="left" colspan="1" rowspan="1">Version of LLQ protocol | ||||
<figure><artwork> | implemented in server (1)</td> | |||
ERROR-CODE: Possible values include: | </tr> | |||
<tr> | ||||
NO-ERROR: The LLQ Setup Request was successful. | <td align="left" colspan="1" rowspan="1">LLQ-OPCODE</td> | |||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
FORMAT-ERR: The LLQ was improperly formatted. Note that if the | <td align="left" colspan="1" rowspan="1">LLQ-SETUP (1)</td> | |||
rest of the DNS message is properly formatted, the | </tr> | |||
DNS header error code MUST NOT include a format error | <tr> | |||
code, as this would cause confusion between a server | <td align="left" colspan="1" rowspan="1">LLQ-ERROR</td> | |||
that does not understand the LLQ format, and a client | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
that sends malformed LLQs. | <td align="left" colspan="1" rowspan="1">[As Appropriate]</td> | |||
</tr> | ||||
SERV-FULL: The server cannot grant the LLQ request because it is | <tr> | |||
overloaded, or the request exceeds the server's rate | <td align="left" colspan="1" rowspan="1">LLQ-ID</td> | |||
limit (see Section 8 "Security Considerations"). | <td align="left" colspan="1" rowspan="1">u_int64_t</td> | |||
Upon returning this error, the server MUST include | <td align="left" colspan="1" rowspan="1">[As Appropriate]</td> | |||
in the LEASE-LIFE field a time interval, in seconds, | </tr> | |||
after which the client may re-try the LLQ Setup. | <tr> | |||
<td align="left" colspan="1" rowspan="1">LLQ-LEASE</td> | ||||
STATIC: The data for this name and type is not expected to | <td align="left" colspan="1" rowspan="1">u_int32_t</td> | |||
change frequently, and the server therefore does not | <td align="left" colspan="1" rowspan="1">[As Appropriate]</td> | |||
support the requested LLQ. The client MUST NOT poll | </tr> | |||
for this name and type, nor should it re-try the LLQ | </tbody> | |||
Setup, and should instead honor the normal resource | </table> | |||
record TTLs returned. | <t pn="section-5.2.2-3"> | |||
The Setup Challenge LLQ OPTION <bcp14>MUST</bcp14> be repeated once for | ||||
BAD-VERS: The protocol version specified in the client's | each query in the Questions | |||
request is not supported by the server. | section of the Setup Challenge. | |||
Further details for LLQ‑ERROR, LLQ‑ID and LLQ‑LEASE are | ||||
UNKNOWN-ERR: The LLQ was not granted for an unknown reason | given below. | |||
</artwork></figure> | </t> | |||
<t pn="section-5.2.2-4"> | ||||
<?rfc needLines="40" ?> | LLQ‑ERROR: | |||
<t> | </t> | |||
LLQ&nbhy;ID: On success, a random number generated by the server that is | <ul empty="true" bare="false" spacing="normal" pn="section-5.2.2-5"> | |||
unique for the requested name/type/class. The LLQ&nbhy;ID SHOULD be an | <li pn="section-5.2.2-5.1"> | |||
unpredictable random number. A possible method of allocating LLQ&nbhy;IDs | <dl indent="18" newline="false" spacing="normal" pn="section-5.2.2 | |||
with minimal bookkeeping would be to store the time, in seconds since | -5.1.1"> | |||
the Epoch, in the high 32 bits of the field, and a cryptographically | <dt pn="section-5.2.2-5.1.1.1">NO-ERROR: | |||
generated 32-bit random integer in the low 32 bits. | </dt> | |||
</t> | <dd pn="section-5.2.2-5.1.1.2">The LLQ Setup Request was success | |||
ful. | ||||
<t> | </dd> | |||
On error, the LLQ&nbhy;ID is set to 0. | <dt pn="section-5.2.2-5.1.1.3">FORMAT-ERR: | |||
</t> | </dt> | |||
<dd pn="section-5.2.2-5.1.1.4">The LLQ was improperly formatted. | ||||
<t> | Note that if the rest of the DNS | |||
LEASE&nbhy;LIFE: On success, the actual life of the LLQ, in seconds. | message is properly formatted, the DNS header error code <bcp14>MUST NOT</bcp14> | |||
Value may be greater than, less than, or equal to the value requested | include a format error code, since to do so would cause ambiguity | |||
by the client, as per the server administrator's policy. The server | between the case where a client sends a valid LLQ Setup Request to a server | |||
MAY discard the LLQ after this LEASE&nbhy;LIFE expires unless the LLQ has | that does not understand LLQ and the case where a client sends a malformed | |||
been renewed by the client (see Section 7 "LLQ Lease-Life Expiration"). | LLQ Setup Request to a server that does understand LLQ. | |||
The server MUST NOT generate events (see Section 6 "Event Responses") | </dd> | |||
for expired LLQs. | <dt pn="section-5.2.2-5.1.1.5">SERV-FULL: | |||
</t> | </dt> | |||
<dd pn="section-5.2.2-5.1.1.6">The server cannot grant the LLQ r | ||||
<t> | equest because it is overloaded or the | |||
On SERV&nbhy;FULL error, LEASE&nbhy;LIFE MUST be set to a time interval, in | request exceeds the server's rate limit (see <xref target="security-consideratio | |||
seconds, after which the client may re&nbhy;try the LLQ Setup. | ns" format="default" sectionFormat="of" derivedContent="Section 8"/>, <xref targ | |||
</t> | et="security-considerations" format="title" sectionFormat="of" derivedContent="S | |||
ecurity Considerations"/>). Upon | ||||
<t> | returning this error, the server <bcp14>MUST</bcp14> include in the LLQ-LEASE | |||
On other errors, the LEASE&nbhy;LIFE MUST be set to 0. | field a time interval, in seconds, after which the client may retry the LLQ | |||
</t> | Setup. | |||
<?rfc needLines="40" ?> | </dd> | |||
</section> | <dt pn="section-5.2.2-5.1.1.7">STATIC: | |||
</dt> | ||||
<section title="Challenge Response"> | <dd pn="section-5.2.2-5.1.1.8">The data for this name and type i | |||
<t> | s not expected to change frequently, and | |||
the server, therefore, does not support the requested LLQ. The client | ||||
<bcp14>MUST</bcp14> honor the resource record TTLs returned and | ||||
<bcp14>MUST NOT</bcp14> poll sooner than indicated by those TTLs, | ||||
nor should it retry the LLQ Setup for this name and type. | ||||
</dd> | ||||
<dt pn="section-5.2.2-5.1.1.9">BAD-VERS: | ||||
</dt> | ||||
<dd pn="section-5.2.2-5.1.1.10">The protocol version specified i | ||||
n the client's Setup Request is not | ||||
supported by | ||||
the server. | ||||
</dd> | ||||
<dt pn="section-5.2.2-5.1.1.11">UNKNOWN-ERR: | ||||
</dt> | ||||
<dd pn="section-5.2.2-5.1.1.12">The LLQ was not granted for some | ||||
other reason not covered by the preceding | ||||
error code values. | ||||
</dd> | ||||
</dl> | ||||
</li> | ||||
</ul> | ||||
<dl indent="18" newline="false" spacing="normal" pn="section-5.2.2-6"> | ||||
<dt pn="section-5.2.2-6.1">LLQ‑ID: | ||||
</dt> | ||||
<dd pn="section-5.2.2-6.2">On success, a random number generated by | ||||
the server that is unique on the | ||||
server for the | ||||
requested name/type/class. The LLQ‑ID <bcp14>SHOULD</bcp14> be an | ||||
unpredictable random number. A possible method of allocating LLQ‑IDs with | ||||
minimal bookkeeping would be to store the time, in seconds since the Epoch, in | ||||
the high 32 bits of the field, and a cryptographically generated 32-bit random | ||||
integer in the low 32 bits. | ||||
</dd> | ||||
<dt pn="section-5.2.2-6.3"> | ||||
</dt> | ||||
<dd pn="section-5.2.2-6.4"> | ||||
On error, the LLQ‑ID is set to 0. | ||||
</dd> | ||||
<dt pn="section-5.2.2-6.5">LLQ‑LEASE: | ||||
</dt> | ||||
<dd pn="section-5.2.2-6.6">On success, the actual life of the LLQ, i | ||||
n seconds. Value may be greater | ||||
than, less than, or equal to the value requested by the client, as per the | ||||
server administrator's policy. The server <bcp14>MAY</bcp14> discard the LLQ | ||||
after this LLQ‑LEASE expires unless the LLQ has been renewed by the | ||||
client (see <xref target="LLQ-LLE" format="default" sectionFormat="of" derivedCo | ||||
ntent="Section 7"/>, "<xref target="LLQ-LLE" format="title" sectionFormat="of" d | ||||
erivedContent="LLQ Lease-Life Expiration"/>"). The server <bcp14>MUST NOT</bcp1 | ||||
4> generate events (see | ||||
<xref target="event-responses" format="default" sectionFormat="of" derivedConten | ||||
t="Section 6"/>, "<xref target="event-responses" format="title" sectionFormat="o | ||||
f" derivedContent="Event Responses"/>") for expired LLQs. | ||||
</dd> | ||||
<dt pn="section-5.2.2-6.7"/> | ||||
<dd pn="section-5.2.2-6.8"> | ||||
On SERV‑FULL error, LLQ‑LEASE <bcp14>MUST</bcp14> be set to a time | ||||
interval, in seconds, after which the client may retry the LLQ Setup. | ||||
</dd> | ||||
<dt pn="section-5.2.2-6.9"> | ||||
</dt> | ||||
<dd pn="section-5.2.2-6.10"> | ||||
On other errors, the LLQ‑LEASE <bcp14>MUST</bcp14> be set to 0. | ||||
</dd> | ||||
</dl> | ||||
</section> | ||||
<section numbered="true" toc="include" anchor="challenge-response" remov | ||||
eInRFC="false" pn="section-5.2.3"> | ||||
<name slugifiedName="name-challenge-response">Challenge Response</name | ||||
> | ||||
<t pn="section-5.2.3-1"> | ||||
Upon issuing a Setup Request, a client listens for a Setup Challenge | Upon issuing a Setup Request, a client listens for a Setup Challenge | |||
(5.2.2), re-transmitting the request as necessary (5.1). After | (<xref target="setup-challenge" format="default" sectionFormat="of" derivedCo | |||
receiving a successful Challenge, the client SHOULD send a Challenge | ntent="Section 5.2.2"/>) retransmitting the Setup Request as | |||
necessary | ||||
(<xref target="setup-message-retransmission" format="default" sectionFormat=" | ||||
of" derivedContent="Section 5.1"/>). After | ||||
receiving a successful Setup Challenge, the client <bcp14>SHOULD</bcp14> | ||||
send a Challenge | ||||
Response to the server. This Challenge Response is a DNS request | Response to the server. This Challenge Response is a DNS request | |||
with questions from the request and challenge, and a single OPT&nbhy;RR in | with questions as in the Setup Request and Setup Challenge, and a single | |||
the Additional section, with the OPT&nbhy;RR RDATA identical to the | OPT pseudo‑RR in | |||
OPT&nbhy;RR RDATA contained in the Setup Challenge (i.e., echoing, for | the Additional section, with the LLQ OPTIONS corresponding to the | |||
each set of fields, the random LLQ&nbhy;ID and the granted lease life). If | LLQ OPTIONS contained in the Setup Challenge (i.e., echoing, for | |||
the challenge response contains multiple questions, the first | each LLQ OPTION, the random LLQ‑ID and the granted LLQ‑LEASE). If | |||
question MUST correspond to the first OPT&nbhy;RR RDATA tuple, etc. | the Challenge Response contains multiple questions, the first | |||
</t> | question <bcp14>MUST</bcp14> correspond to the first LLQ OPTION, etc. | |||
</t> | ||||
<t> | <t pn="section-5.2.3-2"> | |||
If the Setup Request fails with a STATIC error, the client MUST NOT | If the Setup Request for a particular LLQ fails with a STATIC error, the | |||
poll the server. The client SHOULD honor the resource record TTLs | client <bcp14>MUST NOT</bcp14> | |||
poll the server for that LLQ. The client <bcp14>SHOULD</bcp14> honor the | ||||
resource record TTLs | ||||
contained in the response. | contained in the response. | |||
</t> | </t> | |||
<t pn="section-5.2.3-3"> | ||||
<t> | If a Setup Request fails with a SERV‑FULL error, the client | |||
If the Setup Request fails with a SERV&nbhy;FULL error, the client MAY | <bcp14>MAY</bcp14> | |||
re&nbhy;try the LLQ Setup Request (5.2.1) after the time indicated in the | retry the LLQ Setup Request (<xref target="setup-request" format="default" se | |||
LEASE&nbhy;LIFE field. | ctionFormat="of" derivedContent="Section 5.2.1"/>) after the time | |||
</t> | indicated in the | |||
LLQ‑LEASE field. | ||||
<t> | </t> | |||
<t pn="section-5.2.3-4"> | ||||
If the Setup Request fails with an error other than STATIC or | If the Setup Request fails with an error other than STATIC or | |||
SERV&nbhy;FULL, or the server is determined not to support LLQ | SERV‑FULL, or the server is determined not to support LLQ | |||
(i.e., the client receives a DNS response with a nonzero RCODE, | (i.e., the client receives a DNS response with a nonzero RCODE, | |||
or a DNS response containing no LLQ option), the | or a DNS response containing no LLQ option), the | |||
client MAY poll the server periodically with standard DNS queries, | client <bcp14>MAY</bcp14> poll the server periodically with standard DNS | |||
inferring Add and Remove events (see Section 6 "Event Responses") | queries, | |||
inferring Add and Remove Events (see <xref target="event-responses" format="d | ||||
efault" sectionFormat="of" derivedContent="Section 6"/>, | ||||
"Event Responses") | ||||
by comparing answers to these queries. The client | by comparing answers to these queries. The client | |||
SHOULD NOT poll more than once every 15 minutes for a given query. | <bcp14>SHOULD NOT</bcp14> poll more than once every 15 minutes for a given | |||
The client MUST NOT poll if it receives a STATIC error code in the | query. | |||
The client <bcp14>MUST NOT</bcp14> poll if it receives a STATIC error code | ||||
in the | ||||
acknowledgment. | acknowledgment. | |||
</t> | </t> | |||
<?rfc needLines="40" ?> | </section> | |||
</section> | <section numbered="true" toc="include" anchor="ack-answers" removeInRFC= | |||
"false" pn="section-5.2.4"> | ||||
<section title="ACK + Answers"> | <name slugifiedName="name-ack-answers">ACK + Answers</name> | |||
<t> | <t pn="section-5.2.4-1"> | |||
Upon receiving a correct Challenge Response, a server MUST return an | Upon receiving a correct Challenge Response, a server <bcp14>MUST</bcp14> | |||
return an | ||||
acknowledgment, completing the LLQ setup, and provide all current | acknowledgment, completing the LLQ setup, and provide all current | |||
answers to the question(s). | answers to the question(s). | |||
</t> | </t> | |||
<t pn="section-5.2.4-2"> | ||||
<t> | ||||
To acknowledge a successful Challenge Response, i.e., a Challenge | To acknowledge a successful Challenge Response, i.e., a Challenge | |||
Response in which the LLQ&nbhy;ID and LEASE&nbhy;LIFE echoed by the client | Response in which the LLQ‑ID and LLQ‑LEASE echoed by the client | |||
match the values issued by the server, the server MUST send a DNS | match the values issued by the server, the server <bcp14>MUST</bcp14> send | |||
a DNS | ||||
response containing all available answers to the question(s) | response containing all available answers to the question(s) | |||
contained in the original Setup Request, along with all additional | contained in the original Setup Request, along with all additional | |||
resource records appropriate for those answers in the Additional | resource records appropriate for those answers in the Additional | |||
section. The Additional section also contains an OPT&nbhy;RR formatted as | section. The Additional section also contains LLQ OPTIONS formatted as | |||
follows: | follows: | |||
</t> | </t> | |||
<table anchor="SUCCESSFUL-ACK-ANSWERS-OPT-RR-RDATA" align="center" pn= | ||||
<t> | "table-6"> | |||
Successful ACK + Answers OPT&nbhy;RR RDATA Format: | <name slugifiedName="name-successful-ack-answers-llq-">Successful AC | |||
</t> | K + Answers LLQ OPTION Format</name> | |||
<thead> | ||||
<figure><artwork> | <tr> | |||
Field Name Field Type Description | <th align="left" colspan="1" rowspan="1">Field Name</th> | |||
OPTION-CODE u_int16_t LLQ | <th align="left" colspan="1" rowspan="1">Field Type</th> | |||
OPTION-LENGTH u_int16_t Length of following fields, as | <th align="left" colspan="1" rowspan="1">Description</th> | |||
appropriate | </tr> | |||
VERSION u_int16_t Version of LLQ protocol implemented | </thead> | |||
in server | <tbody> | |||
LLQ-OPCODE u_int16_t LLQ-SETUP (1) | <tr> | |||
ERROR-CODE u_int16_t NO-ERROR | <td align="left" colspan="1" rowspan="1">OPTION-CODE</td> | |||
LLQ-ID u_int64_t Originally granted ID, echoed in | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
client's Response | <td align="left" colspan="1" rowspan="1">LLQ (1)</td> | |||
LEASE-LIFE u_int32_t Remaining life of LLQ, in seconds | </tr> | |||
</artwork></figure> | <tr> | |||
<td align="left" colspan="1" rowspan="1">OPTION-LENGTH</td> | ||||
<t> | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
<td align="left" colspan="1" rowspan="1">Length of following fie | ||||
lds (18)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-VERSION</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Version of LLQ protocol | ||||
implemented in server (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-OPCODE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-SETUP (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ERROR</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">NO-ERROR (0)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ID</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int64_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Originally granted ID, | ||||
echoed in client's Response</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-LEASE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int32_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Remaining life of LLQ, | ||||
in seconds</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-5.2.4-4"> | ||||
If there is a significant delay in receiving a Challenge Response, or | If there is a significant delay in receiving a Challenge Response, or | |||
multiple Challenge Responses are issued (possibly because they were lost | multiple Challenge Responses are issued (possibly because they were lost | |||
en route to the client, causing the client to re&nbhy;send the Challenge | en route to the client, causing the client to resend the Challenge | |||
Response), the server MAY decrement the LEASE&nbhy;LIFE by the time | Response), the server <bcp14>MAY</bcp14> decrement the LLQ‑LEASE by | |||
the time | ||||
elapsed since the Setup Challenge was initially issued. | elapsed since the Setup Challenge was initially issued. | |||
</t> | </t> | |||
<t pn="section-5.2.4-5"> | ||||
<t> | ||||
If the setup is completed over UDP and all initially available | If the setup is completed over UDP and all initially available | |||
answers to the question(s), additional records, and the OPT&nbhy;RR do not | answers to the question(s), additional records, and the OPT pseudo‑RR | |||
fit in a single packet, some or all additional records (excluding the | do not | |||
OPT&nbhy;RR) MUST be omitted. If, after omission of all additional | fit in a single IP packet, some or all additional records (excluding the | |||
OPT pseudo‑RR) <bcp14>MUST</bcp14> be omitted. If, after omission of | ||||
all additional | ||||
records, the answers still do not fit in a single message, answers | records, the answers still do not fit in a single message, answers | |||
MUST be removed until the message fits in a single packet. These | <bcp14>MUST</bcp14> be removed until the message fits in a single IP | |||
answers not delivered in the ACK + Answers MUST be delivered | packet. These | |||
without undue delay to the client via Add Events (Section 6 "Event Responses" | answers not delivered in the ACK + Answers <bcp14>MUST</bcp14> be delivered | |||
). | without undue delay to the client via Add Events (<xref target="event-respons | |||
</t> | es" format="default" sectionFormat="of" derivedContent="Section 6"/>, "<xref tar | |||
</section> | get="event-responses" format="title" sectionFormat="of" derivedContent="Event Re | |||
</section> | sponses"/>"). | |||
<section title="Resource Record TTLs"> | </t> | |||
<t> | </section> | |||
</section> | ||||
<section numbered="true" toc="include" anchor="resource-record-ttls" remov | ||||
eInRFC="false" pn="section-5.3"> | ||||
<name slugifiedName="name-resource-record-ttls">Resource Record TTLs</na | ||||
me> | ||||
<t pn="section-5.3-1"> | ||||
The TTLs of resource records contained in answers to successful LLQs | The TTLs of resource records contained in answers to successful LLQs | |||
SHOULD be ignored by the client. The client MAY cache LLQ answers | <bcp14>SHOULD</bcp14> be ignored by the client. The client | |||
until the client receives a gratuitous announcement (see Section 6 | <bcp14>MAY</bcp14> cache LLQ answers until the client receives a gratuitous | |||
"Event Responses") indicating that the answer to the LLQ has changed. | announcement (see <xref target="event-responses" format="default" sectionForm | |||
The client SHOULD NOT cache answers after the LLQs LEASE&nbhy;LIFE expires | at="of" derivedContent="Section 6"/>, "<xref target="event-responses" format="ti | |||
without being refreshed (see Section 7 "LLQ Lease-Life Expiration"). | tle" sectionFormat="of" derivedContent="Event Responses"/>") | |||
If an LLQ request fails, the client SHOULD NOT cache answers for a | indicating that the answer to the LLQ has changed. The client | |||
period longer than the client's polling interval. | <bcp14>SHOULD NOT</bcp14> cache answers after the LLQs LLQ‑LEASE | |||
</t> | expires without being refreshed (see <xref target="LLQ-LLE" format="default" | |||
sectionFormat="of" derivedContent="Section 7"/>, "LLQ | ||||
<t> | Lease-Life Expiration"). If an LLQ request fails, the client <bcp14>SHOULD N | |||
OT</bcp14> cache answers for a period longer than the client's polling | ||||
interval. | ||||
</t> | ||||
<t pn="section-5.3-2"> | ||||
Note that resource records intended specifically to be transmitted | Note that resource records intended specifically to be transmitted | |||
via LLQs (e.g., DNS Service Discovery resource records) may have | via LLQs (e.g., DNS-based Service Discovery resource records) may have | |||
unusually short TTLs. This is because it is assumed that the records | unusually short TTLs. This is because it is assumed that the records | |||
may change frequently, and that a client's cache coherence will be | may change frequently, and that a client's cache coherence will be | |||
maintained via the LLQ and gratuitous responses. Short TTLs prevent | maintained via the LLQ and gratuitous responses. Short TTLs prevent | |||
stale information from residing in intermediate DNS recursive resolvers that | stale information from residing in intermediate DNS recursive resolvers | |||
are | that are | |||
not LLQ-aware. | not LLQ aware. | |||
</t> | </t> | |||
<t pn="section-5.3-3"> | ||||
<t> | ||||
TTLs of resource records included in the Additional section of an | TTLs of resource records included in the Additional section of an | |||
LLQ response (which do not directly answer the LLQ) SHOULD be honored | LLQ response (which do not directly answer the LLQ) <bcp14>SHOULD</bcp14> | |||
be honored | ||||
by the client. | by the client. | |||
</t> | </t> | |||
<?rfc needLines="40" ?> | </section> | |||
</section> | </section> | |||
</section> | <section numbered="true" toc="include" anchor="event-responses" removeInRFC= | |||
"false" pn="section-6"> | ||||
<section title="Event Responses"> | <name slugifiedName="name-event-responses">Event Responses</name> | |||
<t> | <t pn="section-6-1"> | |||
When a change ("event") occurs to a name server's zone, the server | When a change ("event") occurs to a name server's zone, the server | |||
MUST check if the new or deleted resource records answer any LLQs. | <bcp14>MUST</bcp14> check if the new or deleted resource records answer any | |||
If so, the changes MUST be communicated to the LLQ requesters in | LLQs. | |||
If so, the changes <bcp14>MUST</bcp14> be communicated to the LLQ | ||||
requesters in | ||||
the form of a gratuitous DNS response sent to the client, with the | the form of a gratuitous DNS response sent to the client, with the | |||
question(s) being answered in the Question section, and answers to | relevant question(s) in the Question section, and the corresponding answers | |||
these questions in the Answer section. The response also includes | in the Answer section. The response also includes | |||
an OPT RR in the Additional section. This OPT RR contains, in its | an OPT pseudo‑RR in the Additional section. This OPT pseudo‑RR | |||
RDATA, an entry for each LLQ being answered in the message. Entries | contains, in its | |||
must include the LLQ&nbhy;ID. This reduces the potential for spoof events | RDATA, an LLQ OPTION for each LLQ being answered in the message. Each LLQ | |||
OPTION | ||||
must include the LLQ‑ID. This reduces the potential for spoof events | ||||
being sent to a client. | being sent to a client. | |||
</t> | </t> | |||
<table anchor="EVENT-RESPONSE-OPT-RR-RDATA" align="center" pn="table-7"> | ||||
<t> | <name slugifiedName="name-event-response-llq-option-f">Event Response LL | |||
Event Response OPT&nbhy;RR RDATA Format: | Q OPTION Format</name> | |||
</t> | <thead> | |||
<tr> | ||||
<figure><artwork> | <th align="left" colspan="1" rowspan="1">Field Name</th> | |||
Field Name Field Type Description | <th align="left" colspan="1" rowspan="1">Field Type</th> | |||
OPTION-CODE u_int16_t LLQ (1) | <th align="left" colspan="1" rowspan="1">Description</th> | |||
OPTION-LENGTH u_int16_t Length of following fields (18) | </tr> | |||
VERSION u_int16_t Version of LLQ protocol implemented | </thead> | |||
in server (1) | <tbody> | |||
LLQ-OPCODE u_int16_t LLQ-EVENT (3) | <tr> | |||
ERROR-CODE u_int16_t 0 | <td align="left" colspan="1" rowspan="1">OPTION-CODE</td> | |||
LLQ-ID u_int64_t [As Appropriate] | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
LEASE-LIFE u_int32_t 0 | <td align="left" colspan="1" rowspan="1">LLQ (1)</td> | |||
</artwork></figure> | </tr> | |||
<tr> | ||||
<t> | <td align="left" colspan="1" rowspan="1">OPTION-LENGTH</td> | |||
Gratuitous responses for a single LLQ MAY be batched, such that | <td align="left" colspan="1" rowspan="1">u_int16_t</td> | |||
<td align="left" colspan="1" rowspan="1">Length of following fields | ||||
(18)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-VERSION</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">Version of LLQ protocol imp | ||||
lemented in server (1)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-OPCODE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-EVENT (3)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ERROR</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int16_t</td> | ||||
<td align="left" colspan="1" rowspan="1">NO-ERROR (0)</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-ID</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int64_t</td> | ||||
<td align="left" colspan="1" rowspan="1">[As Appropriate]</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left" colspan="1" rowspan="1">LLQ-LEASE</td> | ||||
<td align="left" colspan="1" rowspan="1">u_int32_t</td> | ||||
<td align="left" colspan="1" rowspan="1">0</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t pn="section-6-3"> | ||||
Gratuitous responses for a single LLQ <bcp14>MAY</bcp14> be batched such | ||||
that | ||||
multiple changes are communicated in a single message. | multiple changes are communicated in a single message. | |||
Responses MUST NOT be batched if this would cause a message that | Responses <bcp14>MUST NOT</bcp14> be batched if this would cause a message | |||
would otherwise fit in a single packet to be truncated. While | that | |||
responses MAY be deferred to provide opportunities for batching, | would otherwise fit in a single IP packet to be truncated. While | |||
responses SHOULD NOT be delayed, for purposes of batching, for more | responses <bcp14>MAY</bcp14> be deferred to provide opportunities for | |||
batching, | ||||
responses <bcp14>SHOULD NOT</bcp14> be delayed, for purposes of batching, | ||||
for more | ||||
than 30 seconds, as this would cause an unacceptable latency for the | than 30 seconds, as this would cause an unacceptable latency for the | |||
client. | client. | |||
</t> | </t> | |||
<t pn="section-6-4"> | ||||
<t> | After sending a gratuitous response, the server <bcp14>MUST</bcp14> listen | |||
After sending a gratuitous response, the server MUST listen for an | for an | |||
acknowledgment from the client. If the client does not respond, the | acknowledgment from the client. If the client does not respond, the | |||
server MUST re&nbhy;send the response. The server MUST re&nbhy;send 2 times | server <bcp14>MUST</bcp14> resend the response. The server | |||
(for a total of 3 transmissions), after which the server MUST | <bcp14>MUST</bcp14> resend two times | |||
(for a total of 3 transmissions), after which the server | ||||
<bcp14>MUST</bcp14> | ||||
consider the client to be unreachable and delete its LLQ. The server | consider the client to be unreachable and delete its LLQ. The server | |||
MUST listen for 2 seconds before re&nbhy;sending the response, 4 more | <bcp14>MUST</bcp14> listen for 2 seconds before resending the response, 4 | |||
seconds before re&nbhy;sending again, and must wait an additional 8 | more | |||
seconds before resending again, and must wait an additional 8 | ||||
seconds after the 3rd transmission before terminating the LLQ. | seconds after the 3rd transmission before terminating the LLQ. | |||
</t> | </t> | |||
<t pn="section-6-5"> | ||||
<t> | The DNS message header of the response <bcp14>SHOULD</bcp14> include an | |||
The DNS message header of the response SHOULD include an unpredictable | unpredictable | |||
random number in the DNS message ID field, which is to be echoed in | random number in the DNS message ID field, which is to be echoed in | |||
the client's acknowledgement. | the client's acknowledgment. | |||
</t> | </t> | |||
<section title="Add Events"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-6.1 | |||
<t> | "> | |||
Add events occur when a new resource record appears, usually as the | <name slugifiedName="name-add-events">Add Events</name> | |||
result of a dynamic update <xref target="RFC2136"/>, that answers an LLQ. Thi | <t pn="section-6.1-1"> | |||
s | Add Events occur when a new resource record appears, usually as the | |||
result of a dynamic update <xref target="RFC2136" format="default" sectionFor | ||||
mat="of" derivedContent="RFC2136"/>, that | ||||
answers an LLQ. This | ||||
record must be sent in the Answer section of the event to the client. | record must be sent in the Answer section of the event to the client. | |||
Records that normally accompany this record in responses MAY be | Records that normally accompany this record in responses <bcp14>MAY</bcp14> | |||
included in the Additional section, as per truncation restrictions | be | |||
included in the Additional section as per truncation restrictions | ||||
described above. | described above. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Remove Events"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-6.2 | |||
<t> | "> | |||
Remove events occur when a resource record previously sent to a | <name slugifiedName="name-remove-events">Remove Events</name> | |||
client, either in an initial response, or in an Add Event, becomes | <t pn="section-6.2-1"> | |||
Remove Events occur when a resource record previously sent to a | ||||
client, either in an initial response or in an Add Event, becomes | ||||
invalid (normally as a result of being removed via a dynamic update). | invalid (normally as a result of being removed via a dynamic update). | |||
The deleted resource record is sent in the Answer section of the | The deleted resource record is sent in the Answer section of the | |||
event to the client. The resource record TTL is set to -1, | event to the client. The resource record TTL is set to -1, | |||
indicating that the record has been removed. | indicating that the record has been removed. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Gratuitous Response Acknowledgments"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-6.3 | |||
<t> | "> | |||
Upon receiving a gratuitous response ("event"), the client MUST send | <name slugifiedName="name-gratuitous-response-acknowl">Gratuitous Respon | |||
se Acknowledgments</name> | ||||
<t pn="section-6.3-1"> | ||||
Upon receiving a gratuitous response ("event"), the client | ||||
<bcp14>MUST</bcp14> send | ||||
an acknowledgment to the server. This acknowledgment is a DNS | an acknowledgment to the server. This acknowledgment is a DNS | |||
response echoing the OPT&nbhy;RR contained in the event, with the message | response echoing the OPT pseudo‑RR contained in the event, with the | |||
message | ||||
ID of the gratuitous response echoed in the message header. The | ID of the gratuitous response echoed in the message header. The | |||
acknowledgment MUST be sent to the source IP address and port from | acknowledgment <bcp14>MUST</bcp14> be sent to the source IP address and | |||
port from | ||||
which the event originated. | which the event originated. | |||
</t> | </t> | |||
<?rfc needLines="40" ?> | </section> | |||
</section> | </section> | |||
</section> | <section numbered="true" toc="include" anchor="LLQ-LLE" removeInRFC="false" | |||
pn="section-7"> | ||||
<section title="LLQ Lease-Life Expiration"> | <name slugifiedName="name-llq-lease-life-expiration">LLQ Lease-Life Expira | |||
<t> | tion</name> | |||
</t> | <section numbered="true" toc="include" removeInRFC="false" pn="section-7.1 | |||
<section title="Refresh Request"> | "> | |||
<t> | <name slugifiedName="name-refresh-request">Refresh Request</name> | |||
If the client desires to maintain the LLQ beyond the duration | <t pn="section-7.1-1"> | |||
specified in the LEASE&nbhy;LIFE field of the Ack + Answers | If the client desires to maintain the LLQ beyond the duration specified in | |||
(5.2), the client MUST send a Refresh Request. A Refresh Request is | the LLQ‑LEASE field of the ACK + Answers (<xref target="ack-answers" format=" | |||
identical to an LLQ Challenge Response (5.3), but with the LLQ&nbhy;OPCODE | default" sectionFormat="of" derivedContent="Section 5.2.4"/>), the client <bcp14 | |||
set to LLQ&nbhy;REFRESH. Unlike a Challenge Response, a Refresh Request | >MUST</bcp14> send a | |||
returns no answers. | Refresh Request. A Refresh Request is identical to an LLQ Challenge | |||
</t> | Response (<xref target="challenge-response" format="default" sectionFormat="o | |||
f" derivedContent="Section 5.2.3"/>) but with the LLQ‑OPCODE | ||||
<t> | set to | |||
The client SHOULD refresh an LLQ when 80% of its lease life has | LLQ‑REFRESH. Unlike a Challenge Response, a Refresh Request returns no | |||
answers. | ||||
</t> | ||||
<t pn="section-7.1-2"> | ||||
The client <bcp14>SHOULD</bcp14> refresh an LLQ when 80% of its | ||||
LLQ‑LEASE has | ||||
elapsed. | elapsed. | |||
</t> | </t> | |||
<t pn="section-7.1-3"> | ||||
<t> | ||||
As a means of reducing network traffic, when constructing refresh | As a means of reducing network traffic, when constructing refresh | |||
messages the client SHOULD include all LLQs established with a given | messages the client <bcp14>SHOULD</bcp14> include all LLQs established with | |||
a given | ||||
server, even those not yet close to expiration. However, at least | server, even those not yet close to expiration. However, at least | |||
one LLQ MUST have elapsed at least 80% of its original LEASE&nbhy;LIFE. | one LLQ <bcp14>MUST</bcp14> have elapsed at least 80% of its original | |||
The client MUST NOT include additional LLQs if doing so would cause | LLQ‑LEASE. | |||
the message to no longer fit in a single packet. In this case, the | The client <bcp14>MUST NOT</bcp14> include additional LLQs if doing so | |||
would cause | ||||
the message to no longer fit in a single IP packet. In this case, the | ||||
LLQs furthest from expiration should be omitted such that the message | LLQs furthest from expiration should be omitted such that the message | |||
fits in a single packet. (These LLQs SHOULD be refreshed in a | fits in a single IP packet. (These LLQs <bcp14>SHOULD</bcp14> be refreshed | |||
in a | ||||
separate message when 80% of one or more of their lease lives have | separate message when 80% of one or more of their lease lives have | |||
elapsed.) When refreshing multiple LLQs simultaneously, the message | elapsed.) When refreshing multiple LLQs simultaneously, the message | |||
contains multiple questions, and a single OPT&nbhy;RR with multiple LLQ | contains multiple questions and a single OPT pseudo‑RR with multiple | |||
metadata sections, one per question, with the metadata sections in | LLQ | |||
OPTIONS, one per question, with the LLQ OPTIONS in | ||||
the same order as the questions they correspond to. | the same order as the questions they correspond to. | |||
</t> | </t> | |||
<t pn="section-7.1-4"> | ||||
<t> | The client <bcp14>SHOULD</bcp14> specify the original LLQ‑LEASE | |||
The client SHOULD specify the original lease life granted in the LLQ | granted in the LLQ | |||
response as the desired LEASE&nbhy;LIFE in the refresh request. If | response as the desired LLQ‑LEASE in the Refresh Request. If | |||
refreshing multiple LLQs simultaneously, the client SHOULD request | refreshing multiple LLQs simultaneously, the client <bcp14>SHOULD</bcp14> | |||
the same lease life for all LLQs being refreshed (with the exception | request | |||
of termination requests, see below). | the same LLQ‑LEASE for all LLQs being refreshed (with the exception | |||
</t> | of termination requests; see below). | |||
</t> | ||||
<t> | <t pn="section-7.1-5"> | |||
To terminate an LLQ prior | To terminate an LLQ prior | |||
to its scheduled expiration (for instance, when the client terminates | to its scheduled expiration (for instance, when the client terminates | |||
a DNS Service Discovery browse operation, or a client is about to go | a DNS-based Service Discovery browse operation or when a client is about to g | |||
to sleep or shut down) the client specifies a lease life of 0. | o | |||
</t> | to sleep or shut down), the client specifies an LLQ‑LEASE value of 0. | |||
</t> | ||||
<t> | <t pn="section-7.1-6"> | |||
The client MUST listen for an acknowledgment from the server. The | The client <bcp14>MUST</bcp14> listen for an acknowledgment from the | |||
client MAY re&nbhy;try up to two more times (for a total of 3 attempts) | server. The | |||
before considering the server down or unreachable. The client MUST | client <bcp14>MAY</bcp14> retry up to two more times (for a total of 3 | |||
NOT re&nbhy;try a first time before 90% of the lease life has expired, and | attempts) | |||
MUST NOT re&nbhy;try again before 95% of the lease life has expired. If | before considering the server down or unreachable. The client <bcp14>MUST NOT | |||
the server is determined to be down, the client MAY periodically | </bcp14> retry a first time before 90% of the LLQ‑LEASE has expired | |||
and | ||||
<bcp14>MUST NOT</bcp14> retry again before 95% of the LLQ‑LEASE has | ||||
expired. If | ||||
the server is determined to be down, the client <bcp14>MAY</bcp14> | ||||
periodically | ||||
attempt to re-establish the LLQ via an LLQ Setup Request message. | attempt to re-establish the LLQ via an LLQ Setup Request message. | |||
The client MUST NOT attempt the LLQ Setup Request more than once per | The client <bcp14>MUST NOT</bcp14> attempt the LLQ Setup Request more than | |||
once per | ||||
hour. | hour. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="LLQ Refresh Acknowledgment"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-7.2 | |||
<t> | "> | |||
Upon receiving an LLQ Refresh message, a server MUST send an | <name slugifiedName="name-llq-refresh-acknowledgment">LLQ Refresh Acknow | |||
ledgment</name> | ||||
<t pn="section-7.2-1"> | ||||
Upon receiving an LLQ Refresh message, a server <bcp14>MUST</bcp14> send an | ||||
acknowledgment of the Refresh. This acknowledgment is formatted like | acknowledgment of the Refresh. This acknowledgment is formatted like | |||
the Setup ACK described in 5.2.3, but with the following variations: | the "ACK + Answers" message described in <xref target="ack-answers" format="d | |||
</t> | efault" sectionFormat="of" derivedContent="Section 5.2.4"/>, but | |||
with the following variations: | ||||
<t> | </t> | |||
The LLQ&nbhy;OPCODE is set to LLQ&nbhy;REFRESH. | <ul bare="false" empty="false" spacing="normal" pn="section-7.2-2"> | |||
</t> | <li pn="section-7.2-2.1"> | |||
<t pn="section-7.2-2.1.1"> | ||||
<t> | It contains no answers. | |||
NO&nbhy;SUCH&nbhy;LLQ MUST be returned as an error code if the client attempt | </t> | |||
s | </li> | |||
<li pn="section-7.2-2.2"> | ||||
<t pn="section-7.2-2.2.1"> | ||||
The LLQ‑OPCODE is set to LLQ‑REFRESH. | ||||
</t> | ||||
</li> | ||||
<li pn="section-7.2-2.3"> | ||||
<t pn="section-7.2-2.3.1"> | ||||
NO‑SUCH‑LLQ <bcp14>MUST</bcp14> be returned as an error code if | ||||
the client attempts | ||||
to refresh an expired or non-existent LLQ (as determined by the | to refresh an expired or non-existent LLQ (as determined by the | |||
LLQ&nbhy;ID in the request). | LLQ‑ID in the request). | |||
</t> | </t> | |||
</li> | ||||
<t> | <li pn="section-7.2-2.4"> | |||
The LLQ&nbhy;ID in the acknowledgment is set to the LLQ&nbhy;ID in the reques | <t pn="section-7.2-2.4.1"> | |||
t. | The LLQ‑ID in the acknowledgment is set to the LLQ‑ID in the | |||
</t> | request. | |||
<?rfc needLines="40" ?> | </t> | |||
</section> | </li> | |||
</section> | </ul> | |||
</section> | ||||
<section title="Security Considerations"> | </section> | |||
<t> | <section numbered="true" toc="include" anchor="security-considerations" remo | |||
Without care taken in the design of protocols such as this, servers | veInRFC="false" pn="section-8"> | |||
may be susceptible to denial of service (DOS) attacks, and clients | <name slugifiedName="name-security-considerations">Security Considerations | |||
may be subjected to packet storms. Mechanisms have been added to the | </name> | |||
protocol to limit potential for these attacks. | <t pn="section-8-1"> | |||
</t> | In datagram-based protocols | |||
(i.e., protocols running over UDP, or directly over IP, or similar), servers | ||||
<t> | may be susceptible to denial-of-service (DoS) attacks, and clients | |||
may be subjected to packet storms. Carefully designed mechanisms are needed | ||||
to limit potential for these attacks. | ||||
</t> | ||||
<t pn="section-8-2"> | ||||
Note: This section contains no new protocol elements -- it serves | Note: This section contains no new protocol elements -- it serves | |||
only to explain the rationale behind protocol elements described | only to explain the rationale behind protocol elements described | |||
above, as they relate to security. | above as they relate to security. | |||
</t> | </t> | |||
<section title="Server DOS"> | <section numbered="true" toc="include" anchor="server-dos" removeInRFC="fa | |||
<t> | lse" pn="section-8.1"> | |||
LLQs require that servers be stateful, maintaining entries for each | <name slugifiedName="name-server-dos">Server DoS</name> | |||
LLQ over a potentially long period of time. If unbounded in | <t pn="section-8.1-1"> | |||
quantity, these entries may overload the server. By returning | LLQs require that servers be stateful, maintaining entries for each LLQ | |||
SERV&nbhy;FULL in Setup Challenges, the sever may limit the maximum | over a potentially long period of time. If unbounded in quantity, these | |||
number of LLQs it maintains. Additionally, the server may return | entries may overload the server. By returning SERV‑FULL in Setup | |||
SERV&nbhy;FULL to limit the number of LLQs requested for a single name and | Challenges, the server may limit the maximum number of LLQs it | |||
type, or by a single client. This throttling may be in the form of a | maintains. Additionally, the server may return SERV‑FULL to limit the | |||
hard limit, or, preferably, by token-bucket rate limiting. Such rate | number of LLQs requested for a single name and type, or by a single | |||
limiting should occur rarely in normal use and is intended to prevent | client. This throttling may be in the form of a hard limit, or, preferably, | |||
DOS attacks -- thus it is not built into the protocol explicitly, but | by token-bucket rate limiting. Such rate limiting should occur rarely in | |||
is instead implemented at the discretion of an administrator via the | normal use and is intended to prevent DoS attacks -- thus, it is not built | |||
SERV&nbhy;FULL error and the LEASE&nbhy;LIFE field to indicate a retry time t | into the protocol explicitly but is instead implemented at the discretion | |||
o | of an administrator via the SERV‑FULL error and the LLQ‑LEASE | |||
the client. | field to indicate a retry time to the client. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Client Packet Storms"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-8.2 | |||
<t> | "> | |||
In addition to protecting the server from DOS attacks, the protocol | <name slugifiedName="name-client-packet-storms">Client Packet Storms</na | |||
me> | ||||
<t pn="section-8.2-1"> | ||||
In addition to protecting the server from DoS attacks, the LLQ protocol | ||||
limits the ability of a malicious host to cause the server to flood a | limits the ability of a malicious host to cause the server to flood a | |||
client with packets. This is achieved via the four-way handshake | client with packets. This is achieved via the four-way handshake | |||
upon setup, demonstrating reachability and willingness of the client | upon setup, demonstrating reachability and willingness of the client | |||
to participate, and by requiring that gratuitous responses be ACK'd | to participate, and by requiring that gratuitous responses be ACK'd | |||
by the client. | by the client. | |||
</t> | </t> | |||
<t pn="section-8.2-2"> | ||||
<t> | Additionally, rate limiting by LLQ client address, as described in | |||
Additionally, rate-limiting by LLQ client address, as described in | <xref target="server-dos" format="default" sectionFormat="of" derivedContent= | |||
(8.1) serves to limit the number of packets that can be delivered to | "Section 8.1"/>, serves to limit the number of packets that can | |||
be delivered to | ||||
an unsuspecting client. | an unsuspecting client. | |||
</t> | </t> | |||
</section> | </section> | |||
<section title="Spoofing"> | <section numbered="true" toc="include" removeInRFC="false" pn="section-8.3 | |||
<t> | "> | |||
<name slugifiedName="name-spoofing">Spoofing</name> | ||||
<t pn="section-8.3-1"> | ||||
A large random ID greatly reduces the risk of an off-path attacker | A large random ID greatly reduces the risk of an off-path attacker | |||
sending spoof packets to the client (containing spoof events) | sending spoof packets to the client (containing spoof events) | |||
or to the server (containing phony requests or refreshes). | or to the server (containing phony requests or refreshes). | |||
</t> | </t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="include" removeInRFC="false" pn="section-9"> | ||||
<section title="IANA Considerations"> | <name slugifiedName="name-iana-considerations">IANA Considerations</name> | |||
<t> | <t pn="section-9-1"> | |||
The EDNS(0) OPTION CODE 1 has already been assigned for this DNS | The EDNS(0) OPTION CODE 1 has already been assigned for this DNS extension. | |||
extension. IANA is requested to update the record in the DNS EDNS(0) | IANA has updated the record in the "DNS EDNS0 Option Codes (OPT)" registry | |||
Option Codes registry from "On-hold" to "Optional", and to set the | from "On-hold" to "Optional" and has set the reference to this document. | |||
reference to indicate the RFC number under which this document is | </t> | |||
published. | <t pn="section-9-2"> | |||
</t> | TCP and UDP ports 5352 have already been assigned for LLQ. IANA has | |||
<t> | added a reference to this document. | |||
TCP and UDP ports 5352 have already been assigned for LLQ. IANA is | </t> | |||
requested to add a reference to indicate the RFC number under which | </section> | |||
this document is published. | </middle> | |||
</t> | <back> | |||
<t> | <references pn="section-10"> | |||
No additional IANA services are required by this document. | <name slugifiedName="name-references">References</name> | |||
</t> | <references pn="section-10.1"> | |||
</section> | <name slugifiedName="name-normative-references">Normative References</na | |||
me> | ||||
<section title="Acknowledgments"> | <reference anchor="RFC1035" target="https://www.rfc-editor.org/info/rfc1 | |||
<t> | 035" quoteTitle="true" derivedAnchor="RFC1035"> | |||
The concepts described in this document were originally explored, developed | <front> | |||
and implemented with help from Chris Sharp and Roger Pantos. | <title>Domain names - implementation and specification</title> | |||
</t> | <author initials="P.V." surname="Mockapetris" fullname="P.V. Mockape | |||
<t>In 2005 and 2006 Kiren Sekar made significant contributions to | tris"> | |||
the | <organization showOnFrontPage="true"/> | |||
first two drafts of this document, and he wrote much of the code | </author> | |||
for the | <date year="1987" month="November"/> | |||
implementation of LLQ that shipped in Mac OS X 10.4 Tiger in 2005 | <abstract> | |||
.</t> | <t>This RFC is the revised specification of the protocol and forma | |||
</section> | t used in the implementation of the Domain Name System. It obsoletes RFC-883. T | |||
</middle> | his memo documents the details of the domain name client - server communication. | |||
</t> | ||||
<back> | </abstract> | |||
</front> | ||||
<references title='Normative References'> | <seriesInfo name="STD" value="13"/> | |||
&RFC1035; | <seriesInfo name="RFC" value="1035"/> | |||
&RFC2119; | <seriesInfo name="DOI" value="10.17487/RFC1035"/> | |||
&RFC2782; | </reference> | |||
&RFC6891; | <reference anchor="RFC2119" target="https://www.rfc-editor.org/info/rfc2 | |||
&RFC8174; | 119" quoteTitle="true" derivedAnchor="RFC2119"> | |||
<front> | ||||
<reference anchor='Push'> | <title>Key words for use in RFCs to Indicate Requirement Levels</tit | |||
<front> | le> | |||
<title>DNS Push Notifications [[RFC Editor note: Please update reference | <author initials="S." surname="Bradner" fullname="S. Bradner"> | |||
"Push" to refer to assigned RFC number for that document]]</title> | <organization showOnFrontPage="true"/> | |||
</author> | ||||
<author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | <date year="1997" month="March"/> | |||
<organization /> | <abstract> | |||
</author> | <t>In many standards track documents several words are used to sig | |||
nify the requirements in the specification. These words are often capitalized. | ||||
<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | This document defines these words as they should be interpreted in IETF document | |||
<organization /> | s. This document specifies an Internet Best Current Practices for the Internet | |||
</author> | Community, and requests discussion and suggestions for improvements.</t> | |||
</abstract> | ||||
<date month='September' day='18' year='2018' /> | </front> | |||
<seriesInfo name="BCP" value="14"/> | ||||
<abstract><t>The Domain Name System (DNS) was designed to return | <seriesInfo name="RFC" value="2119"/> | |||
matching records efficiently for queries for data that are relatively | <seriesInfo name="DOI" value="10.17487/RFC2119"/> | |||
static. When those records change frequently, DNS is still efficient at | </reference> | |||
returning the updated results when polled, as long as the polling rate | <reference anchor="RFC2782" target="https://www.rfc-editor.org/info/rfc2 | |||
is not too high. But there exists no mechanism for a client to be | 782" quoteTitle="true" derivedAnchor="RFC2782"> | |||
asynchronously notified when these changes occur. This document defines | <front> | |||
a mechanism for a client to be notified of such changes to DNS records, | <title>A DNS RR for specifying the location of services (DNS SRV)</t | |||
called DNS Push Notifications.</t></abstract> | itle> | |||
<author initials="A." surname="Gulbrandsen" fullname="A. Gulbrandsen | ||||
</front> | "> | |||
<organization showOnFrontPage="true"/> | ||||
<seriesInfo name='Internet-Draft' value='draft-ietf-dnssd-push-15' /> | </author> | |||
<format type='TXT' | <author initials="P." surname="Vixie" fullname="P. Vixie"> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-dn | <organization showOnFrontPage="true"/> | |||
ssd-push-15.txt' /> | </author> | |||
</reference> | <author initials="L." surname="Esibov" fullname="L. Esibov"> | |||
<organization showOnFrontPage="true"/> | ||||
</references> | </author> | |||
<date year="2000" month="February"/> | ||||
<references title='Informative References'> | <abstract> | |||
&RFC2136; | <t>This document describes a DNS RR which specifies the location o | |||
&RFC4787; | f the server(s) for a specific protocol and domain. [STANDARDS-TRACK]</t> | |||
&RFC4953; | </abstract> | |||
&RFC5382; | </front> | |||
&RFC6281; | <seriesInfo name="RFC" value="2782"/> | |||
&RFC6762; | <seriesInfo name="DOI" value="10.17487/RFC2782"/> | |||
&RFC6763; | </reference> | |||
&RFC6886; | <reference anchor="RFC6891" target="https://www.rfc-editor.org/info/rfc6 | |||
&RFC6887; | 891" quoteTitle="true" derivedAnchor="RFC6891"> | |||
&RFC7857; | <front> | |||
<title>Extension Mechanisms for DNS (EDNS(0))</title> | ||||
<reference anchor='SYN'> | <author initials="J." surname="Damas" fullname="J. Damas"> | |||
<front> | <organization showOnFrontPage="true"/> | |||
<title>Defenses Against TCP SYN Flooding Attacks</title> | </author> | |||
<author initials='W.' surname='Eddy' fullname='Wesley Eddy'> | <author initials="M." surname="Graff" fullname="M. Graff"> | |||
<organization>Verizon Federal Network Systems</organization> | <organization showOnFrontPage="true"/> | |||
<address> | </author> | |||
<email>weddy@grc.nasa.gov</email> | <author initials="P." surname="Vixie" fullname="P. Vixie"> | |||
</address> | <organization showOnFrontPage="true"/> | |||
</author> | </author> | |||
<date year='2006' month='December' /> | <date year="2013" month="April"/> | |||
<keyword>TCP</keyword> | <abstract> | |||
</front> | <t>The Domain Name System's wire protocol includes a number of fix | |||
<seriesInfo name="The Internet Protocol Journal," value='Cisco Systems' /> | ed fields whose range has been or soon will be exhausted and does not allow requ | |||
<seriesInfo name='Volume' value='9' /> | estors to advertise their capabilities to responders. This document describes b | |||
<seriesInfo name='Number' value='4' /> | ackward-compatible mechanisms for allowing the protocol to grow.</t> | |||
<format type='PDF' octets='882020' target="http://www.cisco.com/web/about/ac12 | <t>This document updates the Extension Mechanisms for DNS (EDNS(0) | |||
3/ac147/archived_issues/ipj_9-4/ipj_9-4.pdf" /> | ) specification (and obsoletes RFC 2671) based on feedback from deployment exper | |||
<format type='HTML' octets='65566' target="http://www.cisco.com/web/about/ac12 | ience in several implementations. It also obsoletes RFC 2673 ("Binary Labels in | |||
3/ac147/archived_issues/ipj_9-4/syn_flooding_attacks.html" /> | the Domain Name System") and adds considerations on the use of extended labels | |||
</reference> | in the DNS.</t> | |||
</abstract> | ||||
<reference anchor='RFC8490' target='https://www.rfc-editor.org/info/rfc8490'> | </front> | |||
<front> | <seriesInfo name="STD" value="75"/> | |||
<title>DNS Stateful Operations</title> | <seriesInfo name="RFC" value="6891"/> | |||
<author initials='R' surname='Bellis' fullname='Ray Bellis'> | <seriesInfo name="DOI" value="10.17487/RFC6891"/> | |||
<organization /> | </reference> | |||
</author> | <reference anchor="RFC8174" target="https://www.rfc-editor.org/info/rfc8 | |||
174" quoteTitle="true" derivedAnchor="RFC8174"> | ||||
<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | <front> | |||
<organization /> | <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</ti | |||
</author> | tle> | |||
<author initials="B." surname="Leiba" fullname="B. Leiba"> | ||||
<author initials='J' surname='Dickinson' fullname='John Dickinson'> | <organization showOnFrontPage="true"/> | |||
<organization /> | </author> | |||
</author> | <date year="2017" month="May"/> | |||
<abstract> | ||||
<author initials='S' surname='Dickinson' fullname='Sara Dickinson'> | <t>RFC 2119 specifies common key words that may be used in protoco | |||
<organization /> | l specifications. This document aims to reduce the ambiguity by clarifying tha | |||
</author> | t only UPPERCASE usage of the key words have the defined special meanings.</t> | |||
</abstract> | ||||
<author initials='T' surname='Lemon' fullname='Ted Lemon'> | </front> | |||
<organization /> | <seriesInfo name="BCP" value="14"/> | |||
</author> | <seriesInfo name="RFC" value="8174"/> | |||
<seriesInfo name="DOI" value="10.17487/RFC8174"/> | ||||
<author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | </reference> | |||
<organization /> | <reference anchor="RFC8765" target="https://www.rfc-editor.org/info/rfc8 | |||
</author> | 765" quoteTitle="true" derivedAnchor="RFC8765"> | |||
<front> | ||||
<date month='October' day='23' year='2018' /> | <title>DNS Push Notifications</title> | |||
<author initials="T" surname="Pusateri" fullname="Tom Pusateri"> | ||||
<abstract><t>This document defines a new DNS OPCODE for DNS Stateful Operations | <organization showOnFrontPage="true"/> | |||
(DSO). DSO messages communicate operations within persistent stateful sessions, | </author> | |||
using type-length-value (TLV) syntax. Three TLVs are defined that manage sessi | <author initials="S" surname="Cheshire" fullname="Stuart Cheshire"> | |||
on timeouts, termination, and encryption padding, and a framework is defined for | <organization showOnFrontPage="true"/> | |||
extensions to enable new stateful operations. This document updates RFC 1035 b | </author> | |||
y adding a new DNS header opcode which has different message semantics, and a ne | <date month="June" year="2020"/> | |||
w result code. This document updates RFC 7766 by redefining a session, providin | </front> | |||
g new guidance on connection re-use, and providing a new mechanism for handling | <seriesInfo name="RFC" value="8765"/> | |||
session idle timeouts.</t></abstract> | <seriesInfo name="DOI" value="10.17487/RFC8765"/> | |||
</front> | </reference> | |||
<seriesInfo name='BCP' value='14'/> | </references> | |||
<seriesInfo name='RFC' value='8490'/> | <references pn="section-10.2"> | |||
<seriesInfo name='DOI' value='10.17487/RFC8490'/> | <name slugifiedName="name-informative-references">Informative References | |||
</reference> | </name> | |||
<reference anchor="RFC2136" target="https://www.rfc-editor.org/info/rfc2 | ||||
</references> | 136" quoteTitle="true" derivedAnchor="RFC2136"> | |||
<front> | ||||
<?rfc needLines="40" ?> | <title>Dynamic Updates in the Domain Name System (DNS UPDATE)</title | |||
> | ||||
<section anchor="problems" title="Problems with the LLQ Protocol"> | <author initials="P." surname="Vixie" fullname="P. Vixie" role="edit | |||
<t> | or"> | |||
In the course of using LLQ since 2005, some problems were discove | <organization showOnFrontPage="true"/> | |||
red. | </author> | |||
Since no further work is being done on the LLQ protocol, | <author initials="S." surname="Thomson" fullname="S. Thomson"> | |||
this LLQ specification will not be updated to remedy these proble | <organization showOnFrontPage="true"/> | |||
ms. | </author> | |||
</t> | <author initials="Y." surname="Rekhter" fullname="Y. Rekhter"> | |||
<organization showOnFrontPage="true"/> | ||||
<t> | </author> | |||
LLQ's IETF Standards Track successor, | <author initials="J." surname="Bound" fullname="J. Bound"> | |||
<xref target="Push">DNS Push Notifications</xref>, | <organization showOnFrontPage="true"/> | |||
does not suffer from these problems, so | </author> | |||
all existing LLQ implementations are RECOMMENDED to migrate to us | <date year="1997" month="April"/> | |||
ing DNS Push Notifications, | <abstract> | |||
and all new implementations are RECOMMENDED to implement DNS Push | <t>Using this specification of the UPDATE opcode, it is possible t | |||
Notifications instead of LLQ. | o add or delete RRs or RRsets from a specified zone. Prerequisites are specifie | |||
</t> | d separately from update operations, and can specify a dependency upon either th | |||
e previous existence or nonexistence of an RRset, or the existence of a single R | ||||
<t> | R. [STANDARDS-TRACK]</t> | |||
Known problems with LLQ are documented here for the record. | </abstract> | |||
</t> | </front> | |||
<seriesInfo name="RFC" value="2136"/> | ||||
<t> | <seriesInfo name="DOI" value="10.17487/RFC2136"/> | |||
An LLQ "Setup Challenge" message from server to client is identic | </reference> | |||
al to | <reference anchor="RFC4787" target="https://www.rfc-editor.org/info/rfc4 | |||
an LLQ "ACK + Answers" message from server to client | 787" quoteTitle="true" derivedAnchor="RFC4787"> | |||
when there are no current answers for the query. | <front> | |||
If there is packet loss, retransmission, and duplication in the n | <title>Network Address Translation (NAT) Behavioral Requirements for | |||
etwork, | Unicast UDP</title> | |||
then a duplicated "Setup Challenge" message arriving late at the | <author initials="F." surname="Audet" fullname="F. Audet" role="edit | |||
client | or"> | |||
would look like an "ACK + Answers" message with no answers, | <organization showOnFrontPage="true"/> | |||
causing the client to clear its cache of any | </author> | |||
records matching the query. | <author initials="C." surname="Jennings" fullname="C. Jennings"> | |||
</t> | <organization showOnFrontPage="true"/> | |||
</author> | ||||
<t> | <date year="2007" month="January"/> | |||
This LLQ specification states: | <abstract> | |||
"Servers MUST NOT garbage collect LLQs that fail to complete the | <t>This document defines basic terminology for describing differen | |||
four-way | t types of Network Address Translation (NAT) behavior when handling Unicast UDP | |||
handshake until the initially granted LEASE-LIFE has elapsed." | and also defines a set of requirements that would allow many applications, such | |||
This is probably a mistake, since it exposes LLQ servers to an ea | as multimedia communications or online gaming, to work consistently. Developing | |||
sy | NATs that meet this set of requirements will greatly increase the likelihood th | |||
resource-exhaustion denial-of-service attack. | at these applications will function properly. This document specifies an Intern | |||
DNS Push Notifications is built using | et Best Current Practices for the Internet Community, and requests discussion an | |||
DNS Stateful Operations <xref target="RFC8490"/>, | d suggestions for improvements.</t> | |||
which uses TLS over TCP, | </abstract> | |||
and a benefit of building on TCP is that there are already establ | </front> | |||
ished | <seriesInfo name="BCP" value="127"/> | |||
industry best practices to guard against SYN flooding and | <seriesInfo name="RFC" value="4787"/> | |||
similar attacks <xref target="SYN"/> <xref target="RFC4953"/> | <seriesInfo name="DOI" value="10.17487/RFC4787"/> | |||
</t> | </reference> | |||
<reference anchor="RFC4953" target="https://www.rfc-editor.org/info/rfc4 | ||||
<t> | 953" quoteTitle="true" derivedAnchor="RFC4953"> | |||
LLQ is built using UDP, and because the UDP protocol has no | <front> | |||
standardized way of indicating the start and end of a | <title>Defending TCP Against Spoofing Attacks</title> | |||
session, firewalls and NAT gateways tend to be fairly agressive a | <author initials="J." surname="Touch" fullname="J. Touch"> | |||
bout | <organization showOnFrontPage="true"/> | |||
recycling UDP mappings that they believe to be disused | </author> | |||
<xref target="RFC4787"/> <xref target="RFC5382"/> <xref target="R | <date year="2007" month="July"/> | |||
FC7857"/>. | <abstract> | |||
Using a high keepalive traffic rate to maintain firewall or NAT m | <t>Recent analysis of potential attacks on core Internet infrastru | |||
apping | cture indicates an increased vulnerability of TCP connections to spurious resets | |||
state could remedy this, but would largely defeat the purpose of | (RSTs), sent with forged IP source addresses (spoofing). TCP has always been s | |||
using LLQ in the first place, which is to provide efficient | usceptible to such RST spoofing attacks, which were indirectly protected by chec | |||
change notification without wasteful polling. | king that the RST sequence number was inside the current receive window, as well | |||
Because of this, existing LLQ clients use | as via the obfuscation of TCP endpoint and port numbers. For pairs of well-kno | |||
<xref target="RFC6886">NAT Port Mapping Protocol (NAT-PMP)</xref> | wn endpoints often over predictable port pairs, such as BGP or between web serve | |||
and/or | rs and well-known large-scale caches, increases in the path bandwidth-delay prod | |||
<xref target="RFC6887">Port Control Protocol (PCP)</xref> to | uct of a connection have sufficiently increased the receive window space that of | |||
establish longer port mapping lifetimes. | f-path third parties can brute-force generate a viable RST sequence number. The | |||
This solves the problem, but adds extra complexity, and doesn't w | susceptibility to attack increases with the square of the bandwidth, and thus p | |||
ork | resents a significant vulnerability for recent high-speed networks. This docume | |||
with firewalls and NAT gateways that don't support NAT-PMP or PCP | nt addresses this vulnerability, discussing proposed solutions at the transport | |||
. | level and their inherent challenges, as well as existing network level solutions | |||
By using TCP instead of UDP, the DNS Push Notifications | and the feasibility of their deployment. This document focuses on vulnerabilit | |||
protocol benefits from better longevity of sessions through | ies due to spoofed TCP segments, and includes a discussion of related ICMP spoof | |||
firewalls and NAT gateways that don't support NAT-PMP or PCP. | ing attacks on TCP connections. This memo provides information for the Internet | |||
</t> | community.</t> | |||
</abstract> | ||||
</section> | </front> | |||
<seriesInfo name="RFC" value="4953"/> | ||||
</back> | <seriesInfo name="DOI" value="10.17487/RFC4953"/> | |||
</reference> | ||||
<reference anchor="RFC5382" target="https://www.rfc-editor.org/info/rfc5 | ||||
382" quoteTitle="true" derivedAnchor="RFC5382"> | ||||
<front> | ||||
<title>NAT Behavioral Requirements for TCP</title> | ||||
<author initials="S." surname="Guha" fullname="S. Guha" role="editor | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Biswas" fullname="K. Biswas"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="B." surname="Ford" fullname="B. Ford"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Sivakumar" fullname="S. Sivakumar"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P." surname="Srisuresh" fullname="P. Srisuresh"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2008" month="October"/> | ||||
<abstract> | ||||
<t>This document defines a set of requirements for NATs that handl | ||||
e TCP that would allow many applications, such as peer-to-peer applications and | ||||
online games to work consistently. Developing NATs that meet this set of requir | ||||
ements will greatly increase the likelihood that these applications will functio | ||||
n properly. This document specifies an Internet Best Current Practices for the | ||||
Internet Community, and requests discussion and suggestions for improvements.< | ||||
/t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="142"/> | ||||
<seriesInfo name="RFC" value="5382"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC5382"/> | ||||
</reference> | ||||
<reference anchor="RFC6281" target="https://www.rfc-editor.org/info/rfc6 | ||||
281" quoteTitle="true" derivedAnchor="RFC6281"> | ||||
<front> | ||||
<title>Understanding Apple's Back to My Mac (BTMM) Service</title> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="Z." surname="Zhu" fullname="Z. Zhu"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Wakikawa" fullname="R. Wakikawa"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="L." surname="Zhang" fullname="L. Zhang"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2011" month="June"/> | ||||
<abstract> | ||||
<t>This document describes the implementation of Apple Inc.'s Back | ||||
to My Mac (BTMM) service. BTMM provides network connectivity between devices s | ||||
o that a user can perform file sharing and screen sharing among multiple compute | ||||
rs at home, at work, or on the road. The implementation of BTMM addresses the i | ||||
ssues of single sign-on authentication, secure data communication, service disco | ||||
very, and end-to-end connectivity in the face of Network Address Translators (NA | ||||
Ts) and mobility of devices. This document is not an Internet Standards Track | ||||
specification; it is published for informational purposes.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6281"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6281"/> | ||||
</reference> | ||||
<reference anchor="RFC6762" target="https://www.rfc-editor.org/info/rfc6 | ||||
762" quoteTitle="true" derivedAnchor="RFC6762"> | ||||
<front> | ||||
<title>Multicast DNS</title> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Krochmal" fullname="M. Krochmal"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2013" month="February"/> | ||||
<abstract> | ||||
<t>As networked devices become smaller, more portable, and more ub | ||||
iquitous, the ability to operate with less configured infrastructure is increasi | ||||
ngly important. In particular, the ability to look up DNS resource record data | ||||
types (including, but not limited to, host names) in the absence of a convention | ||||
al managed DNS server is useful.</t> | ||||
<t>Multicast DNS (mDNS) provides the ability to perform DNS-like o | ||||
perations on the local link in the absence of any conventional Unicast DNS serve | ||||
r. In addition, Multicast DNS designates a portion of the DNS namespace to be f | ||||
ree for local use, without the need to pay any annual fee, and without the need | ||||
to set up delegations or otherwise configure a conventional DNS server to answer | ||||
for those names.</t> | ||||
<t>The primary benefits of Multicast DNS names are that (i) they r | ||||
equire little or no administration or configuration to set them up, (ii) they wo | ||||
rk when no infrastructure is present, and (iii) they work during infrastructure | ||||
failures.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6762"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6762"/> | ||||
</reference> | ||||
<reference anchor="RFC6763" target="https://www.rfc-editor.org/info/rfc6 | ||||
763" quoteTitle="true" derivedAnchor="RFC6763"> | ||||
<front> | ||||
<title>DNS-Based Service Discovery</title> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Krochmal" fullname="M. Krochmal"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2013" month="February"/> | ||||
<abstract> | ||||
<t>This document specifies how DNS resource records are named and | ||||
structured to facilitate service discovery. Given a type of service that a clie | ||||
nt is looking for, and a domain in which the client is looking for that service, | ||||
this mechanism allows clients to discover a list of named instances of that des | ||||
ired service, using standard DNS queries. This mechanism is referred to as DNS-b | ||||
ased Service Discovery, or DNS-SD.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6763"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6763"/> | ||||
</reference> | ||||
<reference anchor="RFC6886" target="https://www.rfc-editor.org/info/rfc6 | ||||
886" quoteTitle="true" derivedAnchor="RFC6886"> | ||||
<front> | ||||
<title>NAT Port Mapping Protocol (NAT-PMP)</title> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Krochmal" fullname="M. Krochmal"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2013" month="April"/> | ||||
<abstract> | ||||
<t>This document describes a protocol for automating the process o | ||||
f creating Network Address Translation (NAT) port mappings. Included in the pro | ||||
tocol is a method for retrieving the external IPv4 address of a NAT gateway, thu | ||||
s allowing a client to make its external IPv4 address and port known to peers th | ||||
at may wish to communicate with it. From 2005 onwards, this protocol was impleme | ||||
nted in Apple products including Mac OS X, Bonjour for Windows, and AirPort wire | ||||
less base stations. In 2013, NAT Port Mapping Protocol (NAT-PMP) was superseded | ||||
by the IETF Standards Track RFC "Port Control Protocol (PCP)", which builds on | ||||
NAT-PMP and uses a compatible packet format, but adds a number of significant en | ||||
hancements.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6886"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6886"/> | ||||
</reference> | ||||
<reference anchor="RFC6887" target="https://www.rfc-editor.org/info/rfc6 | ||||
887" quoteTitle="true" derivedAnchor="RFC6887"> | ||||
<front> | ||||
<title>Port Control Protocol (PCP)</title> | ||||
<author initials="D." surname="Wing" fullname="D. Wing" role="editor | ||||
"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Boucadair" fullname="M. Boucadair"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="R." surname="Penno" fullname="R. Penno"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="P." surname="Selkirk" fullname="P. Selkirk"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2013" month="April"/> | ||||
<abstract> | ||||
<t>The Port Control Protocol allows an IPv6 or IPv4 host to contro | ||||
l how incoming IPv6 or IPv4 packets are translated and forwarded by a Network Ad | ||||
dress Translator (NAT) or simple firewall, and also allows a host to optimize it | ||||
s outgoing NAT keepalive messages.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="6887"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC6887"/> | ||||
</reference> | ||||
<reference anchor="RFC7857" target="https://www.rfc-editor.org/info/rfc7 | ||||
857" quoteTitle="true" derivedAnchor="RFC7857"> | ||||
<front> | ||||
<title>Updates to Network Address Translation (NAT) Behavioral Requi | ||||
rements</title> | ||||
<author initials="R." surname="Penno" fullname="R. Penno"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Perreault" fullname="S. Perreault"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="M." surname="Boucadair" fullname="M. Boucadair" ro | ||||
le="editor"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Sivakumar" fullname="S. Sivakumar"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="K." surname="Naito" fullname="K. Naito"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2016" month="April"/> | ||||
<abstract> | ||||
<t>This document clarifies and updates several requirements of RFC | ||||
s 4787, 5382, and 5508 based on operational and development experience. The focu | ||||
s of this document is Network Address Translation from IPv4 to IPv4 (NAT44).</t> | ||||
<t>This document updates RFCs 4787, 5382, and 5508.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="BCP" value="127"/> | ||||
<seriesInfo name="RFC" value="7857"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC7857"/> | ||||
</reference> | ||||
<reference anchor="RFC8490" target="https://www.rfc-editor.org/info/rfc8 | ||||
490" quoteTitle="true" derivedAnchor="RFC8490"> | ||||
<front> | ||||
<title>DNS Stateful Operations</title> | ||||
<author initials="R." surname="Bellis" fullname="R. Bellis"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Cheshire" fullname="S. Cheshire"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="J." surname="Dickinson" fullname="J. Dickinson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="S." surname="Dickinson" fullname="S. Dickinson"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T." surname="Lemon" fullname="T. Lemon"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<author initials="T." surname="Pusateri" fullname="T. Pusateri"> | ||||
<organization showOnFrontPage="true"/> | ||||
</author> | ||||
<date year="2019" month="March"/> | ||||
<abstract> | ||||
<t>This document defines a new DNS OPCODE for DNS Stateful Operati | ||||
ons (DSO). DSO messages communicate operations within persistent stateful sessi | ||||
ons using Type Length Value (TLV) syntax. Three TLVs are defined that manage se | ||||
ssion timeouts, termination, and encryption padding, and a framework is defined | ||||
for extensions to enable new stateful operations. This document updates RFC 103 | ||||
5 by adding a new DNS header OPCODE that has both different message semantics an | ||||
d a new result code. This document updates RFC 7766 by redefining a session, pr | ||||
oviding new guidance on connection reuse, and providing a new mechanism for hand | ||||
ling session idle timeouts.</t> | ||||
</abstract> | ||||
</front> | ||||
<seriesInfo name="RFC" value="8490"/> | ||||
<seriesInfo name="DOI" value="10.17487/RFC8490"/> | ||||
</reference> | ||||
<reference anchor="SYN" target="https://www.cisco.com/web/about/ac123/ac | ||||
147/archived_issues/ipj_9-4/ipj_9-4.pdf" quoteTitle="true" derivedAnchor="SYN"> | ||||
<front> | ||||
<title>Defenses Against TCP SYN Flooding Attacks</title> | ||||
<seriesInfo name="Volume" value="9"/> | ||||
<seriesInfo name="Number" value="4"/> | ||||
<seriesInfo name="The Internet Protocol Journal," value="Cisco | ||||
Systems"/> | ||||
<author initials="W." surname="Eddy" fullname="Wesley Eddy"> | ||||
<organization showOnFrontPage="true">Verizon Federal Network Syste | ||||
ms</organization> | ||||
<address> | ||||
<email>weddy@grc.nasa.gov</email> | ||||
</address> | ||||
</author> | ||||
<date year="2006" month="December"/> | ||||
<keyword>TCP</keyword> | ||||
</front> | ||||
</reference> | ||||
</references> | ||||
</references> | ||||
<section anchor="problems" numbered="true" toc="include" removeInRFC="false" | ||||
pn="section-appendix.a"> | ||||
<name slugifiedName="name-problems-with-the-llq-proto">Problems with the L | ||||
LQ Protocol</name> | ||||
<t pn="section-appendix.a-1"> | ||||
In the course of using LLQ since 2005, some problems were discovered. | ||||
Since no further work is being done on the LLQ protocol, | ||||
this LLQ specification will not be updated to remedy these problems. | ||||
</t> | ||||
<t pn="section-appendix.a-2"> | ||||
LLQ's IETF Standards Track successor, "DNS Push Notifications" | ||||
<xref target="RFC8765" format="default" sectionFormat="of" derivedContent | ||||
="RFC8765"/>, does not | ||||
suffer from these problems, so all existing LLQ | ||||
implementations are <bcp14>RECOMMENDED</bcp14> to migrate to | ||||
using DNS Push Notifications, and all new implementations are | ||||
<bcp14>RECOMMENDED</bcp14> to implement DNS Push Notifications | ||||
instead of LLQ. | ||||
</t> | ||||
<t pn="section-appendix.a-3"> | ||||
Known problems with LLQ are documented here as a cautionary tale | ||||
about the challenges of building an application protocol directly | ||||
using datagrams (like IP or UDP) without the benefit of a | ||||
mature and thoroughly reviewed | ||||
intervening transport layer (such as TCP or QUIC). | ||||
</t> | ||||
<t pn="section-appendix.a-4"> | ||||
An LLQ "Setup Challenge" message from server to client is identical to | ||||
an LLQ "ACK + Answers" message from server to client | ||||
when there are no current answers for the query. | ||||
If there is packet loss, retransmission, and duplication in the | ||||
network, | ||||
then a duplicated "Setup Challenge" message arriving late at the | ||||
client | ||||
would look like an "ACK + Answers" message with no answers, | ||||
causing the client to clear its cache of any | ||||
records matching the query. | ||||
</t> | ||||
<t pn="section-appendix.a-5"> | ||||
<xref target="setup-message-retransmission" format="default" sectionForma | ||||
t="of" derivedContent="Section 5.1"/> of this LLQ | ||||
specification states, "Servers <bcp14>MUST NOT</bcp14> garbage collect LL | ||||
Qs that fail to complete the | ||||
four-way handshake until the initially granted LLQ-LEASE has | ||||
elapsed." This is probably a mistake since it exposes LLQ | ||||
servers to an easy resource-exhaustion denial-of-service | ||||
attack. | ||||
LLQ's replacement, | ||||
DNS Push Notifications <xref target="RFC8765" format="default" sectionFor | ||||
mat="of" derivedContent="RFC8765"/>, | ||||
is built using DNS Stateful | ||||
Operations <xref target="RFC8490" format="default" sectionFormat="of" der | ||||
ivedContent="RFC8490"/>, which | ||||
uses TLS over TCP; a benefit of building on TCP is that there | ||||
are already established industry best practices to guard | ||||
against SYN flooding and similar attacks <xref target="SYN" format="defau | ||||
lt" sectionFormat="of" derivedContent="SYN"/> <xref target="RFC4953" format="def | ||||
ault" sectionFormat="of" derivedContent="RFC4953"/>. | ||||
</t> | ||||
<t pn="section-appendix.a-6"> | ||||
The attempts here to pack multiple questions into a single UDP/IP | ||||
packet for efficiency are awkward and lead to error-prone programming | ||||
to deal with cases where some requests in a packet succeed and other | ||||
requests in the same packet fail. Fully specifying the correct | ||||
handling in all possible cases would be a lot of work to document, a | ||||
lot of work to implement, and even more work to thoroughly test. DNS | ||||
Push Notifications <xref target="RFC8765" format="default" sectionFormat= | ||||
"of" derivedContent="RFC8765"/> | ||||
avoids this problem by using an underlying stream protocol (TLS/TCP) | ||||
to deal with packing small multiple messages into larger IP packets | ||||
for efficiency. | ||||
</t> | ||||
<t pn="section-appendix.a-7"> | ||||
In some cases, initial LLQ answers are delivered in the "ACK + | ||||
Answers" message, and in other cases, such as when all the initial | ||||
answers will not fit in a single IP packet, some of the initial | ||||
answers are delivered in a subsequent "Add Event" message. | ||||
Having two different ways to accomplish the same thing increases | ||||
the possibility for programming errors. | ||||
DNS Push Notifications <xref target="RFC8765" format="default" sectionFor | ||||
mat="of" derivedContent="RFC8765"/> | ||||
corrects this error by having only one single consistent way to | ||||
deliver results. | ||||
</t> | ||||
<t pn="section-appendix.a-8"> | ||||
LLQ is built using UDP, and because UDP has no | ||||
standardized way of indicating the start and end of a session, | ||||
firewalls and NAT gateways tend to be fairly aggressive about | ||||
recycling UDP mappings that they believe to be disused <xref target="RFC4 | ||||
787" format="default" sectionFormat="of" derivedContent="RFC4787"/> <xref target | ||||
="RFC5382" format="default" sectionFormat="of" derivedContent="RFC5382"/> <xref | ||||
target="RFC7857" format="default" sectionFormat="of" derivedContent="RFC7857"/>. | ||||
Using a high keepalive traffic rate to maintain firewall or | ||||
NAT mapping state could remedy this but would largely defeat | ||||
the purpose of using LLQ in the first place, which is to | ||||
provide efficient change notification without wasteful | ||||
polling. Because of this, existing LLQ clients use the NAT | ||||
Port Mapping Protocol (NAT-PMP) <xref target="RFC6886" format="default" s | ||||
ectionFormat="of" derivedContent="RFC6886"/> and/or Port Control Protocol (PCP) | ||||
<xref target="RFC6887" format="default" sectionFormat="of" derivedContent | ||||
="RFC6887"/> to establish | ||||
longer port mapping lifetimes. This solves the problem but | ||||
adds extra complexity and doesn't work with firewalls and NAT | ||||
gateways that don't support NAT-PMP or PCP. By using TCP | ||||
instead of UDP, the DNS Push Notifications protocol benefits | ||||
from better longevity of sessions through firewalls and NAT | ||||
gateways that don't support NAT-PMP or PCP. | ||||
</t> | ||||
</section> | ||||
<section numbered="false" toc="include" removeInRFC="false" pn="section-appe | ||||
ndix.b"> | ||||
<name slugifiedName="name-acknowledgments">Acknowledgments</name> | ||||
<t pn="section-appendix.b-1"> | ||||
The concepts described in this document were originally explored, | ||||
developed, | ||||
and implemented with help from <contact fullname="Chris Sharp"/> and | ||||
<contact fullname="Roger Pantos"/>. | ||||
</t> | ||||
<t pn="section-appendix.b-2"><contact fullname="Kiren Sekar"/> made signif | ||||
icant contributions to | ||||
the first draft of this document and he wrote much of the code for the | ||||
implementation of LLQ that shipped in Mac OS X 10.4 Tiger in April | ||||
2005.</t> | ||||
<t pn="section-appendix.b-3">Thanks to Independent Stream Editor <contact | ||||
fullname="Adrian Farrel"/> for his support and | ||||
assistance in the publication of this RFC. | ||||
</t> | ||||
</section> | ||||
<section anchor="authors-addresses" numbered="false" removeInRFC="false" toc | ||||
="include" pn="section-appendix.c"> | ||||
<name slugifiedName="name-authors-addresses">Authors' Addresses</name> | ||||
<author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | ||||
<organization showOnFrontPage="true">Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>One Apple Park Way</street> | ||||
<city>Cupertino</city> | ||||
<region>CA</region> | ||||
<code>95014</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<phone>+1 (408) 996-1010</phone> | ||||
<email>cheshire@apple.com</email> | ||||
</address> | ||||
</author> | ||||
<author initials="M." surname="Krochmal" fullname="Marc Krochmal"> | ||||
<organization showOnFrontPage="true">Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>One Apple Park Way</street> | ||||
<city>Cupertino</city> | ||||
<region>CA</region> | ||||
<code>95014</code> | ||||
<country>United States of America</country> | ||||
</postal> | ||||
<phone>+1 (408) 996-1010</phone> | ||||
<email>marc@apple.com</email> | ||||
</address> | ||||
</author> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 72 change blocks. | ||||
1149 lines changed or deleted | 2292 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/ |