| 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" ?> | ||||
| <!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
| <!ENTITY RFC1035 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.1035.xml"> | ||||
| <!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.2119.xml"> | ||||
| <!ENTITY RFC2782 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.2782.xml"> | ||||
| <!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.8174.xml"> | ||||
| <!ENTITY RFC2136 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.2136.xml"> | ||||
| <!ENTITY RFC4787 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.4787.xml"> | ||||
| <!ENTITY RFC4953 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.4953.xml"> | ||||
| <!ENTITY RFC5382 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.5382.xml"> | ||||
| <!ENTITY RFC6281 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6281.xml"> | ||||
| <!ENTITY RFC6762 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6762.xml"> | ||||
| <!ENTITY RFC6763 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6763.xml"> | ||||
| <!ENTITY RFC6886 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6886.xml"> | ||||
| <!ENTITY RFC6887 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6887.xml"> | ||||
| <!ENTITY RFC6891 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.6891.xml"> | ||||
| <!ENTITY RFC7857 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refere | ||||
| nce.RFC.7857.xml"> | ||||
| ]> | ||||
| <?rfc compact="yes"?> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
| <?rfc subcompact="no"?> | ||||
| <?rfc toc="yes"?> | ||||
| <?rfc symrefs="yes"?> | ||||
| <?rfc sortrefs="yes"?> | ||||
| <rfc docName="draft-sekar-dns-llq-06" category="info" submissionType="independen | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" number="8764" | |||
| t" ipr="trust200902"> | docName="draft-sekar-dns-llq-06" category="info" | |||
| submissionType="independent" ipr="trust200902" obsoletes="" updates="" | ||||
| xml:lang="en" tocInclude="true" symRefs="true" sortRefs="true" | ||||
| version="3"> | ||||
| <front> | <front> | |||
| <title abbrev="Apple's DNS LLQ">Apple's DNS Long-Lived Queries | ||||
| Protocol</title> | ||||
| <seriesInfo name="RFC" value="8764"/> | ||||
| <author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | ||||
| <organization>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>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> | ||||
| <date year="2020" month="June"/> | ||||
| <title>Apple's DNS Long-Lived Queries protocol</title> | <keyword>Async, Asynchronous, Change Notification, Push Notification</keyword> | |||
| <author initials="S." surname="Cheshire" fullname="Stuart Cheshire"> | <abstract> | |||
| <organization>Apple Inc.</organization> | <t> | |||
| <address> | Apple's DNS Long-Lived Queries (LLQ) is a mechanism | |||
| <postal> | for extending the DNS protocol to support change notification, | |||
| <street>One Apple Park Way</street> | thus allowing clients to learn about changes to DNS data | |||
| <city>Cupertino</city> | without polling the server. From 2005 onwards, LLQ was | |||
| <region>CA</region> | implemented in Apple products including Mac OS X, Bonjour for | |||
| <code>95014</code> | Windows, and AirPort wireless base stations. In 2020, the LLQ | |||
| <country>United States of America</country> | protocol was superseded by the IETF Standards Track RFC 8765, | |||
| </postal> | "DNS | |||
| <phone>+1 (408) 996-1010</phone> | Push Notifications", which builds on experience gained with | |||
| <email>cheshire@apple.com</email> | the LLQ protocol to create a superior replacement. | |||
| </address> | </t> | |||
| </author> | <t> | |||
| The existing LLQ protocol deployed and used from 2005 to 2020 is | ||||
| documented here to give | ||||
| background regarding the operational experience that informed | ||||
| the development of DNS Push Notifications, and to help facilitate | ||||
| a smooth transition from LLQ to DNS Push Notifications. | ||||
| </t> | ||||
| </abstract> | ||||
| </front> | ||||
| <middle> | ||||
| <section anchor="introduction" numbered="true" toc="default"> | ||||
| <name>Introduction</name> | ||||
| <t> | ||||
| In dynamic environments, DNS-based Service Discovery <xref target="RFC6763" | ||||
| format="default"/> 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"/> 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> | ||||
| 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> | ||||
| The mechanism defined in this document is now being replaced by DNS Push | ||||
| Notifications <xref target="RFC8765" format="default"></xref> as explained | ||||
| in <xref target="trans" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| </t> | ||||
| <section anchor="trans" numbered="true" toc="default"> | ||||
| <name>Transition to DNS Push Notifications</name> | ||||
| <t> | ||||
| 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"></xref> | ||||
| service. | ||||
| </t> | ||||
| <t> | ||||
| However, some problems were discovered, as described in <xref | ||||
| target="problems" format="default"/>. | ||||
| This operational | ||||
| experience with LLQ informed the design of its IETF Standards | ||||
| Track successor, DNS Push Notifications <xref target="RFC8765" | ||||
| format="default"></xref>. | ||||
| Since no further work is being done on the LLQ protocol, this LLQ | ||||
| specification will not be updated to remedy these problems. | ||||
| </t> | ||||
| <t> | ||||
| All existing LLQ implementations are <bcp14>RECOMMENDED</bcp14> to migrate | ||||
| to using DNS Push Notifications instead. | ||||
| </t> | ||||
| <t> | ||||
| 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> | ||||
| Existing LLQ clients are <bcp14>RECOMMENDED</bcp14> to query for the | ||||
| <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> SRV record first, and | ||||
| then only if DNS Push Notifications fail, fall back to query for | ||||
| <tt>_dns&nbhy;llq._udp.<zone></tt> instead. Use of the | ||||
| <tt>_dns&nbhy;llq._udp.<zone></tt> SRV record is described in <xref | ||||
| target="address-port"/>. | ||||
| </t> | ||||
| <t> | ||||
| 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> | ||||
| New client and server implementations are <bcp14>RECOMMENDED</bcp14> to | ||||
| support only | ||||
| DNS Push Notifications. | ||||
| </t> | ||||
| <author initials='M.' surname='Krochmal' fullname='Marc Krochmal'> | </section> | |||
| <organization>Apple Inc.</organization> | </section> | |||
| <address> | <section numbered="true" toc="default"> | |||
| <postal> | <name>Conventions and Terminology Used in This Document</name> | |||
| <street>One Apple Park Way</street> | ||||
| <city>Cupertino</city> | ||||
| <region>California</region> | ||||
| <code>95014</code> | ||||
| <country>USA</country> | ||||
| </postal> | ||||
| <email>marc@apple.com</email> | ||||
| </address> | ||||
| </author> | ||||
| <date year="2019" month="August" day="22"/> | <t> | |||
| 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"/> | ||||
| <xref target="RFC8174"/> when, and only when, they appear in all | ||||
| capitals, as shown here. | ||||
| </t> | ||||
| <abstract> | </section> | |||
| <t> | <section numbered="true" toc="default"> | |||
| Apple's DNS Long-Lived Queries protocol (LLQ) is | <name>Mechanisms</name> | |||
| a protocol for extending the DNS protocol to support | <t> | |||
| change notification, thus allowing clients to learn about changes | DNS Long-Lived Queries (LLQ) are implemented using the standard | |||
| to | DNS message format <xref target="RFC1035" format="default"/> in | |||
| DNS data without polling the server. | conjunction with an EDNS(0) OPT | |||
| From 2005 onwards, LLQ was implemented in Apple products | pseudo&nbhy;RR <xref target="RFC6891" format="default"/> with a new | |||
| including Mac OS X, Bonjour for Windows, and AirPort wireless base | OPTION&nbhy;CODE | |||
| stations. In 2019, the LLQ protocol | and OPTION&nbhy;DATA format specified here. Encoding the LLQ request in | |||
| was superseded by the IETF Standards Track RFC xxxx | an OPT pseudo&nbhy;RR | |||
| [[RFC Editor note: Please replace xxxx with RFC number]] | allows for implementation of LLQ with minimal modification to a name | |||
| "DNS Push Notifications", | server's front end. If a DNS query containing an LLQ option is sent to a | |||
| which builds on experience gained with the LLQ protocol to create | server that does not implement LLQ, a server that complies with the | |||
| a superior replacement. | EDNS(0) specification <xref target="RFC6891" format="default"></xref> will | |||
| </t> | silently ignore the unrecognized option and answer the request as a normal | |||
| <t> | DNS query without establishing any long-lived state and without | |||
| The existing LLQ protocol deployed and used from 2005 to 2019 is documented h | returning an LLQ option in its response. If a DNS query containing an LLQ | |||
| ere to give | option is sent to a server that does not implement EDNS(0) at all, the | |||
| background regarding the operational experience that informed | server may silently ignore the EDNS(0) OPT pseudo&nbhy;RR or it may | |||
| the development of DNS Push Notifications, and to help facilitate | return a nonzero RCODE. However, in practice, this issue is mostly | |||
| a smooth transition from LLQ to DNS Push Notifications. | theoretical, since having a zone's _dns&nbhy;llq._udp.<zone> SRV | |||
| </t> | record target a host that does not implement LLQ is a configuration error. | |||
| </abstract> | </t> | |||
| <t> | ||||
| 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> | ||||
| </front> | <section numbered="true" toc="default"> | |||
| <name>Assigned Numbers</name> | ||||
| <t> | ||||
| This section describes constants used in this document. | ||||
| </t> | ||||
| <middle> | <ul empty="true"> | |||
| <?rfc needLines="40" ?> | ||||
| <section anchor="introduction" title="Introduction"> | ||||
| <t> | ||||
| In dynamic environments, DNS Service Discovery <xref target="RFC6763"/> benef | ||||
| its | ||||
| 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 learn when a new instance of a service appears, or when | ||||
| an existing service disappears from the network, and allows clients | ||||
| to monitor changes to a service. Multicast DNS <xref target="RFC6762"/> suppo | ||||
| rts this | ||||
| natively. When a host on the network publishes or deletes DNS | ||||
| records, these changes are multicast to other hosts on the network. | ||||
| These hosts deliver the change notifications to interested clients (applicati | ||||
| ons | ||||
| running on the 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> | <li> | |||
| This document defines an Apple extension to DNS that enables a client to | <t>EDNS(0) OPTION&nbhy;CODE (recorded with IANA):</t> | |||
| issue long-lived queries that allow a 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> | <ul empty="true"> | |||
| The mechanism defined in this document is now being replaced by | <li> | |||
| <xref target="Push">DNS Push Notifications</xref> as explained below | <dl indent="18"> | |||
| in <xref target="trans"/>. | <dt>LLQ | |||
| </t> | </dt> | |||
| <?rfc needLines="40" ?> | <dd>1 | |||
| <t> | </dd> | |||
| </t> | </dl> | |||
| <section anchor="trans" title="Transition to DNS Push Notificatio | </li> | |||
| ns"> | </ul> | |||
| <t> | </li> | |||
| The LLQ protocol enjoyed over a decade of useful operation, | ||||
| enabling timely live updates for the service discovery user interface in | ||||
| Apple's <xref target="RFC6281">Back to My Mac</xref> service. | ||||
| </t> | ||||
| <t> | <li> | |||
| However, some problems were discovered, as described in <xref target="problem | LLQ&nbhy;PORT 5352 (recorded with IANA) | |||
| s"/>. | </li> | |||
| This operational | ||||
| experience with LLQ informed the design of its IETF Standards | ||||
| Track successor, <xref target="Push">DNS Push Notifications</xref>. | ||||
| Since no further work is being done on the LLQ protocol, this LLQ | ||||
| specification will not be updated to remedy these problems. | ||||
| </t> | ||||
| <t> | <li><t>LLQ Opcodes (specific to this LLQ EDNS(0) Option):</t> | |||
| All existing LLQ | ||||
| implementations are RECOMMENDED to migrate to using DNS Push Notifications in | ||||
| stead. | ||||
| </t> | ||||
| <t> | <ul empty="true"> | |||
| For existing LLQ servers, they are RECOMMENDED to implement and support | <li> | |||
| DNS Push Notifications, so that clients can begin migrating to the | <dl indent="18" spacing="compact"> | |||
| newer protocol. | <dt>LLQ&nbhy;SETUP | |||
| </t> | </dt> | |||
| <dd>1 | ||||
| </dd> | ||||
| <t> | <dt>LLQ&nbhy;REFRESH | |||
| For existing LLQ clients, they are RECOMMENDED to query for the | </dt> | |||
| <spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx> | <dd>2 | |||
| SRV record first, and only if DNS Push fails, then fall back to query for | </dd> | |||
| <spanx style="verb">_dns&nbhy;llq._udp.<zone></spanx> instead. | ||||
| </t> | ||||
| <t> | <dt>LLQ&nbhy;EVENT | |||
| This will cause clients to prefer the newer protocol when possible. | </dt> | |||
| It is RECOMMENDED that clients always attempt | <dd>3 | |||
| DNS Push Notifications first for every new request, and | </dd> | |||
| only if that fails, then back to using LLQ. | </dl> | |||
| Clients SHOULD NOT record that a given server only speaks LLQ and | </li> | |||
| subsequently default to LLQ for that server, since server software | </ul> | |||
| gets updated, and even a server that speaks only LLQ today, | </li> | |||
| may be updated to support DNS Push Notifications tomorrow. | ||||
| </t> | ||||
| <t> | <li> | |||
| New client and server implementations are RECOMMENDED to support only | <t>LLQ Error Codes (specific to this LLQ EDNS(0) Option):</t> | |||
| DNS Push Notifications. | ||||
| </t> | ||||
| </section> | <ul empty="true"> | |||
| </section> | <li> | |||
| <dl indent="18" spacing="compact"> | ||||
| <dt> | ||||
| NO-ERROR | ||||
| </dt> | ||||
| <dd>0 | ||||
| </dd> | ||||
| <section title="Conventions and Terminology Used in this Document"> | <dt> | |||
| <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL | SERV-FULL | |||
| NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", | </dt> | |||
| "MAY", and "OPTIONAL" in this document are to be interpreted as | <dd>1 | |||
| described in BCP 14 <xref target="RFC2119"/> <xref target="R | </dd> | |||
| FC8174"/> | ||||
| when, and only when, they appear in all capitals, as shown here.< | ||||
| /t> | ||||
| <?rfc needLines="40" ?> | ||||
| </section> | ||||
| <section title="Mechanisms"> | <dt> | |||
| <t> | STATIC | |||
| DNS Long-Lived Queries (DNS&nbhy;LLQ) is implemented using the standard | </dt> | |||
| DNS message format <xref target="RFC1035"/> in conjunction with an EDNS(0) OP | <dd>2 | |||
| T | </dd> | |||
| pseudo&nbhy;RR <xref target="RFC6891"/> with a new OPT and RDATA format speci | ||||
| fied here. | ||||
| Encoding the LLQ request in an OPT 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 <xref target="RFC6891">EDNS(0) specification</xref> 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&nbhy;RR, | ||||
| or it may return a nonzero RCODE. | ||||
| However, in practice this issue is mostly theoretical, | ||||
| since having a zone's _dns&nbhy;llq._udp.<zone> SRV record | ||||
| target a host that does not implement LLQ is a configuration error. | ||||
| </t> | ||||
| <t> | ||||
| Note that this protocol is designed for data set sizes of a few dozen resourc | ||||
| e records at most, and | ||||
| change rates no more than one every ten seconds on average. Data sets in resp | ||||
| onse to queries that | ||||
| frequently exceed a single packet, or that experience a rapid change | ||||
| rate, may have undesirable performance implications. | ||||
| </t> | ||||
| <?rfc needLines="20" ?> | ||||
| <t> | ||||
| </t> | ||||
| <section title="Assigned Numbers"> | ||||
| <t> | ||||
| This section describes constants uses in this document. | ||||
| </t> | ||||
| <figure><artwork> | ||||
| EDNS(0) Option Code (recorded with IANA): | ||||
| LLQ 1 | ||||
| LLQ-PORT 5352 (recorded with IANA) | <dt> | |||
| FORMAT-ERR | ||||
| </dt> | ||||
| <dd>3 | ||||
| </dd> | ||||
| LLQ Error Codes (specific to this LLQ EDNS(0) Option): | <dt> | |||
| NO-ERROR 0 | NO-SUCH-LLQ | |||
| SERV-FULL 1 | </dt> | |||
| STATIC 2 | <dd>4 | |||
| FORMAT-ERR 3 | </dd> | |||
| NO-SUCH-LLQ 4 | ||||
| BAD-VERS 5 | ||||
| UNKNOWN-ERR 6 | ||||
| LLQ Opcodes (specific to this LLQ EDNS(0) Option): | <dt> | |||
| LLQ-SETUP 1 | BAD-VERS | |||
| LLQ-REFRESH 2 | </dt> | |||
| LLQ-EVENT 3 | <dd>5 | |||
| </artwork></figure> | </dd> | |||
| <?rfc needLines="40" ?> | ||||
| </section> | ||||
| <section title="Opt-RR Format"> | <dt> | |||
| <t> | UNKNOWN-ERR | |||
| As required by the <xref target="RFC6891">EDNS(0) specification</xref>, | </dt> | |||
| all OPT&nbhy;RRs used in LLQs are formatted as follows: | <dd>6 | |||
| </t> | </dd> | |||
| </dl> | ||||
| </li> | ||||
| </ul> | ||||
| </li> | ||||
| </ul> | ||||
| <figure><artwork> | </section> | |||
| Field Name Field Type Description | ||||
| NAME domain name empty (root domain) | ||||
| TYPE u_int16_t OPT | ||||
| CLASS u_int16_t 0* | ||||
| TTL u_int32_t 0 | ||||
| RDLEN u_int16_t describes RDATA | ||||
| RDATA octet stream (see below) | ||||
| </artwork></figure> | ||||
| <t> | <section numbered="true" toc="default"> | |||
| * The CLASS field indicates, as per the <xref target="RFC6891">EDNS(0) specif | <name>Opt-RR Format</name> | |||
| ication</xref>, the sender's UDP | <t> | |||
| payload size. However, clients and servers need not be required to | As required by the EDNS(0) specification <xref target="RFC6891" | |||
| determine their reassembly buffer size, path MTU, etc. to support | format="default"></xref>, | |||
| LLQ. Thus, the sender of an LLQ Request or Response MAY set the CLASS | all OPT pseudo&nbhy;RRs used in LLQs are formatted as follows: | |||
| field to 0. The recipient MUST ignore the class field if it is set | </t> | |||
| to 0. | ||||
| </t> | ||||
| <?rfc needLines="20" ?> | <table anchor="OPT-RRs"> | |||
| <t> | <name>OPT-RRs Used in LLQs</name> | |||
| RDATA Format: | <thead> | |||
| </t> | <tr> | |||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Description</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>NAME</td> | ||||
| <td>domain name</td> | ||||
| <td>MUST be 0 (root domain)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>TYPE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>OPT (41)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>CLASS</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>0*</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>TTL</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>0</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>RDLEN</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>length of all RDATA</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>RDATA</td> | ||||
| <td>octet stream</td> | ||||
| <td>(see below)</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <figure><artwork> | <t> | |||
| Field Name Field Type Description | * The CLASS field indicates, as per the EDNS(0) specification <xref | |||
| OPTION-CODE u_int16_t LLQ | target="RFC6891" format="default"></xref>, the sender's UDP payload | |||
| OPTION-LENGTH u_int16_t Length of following fields, as | size. However, clients and servers are not required to determine their | |||
| appropriate | reassembly buffer size, path MTU, etc., to support LLQ. Thus, the sender | |||
| VERSION u_int16_t Version of LLQ protocol implemented | of | |||
| LLQ-OPCODE u_int16_t Identifies LLQ operation | an LLQ Request or Response <bcp14>MAY</bcp14> set the CLASS field to 0. | |||
| ERROR-CODE u_int16_t Identifies LLQ errors | The recipient <bcp14>MUST</bcp14> ignore the class field if it is set to | |||
| LLQ-ID u_int64_t Identifier for an LLQ | 0. | |||
| LEASE-LIFE u_int32_t Requested or granted life of LLQ, in | </t> | |||
| seconds | <t> | |||
| </artwork></figure> | The RDATA of an EDNS(0) OPT pseudo&nbhy;RR consists of zero or more | |||
| options | ||||
| of the form { OPTION&nbhy;CODE, OPTION&nbhy;LENGTH, OPTION&nbhy;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&nbhy;RR may contain zero or more LLQ OPTIONS in | ||||
| addition | ||||
| to zero or more other EDNS(0) options. | ||||
| </t> | ||||
| <t> | <table anchor="LLQ-OPT-FORMAT"> | |||
| This data format, consisting of (OPTION&nbhy;CODE, OPTION&nbhy;LENGTH, | <name>LLQ OPTION</name> | |||
| LLQ&nbhy;Metadata) tuples, may be repeated an arbitrary number of times in | <thead> | |||
| the RDATA section, with the RDLEN field set accordingly. | <tr> | |||
| </t> | <th>Field Name</th> | |||
| <th>Field Type</th> | ||||
| <th>Description</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>OPTION-CODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>OPTION-LENGTH</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Length of following fields (18)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-VERSION</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Version of LLQ protocol implemented</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-OPCODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Identifies LLQ operation</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ERROR</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Identifies LLQ errors</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ID</td> | ||||
| <td>u_int64_t</td> | ||||
| <td>Identifier for an LLQ</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-LEASE</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>Requested or granted life of LLQ, in seconds</td> | ||||
| </tr> | ||||
| <t> | </tbody> | |||
| The size and meaning of the | </table> | |||
| OPTION&nbhy;CODE and OPTION&nbhy;LENGTH fields are as described in the | ||||
| <xref target="RFC6891">EDNS(0) specification</xref>. | ||||
| The remainder of the fields comprise the OPTION-DATA of the | ||||
| EDNS(0) option. | ||||
| Since for LLQ the OPTION-DATA is a fixed size, | ||||
| in LLQ EDNS(0) options the OPTION&nbhy;LENGTH field always has the value 18. | ||||
| </t> | ||||
| <?rfc needLines="40" ?> | ||||
| </section> | ||||
| </section> | ||||
| <section title="LLQ Address and Port Identification"> | <t> | |||
| <t> | The size and meaning of the OPTION&nbhy;CODE and OPTION&nbhy;LENGTH fields | |||
| are as described in the EDNS(0) specification <xref target="RFC6891" | ||||
| format="default"></xref>. The remainder of the fields comprise the | ||||
| OPTION&nbhy;DATA of the EDNS(0) LLQ OPTION. Since for LLQ the | ||||
| OPTION&nbhy;DATA is a | ||||
| fixed size, in EDNS(0) LLQ OPTIONS the OPTION&nbhy;LENGTH field always has | ||||
| the value 18. | ||||
| </t> | ||||
| <t> | ||||
| 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="default" anchor="address-port"> | ||||
| <name>LLQ Address and Port Identification</name> | ||||
| <t> | ||||
| 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> | |||
| 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> | <t> | |||
| The client determines the server responsible for a given LLQ much as | The client determines the server responsible for a given LLQ much as a | |||
| a client determines to which server to send a dynamic update. The | client determines to which server to send a DNS dynamic update. The client | |||
| client begins by sending a standard DNS query for the name of the | begins by sending a standard DNS query for the name of the LLQ, with type | |||
| LLQ, with type SOA. The server MUST answer with that SOA record in | SOA. If the record exists, then the server <bcp14>MUST</bcp14> answer with | |||
| the Answer section, if the record exists. The server SHOULD include | that SOA record in the Answer section. If a record of type SOA with the | |||
| an SOA record for that name's zone in the Authority section, if the | LLQ name does not exist, then the server <bcp14>SHOULD</bcp14> include an | |||
| LLQ name (type SOA) does not exist. For example, a query for | SOA record for that name's zone in the Authority section. For example, a | |||
| "_ftp._tcp.example.com." may return an SOA record named "example.com." in the | query for "_ftp._tcp.example.com" with type SOA, when there is no SOA | |||
| Authority section if there is no SOA record named | record with that name, might return an SOA record named "example.com" in | |||
| "_ftp._tcp.example.com." If, in this case, the server does not include | the Authority section. If the named SOA record does not exist and the | |||
| the SOA record in the Authority section, the client strips the | server fails to include the enclosing SOA record in the Authority section, | |||
| leading label from the name and tries again, repeating until an | the client strips the leading label from the name and tries again, | |||
| answer is received. | repeating until an answer is received. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| This iterative zone apex discovery algorithm is described in more detail | This iterative zone apex discovery algorithm is described in more detail in | |||
| in the <xref target="Push">DNS Push Notifications specification</xref>. | the DNS Push Notifications specification <xref target="RFC8765" | |||
| </t> | format="default"></xref>. | |||
| <t> | </t> | |||
| Upon learning the zone (SOA), the client then constructs and sends an | <t> | |||
| SRV query for the name _dns&nbhy;llq._udp.<zone>, | Upon learning the zone apex (SOA), the client then constructs and sends an | |||
| e.g., _dns&nbhy;llq._udp.example.com. | SRV query for the name, "_dns&nbhy;llq._udp.<zone>", | |||
| </t> | e.g., "_dns&nbhy;llq._udp.example.com". | |||
| <t> | </t> | |||
| A server implementing LLQ MUST answer with an SRV record <xref target="RFC278 | <t> | |||
| 2"/> | An authoritative server for a zone implementing LLQ <bcp14>MUST</bcp14> | |||
| answer with an SRV record <xref target="RFC2782" format="default"/> | ||||
| for this name. The SRV RDATA is as follows: | for this name. The SRV RDATA is as follows: | |||
| </t> | </t> | |||
| <figure><artwork> | ||||
| PRIORITY typically 0 | <table anchor="SRV-RDATA"> | |||
| WEIGHT typically 0 | <name>SRV RDATA</name> | |||
| PORT typically 53 or 5352 | <tbody> | |||
| TARGET name of server providing LLQs for the requested zone | <tr> | |||
| </artwork></figure> | <td>PRIORITY</td> | |||
| <t> | <td>typically 0</td> | |||
| The server SHOULD include its address record(s) in the Additional | ||||
| </tr> | ||||
| <tr> | ||||
| <td>WEIGHT</td> | ||||
| <td>typically 0</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>PORT</td> | ||||
| <td>typically 53 or 5352</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>TARGET</td> | ||||
| <td>name of server providing LLQs for the requested zone</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t> | ||||
| 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> | |||
| 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> | |||
| 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> | |||
| 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"/>, "<xref target="llq-setup" | |||
| </t> | format="title"/>". | |||
| <?rfc needLines="20" ?> | </t> | |||
| <t> | ||||
| </t> | <t> | |||
| <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="default" anchor="llq-setup"> | |||
| <name>LLQ Setup</name> | ||||
| <section title="LLQ Setup"> | <t> | |||
| <t> | 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"/>, "<xref | |||
| </t> | target="security-considerations" format="title"/>"). | |||
| <section title="Setup Message Retransmission"> | </t> | |||
| <t> | <section numbered="true" toc="default" | |||
| LLQ Setup Requests and Responses sent by the client SHOULD be | anchor="setup-message-retransmission"> | |||
| retransmitted if no acknowledgments are received. The client SHOULD | <name>Setup Message Retransmission</name> | |||
| re&nbhy;try up to two more times (for a total of 3 attempts) before | <t> | |||
| considering the server down or unreachable. The client MUST wait at | 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> | |||
| 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&nbhy;LEASE as described in <xref | |||
| </t> | target="ack-answers"/>, "<xref | |||
| target="ack-answers" format="title"/>"). | ||||
| <t> | </t> | |||
| Servers MUST NOT garbage collect LLQs that fail to complete the four- | <t> | |||
| way handshake until the initially granted LEASE&nbhy;LIFE has elapsed. | Servers <bcp14>MUST NOT</bcp14> garbage collect LLQs that fail to complete | |||
| </t> | the four-way handshake until the initially granted LLQ&nbhy;LEASE has | |||
| </section> | elapsed. | |||
| <section title="LLQ Setup Four-Way Handshake"> | </t> | |||
| <figure><artwork> | </section> | |||
| The four phases of the handshake include: | ||||
| 1) Setup Request client to server, identifies LLQ(s) requested | ||||
| 2) Setup Challenge server to client, provides error(s) for | <section numbered="true" toc="default" anchor="four-way-handshake"> | |||
| requested LLQs, and unique identifiers for | <name>LLQ Setup Four-Way Handshake</name> | |||
| the successful requests | <t>The four phases of the handshake include: | |||
| </t> | ||||
| 3) Challenge Response client to server, echoes identifier(s), | <ul empty="true"> | |||
| demonstrating client's reachability and | <li> | |||
| willingness to participate | <dl indent="24"> | |||
| <dt>1) Setup Request | ||||
| </dt> | ||||
| <dd>client to server, identifies LLQ(s) requested | ||||
| </dd> | ||||
| <dt>2) Setup Challenge | ||||
| </dt> | ||||
| <dd>server to client, provides | ||||
| unique identifiers for successful requested LLQs, and | ||||
| error(s) for unsuccessful requested LLQs. | ||||
| </dd> | ||||
| <dt>3) Challenge Response | ||||
| </dt> | ||||
| <dd>client to server, echoes identifier(s), demonstrating client's | ||||
| reachability and willingness to participate | ||||
| </dd> | ||||
| <dt>4) ACK + Answers | ||||
| </dt> | ||||
| <dd>server to client, confirms setup and provides initial answers | ||||
| </dd> | ||||
| </dl> | ||||
| </li> | ||||
| </ul> | ||||
| 4) ACK + Answers server to client, confirms setup and | <section numbered="true" toc="default" anchor="setup-request"> | |||
| provides initial answers | <name>Setup Request</name> | |||
| </artwork></figure> | <t> | |||
| <section title="Setup Request"> | A request for an LLQ is formatted like a standard DNS query but with | |||
| <t> | an OPT pseudo&nbhy;RR containing LLQ metadata in its Additional | |||
| A request for an LLQ is formatted like a standard DNS query, but with | section. LLQ | |||
| an OPT RR containing LLQ metadata in its Additional section. LLQ | Setup Requests are identified by the LLQ&nbhy;SETUP opcode and a | |||
| setup requests are identified by the LLQ&nbhy;SETUP opcode and a | ||||
| zero&nbhy;valued LLQ&nbhy;ID. | zero&nbhy;valued LLQ&nbhy;ID. | |||
| </t> | </t> | |||
| <t> | ||||
| <t> | The request <bcp14>MAY</bcp14> contain multiple questions to set up | |||
| The request MAY contain multiple questions to set up multiple LLQs. | multiple LLQs. | |||
| A request consisting of multiple questions MUST contain multiple LLQ | A Setup Request consisting of multiple questions <bcp14>MUST</bcp14> | |||
| metadata sections, one per question, with metadata sections in the | 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&nbhy;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> | |||
| 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> | |||
| The query <bcp14>MUST NOT</bcp14> be for record type ANY (255), class ANY | ||||
| (255), or | ||||
| class NONE (0). | class NONE (0). | |||
| </t> | </t> | |||
| <t> | ||||
| Setup Request OPT&nbhy;RR LLQ Metadata Format: | ||||
| </t> | ||||
| <figure><artwork> | ||||
| Field Name Field Type Description | ||||
| OPTION-CODE u_int16_t LLQ (1) | ||||
| OPTION-LENGTH u_int16_t Length of following fields (18) | ||||
| VERSION u_int16_t Version of LLQ protocol implemented | ||||
| by requester (1) | ||||
| LLQ-OPCODE u_int16_t LLQ-SETUP (1) | ||||
| ERROR-CODE u_int16_t NOERROR (0) | ||||
| LLQ-ID u_int64_t 0 | ||||
| LEASE-LIFE u_int32_t Desired life of LLQ request | ||||
| These fields MUST be repeated once for each additional query in the | <table anchor="OPT-RR-LLQ"> | |||
| <name>Setup Request LLQ OPTION Format</name> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Description</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>OPTION-CODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>OPTION-LENGTH</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Length of following fields (18)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-VERSION</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Version of LLQ protocol implemented by requester (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-OPCODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ-SETUP (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ERROR</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>NO-ERROR (0)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ID</td> | ||||
| <td>u_int64_t</td> | ||||
| <td>0</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-LEASE</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>Desired life of LLQ request</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t>The Setup Request LLQ OPTION <bcp14>MUST</bcp14> be repeated once for each | ||||
| additional query in the | ||||
| Question section. | Question section. | |||
| </artwork></figure> | </t> | |||
| <?rfc needLines="40" ?> | ||||
| </section> | ||||
| <section title="Setup Challenge"> | </section> | |||
| <t> | <section numbered="true" toc="default" anchor="setup-challenge"> | |||
| <name>Setup Challenge</name> | ||||
| <t> | ||||
| 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&nbhy;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"> | |||
| Setup Challenge OPT&nbhy;RR RDATA Format: | <name>Setup Challenge LLQ OPTION Format</name> | |||
| </t> | <thead> | |||
| <tr> | ||||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Description</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>OPTION-CODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>OPTION-LENGTH</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Length of following fields (18)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-VERSION</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Version of LLQ protocol implemented in server (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-OPCODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ-SETUP (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ERROR</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>[As Appropriate]</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ID</td> | ||||
| <td>u_int64_t</td> | ||||
| <td>[As Appropriate]</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-LEASE</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>[As Appropriate]</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <figure><artwork> | <t> | |||
| Field Name Field Type Description | The Setup Challenge LLQ OPTION <bcp14>MUST</bcp14> be repeated once for | |||
| OPTION-CODE u_int16_t LLQ (1) | each query in the Questions | |||
| OPTION-LENGTH u_int16_t Length of following fields (18) | section of the Setup Challenge. | |||
| VERSION u_int16_t Version of LLQ protocol implemented | Further details for LLQ&nbhy;ERROR, LLQ&nbhy;ID and LLQ&nbhy;LEASE are | |||
| in server (1) | given below. | |||
| LLQ-OPCODE u_int16_t LLQ-SETUP (1) | </t> | |||
| ERROR-CODE u_int16_t [As Appropriate] | ||||
| LLQ-ID u_int64_t [As Appropriate] | ||||
| LEASE-LIFE u_int32_t [As Appropriate] | ||||
| </artwork></figure> | ||||
| <t> | <t> | |||
| These fields MUST be repeated once for each query in the Questions | LLQ&nbhy;ERROR: | |||
| section of the Setup Request. | </t> | |||
| </t> | ||||
| <?rfc needLines="40" ?> | <ul empty="true"> | |||
| <t> | <li> | |||
| LLQ Metadata field descriptions: | <dl indent="18"> | |||
| </t> | <dt>NO-ERROR: | |||
| </dt> | ||||
| <dd>The LLQ Setup Request was successful. | ||||
| </dd> | ||||
| <dt>FORMAT-ERR: | ||||
| </dt> | ||||
| <dd>The LLQ was improperly formatted. Note that if the rest of the DNS | ||||
| message is properly formatted, the DNS header error code <bcp14>MUST | ||||
| NOT</bcp14> include a format error code, since to do so would cause ambiguity | ||||
| between the case where a client sends a valid LLQ Setup Request to a server | ||||
| that does not understand LLQ and the case where a client sends a malformed | ||||
| LLQ Setup Request to a server that does understand LLQ. | ||||
| </dd> | ||||
| <figure><artwork> | <dt>SERV-FULL: | |||
| ERROR-CODE: Possible values include: | </dt> | |||
| <dd>The server cannot grant the LLQ request because it is overloaded or the | ||||
| request exceeds the server's rate limit (see <xref | ||||
| target="security-considerations"/>, <xref target="security-considerations" | ||||
| format="title"/>). Upon | ||||
| returning this error, the server <bcp14>MUST</bcp14> include in the LLQ-LEASE | ||||
| field a time interval, in seconds, after which the client may retry the LLQ | ||||
| Setup. | ||||
| </dd> | ||||
| NO-ERROR: The LLQ Setup Request was successful. | <dt>STATIC: | |||
| </dt> | ||||
| <dd>The data for this name and type is 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> | ||||
| FORMAT-ERR: The LLQ was improperly formatted. Note that if the | <dt>BAD-VERS: | |||
| rest of the DNS message is properly formatted, the | </dt> | |||
| DNS header error code MUST NOT include a format error | <dd>The protocol version specified in the client's Setup Request is not | |||
| code, as this would cause confusion between a server | supported by | |||
| that does not understand the LLQ format, and a client | the server. | |||
| that sends malformed LLQs. | </dd> | |||
| SERV-FULL: The server cannot grant the LLQ request because it is | <dt>UNKNOWN-ERR: | |||
| overloaded, or the request exceeds the server's rate | </dt> | |||
| limit (see Section 8 "Security Considerations"). | <dd>The LLQ was not granted for some other reason not covered by the preceding | |||
| Upon returning this error, the server MUST include | error code values. | |||
| in the LEASE-LIFE field a time interval, in seconds, | </dd> | |||
| after which the client may re-try the LLQ Setup. | ||||
| STATIC: The data for this name and type is not expected to | </dl> | |||
| change frequently, and the server therefore does not | ||||
| support the requested LLQ. The client MUST NOT poll | ||||
| for this name and type, nor should it re-try the LLQ | ||||
| Setup, and should instead honor the normal resource | ||||
| record TTLs returned. | ||||
| BAD-VERS: The protocol version specified in the client's | </li> | |||
| request is not supported by the server. | </ul> | |||
| UNKNOWN-ERR: The LLQ was not granted for an unknown reason | <dl indent="18"> | |||
| </artwork></figure> | <dt>LLQ&nbhy;ID: | |||
| </dt> | ||||
| <dd>On success, a random number generated by the server that is unique on the | ||||
| server for the | ||||
| requested name/type/class. The LLQ&nbhy;ID <bcp14>SHOULD</bcp14> be an | ||||
| unpredictable random number. A possible method of allocating LLQ&nbhy;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> | ||||
| <?rfc needLines="40" ?> | <dt> | |||
| <t> | </dt> | |||
| LLQ&nbhy;ID: On success, a random number generated by the server that is | <dd> | |||
| unique for the requested name/type/class. The LLQ&nbhy;ID SHOULD be an | On error, the LLQ&nbhy;ID is set to 0. | |||
| unpredictable random number. A possible method of allocating LLQ&nbhy;IDs | </dd> | |||
| 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. | ||||
| </t> | ||||
| <t> | <dt>LLQ&nbhy;LEASE: | |||
| On error, the LLQ&nbhy;ID is set to 0. | </dt> | |||
| </t> | ||||
| <t> | <dd>On success, the actual life of the LLQ, in seconds. Value may be greater | |||
| LEASE&nbhy;LIFE: On success, the actual life of the LLQ, in seconds. | than, less than, or equal to the value requested by the client, as per the | |||
| Value may be greater than, less than, or equal to the value requested | server administrator's policy. The server <bcp14>MAY</bcp14> discard the LLQ | |||
| by the client, as per the server administrator's policy. The server | after this LLQ&nbhy;LEASE expires unless the LLQ has been renewed by the | |||
| MAY discard the LLQ after this LEASE&nbhy;LIFE expires unless the LLQ has | client (see <xref target="LLQ-LLE"/>, "<xref target="LLQ-LLE" | |||
| been renewed by the client (see Section 7 "LLQ Lease-Life Expiration"). | format="title"/>"). The server <bcp14>MUST NOT</bcp14> generate events (see | |||
| The server MUST NOT generate events (see Section 6 "Event Responses") | <xref target="event-responses"/>, "<xref target="event-responses" | |||
| for expired LLQs. | format="title"/>") for expired LLQs. | |||
| </t> | </dd> | |||
| <t> | <dt></dt> | |||
| On SERV&nbhy;FULL error, LEASE&nbhy;LIFE MUST be set to a time interval, in | <dd> | |||
| seconds, after which the client may re&nbhy;try the LLQ Setup. | On SERV&nbhy;FULL error, LLQ&nbhy;LEASE <bcp14>MUST</bcp14> be set to a time | |||
| </t> | interval, in seconds, after which the client may retry the LLQ Setup. | |||
| </dd> | ||||
| <dt> | ||||
| </dt> | ||||
| <dd> | ||||
| On other errors, the LLQ&nbhy;LEASE <bcp14>MUST</bcp14> be set to 0. | ||||
| </dd> | ||||
| <t> | </dl> | |||
| On other errors, the LEASE&nbhy;LIFE MUST be set to 0. | ||||
| </t> | ||||
| <?rfc needLines="40" ?> | ||||
| </section> | ||||
| <section title="Challenge Response"> | </section> | |||
| <t> | <section numbered="true" toc="default" anchor="challenge-response"> | |||
| <name>Challenge Response</name> | ||||
| <t> | ||||
| 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"/>) retransmitting the Setup Request as | |||
| receiving a successful Challenge, the client SHOULD send a Challenge | necessary | |||
| (<xref target="setup-message-retransmission"/>). 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&nbhy;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&nbhy;ID and the granted LLQ&nbhy;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> | |||
| 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> | ||||
| <t> | If a Setup Request fails with a SERV&nbhy;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"/>) after the time | |||
| LEASE&nbhy;LIFE field. | indicated in the | |||
| </t> | LLQ&nbhy;LEASE field. | |||
| </t> | ||||
| <t> | <t> | |||
| 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&nbhy;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"/>, | ||||
| "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="default" anchor="ack-answers"> | |||
| <name>ACK + Answers</name> | ||||
| <section title="ACK + Answers"> | <t> | |||
| <t> | ||||
| 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> | ||||
| <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&nbhy;ID and LLQ&nbhy;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> | |||
| <t> | ||||
| Successful ACK + Answers OPT&nbhy;RR RDATA Format: | ||||
| </t> | ||||
| <figure><artwork> | <table anchor="SUCCESSFUL-ACK-ANSWERS-OPT-RR-RDATA"> | |||
| Field Name Field Type Description | <name>Successful ACK + Answers LLQ OPTION Format</name> | |||
| OPTION-CODE u_int16_t LLQ | <thead> | |||
| OPTION-LENGTH u_int16_t Length of following fields, as | <tr> | |||
| appropriate | <th>Field Name</th> | |||
| VERSION u_int16_t Version of LLQ protocol implemented | <th>Field Type</th> | |||
| in server | <th>Description</th> | |||
| LLQ-OPCODE u_int16_t LLQ-SETUP (1) | </tr> | |||
| ERROR-CODE u_int16_t NO-ERROR | </thead> | |||
| LLQ-ID u_int64_t Originally granted ID, echoed in | <tbody> | |||
| client's Response | <tr> | |||
| LEASE-LIFE u_int32_t Remaining life of LLQ, in seconds | <td>OPTION-CODE</td> | |||
| </artwork></figure> | <td>u_int16_t</td> | |||
| <td>LLQ (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>OPTION-LENGTH</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Length of following fields (18)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-VERSION</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Version of LLQ protocol implemented in server (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-OPCODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ-SETUP (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ERROR</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>NO-ERROR (0)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ID</td> | ||||
| <td>u_int64_t</td> | ||||
| <td>Originally granted ID, echoed in client's Response</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-LEASE</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>Remaining life of LLQ, in seconds</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| <t> | <t> | |||
| 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&nbhy;LEASE by | |||
| the time | ||||
| elapsed since the Setup Challenge was initially issued. | elapsed since the Setup Challenge was initially issued. | |||
| </t> | </t> | |||
| <t> | ||||
| <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&nbhy;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&nbhy;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 | |||
| </t> | target="event-responses"/>, "<xref | |||
| </section> | target="event-responses" format="title"/>"). | |||
| </section> | </t> | |||
| <section title="Resource Record TTLs"> | </section> | |||
| <t> | </section> | |||
| <section numbered="true" toc="default" anchor="resource-record-ttls"> | ||||
| <name>Resource Record TTLs</name> | ||||
| <t> | ||||
| 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"/>, "<xref | |||
| The client SHOULD NOT cache answers after the LLQs LEASE&nbhy;LIFE expires | target="event-responses" format="title"/>") | |||
| without being refreshed (see Section 7 "LLQ Lease-Life Expiration"). | indicating that the answer to the LLQ has changed. The client | |||
| If an LLQ request fails, the client SHOULD NOT cache answers for a | <bcp14>SHOULD NOT</bcp14> cache answers after the LLQs LLQ&nbhy;LEASE | |||
| period longer than the client's polling interval. | expires without being refreshed (see <xref target="LLQ-LLE"/>, "LLQ | |||
| </t> | Lease-Life Expiration"). If an LLQ request fails, the client <bcp14>SHOULD | |||
| NOT</bcp14> cache answers for a period longer than the client's polling | ||||
| <t> | interval. | |||
| </t> | ||||
| <t> | ||||
| 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> | ||||
| <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="default" anchor="event-responses"> | |||
| <name>Event Responses</name> | ||||
| <section title="Event Responses"> | <t> | |||
| <t> | ||||
| 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&nbhy;RR in the Additional section. This OPT pseudo&nbhy;RR | |||
| RDATA, an entry for each LLQ being answered in the message. Entries | contains, in its | |||
| RDATA, an LLQ OPTION for each LLQ being answered in the message. Each LLQ | ||||
| OPTION | ||||
| must include the LLQ&nbhy;ID. This reduces the potential for spoof events | must include the LLQ&nbhy;ID. This reduces the potential for spoof events | |||
| being sent to a client. | being sent to a client. | |||
| </t> | </t> | |||
| <t> | <table anchor="EVENT-RESPONSE-OPT-RR-RDATA"> | |||
| Event Response OPT&nbhy;RR RDATA Format: | <name>Event Response LLQ OPTION Format</name> | |||
| </t> | <thead> | |||
| <tr> | ||||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Description</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>OPTION-CODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>OPTION-LENGTH</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Length of following fields (18)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-VERSION</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>Version of LLQ protocol implemented in server (1)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-OPCODE</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>LLQ-EVENT (3)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ERROR</td> | ||||
| <td>u_int16_t</td> | ||||
| <td>NO-ERROR (0)</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-ID</td> | ||||
| <td>u_int64_t</td> | ||||
| <td>[As Appropriate]</td> | ||||
| </tr> | ||||
| <tr> | ||||
| <td>LLQ-LEASE</td> | ||||
| <td>u_int32_t</td> | ||||
| <td>0</td> | ||||
| </tr> | ||||
| <figure><artwork> | </tbody> | |||
| Field Name Field Type Description | </table> | |||
| OPTION-CODE u_int16_t LLQ (1) | ||||
| OPTION-LENGTH u_int16_t Length of following fields (18) | ||||
| VERSION u_int16_t Version of LLQ protocol implemented | ||||
| in server (1) | ||||
| LLQ-OPCODE u_int16_t LLQ-EVENT (3) | ||||
| ERROR-CODE u_int16_t 0 | ||||
| LLQ-ID u_int64_t [As Appropriate] | ||||
| LEASE-LIFE u_int32_t 0 | ||||
| </artwork></figure> | ||||
| <t> | <t> | |||
| Gratuitous responses for a single LLQ MAY be batched, such that | 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> | ||||
| <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> | ||||
| <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="default"> | |||
| <t> | <name>Add Events</name> | |||
| Add events occur when a new resource record appears, usually as the | <t> | |||
| result of a dynamic update <xref target="RFC2136"/>, that answers an LLQ. Thi | Add Events occur when a new resource record appears, usually as the | |||
| s | result of a dynamic update <xref target="RFC2136" format="default"/>, 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="default"> | |||
| <t> | <name>Remove Events</name> | |||
| Remove events occur when a resource record previously sent to a | <t> | |||
| client, either in an initial response, or in an Add Event, becomes | 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="default"> | |||
| <t> | <name>Gratuitous Response Acknowledgments</name> | |||
| Upon receiving a gratuitous response ("event"), the client MUST send | <t> | |||
| 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&nbhy;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="default" anchor="LLQ-LLE"> | |||
| <name>LLQ Lease-Life Expiration</name> | ||||
| <section title="LLQ Lease-Life Expiration"> | <section numbered="true" toc="default"> | |||
| <t> | <name>Refresh Request</name> | |||
| </t> | <t> | |||
| <section title="Refresh Request"> | If the client desires to maintain the LLQ beyond the duration specified in | |||
| <t> | the LLQ&nbhy;LEASE field of the ACK + Answers (<xref | |||
| If the client desires to maintain the LLQ beyond the duration | target="ack-answers"/>), the client <bcp14>MUST</bcp14> send a | |||
| specified in the LEASE&nbhy;LIFE field of the Ack + Answers | Refresh Request. A Refresh Request is identical to an LLQ Challenge | |||
| (5.2), the client MUST send a Refresh Request. A Refresh Request is | Response (<xref target="challenge-response"/>) but with the LLQ&nbhy;OPCODE | |||
| identical to an LLQ Challenge Response (5.3), but with the LLQ&nbhy;OPCODE | set to | |||
| set to LLQ&nbhy;REFRESH. Unlike a Challenge Response, a Refresh Request | LLQ&nbhy;REFRESH. Unlike a Challenge Response, a Refresh Request returns no | |||
| returns no answers. | answers. | |||
| </t> | </t> | |||
| <t> | <t> | |||
| The client SHOULD refresh an LLQ when 80% of its lease life has | The client <bcp14>SHOULD</bcp14> refresh an LLQ when 80% of its | |||
| LLQ&nbhy;LEASE has | ||||
| elapsed. | elapsed. | |||
| </t> | </t> | |||
| <t> | ||||
| <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&nbhy;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&nbhy;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> | ||||
| <t> | The client <bcp14>SHOULD</bcp14> specify the original LLQ&nbhy;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&nbhy;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&nbhy;LEASE for all LLQs being refreshed (with the exception | |||
| </t> | of termination requests; see below). | |||
| </t> | ||||
| <t> | <t> | |||
| 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&nbhy;LEASE value of 0. | |||
| </t> | ||||
| <t> | <t> | |||
| 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 | |||
| the server is determined to be down, the client MAY periodically | NOT</bcp14> retry a first time before 90% of the LLQ&nbhy;LEASE has expired | |||
| and | ||||
| <bcp14>MUST NOT</bcp14> retry again before 95% of the LLQ&nbhy;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="default"> | |||
| <t> | <name>LLQ Refresh Acknowledgment</name> | |||
| Upon receiving an LLQ Refresh message, a server MUST send an | ||||
| acknowledgment of the Refresh. This acknowledgment is formatted like | ||||
| the Setup ACK described in 5.2.3, but with the following variations: | ||||
| </t> | ||||
| <t> | <t> | |||
| Upon receiving an LLQ Refresh message, a server <bcp14>MUST</bcp14> send an | ||||
| acknowledgment of the Refresh. This acknowledgment is formatted like | ||||
| the "ACK + Answers" message described in <xref target="ack-answers"/>, but | ||||
| with the following variations: | ||||
| </t> | ||||
| <ul> | ||||
| <li> | ||||
| <t> | ||||
| It contains no answers. | ||||
| </t> | ||||
| </li> | ||||
| <li> | ||||
| <t> | ||||
| The LLQ&nbhy;OPCODE is set to LLQ&nbhy;REFRESH. | The LLQ&nbhy;OPCODE is set to LLQ&nbhy;REFRESH. | |||
| </t> | </t> | |||
| </li> | ||||
| <t> | <li> | |||
| NO&nbhy;SUCH&nbhy;LLQ MUST be returned as an error code if the client attempt | <t> | |||
| s | NO&nbhy;SUCH&nbhy;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&nbhy;ID in the request). | |||
| </t> | </t> | |||
| </li> | ||||
| <t> | <li> | |||
| The LLQ&nbhy;ID in the acknowledgment is set to the LLQ&nbhy;ID in the reques | <t> | |||
| t. | The LLQ&nbhy;ID in the acknowledgment is set to the LLQ&nbhy;ID in the | |||
| </t> | request. | |||
| <?rfc needLines="40" ?> | </t> | |||
| </section> | </li> | |||
| </section> | </ul> | |||
| <section title="Security Considerations"> | ||||
| <t> | ||||
| Without care taken in the design of protocols such as this, servers | ||||
| may be susceptible to denial of service (DOS) attacks, and clients | ||||
| may be subjected to packet storms. Mechanisms have been added to the | ||||
| protocol to limit potential for these attacks. | ||||
| </t> | ||||
| <t> | </section> | |||
| </section> | ||||
| <section numbered="true" toc="default" anchor="security-considerations"> | ||||
| <name>Security Considerations</name> | ||||
| <t> | ||||
| In datagram-based protocols | ||||
| (i.e., protocols running over UDP, or directly over IP, or similar), servers | ||||
| 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> | ||||
| 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="default" anchor="server-dos"> | |||
| <t> | <name>Server DoS</name> | |||
| LLQs require that servers be stateful, maintaining entries for each | <t> | |||
| LLQ over a potentially long period of time. If unbounded in | LLQs require that servers be stateful, maintaining entries for each LLQ | |||
| quantity, these entries may overload the server. By returning | over a potentially long period of time. If unbounded in quantity, these | |||
| SERV&nbhy;FULL in Setup Challenges, the sever may limit the maximum | entries may overload the server. By returning SERV&nbhy;FULL in Setup | |||
| number of LLQs it maintains. Additionally, the server may return | Challenges, the server may limit the maximum number of LLQs it | |||
| SERV&nbhy;FULL to limit the number of LLQs requested for a single name and | maintains. Additionally, the server may return SERV&nbhy;FULL to limit the | |||
| type, or by a single client. This throttling may be in the form of a | number of LLQs requested for a single name and type, or by a single | |||
| hard limit, or, preferably, by token-bucket rate limiting. Such rate | client. This throttling may be in the form of a hard limit, or, preferably, | |||
| limiting should occur rarely in normal use and is intended to prevent | by token-bucket rate limiting. Such rate limiting should occur rarely in | |||
| DOS attacks -- thus it is not built into the protocol explicitly, but | normal use and is intended to prevent DoS attacks -- thus, it is not built | |||
| is instead implemented at the discretion of an administrator via the | into the protocol explicitly but is instead implemented at the discretion | |||
| SERV&nbhy;FULL error and the LEASE&nbhy;LIFE field to indicate a retry time t | of an administrator via the SERV&nbhy;FULL error and the LLQ&nbhy;LEASE | |||
| o | field to indicate a retry time to the client. | |||
| the client. | </t> | |||
| </t> | </section> | |||
| </section> | <section numbered="true" toc="default"> | |||
| <section title="Client Packet Storms"> | <name>Client Packet Storms</name> | |||
| <t> | <t> | |||
| In addition to protecting the server from DOS attacks, the protocol | 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> | ||||
| <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"/>, serves to limit the number of packets that can | |||
| (8.1) serves to limit the number of packets that can be delivered to | be delivered to | |||
| an unsuspecting client. | an unsuspecting client. | |||
| </t> | </t> | |||
| </section> | </section> | |||
| <section title="Spoofing"> | <section numbered="true" toc="default"> | |||
| <t> | <name>Spoofing</name> | |||
| <t> | ||||
| 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="default"> | ||||
| <section title="IANA Considerations"> | <name>IANA Considerations</name> | |||
| <t> | <t> | |||
| 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> | ||||
| <t> | ||||
| TCP and UDP ports 5352 have already been assigned for LLQ. IANA is | ||||
| requested to add a reference to indicate the RFC number under which | ||||
| this document is published. | ||||
| </t> | ||||
| <t> | ||||
| No additional IANA services are required by this document. | ||||
| </t> | ||||
| </section> | ||||
| <section title="Acknowledgments"> | ||||
| <t> | ||||
| The concepts described in this document were originally explored, developed | ||||
| and implemented with help from Chris Sharp and Roger Pantos. | ||||
| </t> | ||||
| <t>In 2005 and 2006 Kiren Sekar made significant contributions to | ||||
| the | ||||
| first two drafts 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 2005 | ||||
| .</t> | ||||
| </section> | ||||
| </middle> | ||||
| <back> | ||||
| <references title='Normative References'> | ||||
| &RFC1035; | ||||
| &RFC2119; | ||||
| &RFC2782; | ||||
| &RFC6891; | ||||
| &RFC8174; | ||||
| <reference anchor='Push'> | ||||
| <front> | ||||
| <title>DNS Push Notifications [[RFC Editor note: Please update reference | ||||
| "Push" to refer to assigned RFC number for that document]]</title> | ||||
| <author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | ||||
| <organization /> | ||||
| </author> | ||||
| <date month='September' day='18' year='2018' /> | ||||
| <abstract><t>The Domain Name System (DNS) was designed to return | ||||
| matching records efficiently for queries for data that are relatively | ||||
| static. When those records change frequently, DNS is still efficient at | ||||
| returning the updated results when polled, as long as the polling rate | ||||
| is not too high. But there exists no mechanism for a client to be | ||||
| asynchronously notified when these changes occur. This document defines | ||||
| a mechanism for a client to be notified of such changes to DNS records, | ||||
| called DNS Push Notifications.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='Internet-Draft' value='draft-ietf-dnssd-push-15' /> | ||||
| <format type='TXT' | ||||
| target='http://www.ietf.org/internet-drafts/draft-ietf-dn | ||||
| ssd-push-15.txt' /> | ||||
| </reference> | ||||
| </references> | ||||
| <references title='Informative References'> | ||||
| &RFC2136; | ||||
| &RFC4787; | ||||
| &RFC4953; | ||||
| &RFC5382; | ||||
| &RFC6281; | ||||
| &RFC6762; | ||||
| &RFC6763; | ||||
| &RFC6886; | ||||
| &RFC6887; | ||||
| &RFC7857; | ||||
| <reference anchor='SYN'> | ||||
| <front> | ||||
| <title>Defenses Against TCP SYN Flooding Attacks</title> | ||||
| <author initials='W.' surname='Eddy' fullname='Wesley Eddy'> | ||||
| <organization>Verizon Federal Network Systems</organization> | ||||
| <address> | ||||
| <email>weddy@grc.nasa.gov</email> | ||||
| </address> | ||||
| </author> | ||||
| <date year='2006' month='December' /> | ||||
| <keyword>TCP</keyword> | ||||
| </front> | ||||
| <seriesInfo name="The Internet Protocol Journal," value='Cisco Systems' /> | ||||
| <seriesInfo name='Volume' value='9' /> | ||||
| <seriesInfo name='Number' value='4' /> | ||||
| <format type='PDF' octets='882020' target="http://www.cisco.com/web/about/ac12 | ||||
| 3/ac147/archived_issues/ipj_9-4/ipj_9-4.pdf" /> | ||||
| <format type='HTML' octets='65566' target="http://www.cisco.com/web/about/ac12 | ||||
| 3/ac147/archived_issues/ipj_9-4/syn_flooding_attacks.html" /> | ||||
| </reference> | ||||
| <reference anchor='RFC8490' target='https://www.rfc-editor.org/info/rfc8490'> | ||||
| <front> | ||||
| <title>DNS Stateful Operations</title> | ||||
| <author initials='R' surname='Bellis' fullname='Ray Bellis'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='J' surname='Dickinson' fullname='John Dickinson'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='S' surname='Dickinson' fullname='Sara Dickinson'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='T' surname='Lemon' fullname='Ted Lemon'> | ||||
| <organization /> | ||||
| </author> | ||||
| <author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | <t> | |||
| <organization /> | TCP and UDP ports 5352 have already been assigned for LLQ. IANA has | |||
| </author> | added a reference to this document. | |||
| </t> | ||||
| </section> | ||||
| <date month='October' day='23' year='2018' /> | </middle> | |||
| <back> | ||||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include | ||||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.1035.x | ||||
| ml"/> | ||||
| <xi:include | ||||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2119.x | ||||
| ml"/> | ||||
| <xi:include | ||||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2782.x | ||||
| ml"/> | ||||
| <xi:include | ||||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6891.x | ||||
| ml"/> | ||||
| <xi:include | ||||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8174.x | ||||
| ml"/> | ||||
| <abstract><t>This document defines a new DNS OPCODE for DNS Stateful Operations | <reference anchor='RFC8765' target="https://www.rfc-editor.org/info/rfc8765"> | |||
| (DSO). DSO messages communicate operations within persistent stateful sessions, | <front> | |||
| using type-length-value (TLV) syntax. Three TLVs are defined that manage sessi | <title>DNS Push Notifications | |||
| on timeouts, termination, and encryption padding, and a framework is defined for | </title> | |||
| extensions to enable new stateful operations. This document updates RFC 1035 b | <author initials='T' surname='Pusateri' fullname='Tom Pusateri'> | |||
| y adding a new DNS header opcode which has different message semantics, and a ne | <organization /> | |||
| w result code. This document updates RFC 7766 by redefining a session, providin | </author> | |||
| g new guidance on connection re-use, and providing a new mechanism for handling | <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | |||
| session idle timeouts.</t></abstract> | <organization /> | |||
| </front> | </author> | |||
| <seriesInfo name='BCP' value='14'/> | <date month='June' year='2020' /> | |||
| <seriesInfo name='RFC' value='8490'/> | </front> | |||
| <seriesInfo name='DOI' value='10.17487/RFC8490'/> | <seriesInfo name='RFC' value='8765' /> | |||
| <seriesInfo name="DOI" value="10.17487/RFC8765"/> | ||||
| </reference> | </reference> | |||
| </references> | </references> | |||
| <references> | ||||
| <?rfc needLines="40" ?> | <name>Informative References</name> | |||
| <xi:include | ||||
| <section anchor="problems" title="Problems with the LLQ Protocol"> | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.2136.x | |||
| <t> | ml"/> | |||
| In the course of using LLQ since 2005, some problems were discove | <xi:include | |||
| red. | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4787.x | |||
| Since no further work is being done on the LLQ protocol, | ml"/> | |||
| this LLQ specification will not be updated to remedy these proble | <xi:include | |||
| ms. | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.4953.x | |||
| </t> | ml"/> | |||
| <xi:include | ||||
| <t> | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.5382.x | |||
| LLQ's IETF Standards Track successor, | ml"/> | |||
| <xref target="Push">DNS Push Notifications</xref>, | <xi:include | |||
| does not suffer from these problems, so | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6281.x | |||
| all existing LLQ implementations are RECOMMENDED to migrate to us | ml"/> | |||
| ing DNS Push Notifications, | <xi:include | |||
| and all new implementations are RECOMMENDED to implement DNS Push | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6762.x | |||
| Notifications instead of LLQ. | ml"/> | |||
| </t> | <xi:include | |||
| href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6763.x | ||||
| <t> | ml"/> | |||
| Known problems with LLQ are documented here for the record. | <xi:include | |||
| </t> | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6886.x | |||
| ml"/> | ||||
| <t> | <xi:include | |||
| An LLQ "Setup Challenge" message from server to client is identic | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.6887.x | |||
| al to | ml"/> | |||
| an LLQ "ACK + Answers" message from server to client | <xi:include | |||
| when there are no current answers for the query. | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.7857.x | |||
| If there is packet loss, retransmission, and duplication in the n | ml"/> | |||
| etwork, | <xi:include | |||
| then a duplicated "Setup Challenge" message arriving late at the | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.8490.x | |||
| client | ml"/> | |||
| 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> | ||||
| This LLQ specification states: | ||||
| "Servers MUST NOT garbage collect LLQs that fail to complete the | ||||
| four-way | ||||
| handshake until the initially granted LEASE-LIFE has elapsed." | ||||
| This is probably a mistake, since it exposes LLQ servers to an ea | ||||
| sy | ||||
| resource-exhaustion denial-of-service attack. | ||||
| DNS Push Notifications is built using | ||||
| DNS Stateful Operations <xref target="RFC8490"/>, | ||||
| which uses TLS over TCP, | ||||
| and a benefit of building on TCP is that there are already establ | ||||
| ished | ||||
| industry best practices to guard against SYN flooding and | ||||
| similar attacks <xref target="SYN"/> <xref target="RFC4953"/> | ||||
| </t> | ||||
| <t> | <reference anchor="SYN" | |||
| LLQ is built using UDP, and because the UDP protocol has no | target="https://www.cisco.com/web/about/ac123/ac147/archived_i | |||
| standardized way of indicating the start and end of a | ssues/ipj_9-4/ipj_9-4.pdf"> | |||
| session, firewalls and NAT gateways tend to be fairly agressive a | <front> | |||
| bout | <title>Defenses Against TCP SYN Flooding Attacks</title> | |||
| recycling UDP mappings that they believe to be disused | <seriesInfo name="Volume" value="9"/> | |||
| <xref target="RFC4787"/> <xref target="RFC5382"/> <xref target="R | <seriesInfo name="Number" value="4"/> | |||
| FC7857"/>. | <seriesInfo name="The Internet Protocol Journal," value="Cisco | |||
| Using a high keepalive traffic rate to maintain firewall or NAT m | Systems"/> | |||
| apping | <author initials="W." surname="Eddy" fullname="Wesley Eddy"> | |||
| state could remedy this, but would largely defeat the purpose of | <organization>Verizon Federal Network Systems</organization> | |||
| using LLQ in the first place, which is to provide efficient | <address> | |||
| change notification without wasteful polling. | <email>weddy@grc.nasa.gov</email> | |||
| Because of this, existing LLQ clients use | </address> | |||
| <xref target="RFC6886">NAT Port Mapping Protocol (NAT-PMP)</xref> | </author> | |||
| and/or | <date year="2006" month="December"/> | |||
| <xref target="RFC6887">Port Control Protocol (PCP)</xref> to | <keyword>TCP</keyword> | |||
| establish longer port mapping lifetimes. | </front> | |||
| This solves the problem, but adds extra complexity, and doesn't w | ||||
| ork | ||||
| 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> | </reference> | |||
| </back> | </references> | |||
| </references> | ||||
| <section anchor="problems" numbered="true" toc="default"> | ||||
| <name>Problems with the LLQ Protocol</name> | ||||
| <t> | ||||
| 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> | ||||
| LLQ's IETF Standards Track successor, "DNS Push Notifications" | ||||
| <xref target="RFC8765" format="default"></xref>, 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> | ||||
| 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> | ||||
| 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> | ||||
| <xref target="setup-message-retransmission"/> of this LLQ | ||||
| specification states, "Servers <bcp14>MUST | ||||
| NOT</bcp14> garbage collect LLQs 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"></xref>, | ||||
| is built using DNS Stateful | ||||
| Operations <xref target="RFC8490" format="default"/>, 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="default"/> <xref target="RFC4953" format="default"/>. | ||||
| </t> | ||||
| <t> | ||||
| 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"></xref> | ||||
| 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> | ||||
| 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"></xref> | ||||
| corrects this error by having only one single consistent way to | ||||
| deliver results. | ||||
| </t> | ||||
| <t> | ||||
| 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="RFC4787" format="default"/> <xref target="RFC5382" | ||||
| format="default"/> <xref target="RFC7857" format="default"/>. | ||||
| 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"></xref> and/or Port Control Protocol (PCP) | ||||
| <xref target="RFC6887" format="default"></xref> 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="default"> | ||||
| <name>Acknowledgments</name> | ||||
| <t> | ||||
| 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><contact fullname="Kiren Sekar"/> made significant 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>Thanks to Independent Stream Editor <contact fullname="Adrian Farrel"/> for h | ||||
| is support and | ||||
| assistance in the publication of this RFC. | ||||
| </t> | ||||
| </section> | ||||
| </back> | ||||
| </rfc> | </rfc> | |||
| End of changes. 144 change blocks. | ||||
| 1072 lines changed or deleted | 1455 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/ | ||||