draft-ietf-dnssd-push-25.txt | rfc8765.txt | |||
---|---|---|---|---|
Internet Engineering Task Force T. Pusateri | Internet Engineering Task Force (IETF) T. Pusateri | |||
Internet-Draft Unaffiliated | Request for Comments: 8765 Unaffiliated | |||
Intended status: Standards Track S. Cheshire | Category: Standards Track S. Cheshire | |||
Expires: April 15, 2020 Apple Inc. | ISSN: 2070-1721 Apple Inc. | |||
October 13, 2019 | June 2020 | |||
DNS Push Notifications | DNS Push Notifications | |||
draft-ietf-dnssd-push-25 | ||||
Abstract | Abstract | |||
The Domain Name System (DNS) was designed to return matching records | The Domain Name System (DNS) was designed to return matching records | |||
efficiently for queries for data that are relatively static. When | efficiently for queries for data that are relatively static. When | |||
those records change frequently, DNS is still efficient at returning | those records change frequently, DNS is still efficient at returning | |||
the updated results when polled, as long as the polling rate is not | 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 | too high. But, there exists no mechanism for a client to be | |||
asynchronously notified when these changes occur. This document | asynchronously notified when these changes occur. This document | |||
defines a mechanism for a client to be notified of such changes to | defines a mechanism for a client to be notified of such changes to | |||
DNS records, called DNS Push Notifications. | DNS records, called DNS Push Notifications. | |||
Status of This Memo | Status of This Memo | |||
This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
provisions of BCP 78 and BCP 79. | ||||
Internet-Drafts are working documents of the Internet Engineering | ||||
Task Force (IETF). Note that other groups may also distribute | ||||
working documents as Internet-Drafts. The list of current Internet- | ||||
Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
Internet Standards is available in Section 2 of RFC 7841. | ||||
This Internet-Draft will expire on April 15, 2020. | Information about the current status of this document, any errata, | |||
and how to provide feedback on it may be obtained at | ||||
https://www.rfc-editor.org/info/rfc8765. | ||||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2020 IETF Trust and the persons identified as the | |||
document authors. All rights reserved. | document authors. All rights reserved. | |||
This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
Provisions Relating to IETF Documents | Provisions Relating to IETF Documents | |||
(https://trustee.ietf.org/license-info) in effect on the date of | (https://trustee.ietf.org/license-info) in effect on the date of | |||
publication of this document. Please review these documents | publication of this document. Please review these documents | |||
carefully, as they describe your rights and restrictions with respect | carefully, as they describe your rights and restrictions with respect | |||
to this document. Code Components extracted from this document must | to this document. Code Components extracted from this document must | |||
include Simplified BSD License text as described in Section 4.e of | include Simplified BSD License text as described in Section 4.e of | |||
the Trust Legal Provisions and are provided without warranty as | the Trust Legal Provisions and are provided without warranty as | |||
described in the Simplified BSD License. | described in the Simplified BSD License. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction | |||
1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3 | 1.1. Requirements Language | |||
1.2. Fatal Errors . . . . . . . . . . . . . . . . . . . . . . 3 | 1.2. Fatal Errors | |||
2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Motivation | |||
3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 3. Overview | |||
4. State Considerations . . . . . . . . . . . . . . . . . . . . 6 | 4. State Considerations | |||
5. Transport . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | 5. Transport | |||
6. Protocol Operation . . . . . . . . . . . . . . . . . . . . . 8 | 6. Protocol Operation | |||
6.1. Discovery . . . . . . . . . . . . . . . . . . . . . . . . 9 | 6.1. Discovery | |||
6.2. DNS Push Notification SUBSCRIBE . . . . . . . . . . . . . 13 | 6.2. DNS Push Notification SUBSCRIBE | |||
6.2.1. SUBSCRIBE Request . . . . . . . . . . . . . . . . . . 13 | 6.2.1. SUBSCRIBE Request | |||
6.2.2. SUBSCRIBE Response . . . . . . . . . . . . . . . . . 16 | 6.2.2. SUBSCRIBE Response | |||
6.3. DNS Push Notification Updates . . . . . . . . . . . . . . 20 | 6.3. DNS Push Notification Updates | |||
6.3.1. PUSH Message . . . . . . . . . . . . . . . . . . . . 20 | 6.3.1. PUSH Message | |||
6.4. DNS Push Notification UNSUBSCRIBE . . . . . . . . . . . . 26 | 6.4. DNS Push Notification UNSUBSCRIBE | |||
6.4.1. UNSUBSCRIBE Message . . . . . . . . . . . . . . . . . 26 | 6.4.1. UNSUBSCRIBE Message | |||
6.5. DNS Push Notification RECONFIRM . . . . . . . . . . . . . 28 | 6.5. DNS Push Notification RECONFIRM | |||
6.5.1. RECONFIRM Message . . . . . . . . . . . . . . . . . . 29 | 6.5.1. RECONFIRM Message | |||
6.6. DNS Stateful Operations TLV Context Summary . . . . . . . 31 | 6.6. DNS Stateful Operations TLV Context Summary | |||
6.7. Client-Initiated Termination . . . . . . . . . . . . . . 32 | 6.7. Client-Initiated Termination | |||
6.8. Client Fallback to Polling . . . . . . . . . . . . . . . 33 | 6.8. Client Fallback to Polling | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 34 | 7. Security Considerations | |||
7.1. Security Services . . . . . . . . . . . . . . . . . . . . 35 | 7.1. Security Services | |||
7.2. TLS Name Authentication . . . . . . . . . . . . . . . . . 35 | 7.2. TLS Name Authentication | |||
7.3. TLS Early Data . . . . . . . . . . . . . . . . . . . . . 36 | 7.3. TLS Early Data | |||
7.4. TLS Session Resumption . . . . . . . . . . . . . . . . . 36 | 7.4. TLS Session Resumption | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 37 | 8. IANA Considerations | |||
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 37 | 9. References | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 38 | 9.1. Normative References | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 38 | 9.2. Informative References | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 40 | Acknowledgments | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 42 | Authors' Addresses | |||
1. Introduction | 1. Introduction | |||
Domain Name System (DNS) records may be updated using DNS Update | Domain Name System (DNS) records may be updated using DNS Update | |||
[RFC2136]. Other mechanisms such as a Discovery Proxy [DisProx] can | [RFC2136]. Other mechanisms such as a Discovery Proxy [RFC8766] can | |||
also generate changes to a DNS zone. This document specifies a | also generate changes to a DNS zone. This document specifies a | |||
protocol for DNS clients to subscribe to receive asynchronous | protocol for DNS clients to subscribe to receive asynchronous | |||
notifications of changes to RRsets of interest. It is immediately | notifications of changes to RRsets of interest. It is immediately | |||
relevant in the case of DNS Service Discovery [RFC6763] but is not | relevant in the case of DNS-based Service Discovery [RFC6763] but is | |||
limited to that use case, and provides a general DNS mechanism for | not limited to that use case; it provides a general DNS mechanism for | |||
DNS record change notifications. Familiarity with the DNS protocol | DNS record change notifications. Familiarity with the DNS protocol | |||
and DNS packet formats is assumed [RFC1034] [RFC1035] [RFC6895]. | and DNS packet formats is assumed [RFC1034] [RFC1035] [RFC6895]. | |||
1.1. Requirements Language | 1.1. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. These words may also appear in this | capitals, as shown here. | |||
document in lower case as plain English words, absent their normative | ||||
meanings. | ||||
1.2. Fatal Errors | 1.2. Fatal Errors | |||
Certain invalid situations are described in this specification, like | Certain invalid situations are described in this specification, such | |||
a server sending a Push Notification subscription request to a | as a server sending a Push Notification subscription request to a | |||
client, or a client sending a Push Notification response to a server. | client, or a client sending a Push Notification response to a server. | |||
These should never occur with a correctly implemented client and | These should never occur with a correctly implemented client and | |||
server, and if they do occur then they indicate a serious | server, and if they do occur, then they indicate a serious | |||
implementation error. In these extreme cases there is no reasonable | implementation error. In these extreme cases, there is no reasonable | |||
expectation of a graceful recovery, and the recipient detecting the | expectation of a graceful recovery, and the recipient detecting the | |||
error should respond by unilaterally aborting the session without | error should respond by unilaterally aborting the session without | |||
regard for data loss. Such cases are addressed by having an engineer | regard for data loss. Such cases are addressed by having an engineer | |||
investigate the cause of the failure and fixing the problem in the | investigate the cause of the failure and fixing the problem in the | |||
software. | software. | |||
Where this specification says "forcibly abort", it means sending a | Where this specification says "forcibly abort", it means sending a | |||
TCP RST to terminate the TCP connection, and the TLS session running | TCP RST to terminate the TCP connection and the TLS session running | |||
over that TCP connection. In the BSD Sockets API, this is achieved | over that TCP connection. In the BSD Sockets API, this is achieved | |||
by setting the SO_LINGER option to zero before closing the socket. | by setting the SO_LINGER option to zero before closing the socket. | |||
2. Motivation | 2. Motivation | |||
As the domain name system continues to adapt to new uses and changes | As the domain name system continues to adapt to new uses and changes | |||
in deployment, polling has the potential to burden DNS servers at | in deployment, polling has the potential to burden DNS servers at | |||
many levels throughout the network. Other network protocols have | many levels throughout the network. Other network protocols have | |||
successfully deployed a publish/subscribe model following the | successfully deployed a publish/subscribe model following the | |||
Observer design pattern [obs]. XMPP Publish-Subscribe [XEP0060] and | Observer design pattern [OBS]. Extensible Messaging and Presence | |||
Atom [RFC4287] are examples. While DNS servers are generally highly | Protocol (XMPP) Publish-Subscribe [XEP0060] and Atom [RFC4287] are | |||
tuned and capable of a high rate of query/response traffic, adding a | examples. While DNS servers are generally highly tuned and capable | |||
publish/subscribe model for tracking changes to DNS records can | of a high rate of query/response traffic, adding a publish/subscribe | |||
deliver more timely notification of changes with reduced CPU usage | model for tracking changes to DNS records can deliver more timely | |||
and lower network traffic. | notifications of changes with reduced CPU usage and lower network | |||
traffic. | ||||
Multicast DNS [RFC6762] implementations always listen on a well known | The guiding design principle of DNS Push Notifications is that | |||
clients that choose to use DNS Push Notifications, instead of | ||||
repeated polling with DNS queries, will receive the same results as | ||||
they could via sufficiently rapid polling, except more efficiently. | ||||
This means that the rules for which records match a given DNS Push | ||||
Notification subscription are the same as the already established | ||||
rules used to determine which records match a given DNS query | ||||
[RFC1034]. For example, name comparisons are done in a case- | ||||
insensitive manner, and a record of type CNAME in a zone matches any | ||||
DNS TYPE in a query or subscription. | ||||
Multicast DNS [RFC6762] implementations always listen on a well-known | ||||
link-local IP multicast group address, and changes are sent to that | link-local IP multicast group address, and changes are sent to that | |||
multicast group address for all group members to receive. Therefore, | multicast group address for all group members to receive. Therefore, | |||
Multicast DNS already has asynchronous change notification | Multicast DNS already has asynchronous change notification | |||
capability. When DNS Service Discovery [RFC6763] is used across a | capability. When DNS-based Service Discovery [RFC6763] is used | |||
wide area network using Unicast DNS (possibly facilitated via a | across a wide area network using Unicast DNS (possibly facilitated | |||
Discovery Proxy [DisProx]) it would be beneficial to have an | via a Discovery Proxy [RFC8766]), it would be beneficial to have an | |||
equivalent capability for Unicast DNS, to allow clients to learn | equivalent capability for Unicast DNS in order to allow clients to | |||
about DNS record changes in a timely manner without polling. | learn about DNS record changes in a timely manner without polling. | |||
The DNS Long-Lived Queries (LLQ) mechanism [LLQ] is an existing | The DNS Long-Lived Queries (LLQ) mechanism [RFC8764] is an existing | |||
deployed solution to provide asynchronous change notifications, used | deployed solution to provide asynchronous change notifications; it | |||
by Apple's Back to My Mac [RFC6281] service introduced in Mac OS X | was used by Apple's Back to My Mac [RFC6281] service introduced in | |||
10.5 Leopard in 2007. Back to My Mac was designed in an era when the | Mac OS X 10.5 Leopard in 2007. Back to My Mac was designed in an era | |||
data center operations staff asserted that it was impossible for a | when the data center operations staff asserted that it was impossible | |||
server to handle large numbers of mostly-idle TCP connections, so LLQ | for a server to handle large numbers of TCP connections, even if | |||
was defined as a UDP-based protocol, effectively replicating much of | those connections carried very little traffic and spent most of their | |||
TCP's connection state management logic in user space, and creating | time idle. Consequently, LLQ was defined as a UDP-based protocol, | |||
its own imitation of existing TCP features like the three-way | effectively replicating much of TCP's connection state management | |||
handshake, flow control, and reliability. | logic in user space and creating its own imitation of existing TCP | |||
features like flow control, reliability, and the three-way handshake. | ||||
This document builds on experience gained with the LLQ protocol, with | This document builds on experience gained with the LLQ protocol, with | |||
an improved design. Instead of using UDP, this specification uses | an improved design. Instead of using UDP, this specification uses | |||
DNS Stateful Operations (DSO) [RFC8490] running over TLS over TCP, | DNS Stateful Operations (DSO) [RFC8490] running over TLS over TCP, | |||
and therefore doesn't need to reinvent existing TCP functionality. | and therefore doesn't need to reinvent existing TCP functionality. | |||
Using TCP also gives long-lived low-traffic connections better | Using TCP also gives long-lived low-traffic connections better | |||
longevity through NAT gateways without depending on the gateway to | longevity through NAT gateways without depending on the gateway to | |||
support NAT Port Mapping Protocol (NAT-PMP) [RFC6886] or Port Control | support NAT Port Mapping Protocol (NAT-PMP) [RFC6886] or Port Control | |||
Protocol (PCP) [RFC6887], or resorting to excessive keepalive | Protocol (PCP) [RFC6887], or resorting to excessive keepalive | |||
traffic. | traffic. | |||
3. Overview | 3. Overview | |||
A DNS Push Notification client subscribes for Push Notifications for | A DNS Push Notification client subscribes for Push Notifications for | |||
a particular RRset by connecting to the appropriate Push Notification | a particular RRset by connecting to the appropriate Push Notification | |||
server for that RRset, and sending DSO message(s) indicating the | server for that RRset and sending DSO message(s) indicating the | |||
RRset(s) of interest. When the client loses interest in receiving | RRset(s) of interest. When the client loses interest in receiving | |||
further updates to these records, it unsubscribes. | further updates to these records, it unsubscribes. | |||
The DNS Push Notification server for a DNS zone is any server capable | The DNS Push Notification server for a DNS zone is any server capable | |||
of generating the correct change notifications for a name. It may be | of generating the correct change notifications for a name. It may be | |||
a primary, secondary, or stealth name server [RFC7719]. | a primary, secondary, or stealth name server [RFC8499]. | |||
The "_dns-push-tls._tcp.<zone>" SRV record for a zone MAY reference | The "_dns-push-tls._tcp.<zone>" SRV record for a zone MAY reference | |||
the same target host and port as that zone's | the same target host and port as that zone's | |||
"_dns-update-tls._tcp.<zone>" SRV record. When the same target host | "_dns-update-tls._tcp.<zone>" SRV record. When the same target host | |||
and port is offered for both DNS Updates and DNS Push Notifications, | and port is offered for both DNS Updates and DNS Push Notifications, | |||
a client MAY use a single DSO session to that server for both DNS | a client MAY use a single DSO session to that server for both DNS | |||
Updates and DNS Push Notification Subscriptions. DNS Updates and DNS | Updates and DNS Push Notification subscriptions. DNS Updates and DNS | |||
Push Notifications may be handled on different ports on the same | Push Notifications may be handled on different ports on the same | |||
target host, in which case they are not considered to be the "same | target host, in which case they are not considered to be the "same | |||
server" for the purposes of this specification, and communications | server" for the purposes of this specification, and communications | |||
with these two ports are handled independently. Supporting DNS | with these two ports are handled independently. Supporting DNS | |||
Updates and DNS Push Notifications on the same server is OPTIONAL. A | Updates and DNS Push Notifications on the same server is OPTIONAL. A | |||
DNS Push Notification server is not required to support DNS Update. | DNS Push Notification server is not required to support DNS Update. | |||
Standard DNS Queries MAY be sent over a DNS Push Notification (i.e., | Standard DNS Queries MAY be sent over a DNS Push Notification (i.e., | |||
DSO) session. For any zone for which the server is authoritative, it | DSO) session. For any zone for which the server is authoritative, it | |||
MUST respond authoritatively for queries for names falling within | MUST respond authoritatively for queries for names falling within | |||
that zone (e.g., the "_dns-push-tls._tcp.<zone>" SRV record) both for | that zone (e.g., the "_dns-push-tls._tcp.<zone>" SRV record) both for | |||
normal DNS queries and for DNS Push Notification subscriptions. For | normal DNS queries and for DNS Push Notification subscriptions. For | |||
names for which the server is acting as a recursive resolver (e.g., | names for which the server is acting as a recursive resolver (e.g., | |||
when the server is the local recursive resolver) for any query for | when the server is the local recursive resolver) for any query for | |||
which it supports DNS Push Notification subscriptions, it MUST also | which it supports DNS Push Notification subscriptions, it MUST also | |||
support standard queries. | support standard queries. | |||
DNS Push Notifications impose less load on the responding server than | DNS Push Notifications impose less load on the responding server than | |||
rapid polling would, but Push Notifications do still have a cost, so | rapid polling would, but Push Notifications do still have a cost. | |||
DNS Push Notification clients MUST NOT recklessly create an excessive | Therefore, DNS Push Notification clients MUST NOT recklessly create | |||
number of Push Notification subscriptions. Specifically: | an excessive number of Push Notification subscriptions. | |||
Specifically: | ||||
(a) A subscription should only be active when there is a valid reason | (a) A subscription should only be active when there is a valid | |||
to need live data (for example, an on-screen display is currently | reason to need live data (for example, an on-screen display is | |||
showing the results to the user) and the subscription SHOULD be | currently showing the results to the user), and the subscription | |||
cancelled as soon as the need for that data ends (for example, when | SHOULD be canceled as soon as the need for that data ends (for | |||
the user dismisses that display). In the case of a device like a | example, when the user dismisses that display). In the case of | |||
smartphone which, after some period of inactivity, goes to sleep or | a device like a smartphone that, after some period of | |||
otherwise darkens its screen, it should cancel its subscriptions when | inactivity, goes to sleep or otherwise darkens its screen, it | |||
darkening the screen (since the user cannot see any changes on the | should cancel its subscriptions when darkening the screen (since | |||
display anyway) and reinstate its subscriptions when re-awakening | the user cannot see any changes on the display anyway) and | |||
from display sleep. | reinstate its subscriptions when reawakening from display sleep. | |||
(b) A DNS Push Notification client SHOULD NOT routinely keep a DNS | (b) A DNS Push Notification client SHOULD NOT routinely keep a DNS | |||
Push Notification subscription active 24 hours a day, 7 days a week, | Push Notification subscription active 24 hours a day, 7 days a | |||
just to keep a list in memory up to date so that if the user does | week, just to keep a list in memory up to date so that if the | |||
choose to bring up an on-screen display of that data, it can be | user does choose to bring up an on-screen display of that data, | |||
displayed really fast. DNS Push Notifications are designed to be | it can be displayed really fast. DNS Push Notifications are | |||
fast enough that there is no need to pre-load a "warm" list in memory | designed to be fast enough that there is no need to pre-load a | |||
just in case it might be needed later. | "warm" list in memory just in case it might be needed later. | |||
Generally, as described in the DNS Stateful Operations specification | Generally, as described in the DNS Stateful Operations specification | |||
[RFC8490], a client must not keep a DSO session to a server open | [RFC8490], a client must not keep a DSO session to a server open | |||
indefinitely if it has no subscriptions (or other operations) active | indefinitely if it has no subscriptions (or other operations) active | |||
on that session. A client may close a DSO session immediately it | on that session. A client should begin closing a DSO session | |||
becomes idle, and then if needed in the future, open a new session | immediately after it becomes idle, and then, if needed in the future, | |||
when required. Alternatively, a client may speculatively keep an | open a new session when required. Alternatively, a client may | |||
idle DSO session open for some time, subject to the constraint that | speculatively keep an idle DSO session open for some time, subject to | |||
it must not keep a session open that has been idle for more than the | the constraint that it must not keep a session open that has been | |||
session's idle timeout (15 seconds by default) [RFC8490]. | idle for more than the session's idle timeout (15 seconds by default) | |||
[RFC8490]. | ||||
Note that a DSO session that has an active DNS Push Notification | Note that a DSO session that has an active DNS Push Notification | |||
subscription is not considered idle, even if there is no traffic | subscription is not considered idle, even if there is no traffic | |||
flowing for an extended period of time. In this case the DSO | flowing for an extended period of time. In this case, the DSO | |||
inactivity timeout does not apply, because the session is not | inactivity timeout does not apply, because the session is not | |||
inactive, but the keepalive interval does still apply, to ensure | inactive, but the keepalive interval does still apply, to ensure the | |||
generation of sufficient messages to maintain state in middleboxes | generation of sufficient messages to maintain state in middleboxes | |||
(such at NAT gateways or firewalls) and for the client and server to | (such at NAT gateways or firewalls) and for the client and server to | |||
periodically verify that they still have connectivity to each other. | periodically verify that they still have connectivity to each other. | |||
This is described in Section 6.2 of the DSO specification [RFC8490]. | This is described in Section 6.2 of the DSO specification [RFC8490]. | |||
4. State Considerations | 4. State Considerations | |||
Each DNS Push Notification server is capable of handling some finite | Each DNS Push Notification server is capable of handling some finite | |||
number of Push Notification subscriptions. This number will vary | number of Push Notification subscriptions. This number will vary | |||
from server to server and is based on physical machine | from server to server and is based on physical machine | |||
characteristics, network bandwidth, and operating system resource | characteristics, network capacity, and operating system resource | |||
allocation. After a client establishes a session to a DNS server, | allocation. After a client establishes a session to a DNS server, | |||
each subscription is individually accepted or rejected. Servers may | each subscription is individually accepted or rejected. Servers may | |||
employ various techniques to limit subscriptions to a manageable | employ various techniques to limit subscriptions to a manageable | |||
level. Correspondingly, the client is free to establish simultaneous | level. Correspondingly, the client is free to establish simultaneous | |||
sessions to alternate DNS servers that support DNS Push Notifications | sessions to alternate DNS servers that support DNS Push Notifications | |||
for the zone and distribute subscriptions at the client's discretion. | for the zone and distribute subscriptions at the client's discretion. | |||
In this way, both clients and servers can react to resource | In this way, both clients and servers can react to resource | |||
constraints. | constraints. | |||
5. Transport | 5. Transport | |||
Other DNS operations like DNS Update [RFC2136] MAY use either User | Other DNS operations like DNS Update [RFC2136] MAY use either DNS | |||
Datagram Protocol (UDP) [RFC0768] or Transmission Control Protocol | over User Datagram Protocol (UDP) [RFC0768] or DNS over Transmission | |||
(TCP) [RFC0793] as the transport protocol, in keeping with the | Control Protocol (TCP) [RFC0793] as the transport protocol, provided | |||
historical precedent that DNS queries must first be sent over UDP | they follow the historical precedent that DNS queries must first be | |||
[RFC1123]. This requirement to use UDP has subsequently been relaxed | sent using DNS over UDP and only switch to DNS over TCP if needed | |||
[RFC7766]. | [RFC1123]. This requirement to prefer UDP has subsequently been | |||
relaxed [RFC7766]. | ||||
In keeping with the more recent precedent, DNS Push Notification is | In keeping with the more recent precedent, DNS Push Notification is | |||
defined only for TCP. DNS Push Notification clients MUST use DNS | defined only for TCP. DNS Push Notification clients MUST use DNS | |||
Stateful Operations [RFC8490] running over TLS over TCP [RFC7858]. | Stateful Operations [RFC8490] running over TLS over TCP [RFC7858]. | |||
Connection setup over TCP ensures return reachability and alleviates | Connection setup over TCP ensures return reachability and alleviates | |||
concerns of state overload at the server, which is a potential | concerns of state overload at the server, a potential problem with | |||
problem with connectionless protocols, which can be more vulnerable | connectionless protocols, which can be more vulnerable to being | |||
to being exploited by attackers using spoofed source addresses. All | exploited by attackers using spoofed source addresses. All | |||
subscribers are guaranteed to be reachable by the server by virtue of | subscribers are guaranteed to be reachable by the server by virtue of | |||
the TCP three-way handshake. Flooding attacks are possible with any | the TCP three-way handshake. Flooding attacks are possible with any | |||
protocol, and a benefit of TCP is that there are already established | protocol, and a benefit of TCP is that there are already established | |||
industry best practices to guard against SYN flooding and similar | industry best practices to guard against SYN flooding and similar | |||
attacks [SYN] [RFC4953]. | attacks [SYN] [RFC4953]. | |||
Use of TCP also allows DNS Push Notifications to take advantage of | Use of TCP also allows DNS Push Notifications to take advantage of | |||
current and future developments in TCP, such as Multipath TCP (MPTCP) | current and future developments in TCP such as Multipath TCP (MPTCP) | |||
[RFC6824], TCP Fast Open (TFO) [RFC7413], the TCP RACK fast loss | [RFC8684], TCP Fast Open (TFO) [RFC7413], the TCP RACK fast loss | |||
detection algorithm [I-D.ietf-tcpm-rack], and so on. | detection algorithm [TCPRACK], and so on. | |||
Transport Layer Security (TLS) [RFC8446] is well understood, and used | Transport Layer Security (TLS) [RFC8446] is well understood and is | |||
by many application-layer protocols running over TCP. TLS is | used by many application-layer protocols running over TCP. TLS is | |||
designed to prevent eavesdropping, tampering, and message forgery. | designed to prevent eavesdropping, tampering, and message forgery. | |||
TLS is REQUIRED for every connection between a client subscriber and | TLS is REQUIRED for every connection between a client subscriber and | |||
server in this protocol specification. Additional security measures | server in this protocol specification. Additional security measures | |||
such as client authentication during TLS negotiation may also be | such as client authentication during TLS negotiation may also be | |||
employed to increase the trust relationship between client and | employed to increase the trust relationship between client and | |||
server. | server. | |||
6. Protocol Operation | 6. Protocol Operation | |||
The DNS Push Notification protocol is a session-oriented protocol, | The DNS Push Notification protocol is a session-oriented protocol and | |||
and makes use of DNS Stateful Operations (DSO) [RFC8490]. | makes use of DNS Stateful Operations (DSO) [RFC8490]. | |||
For details of the DSO message format refer to the DNS Stateful Oper- | For details of the DSO message format, refer to the DNS Stateful | |||
ations specification [RFC8490]. Those details are not repeated here. | Operations specification [RFC8490]. Those details are not repeated | |||
here. | ||||
DNS Push Notification clients and servers MUST support DSO. A single | DNS Push Notification clients and servers MUST support DSO. A single | |||
server can support DNS Queries, DNS Updates, and DNS Push | server can support DNS Queries, DNS Updates, and DNS Push | |||
Notifications (using DSO) on the same TCP port. | Notifications (using DSO) on the same TCP port. | |||
A DNS Push Notification exchange begins with the client discovering | A DNS Push Notification exchange begins with the client discovering | |||
the appropriate server, using the procedure described in Section 6.1, | the appropriate server, using the procedure described in Section 6.1, | |||
and then making a TLS/TCP connection to it. | and then making a TLS/TCP connection to it. | |||
A typical DNS Push Notification client will immediately issue a DSO | After making the TLS/TCP connection to the server, a typical DNS Push | |||
Keepalive operation to request a session timeout and/or keepalive | Notification client will then immediately issue a DSO Keepalive | |||
interval longer than the 15-second default values, but this is not | operation to establish the DSO session and request a session timeout | |||
required. A DNS Push Notification client MAY issue other requests on | and/or keepalive interval longer than the 15-second default values, | |||
the session first, and only issue a DSO Keepalive operation later if | but this is not required. A DNS Push Notification client MAY issue | |||
it determines that to be necessary. Sending either a DSO Keepalive | other requests on the session first, and only issue a DSO Keepalive | |||
operation or a Push Notification subscription request over the TLS/ | operation later if it determines that to be necessary. Sending | |||
TCP connection to the server signals the client's support of DSO and | either a DSO Keepalive operation or a Push Notification subscription | |||
serves to establish a DSO session. | request over the TLS/TCP connection to the server signals the | |||
client's support of DSO and serves to establish a DSO session. | ||||
In accordance with the current set of active subscriptions, the | In accordance with the current set of active subscriptions, the | |||
server sends relevant asynchronous Push Notifications to the client. | server sends relevant asynchronous Push Notifications to the client. | |||
Note that a client MUST be prepared to receive (and silently ignore) | Note that a client MUST be prepared to receive (and silently ignore) | |||
Push Notifications for subscriptions it has previously removed, since | Push Notifications for subscriptions it has previously removed, since | |||
there is no way to prevent the situation where a Push Notification is | there is no way to prevent the situation where a Push Notification is | |||
in flight from server to client while the client's UNSUBSCRIBE | in flight from server to client while the client's UNSUBSCRIBE | |||
message cancelling that subscription is simultaneously in flight from | message canceling that subscription is simultaneously in flight from | |||
client to server. | client to server. | |||
6.1. Discovery | 6.1. Discovery | |||
The first step in establishing a DNS Push Notification subscription | The first step in establishing a DNS Push Notification subscription | |||
is to discover an appropriate DNS server that supports DNS Push | is to discover an appropriate DNS server that supports DNS Push | |||
Notifications for the desired zone. | Notifications for the desired zone. | |||
The client begins by opening a DSO Session to its normal configured | The client begins by opening a DSO session to its normal configured | |||
DNS recursive resolver and requesting a Push Notification | DNS recursive resolver and requesting a Push Notification | |||
subscription. This connection is made to TCP port 853, the default | subscription. This connection is made to TCP port 853, the default | |||
port for DNS-over-TLS [RFC7858]. If the request for a Push | port for DNS over TLS [RFC7858]. If the request for a Push | |||
Notification subscription is successful, and the recursive resolver | Notification subscription is successful, and the recursive resolver | |||
doesn't already have an active subscription for that name, type, and | doesn't already have an active subscription for that name, type, and | |||
class, then the recursive resolver will make a corresponding Push | class, then the recursive resolver will make a corresponding Push | |||
Notification subscription on the client's behalf. Results received | Notification subscription on the client's behalf. Results received | |||
are relayed to the client. This is closely analogous to how a client | are relayed to the client. This is closely analogous to how a client | |||
sends a normal DNS query to its configured DNS recursive resolver | sends a normal DNS query to its configured DNS recursive resolver, | |||
which, if it doesn't already have appropriate answer(s) in its cache, | which, if it doesn't already have appropriate answer(s) in its cache, | |||
issues an upstream query to satisfy the request. | issues an upstream query to satisfy the request. | |||
In many contexts, the recursive resolver will be able to handle Push | In many contexts, the recursive resolver will be able to handle Push | |||
Notifications for all names that the client may need to follow. Use | Notifications for all names that the client may need to follow. Use | |||
of VPN tunnels and Private DNS [RFC8499] can create some additional | of VPN tunnels and Private DNS [RFC8499] can create some additional | |||
complexity in the client software here; the techniques to handle VPN | complexity in the client software here; the techniques to handle VPN | |||
tunnels and Private DNS for DNS Push Notifications are the same as | tunnels and Private DNS for DNS Push Notifications are the same as | |||
those already used to handle this for normal DNS queries. | those already used to handle this for normal DNS queries. | |||
If the recursive resolver does not support DNS over TLS, or supports | If the recursive resolver does not support DNS over TLS, or supports | |||
DNS over TLS but is not listening on TCP port 853, or supports DNS | DNS over TLS but is not listening on TCP port 853, or supports DNS | |||
over TLS on TCP port 853 but does not support DSO on that port, then | over TLS on TCP port 853 but does not support DSO on that port, then | |||
the DSO Session session establishment will fail [RFC8490]. | the DSO session establishment will fail [RFC8490]. | |||
If the recursive resolver does support DSO but not Push Notification | If the recursive resolver does support DSO on TCP port 853 but does | |||
subscriptions, then it will return the DSO error code DSOTYPENI (11). | not support Push Notification subscriptions, then when the client | |||
attempts to create a subscription, the server will return the DSO | ||||
error code DSOTYPENI (11). | ||||
In some cases, the recursive resolver may support DSO and Push | In some cases, the recursive resolver may support DSO and Push | |||
Notification subscriptions, but may not be able to subscribe for Push | Notification subscriptions but may not be able to subscribe for Push | |||
Notifications for a particular name. In this case, the recursive | Notifications for a particular name. In this case, the recursive | |||
resolver should return SERVFAIL to the client. This includes being | resolver should return SERVFAIL to the client. This includes being | |||
unable to establish a connection to the zone's DNS Push Notification | unable to establish a connection to the zone's DNS Push Notification | |||
server or establishing a connection but receiving a non success | server or establishing a connection but receiving a non-success | |||
response code. In some cases, where the client has a pre-established | response code. In some cases, where the client has a pre-established | |||
trust relationship with the owner of the zone (that is not handled | trust relationship with the owner of the zone (that is not handled | |||
via the usual mechanisms for VPN software) the client may handle | via the usual mechanisms for VPN software), the client may handle | |||
these failures by contacting the zone's DNS Push server directly. | these failures by contacting the zone's DNS Push Notification server | |||
directly. | ||||
In any of the cases described above where the client fails to | In any of the cases described above where the client fails to | |||
establish a DNS Push Notification subscription via its configured | establish a DNS Push Notification subscription via its configured | |||
recursive resolver, the client should proceed to discover the | recursive resolver, the client should proceed to discover the | |||
appropriate server for direct communication. The client MUST also | appropriate server for direct communication. The client MUST also | |||
determine which TCP port on the server is listening for connections, | determine on which TCP port the server is listening for connections, | |||
which need not be (and often is not) the typical TCP port 53 used for | which need not be, and often is not, TCP port 53 (traditionally used | |||
conventional DNS, or TCP port 853 used for DNS over TLS. | for conventional DNS) or TCP port 853 (traditionally used for DNS | |||
over TLS). | ||||
The discovery algorithm described here is an iterative algorithm, | The discovery algorithm described here is an iterative algorithm, | |||
which starts with the full name of the record to which the client | which starts with the full name of the record to which the client | |||
wishes to subscribe. Successive SOA queries are then issued, | wishes to subscribe. Successive SOA queries are then issued, | |||
trimming one label each time, until the closest enclosing | trimming one label each time, until the closest enclosing | |||
authoritative server is discovered. There is also an optimization to | authoritative server is discovered. There is also an optimization to | |||
enable the client to take a "short cut" directly to the SOA record of | enable the client to take a "short cut" directly to the SOA record of | |||
the closest enclosing authoritative server in many cases. | the closest enclosing authoritative server in many cases. | |||
1. The client begins the discovery by sending a DNS query to its | 1. The client begins the discovery by sending a DNS query to its | |||
local resolver, with record type SOA [RFC1035] for the record | local resolver, with record type SOA [RFC1035] for the record | |||
name to which it wishes to subscribe. As an example, suppose the | name to which it wishes to subscribe. As an example, suppose the | |||
client wishes to subscribe to PTR records with the name | client wishes to subscribe to PTR records with the name | |||
_ipp._tcp.headoffice.example.com (to discover Internet Printing | "_ipp._tcp.headoffice.example.com" (to discover Internet Printing | |||
Protocol (IPP) printers [RFC8010] [RFC8011] being advertised in | Protocol (IPP) printers [RFC8010] [RFC8011] being advertised in | |||
the head office of Example Company.). The client begins by | the head office of Example Company). The client begins by | |||
sending an SOA query for _ipp._tcp.headoffice.example.com to the | sending an SOA query for "_ipp._tcp.headoffice.example.com" to | |||
local recursive resolver. The goal is to determine the server | the local recursive resolver. The goal is to determine the | |||
authoritative for the name _ipp._tcp.headoffice.example.com. The | server that is authoritative for the name | |||
closest enclosing DNS zone containing the name | "_ipp._tcp.headoffice.example.com". The closest enclosing DNS | |||
_ipp._tcp.headoffice.example.com could be example.com, or | zone containing the name "_ipp._tcp.headoffice.example.com" could | |||
headoffice.example.com, or _tcp.headoffice.example.com, or even | be "example.com", or "headoffice.example.com", or | |||
_ipp._tcp.headoffice.example.com. The client does not know in | "_tcp.headoffice.example.com", or even | |||
"_ipp._tcp.headoffice.example.com". The client does not know in | ||||
advance where the closest enclosing zone cut occurs, which is why | advance where the closest enclosing zone cut occurs, which is why | |||
it uses the iterative procedure described here to discover this | it uses the iterative procedure described here to discover this | |||
information. | information. | |||
2. If the requested SOA record exists, it will be returned in the | 2. If the requested SOA record exists, it will be returned in the | |||
Answer section with a NOERROR response code, and the client has | Answer Section with a NOERROR response code, and the client has | |||
succeeded in discovering the information it needs. | succeeded in discovering the information it needs. | |||
(This language is not placing any new requirements on DNS | (This language is not placing any new requirements on DNS | |||
recursive resolvers. This text merely describes the existing | recursive resolvers. This text merely describes the existing | |||
operation of the DNS protocol [RFC1034] [RFC1035].) | operation of the DNS protocol [RFC1034] [RFC1035].) | |||
3. If the requested SOA record does not exist, the client will get | 3. If the requested SOA record does not exist, the client will get | |||
back a NOERROR/NODATA response or an NXDOMAIN/Name Error | back a NOERROR/NODATA response or an NXDOMAIN/Name Error | |||
response. In either case, the local resolver would normally | response. In either case, the local resolver would normally | |||
include the SOA record for the closest enclosing zone of the | include the SOA record for the closest enclosing zone of the | |||
requested name in the Authority Section. If the SOA record is | requested name in the Authority Section. If the SOA record is | |||
received in the Authority Section, then the client has succeeded | received in the Authority Section, then the client has succeeded | |||
skipping to change at page 10, line 49 ¶ | skipping to change at line 451 ¶ | |||
recursive resolvers. This text merely describes the existing | recursive resolvers. This text merely describes the existing | |||
operation of the DNS protocol [RFC1034] [RFC1035].) | operation of the DNS protocol [RFC1034] [RFC1035].) | |||
3. If the requested SOA record does not exist, the client will get | 3. If the requested SOA record does not exist, the client will get | |||
back a NOERROR/NODATA response or an NXDOMAIN/Name Error | back a NOERROR/NODATA response or an NXDOMAIN/Name Error | |||
response. In either case, the local resolver would normally | response. In either case, the local resolver would normally | |||
include the SOA record for the closest enclosing zone of the | include the SOA record for the closest enclosing zone of the | |||
requested name in the Authority Section. If the SOA record is | requested name in the Authority Section. If the SOA record is | |||
received in the Authority Section, then the client has succeeded | received in the Authority Section, then the client has succeeded | |||
in discovering the information it needs. | in discovering the information it needs. | |||
(This language is not placing any new requirements on DNS | (This language is not placing any new requirements on DNS | |||
recursive resolvers. This text merely describes the existing | recursive resolvers. This text merely describes the existing | |||
operation of the DNS protocol regarding negative responses | operation of the DNS protocol regarding negative responses | |||
[RFC2308].) | [RFC2308].) | |||
4. If the client receives a response containing no SOA record, then | 4. If the client receives a response containing no SOA record, then | |||
it proceeds with the iterative approach. The client strips the | it proceeds with the iterative approach. The client strips the | |||
leading label from the current query name, and if the resulting | leading label from the current query name, and if the resulting | |||
name has at least two labels in it, the client sends an SOA query | name has at least two labels in it, then the client sends an SOA | |||
for that new name, and processing continues at step 2 above, | query for that new name and processing continues at step 2 above, | |||
repeating the iterative search until either an SOA is received, | repeating the iterative search until either an SOA is received or | |||
or the query name consists of a single label, i.e., a Top Level | the query name consists of a single label, i.e., a Top-Level | |||
Domain (TLD). In the case of a single-label name (TLD), this is | Domain (TLD). In the case of a single-label name (TLD), this is | |||
a network configuration error, which should not happen, and the | a network configuration error, which should not happen, and the | |||
client gives up. The client may retry the operation at a later | client gives up. The client may retry the operation at a later | |||
time, of the client's choosing, such after a change in network | time of the client's choosing, such as after a change in network | |||
attachment. | attachment. | |||
5. Once the SOA is known (either by virtue of being seen in the | 5. Once the SOA is known (by virtue of being seen either in the | |||
Answer Section, or in the Authority Section), the client sends a | Answer Section or in the Authority Section), the client sends a | |||
DNS query with type SRV [RFC2782] for the record name | DNS query with type SRV [RFC2782] for the record name | |||
"_dns-push-tls._tcp.<zone>", where <zone> is the owner name of | "_dns-push-tls._tcp.<zone>", where <zone> is the owner name of | |||
the discovered SOA record. | the discovered SOA record. | |||
6. If the zone in question is set up to offer DNS Push Notifications | 6. If the zone in question is set up to offer DNS Push | |||
then this SRV record MUST exist. (If this SRV record does not | Notifications, then this SRV record MUST exist. (If this SRV | |||
exist then the zone is not correctly configured for DNS Push | record does not exist, then the zone is not correctly configured | |||
Notifications as specified in this document.) The SRV "target" | for DNS Push Notifications as specified in this document.) The | |||
contains the name of the server providing DNS Push Notifications | SRV "target" contains the name of the server providing DNS Push | |||
for the zone. The port number on which to contact the server is | Notifications for the zone. The port number on which to contact | |||
in the SRV record "port" field. The address(es) of the target | the server is in the SRV record "port" field. The address(es) of | |||
host MAY be included in the Additional Section, however, the | the target host MAY be included in the Additional Section, | |||
address records SHOULD be authenticated before use as described | however, the address records SHOULD be authenticated before use | |||
below in Section 7.2 and in the specification for using DANE TLSA | as described in Section 7.2 and in the specification for using | |||
Records with SRV Records [RFC7673], if applicable. | DNS-Based Authentication of Named Entities (DANE) TLSA Records | |||
with SRV Records [RFC7673], if applicable. | ||||
7. More than one SRV record may be returned. In this case, the | 7. More than one SRV record may be returned. In this case, the | |||
"priority" and "weight" values in the returned SRV records are | "priority" and "weight" values in the returned SRV records are | |||
used to determine the order in which to contact the servers for | used to determine the order in which to contact the servers for | |||
subscription requests. As described in the SRV specification | subscription requests. As described in the SRV specification | |||
[RFC2782], the server with the lowest "priority" is first | [RFC2782], the server with the lowest "priority" is first | |||
contacted. If more than one server has the same "priority", the | contacted. If more than one server has the same "priority", the | |||
"weight" indicates the weighted probability that the client | "weight" indicates the weighted probability that the client | |||
should contact that server. Higher weights have higher | should contact that server. Higher weights have higher | |||
probabilities of being selected. If a server is not willing to | probabilities of being selected. If a server is not willing to | |||
accept a subscription request, or is not reachable within a | accept a subscription request, or is not reachable within a | |||
reasonable time, as determined by the client, then a subsequent | reasonable time, as determined by the client, then a subsequent | |||
server is to be contacted. | server is to be contacted. | |||
Each time a client makes a new DNS Push Notification subscription, it | Each time a client makes a new DNS Push Notification subscription, it | |||
SHOULD repeat the discovery process in order to determine the | SHOULD repeat the discovery process in order to determine the | |||
preferred DNS server for that subscription at that time. If a client | preferred DNS server for that subscription at that time. If a client | |||
already has a DSO session with that DNS server the client SHOULD | already has a DSO session with that DNS server, the client SHOULD | |||
reuse that existing DSO session for the new subscription, otherwise, | reuse that existing DSO session for the new subscription; otherwise, | |||
a new DSO session is established. The client MUST respect the DNS | a new DSO session is established. The client MUST respect the DNS | |||
TTL values on records it receives while performing the discovery | TTL values on records it receives while performing the discovery | |||
process and store them in its local cache with this lifetime (as it | process and store them in its local cache with this lifetime (as it | |||
will generally be do anyway for all DNS queries it performs). This | will generally do anyway for all DNS queries it performs). This | |||
means that, as long as the DNS TTL values on the authoritative | means that, as long as the DNS TTL values on the authoritative | |||
records are set to reasonable values, repeated application of the | records are set to reasonable values, repeated application of the | |||
discovery process can be completed nearly instantaneously by the | discovery process can be completed practically instantaneously by the | |||
client, using only locally-stored cached data. | client, using only locally stored cached data. | |||
6.2. DNS Push Notification SUBSCRIBE | 6.2. DNS Push Notification SUBSCRIBE | |||
After connecting, and requesting a longer idle timeout and/or | After connecting, and requesting a longer idle timeout and/or | |||
keepalive interval if necessary, a DNS Push Notification client | keepalive interval if necessary, a DNS Push Notification client then | |||
then indicates its desire to receive DNS Push Notifications for | indicates its desire to receive DNS Push Notifications for a given | |||
a given domain name by sending a SUBSCRIBE request to the server. | domain name by sending a SUBSCRIBE request to the server. A | |||
A SUBSCRIBE request is encoded in a DSO message [RFC8490]. | SUBSCRIBE request is encoded in a DSO message [RFC8490]. This | |||
This specification defines a primary DSO TLV for DNS Push | specification defines a DSO Primary TLV for DNS Push Notification | |||
Notification SUBSCRIBE Requests (tentatively DSO Type Code 0x40). | SUBSCRIBE Requests (DSO Type Code 0x0040). | |||
DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted | DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted | |||
in TLS early data, provided that the precautions described in | in TLS early data, provided that the precautions described in | |||
Section 7.3 are followed. | Section 7.3 are followed. | |||
The entity that initiates a SUBSCRIBE request is by definition the | The entity that initiates a SUBSCRIBE request is by definition the | |||
client. A server MUST NOT send a SUBSCRIBE request over an existing | client. A server MUST NOT send a SUBSCRIBE request over an existing | |||
session from a client. If a server does send a SUBSCRIBE request | session from a client. If a server does send a SUBSCRIBE request | |||
over a DSO session initiated by a client, this is a fatal error and | over a DSO session initiated by a client, this is a fatal error and | |||
the client MUST forcibly abort the connection immediately. | the client MUST forcibly abort the connection immediately. | |||
Each SUBSCRIBE request generates exactly one SUBSCRIBE response from | Each SUBSCRIBE request generates exactly one SUBSCRIBE response from | |||
the server. The entity that initiates a SUBSCRIBE response is by | the server. The entity that initiates a SUBSCRIBE response is by | |||
definition the server. A client MUST NOT send a SUBSCRIBE response. | definition the server. A client MUST NOT send a SUBSCRIBE response. | |||
If a client does send a SUBSCRIBE response, this is a fatal error and | If a client does send a SUBSCRIBE response, this is a fatal error and | |||
the server MUST forcibly abort the connection immediately. | the server MUST forcibly abort the connection immediately. | |||
6.2.1. SUBSCRIBE Request | 6.2.1. SUBSCRIBE Request | |||
A SUBSCRIBE request begins with the standard DSO 12-byte header | A SUBSCRIBE request begins with the standard DSO 12-byte header | |||
[RFC8490], followed by the SUBSCRIBE primary TLV. A SUBSCRIBE | [RFC8490], followed by the SUBSCRIBE Primary TLV. A SUBSCRIBE | |||
request is illustrated in Figure 1. | request is illustrated in Figure 1. | |||
The MESSAGE ID field MUST be set to a unique value, that the client | The MESSAGE ID field MUST be set to a unique value that the client is | |||
is not using for any other active operation on this DSO session. For | not using for any other active operation on this DSO session. For | |||
the purposes here, a MESSAGE ID is in use on this session if the | the purposes here, a MESSAGE ID is in use on this session if either | |||
client has used it in a request for which it has not yet received a | the client has used it in a request for which it has not yet received | |||
response, or if the client has used it for a subscription which it | a response, or if the client has used it for a subscription that it | |||
has not yet cancelled using UNSUBSCRIBE. In the SUBSCRIBE response | has not yet canceled using UNSUBSCRIBE. In the SUBSCRIBE response, | |||
the server MUST echo back the MESSAGE ID value unchanged. | the server MUST echo back the MESSAGE ID value unchanged. | |||
The other header fields MUST be set as described in the DSO spec- | The other header fields MUST be set as described in the DSO | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | specification [RFC8490]. The DNS OPCODE field contains the OPCODE | |||
for DNS Stateful Operations (6). The four count fields must be zero, | value for DNS Stateful Operations (6). The four count fields must be | |||
and the corresponding four sections must be empty (i.e., absent). | zero, and the corresponding four sections must be empty (i.e., | |||
absent). | ||||
The DSO-TYPE is SUBSCRIBE (tentatively 0x40). | The DSO-TYPE is SUBSCRIBE (0x0040). | |||
The DSO-LENGTH is the length of the DSO-DATA that follows, which | The DSO-LENGTH is the length of the DSO-DATA that follows, which | |||
specifies the name, type, and class of the record(s) being sought. | specifies the name, type, and class of the record(s) being sought. | |||
1 1 1 1 1 1 | 1 1 1 1 1 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| MESSAGE ID | \ | | MESSAGE ID | \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
|QR| OPCODE(6) | Z | RCODE | | | |QR| OPCODE(6) | Z | RCODE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| QDCOUNT (MUST BE ZERO) | | | | QDCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | |||
| ANCOUNT (MUST BE ZERO) | | | | ANCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| NSCOUNT (MUST BE ZERO) | | | | NSCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| ARCOUNT (MUST BE ZERO) | / | | ARCOUNT (MUST BE ZERO) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
| DSO-TYPE = SUBSCRIBE (tentatively 0x40) | | | DSO-TYPE = SUBSCRIBE (0x0040) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
| DSO-LENGTH (number of octets in DSO-DATA) | | | DSO-LENGTH (number of octets in DSO-DATA) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
\ NAME \ \ | \ NAME \ \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| TYPE | > DSO-DATA | | TYPE | > DSO-DATA | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| CLASS | / | | CLASS | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
skipping to change at page 14, line 46 ¶ | skipping to change at line 605 ¶ | |||
The DSO-DATA for a SUBSCRIBE request MUST contain exactly one NAME, | The DSO-DATA for a SUBSCRIBE request MUST contain exactly one NAME, | |||
TYPE, and CLASS. Since SUBSCRIBE requests are sent over TCP, | TYPE, and CLASS. Since SUBSCRIBE requests are sent over TCP, | |||
multiple SUBSCRIBE DSO request messages can be concatenated in a | multiple SUBSCRIBE DSO request messages can be concatenated in a | |||
single TCP stream and packed efficiently into TCP segments. | single TCP stream and packed efficiently into TCP segments. | |||
If accepted, the subscription will stay in effect until the client | If accepted, the subscription will stay in effect until the client | |||
cancels the subscription using UNSUBSCRIBE or until the DSO session | cancels the subscription using UNSUBSCRIBE or until the DSO session | |||
between the client and the server is closed. | between the client and the server is closed. | |||
SUBSCRIBE requests on a given session MUST be unique. A client MUST | SUBSCRIBE requests on a given session MUST be unique. A client MUST | |||
NOT send a SUBSCRIBE message that duplicates the NAME, TYPE and CLASS | NOT send a SUBSCRIBE message that duplicates the name, type and class | |||
of an existing active subscription on that DSO session. For the | of an existing active subscription on that DSO session. For the | |||
purpose of this matching, the established DNS case-insensitivity for | purpose of this matching, the established DNS case insensitivity for | |||
US-ASCII letters [RFC0020] applies (e.g., "example.com" and | US-ASCII letters [RFC0020] applies (e.g., "example.com" and | |||
"Example.com" are the same). If a server receives such a duplicate | "Example.com" are the same). If a server receives such a duplicate | |||
SUBSCRIBE message, this is a fatal error and the server MUST forcibly | SUBSCRIBE message, this is a fatal error and the server MUST forcibly | |||
abort the connection immediately. | abort the connection immediately. | |||
DNS wildcarding is not supported. That is, a wildcard ("*") in a | DNS wildcarding is not supported. That is, an asterisk character | |||
SUBSCRIBE message matches only a literal wildcard character ("*") in | ("*") in a SUBSCRIBE message matches only a literal asterisk | |||
the zone, and nothing else. | character ("*") in a name and nothing else. Similarly, a CNAME in a | |||
SUBSCRIBE message matches only a CNAME record with that name in the | ||||
Aliasing is not supported. That is, a CNAME in a SUBSCRIBE message | zone and no other records with that name. | |||
matches only a literal CNAME record in the zone, and no other records | ||||
with the same owner name. | ||||
A client may SUBSCRIBE to records that are unknown to the server at | A client may SUBSCRIBE to records that are unknown to the server at | |||
the time of the request (providing that the name falls within one of | the time of the request (providing that the name falls within one of | |||
the zone(s) the server is responsible for) and this is not an error. | the zone(s) the server is responsible for), and this is not an error. | |||
The server MUST NOT return NXDOMAIN in this case. The server MUST | The server MUST NOT return NXDOMAIN in this case. The server MUST | |||
accept these requests and send Push Notifications if and when | accept these requests and send Push Notifications if and when | |||
matching records are found in the future. | matching records are found in the future. | |||
If neither TYPE nor CLASS are ANY (255) then this is a specific | If neither TYPE nor CLASS are ANY (255), then this is a specific | |||
subscription to changes for the given NAME, TYPE and CLASS. If one | subscription to changes for the given name, type, and class. If one | |||
or both of TYPE or CLASS are ANY (255) then this subscription matches | or both of TYPE or CLASS are ANY (255), then this subscription | |||
any type and/or any class, as appropriate. | matches all types and/or all classes as appropriate. | |||
NOTE: A little-known quirk of DNS is that in DNS QUERY requests, | NOTE: A little-known quirk of DNS is that in DNS QUERY requests, | |||
QTYPE and QCLASS 255 mean "ANY" not "ALL". They indicate that the | QTYPE and QCLASS 255 mean "ANY", not "ALL". They indicate that the | |||
server should respond with ANY matching records of its choosing, not | server should respond with ANY matching records of its choosing, not | |||
necessarily ALL matching records. This can lead to some surprising | necessarily ALL matching records. This can lead to some surprising | |||
and unexpected results, where a query returns some valid answers but | and unexpected results, where a query returns some valid answers, but | |||
not all of them, and makes QTYPE = 255 (ANY) queries less useful than | not all of them, and makes QTYPE = 255 (ANY) queries less useful than | |||
people sometimes imagine. | people sometimes imagine. | |||
When used in conjunction with SUBSCRIBE, TYPE and CLASS 255 should be | When used in conjunction with SUBSCRIBE, TYPE 255 and CLASS 255 | |||
interpreted to mean "ALL", not "ANY". After accepting a subscription | should be interpreted to mean "ALL", not "ANY". After accepting a | |||
where one or both of TYPE or CLASS are 255, the server MUST send Push | subscription where one or both of TYPE or CLASS are 255, the server | |||
Notification Updates for ALL record changes that match the | MUST send Push Notification Updates for ALL record changes that match | |||
subscription, not just some of them. | the subscription, not just some of them. | |||
6.2.2. SUBSCRIBE Response | 6.2.2. SUBSCRIBE Response | |||
A SUBSCRIBE response begins with the standard DSO 12-byte header | A SUBSCRIBE response begins with the standard DSO 12-byte header | |||
[RFC8490]. The QR bit in the header is set indicating it is a | [RFC8490]. The QR bit in the header is set indicating it is a | |||
response. The header MAY be followed by one or more optional TLVs, | response. The header MAY be followed by one or more optional | |||
such as a Retry Delay TLV. A SUBSCRIBE response is illustrated in | Additional TLVs such as a Retry Delay Additional TLV. A SUBSCRIBE | |||
Figure 2. | response is illustrated in Figure 2. | |||
The MESSAGE ID field MUST echo the value given in the MESSAGE ID | The MESSAGE ID field MUST echo the value given in the MESSAGE ID | |||
field of the SUBSCRIBE request. This is how the client knows which | field of the SUBSCRIBE request. This is how the client knows which | |||
request is being responded to. | request is being responded to. | |||
The other header fields MUST be set as described in the DSO spec- | The other header fields MUST be set as described in the DSO | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | specification [RFC8490]. The DNS OPCODE field contains the OPCODE | |||
for DNS Stateful Operations (6). The four count fields must be zero, | value for DNS Stateful Operations (6). The four count fields must be | |||
and the corresponding four sections must be empty (i.e., absent). | zero, and the corresponding four sections must be empty (i.e., | |||
absent). | ||||
A SUBSCRIBE response message MUST NOT include a SUBSCRIBE TLV. If a | A SUBSCRIBE response message MUST NOT include a SUBSCRIBE TLV. If a | |||
client receives a SUBSCRIBE response message containing a SUBSCRIBE | client receives a SUBSCRIBE response message containing a SUBSCRIBE | |||
TLV then the response message is processed but the SUBSCRIBE TLV MUST | TLV, then the response message is processed but the SUBSCRIBE TLV | |||
be silently ignored. | MUST be silently ignored. | |||
1 1 1 1 1 1 | 1 1 1 1 1 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| MESSAGE ID | \ | | MESSAGE ID | \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
|QR| OPCODE(6) | Z | RCODE | | | |QR| OPCODE(6) | Z | RCODE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| QDCOUNT (MUST BE ZERO) | | | | QDCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | |||
| ANCOUNT (MUST BE ZERO) | | | | ANCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| NSCOUNT (MUST BE ZERO) | | | | NSCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| ARCOUNT (MUST BE ZERO) | / | | ARCOUNT (MUST BE ZERO) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
Figure 2: SUBSCRIBE Response | Figure 2: SUBSCRIBE Response | |||
In the SUBSCRIBE response the RCODE indicates whether or not the | In the SUBSCRIBE response, the RCODE indicates whether or not the | |||
subscription was accepted. Supported RCODEs are as follows: | subscription was accepted. Supported RCODEs are as follows: | |||
+-----------+-------+-----------------------------------------------+ | +-----------+-------+-----------------------------------+ | |||
| Mnemonic | Value | Description | | | Mnemonic | Value | Description | | |||
+-----------+-------+-----------------------------------------------+ | +===========+=======+===================================+ | |||
| NOERROR | 0 | SUBSCRIBE successful. | | | NOERROR | 0 | SUBSCRIBE successful. | | |||
| FORMERR | 1 | Server failed to process request due to a | | +-----------+-------+-----------------------------------+ | |||
| | | malformed request. | | | FORMERR | 1 | Server failed to process request | | |||
| SERVFAIL | 2 | Server failed to process request due to a | | | | | due to a malformed request. | | |||
| | | problem with the server. | | +-----------+-------+-----------------------------------+ | |||
| NOTIMP | 4 | Server does not implement DSO. | | | SERVFAIL | 2 | Server failed to process request | | |||
| REFUSED | 5 | Server refuses to process request for policy | | | | | due to a problem with the server. | | |||
| | | or security reasons. | | +-----------+-------+-----------------------------------+ | |||
| NOTAUTH | 9 | Server is not authoritative for the requested | | | NOTIMP | 4 | Server does not implement DSO. | | |||
| | | name. | | +-----------+-------+-----------------------------------+ | |||
| DSOTYPENI | 11 | SUBSCRIBE operation not supported. | | | REFUSED | 5 | Server refuses to process request | | |||
+-----------+-------+-----------------------------------------------+ | | | | for policy or security reasons. | | |||
+-----------+-------+-----------------------------------+ | ||||
| NOTAUTH | 9 | Server is not authoritative for | | ||||
| | | the requested name. | | ||||
+-----------+-------+-----------------------------------+ | ||||
| DSOTYPENI | 11 | SUBSCRIBE operation not | | ||||
| | | supported. | | ||||
+-----------+-------+-----------------------------------+ | ||||
Table 1: SUBSCRIBE Response codes | Table 1: SUBSCRIBE Response Codes | |||
This document specifies only these RCODE values for SUBSCRIBE | This document specifies only these RCODE values for SUBSCRIBE | |||
Responses. Servers sending SUBSCRIBE Responses SHOULD use one of | Responses. Servers sending SUBSCRIBE Responses SHOULD use one of | |||
these values. Note that NXDOMAIN is not a valid RCODE in response to | these values. Note that NXDOMAIN is not a valid RCODE in response to | |||
a SUBSCRIBE Request. However, future circumstances may create | a SUBSCRIBE Request. However, future circumstances may create | |||
situations where other RCODE values are appropriate in SUBSCRIBE | situations where other RCODE values are appropriate in SUBSCRIBE | |||
Responses, so clients MUST be prepared to accept SUBSCRIBE Responses | Responses, so clients MUST be prepared to accept and handle SUBSCRIBE | |||
with any other RCODE value. | Responses with any other nonzero RCODE error values. | |||
If the server sends a nonzero RCODE in the SUBSCRIBE response, that | If the server sends a nonzero RCODE in the SUBSCRIBE response, that | |||
means: | means: | |||
a. the client is (at least partially) misconfigured, or | a. the client is (at least partially) misconfigured, or | |||
b. the server resources are exhausted, or | b. the server resources are exhausted, or | |||
c. there is some other unknown failure on the server. | c. there is some other unknown failure on the server. | |||
In any case, the client shouldn't retry the subscription to this | In any case, the client shouldn't retry the subscription to this | |||
server right away. If multiple SRV records were returned as | server right away. If multiple SRV records were returned as | |||
described in Section 6.1, Paragraph 7, a subsequent server MAY be | described in Section 6.1, Paragraph 9, Item 7, a subsequent server | |||
tried immediately. | MAY be tried immediately. | |||
If the client has other successful subscriptions to this server, | If the client has other successful subscriptions to this server, | |||
these subscriptions remain even though additional subscriptions may | these subscriptions remain even though additional subscriptions may | |||
be refused. Neither the client nor the server are required to close | be refused. Neither the client nor the server is required to close | |||
the connection, although, either end may choose to do so. | the connection, although either end may choose to do so. | |||
If the server sends a nonzero RCODE then it SHOULD append a Retry | If the server sends a nonzero RCODE, then it SHOULD append a Retry | |||
Delay TLV [RFC8490] to the response specifying a delay before the | Delay Additional TLV [RFC8490] to the response specifying a delay | |||
client attempts this operation again. Recommended values for the | before the client attempts this operation again. Recommended values | |||
delay for different RCODE values are given below. These recommended | for the delay for different RCODE values are given below. These | |||
values apply both to the default values a server should place in the | recommended values apply both to the default values a server should | |||
Retry Delay TLV, and the default values a client should assume if the | place in the Retry Delay Additional TLV and the default values a | |||
server provides no Retry Delay TLV. | client should assume if the server provides no Retry Delay Additional | |||
TLV. | ||||
For RCODE = 1 (FORMERR) the delay may be any value selected by the | For RCODE = 1 (FORMERR), the delay may be any value selected by | |||
implementer. A value of five minutes is RECOMMENDED, to reduce | the implementer. A value of five minutes is RECOMMENDED to reduce | |||
the risk of high load from defective clients. | the risk of high load from defective clients. | |||
For RCODE = 2 (SERVFAIL) the delay should be chosen according to | For RCODE = 2 (SERVFAIL), the delay should be chosen according to | |||
the level of server overload and the anticipated duration of that | the level of server overload and the anticipated duration of that | |||
overload. By default, a value of one minute is RECOMMENDED. If a | overload. By default, a value of one minute is RECOMMENDED. If a | |||
more serious server failure occurs, the delay may be longer in | more serious server failure occurs, the delay may be longer in | |||
accordance with the specific problem encountered. | accordance with the specific problem encountered. | |||
For RCODE = 4 (NOTIMP), which occurs on a server that doesn't | For RCODE = 4 (NOTIMP), which occurs on a server that doesn't | |||
implement DNS Stateful Operations [RFC8490], it is unlikely that | implement DNS Stateful Operations [RFC8490], it is unlikely that | |||
the server will begin supporting DSO in the next few minutes, so | the server will begin supporting DSO in the next few minutes, so | |||
the retry delay SHOULD be one hour. Note that in such a case, a | the retry delay SHOULD be one hour. Note that in such a case, a | |||
server that doesn't implement DSO is unlikely to place a Retry | server that doesn't implement DSO is unlikely to place a Retry | |||
Delay TLV in its response, so this recommended value in particular | Delay Additional TLV in its response, so this recommended value in | |||
applies to what a client should assume by default. | particular applies to what a client should assume by default. | |||
For RCODE = 5 (REFUSED), which occurs on a server that implements | For RCODE = 5 (REFUSED), which occurs on a server that implements | |||
DNS Push Notifications, but is currently configured to disallow | DNS Push Notifications but is currently configured to disallow DNS | |||
DNS Push Notifications, the retry delay may be any value selected | Push Notifications, the retry delay may be any value selected by | |||
by the implementer and/or configured by the operator. | the implementer and/or configured by the operator. | |||
If the server being queried is listed in a | If the server being queried is listed in a | |||
"_dns-push-tls._tcp.<zone>" SRV record for the zone, then this is | "_dns-push-tls._tcp.<zone>" SRV record for the zone, then this is | |||
a misconfiguration, since this server is being advertised as | a misconfiguration, since this server is being advertised as | |||
supporting DNS Push Notifications for this zone, but the server | supporting DNS Push Notifications for this zone, but the server | |||
itself is not currently configured to perform that task. Since it | itself is not currently configured to perform that task. Since it | |||
is possible that the misconfiguration may be repaired at any time, | is possible that the misconfiguration may be repaired at any time, | |||
the retry delay should not be set too high. By default, a value | the retry delay should not be set too high. By default, a value | |||
of 5 minutes is RECOMMENDED. | of 5 minutes is RECOMMENDED. | |||
For RCODE = 9 (NOTAUTH), which occurs on a server that implements | For RCODE = 9 (NOTAUTH), which occurs on a server that implements | |||
DNS Push Notifications, but is not configured to be authoritative | DNS Push Notifications but is not configured to be authoritative | |||
for the requested name, the retry delay may be any value selected | for the requested name, the retry delay may be any value selected | |||
by the implementer and/or configured by the operator. | by the implementer and/or configured by the operator. | |||
If the server being queried is listed in a | If the server being queried is listed in a | |||
"_dns-push-tls._tcp.<zone>" SRV record for the zone, then this is | "_dns-push-tls._tcp.<zone>" SRV record for the zone, then this is | |||
a misconfiguration, since this server is being advertised as | a misconfiguration, since this server is being advertised as | |||
supporting DNS Push Notifications for this zone, but the server | supporting DNS Push Notifications for this zone, but the server | |||
itself is not currently configured to perform that task. Since it | itself is not currently configured to perform that task. Since it | |||
is possible that the misconfiguration may be repaired at any time, | is possible that the misconfiguration may be repaired at any time, | |||
the retry delay should not be set too high. By default, a value | the retry delay should not be set too high. By default, a value | |||
skipping to change at page 19, line 21 ¶ | skipping to change at line 807 ¶ | |||
Notifications in the next few minutes, so the retry delay SHOULD | Notifications in the next few minutes, so the retry delay SHOULD | |||
be one hour. | be one hour. | |||
For other RCODE values, the retry delay should be set by the | For other RCODE values, the retry delay should be set by the | |||
server as appropriate for that error condition. By default, a | server as appropriate for that error condition. By default, a | |||
value of 5 minutes is RECOMMENDED. | value of 5 minutes is RECOMMENDED. | |||
For RCODE = 9 (NOTAUTH), the time delay applies to requests for other | For RCODE = 9 (NOTAUTH), the time delay applies to requests for other | |||
names falling within the same zone. Requests for names falling | names falling within the same zone. Requests for names falling | |||
within other zones are not subject to the delay. For all other | within other zones are not subject to the delay. For all other | |||
RCODEs the time delay applies to all subsequent requests to this | RCODEs, the time delay applies to all subsequent requests to this | |||
server. | server. | |||
After sending an error response the server MAY allow the session to | After sending an error response, the server MAY allow the session to | |||
remain open, or MAY send a DNS Push Notification Retry Delay | remain open, or MAY follow it with a DSO Retry Delay operation (using | |||
Operation TLV instructing the client to close the session, as | the Retry Delay Primary TLV) instructing the client to close the | |||
described in the DSO specification [RFC8490]. Clients MUST correctly | session as described in the DSO specification [RFC8490]. Clients | |||
handle both cases. | MUST correctly handle both cases. Note that the DSO Retry Delay | |||
operation (using the Retry Delay Primary TLV) is different to the | ||||
Retry Delay Additional TLV mentioned above. | ||||
6.3. DNS Push Notification Updates | 6.3. DNS Push Notification Updates | |||
Once a subscription has been successfully established, the server | Once a subscription has been successfully established, the server | |||
generates PUSH messages to send to the client as appropriate. In the | generates PUSH messages to send to the client as appropriate. In the | |||
case that the answer set was already non-empty at the moment the | case that the answer set was already non-empty at the moment the | |||
subscription was established, an initial PUSH message will be sent | subscription was established, an initial PUSH message will be sent | |||
immediately following the SUBSCRIBE Response. Subsequent changes to | immediately following the SUBSCRIBE Response. Subsequent changes to | |||
the answer set are then communicated to the client in subsequent PUSH | the answer set are then communicated to the client in subsequent PUSH | |||
messages. | messages. | |||
A client MUST NOT send a PUSH message. If a client does send a PUSH | A client MUST NOT send a PUSH message. If a client does send a PUSH | |||
message, or a PUSH message is sent with the QR bit set indicating | message, or a PUSH message is sent with the QR bit set indicating | |||
that it is a response, this is a fatal error and the receiver MUST | that it is a response, this is a fatal error and the receiver MUST | |||
forcibly abort the connection immediately. | forcibly abort the connection immediately. | |||
6.3.1. PUSH Message | 6.3.1. PUSH Message | |||
A PUSH unidirectional message begins with the standard DSO 12-byte | A PUSH unidirectional message begins with the standard DSO 12-byte | |||
header [RFC8490], followed by the PUSH primary TLV. A PUSH message | header [RFC8490], followed by the PUSH Primary TLV. A PUSH message | |||
is illustrated in Figure 3. | is illustrated in Figure 3. | |||
In accordance with the definition of DSO unidirectional messages, the | In accordance with the definition of DSO unidirectional messages, the | |||
MESSAGE ID field MUST be zero. There is no client response to a PUSH | MESSAGE ID field MUST be zero. There is no client response to a PUSH | |||
message. | message. | |||
The other header fields MUST be set as described in the DSO spec- | The other header fields MUST be set as described in the DSO | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | specification [RFC8490]. The DNS OPCODE field contains the OPCODE | |||
for DNS Stateful Operations (6). The four count fields must be zero, | value for DNS Stateful Operations (6). The four count fields must be | |||
and the corresponding four sections must be empty (i.e., absent). | zero, and the corresponding four sections must be empty (i.e., | |||
absent). | ||||
The DSO-TYPE is PUSH (tentatively 0x41). | The DSO-TYPE is PUSH (0x0041). | |||
The DSO-LENGTH is the length of the DSO-DATA that follows, which | The DSO-LENGTH is the length of the DSO-DATA that follows, which | |||
specifies the changes being communicated. | specifies the changes being communicated. | |||
The DSO-DATA contains one or more change notifications. A PUSH | The DSO-DATA contains one or more change notifications. A PUSH | |||
Message MUST contain at least one change notification. If a PUSH | Message MUST contain at least one change notification. If a PUSH | |||
Message is received that contains no change notifications, this is a | Message is received that contains no change notifications, this is a | |||
fatal error, and the client MUST forcibly abort the connection | fatal error and the client MUST forcibly abort the connection | |||
immediately. | immediately. | |||
The change notification records are formatted similarly to how DNS | The change notification records are formatted similarly to how DNS | |||
Resource Records are conventionally expressed in DNS messages, as | Resource Records are conventionally expressed in DNS messages, as | |||
illustrated in Figure 3, and are interpreted as described below. | illustrated in Figure 3, and are interpreted as described below. | |||
The TTL field holds an unsigned 32-bit integer [RFC2181]. If the TTL | The TTL field holds an unsigned 32-bit integer [RFC2181]. If the TTL | |||
is in the range 0 to 2,147,483,647 seconds (0 to 2^31 - 1, or | is in the range 0 to 2,147,483,647 seconds (0 to 2^(31) - 1, or | |||
0x7FFFFFFF), then a new DNS Resource Record with the given name, | 0x7FFFFFFF), then a new DNS Resource Record with the given name, | |||
type, class and RDATA is added. Type and class MUST NOT be 255 | type, class, and RDATA is added. Type and class MUST NOT be 255 | |||
(ANY). If either type or class are 255 (ANY) this is a fatal error, | (ANY). If either type or class are 255 (ANY), this is a fatal error | |||
and the client MUST forcibly abort the connection immediately. A TTL | and the client MUST forcibly abort the connection immediately. A TTL | |||
of 0 means that this record should be retained for as long as the | of 0 means that this record should be retained for as long as the | |||
subscription is active, and should be discarded immediately the | subscription is active and should be discarded immediately the moment | |||
moment the subscription is cancelled. | the subscription is canceled. | |||
If the TTL has the value 0xFFFFFFFF, then the DNS Resource Record | If the TTL has the value 0xFFFFFFFF, then the DNS Resource Record | |||
with the given name, type, class and RDATA is removed. Type and | with the given name, type, class, and RDATA is removed. Type and | |||
class MUST NOT be 255 (ANY). If either type or class are 255 (ANY) | class MUST NOT be 255 (ANY). If either type or class are 255 (ANY), | |||
this is a fatal error, and the client MUST forcibly abort the | this is a fatal error and the client MUST forcibly abort the | |||
connection immediately. | connection immediately. | |||
If the TTL has the value 0xFFFFFFFE, then this is a 'collective' | If the TTL has the value 0xFFFFFFFE, then this is a 'collective' | |||
remove notification. For collective remove notifications RDLEN MUST | remove notification. For collective remove notifications, RDLEN MUST | |||
be zero and consequently the RDATA MUST be empty. If a change | be zero, and consequently, the RDATA MUST be empty. If a change | |||
notification is received where TTL = 0xFFFFFFFE and RDLEN is not | notification is received where TTL = 0xFFFFFFFE and RDLEN is not | |||
zero, this is a fatal error, and the client MUST forcibly abort the | zero, this is a fatal error and the client MUST forcibly abort the | |||
connection immediately. | connection immediately. | |||
There are three types of collective remove notification: | There are three types of collective remove notification. For | |||
collective remove notifications: | ||||
For collective remove notifications, if CLASS is not 255 (ANY) and | * If CLASS is not 255 (ANY) and TYPE is not 255 (ANY), then for the | |||
TYPE is not 255 (ANY) then for the given name this removes all | given name, this removes all records of the specified type in the | |||
records of the specified type in the specified class. | specified class. | |||
For collective remove notifications, if CLASS is not 255 (ANY) and | * If CLASS is not 255 (ANY) and TYPE is 255 (ANY), then for the | |||
TYPE is 255 (ANY) then for the given name this removes all records of | given name, this removes all records of all types in the specified | |||
all types in the specified class. | class. | |||
For collective remove notifications, if CLASS is 255 (ANY), then for | * If CLASS is 255 (ANY), then for the given name, this removes all | |||
the given name this removes all records of all types in all classes. | records of all types in all classes. In this case, TYPE MUST be | |||
In this case TYPE MUST be set to zero on transmission, and MUST be | set to zero on transmission and MUST be silently ignored on | |||
silently ignored on reception. | reception. | |||
Summary of change notification types: | Summary of change notification types: | |||
Remove all RRsets from a name, in all classes | * Remove all RRsets from a name in all classes: | |||
TTL = 0xFFFFFFFE, RDLEN = 0, CLASS = 255 (ANY) | TTL = 0xFFFFFFFE, RDLEN = 0, CLASS = 255 (ANY). | |||
Remove all RRsets from a name, in given class: | * Remove all RRsets from a name in given class: | |||
TTL = 0xFFFFFFFE, RDLEN = 0, CLASS gives class, TYPE = 255 (ANY) | TTL = 0xFFFFFFFE, RDLEN = 0, CLASS gives class, TYPE = 255 (ANY). | |||
Remove specified RRset from a name, in given class: | * Remove specified RRset from a name in given class: | |||
TTL = 0xFFFFFFFE, RDLEN = 0 | TTL = 0xFFFFFFFE, RDLEN = 0, | |||
CLASS and TYPE specify the RRset being removed | CLASS and TYPE specify the RRset being removed. | |||
Remove an individual RR from a name: | * Remove an individual RR from a name: | |||
TTL = 0xFFFFFFFF | TTL = 0xFFFFFFFF, | |||
CLASS, TYPE, RDLEN and RDATA specify the RR being removed | CLASS, TYPE, RDLEN, and RDATA specify the RR being removed. | |||
Add individual RR to a name | * Add individual RR to a name: | |||
TTL >= 0 and TTL <= 0x7FFFFFFF | TTL >= 0 and TTL <= 0x7FFFFFFF, | |||
CLASS, TYPE, RDLEN, RDATA and TTL specify the RR being added | CLASS, TYPE, RDLEN, RDATA, and TTL specify the RR being added. | |||
Note that it is valid for the RDATA of an added or removed DNS | Note that it is valid for the RDATA of an added or removed DNS | |||
Resource Record to be empty (zero length). For example, an Address | Resource Record to be empty (zero length). For example, an Address | |||
Prefix List Resource Record [RFC3123] may have empty RDATA. | Prefix List Resource Record [RFC3123] may have empty RDATA. | |||
Therefore, a change notification with RDLEN = 0 does not | Therefore, a change notification with RDLEN = 0 does not | |||
automatically indicate a remove notification. If RDLEN = 0 and TTL | automatically indicate a remove notification. If RDLEN = 0 and TTL | |||
is the in the range 0 - 0x7FFFFFFF, this change notification signals | is in the range 0 to 0x7FFFFFFF, this change notification signals the | |||
the addition of a record with the given name, type, class, and empty | addition of a record with the given name, type, class, and empty | |||
RDATA. If RDLEN = 0 and TTL = 0xFFFFFFFF, this change notification | RDATA. If RDLEN = 0 and TTL = 0xFFFFFFFF, this change notification | |||
signals the removal specifically of that single record with the given | signals the removal specifically of that single record with the given | |||
name, type, class, and empty RDATA. | name, type, class, and empty RDATA. | |||
If the TTL is any value other than 0xFFFFFFFF, 0xFFFFFFFE, or a value | If the TTL is any value other than 0xFFFFFFFF, 0xFFFFFFFE, or a value | |||
in the range 0 - 0x7FFFFFFF, then the receiver SHOULD silently ignore | in the range 0 to 0x7FFFFFFF, then the receiver SHOULD silently | |||
this particular change notification record. The connection is not | ignore this particular change notification record. The connection is | |||
terminated and other valid change notification records within this | not terminated and other valid change notification records within | |||
PUSH message are processed as usual. | this PUSH message are processed as usual. | |||
For efficiency, when generating a PUSH message, a server SHOULD | In the case where a single change affects more than one active | |||
subscription, only one PUSH message is sent. For example, a PUSH | ||||
message adding a given record may match both a SUBSCRIBE request with | ||||
the same TYPE and a different SUBSCRIBE request with TYPE = 255 | ||||
(ANY). It is not the case that two PUSH messages are sent because | ||||
the new record matches two active subscriptions. | ||||
The server SHOULD encode change notifications in the most efficient | ||||
manner possible. For example, when three AAAA records are removed | ||||
from a given name, and no other AAAA records exist for that name, the | ||||
server SHOULD send a "Remove specified RRset from a name in given | ||||
class" PUSH message, not three separate "Remove an individual RR from | ||||
a name" PUSH messages. Similarly, when both an SRV and a TXT record | ||||
are removed from a given name, and no other records of any kind exist | ||||
for that name in that class, the server SHOULD send a "Remove all | ||||
RRsets from a name in given class" PUSH message, not two separate | ||||
"Remove specified RRset from a name in given class" PUSH messages. | ||||
For efficiency, when generating a PUSH message, rather than sending | ||||
each change notification as a separate DSO message, a server SHOULD | ||||
include as many change notifications as it has immediately available | include as many change notifications as it has immediately available | |||
to send, rather than sending each change notification as a separate | to send to that client, even if those change notifications apply to | |||
DSO message. Once it has exhausted the list of change notifications | different subscriptions from that client. Conceptually, a PUSH | |||
immediately available to send, a server SHOULD then send the PUSH | message is a session-level mechanism, not a subscription-level | |||
message immediately, rather than waiting to see if additional change | mechanism. Once it has exhausted the list of change notifications | |||
notifications become available. | immediately available to send to that client, a server SHOULD then | |||
send the PUSH message immediately rather than waiting speculatively | ||||
to see if additional change notifications become available. | ||||
For efficiency, when generating a PUSH message, a server SHOULD use | For efficiency, when generating a PUSH message a server SHOULD use | |||
standard DNS name compression, with offsets relative to the beginning | standard DNS name compression, with offsets relative to the beginning | |||
of the DNS message [RFC1035]. When multiple change notifications in | of the DNS message [RFC1035]. When multiple change notifications in | |||
a single PUSH message have the same owner name, this name compression | a single PUSH message have the same owner name, this name compression | |||
can yield significant savings. Name compression should be performed | can yield significant savings. Name compression should be performed | |||
as specified in Section 18.14 of the Multicast DNS specification | as specified in Section 18.14 of the Multicast DNS specification | |||
[RFC6762], namely, owner names should always be compressed, and names | [RFC6762]; namely, owner names should always be compressed, and names | |||
appearing within RDATA should be compressed for only the RR types | appearing within RDATA should be compressed for only the RR types | |||
listed below: | listed below: | |||
NS, CNAME, PTR, DNAME, SOA, MX, AFSDB, RT, KX, RP, PX, SRV, NSEC | NS, CNAME, PTR, DNAME, SOA, MX, AFSDB, RT, KX, RP, PX, SRV, NSEC | |||
Servers may generate PUSH messages up to a maximum DNS message length | Servers may generate PUSH messages up to a maximum DNS message length | |||
of 16,382 bytes, counting from the start of the DSO 12-byte header. | of 16,382 bytes, counting from the start of the DSO 12-byte header. | |||
Including the two-byte length prefix that is used to frame DNS over a | Including the two-byte length prefix that is used to frame DNS over a | |||
byte stream like TLS, this makes a total of 16,384 bytes. Servers | byte stream like TLS, this makes a total of 16,384 bytes. Servers | |||
MUST NOT generate PUSH messages larger than this. Where the | MUST NOT generate PUSH messages larger than this. Where the | |||
immediately available change notifications are sufficient to exceed a | immediately available change notifications are sufficient to exceed a | |||
DNS message length of 16,382 bytes, the change notifications MUST be | DNS message length of 16,382 bytes, the change notifications MUST be | |||
communicated in separate PUSH messages of up to 16,382 bytes each. | communicated in separate PUSH messages of up to 16,382 bytes each. | |||
DNS name compression becomes less effective for messages larger than | DNS name compression becomes less effective for messages larger than | |||
16,384 bytes, so little efficiency benefit is gained by sending | 16,384 bytes, so little efficiency benefit is gained by sending | |||
messages larger than this. | messages larger than this. | |||
If a client receives a PUSH message with a DNS message length larger | If a client receives a PUSH message with a DNS message length larger | |||
than 16,382 bytes, this is a fatal error, and the client MUST | than 16,382 bytes, this is a fatal error and the client MUST forcibly | |||
forcibly abort the connection immediately. | abort the connection immediately. | |||
1 1 1 1 1 1 | 1 1 1 1 1 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| MESSAGE ID (MUST BE ZERO) | \ | | MESSAGE ID (MUST BE ZERO) | \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
|QR| OPCODE(6) | Z | RCODE | | | |QR| OPCODE(6) | Z | RCODE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| QDCOUNT (MUST BE ZERO) | | | | QDCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | |||
| ANCOUNT (MUST BE ZERO) | | | | ANCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| NSCOUNT (MUST BE ZERO) | | | | NSCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| ARCOUNT (MUST BE ZERO) | / | | ARCOUNT (MUST BE ZERO) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
| DSO-TYPE = PUSH (tentatively 0x41) | | | DSO-TYPE = PUSH (0x0041) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
| DSO-LENGTH (number of octets in DSO-DATA) | | | DSO-LENGTH (number of octets in DSO-DATA) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
\ NAME \ \ | \ NAME \ \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| TYPE | | | | TYPE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| CLASS | | | | CLASS | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| TTL | | | | TTL | | | |||
| (32-bit unsigned big-endian integer) | > DSO-DATA | | (32-bit unsigned big-endian integer) | > DSO-DATA | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| RDLEN (16-bit unsigned big-endian integer) | | | | RDLEN (16-bit unsigned big-endian integer) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
\ RDATA (sized as necessary) \ | | \ RDATA (sized as necessary) \ | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
: NAME, TYPE, CLASS, TTL, RDLEN, RDATA : | | : NAME, TYPE, CLASS, TTL, RDLEN, RDATA : | | |||
: Repeated As Necessary : / | : Repeated As Necessary : / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
Figure 3: PUSH Message | Figure 3: PUSH Message | |||
When processing the records received in a PUSH Message, the receiving | When processing the records received in a PUSH Message, the receiving | |||
client MUST validate that the records being added or removed | client MUST validate that the records being added or removed | |||
correspond with at least one currently active subscription on that | correspond with at least one currently active subscription on that | |||
session. Specifically, the record name MUST match the name given in | session. Specifically, the record name MUST match the name given in | |||
the SUBSCRIBE request, subject to the usual established DNS case- | the SUBSCRIBE request, subject to the usual established DNS case- | |||
insensitivity for US-ASCII letters. For individual additions and | insensitivity for US-ASCII letters. For individual additions and | |||
removals, if the TYPE in the SUBSCRIBE request was not ANY (255) then | removals, if the TYPE in the SUBSCRIBE request was not ANY (255), | |||
the TYPE of the record must match the TYPE given in the SUBSCRIBE | then the TYPE of the record must either be CNAME or match the TYPE | |||
request, and if the CLASS in the SUBSCRIBE request was not ANY (255) | given in the SUBSCRIBE request, and if the CLASS in the SUBSCRIBE | |||
then the CLASS of the record must match the CLASS given in the | request was not ANY (255), then the CLASS of the record must match | |||
SUBSCRIBE request. For collective removals, at least one of the | the CLASS given in the SUBSCRIBE request. For collective removals, | |||
records being removed must match an active subscription. If a | at least one of the records being removed must match an active | |||
matching active subscription on that session is not found, then that | subscription. If a matching active subscription on that session is | |||
particular addition/removal record is silently ignored. Processing | not found, then that particular addition/removal record is silently | |||
of other additions and removal records in this message is not | ignored. The processing of other additions and removal records in | |||
affected. The DSO session is not closed. This is to allow for the | this message is not affected. The DSO session is not closed. This | |||
unavoidable race condition where a client sends an outbound | is to allow for the unavoidable race condition where a client sends | |||
UNSUBSCRIBE while inbound PUSH messages for that subscription from | an outbound UNSUBSCRIBE while inbound PUSH messages for that | |||
the server are still in flight. | subscription from the server are still in flight. | |||
In the case where a single change affects more than one active | ||||
subscription, only one PUSH message is sent. For example, a PUSH | ||||
message adding a given record may match both a SUBSCRIBE request with | ||||
the same TYPE and a different SUBSCRIBE request with TYPE = 255 | ||||
(ANY). It is not the case that two PUSH messages are sent because | ||||
the new record matches two active subscriptions. | ||||
The server SHOULD encode change notifications in the most efficient | ||||
manner possible. For example, when three AAAA records are removed | ||||
from a given name, and no other AAAA records exist for that name, the | ||||
server SHOULD send a "remove an RRset from a name" PUSH message, not | ||||
three separate "remove an individual RR from a name" PUSH messages. | ||||
Similarly, when both an SRV and a TXT record are removed from a given | ||||
name, and no other records of any kind exist for that name, the | ||||
server SHOULD send a "remove all RRsets from a name" PUSH message, | ||||
not two separate "remove an RRset from a name" PUSH messages. | ||||
A server SHOULD combine multiple change notifications in a single | ||||
PUSH message when possible, even if those change notifications apply | ||||
to different subscriptions. Conceptually, a PUSH message is a | ||||
session-level mechanism, not a subscription-level mechanism. | ||||
The TTL of an added record is stored by the client. While the | The TTL of an added record is stored by the client. While the | |||
subscription is active, the TTL is not decremented, because a change | subscription is active the TTL is not decremented, because a change | |||
to the TTL would produce a new update. For as long as a relevant | to the TTL would produce a new update. For as long as a relevant | |||
subscription remains active, the client SHOULD assume that when a | subscription remains active, the client SHOULD assume that when a | |||
record goes away the server will notify it of that fact. | record goes away, the server will notify it of that fact. | |||
Consequently, a client does not have to poll to verify that the | Consequently, a client does not have to poll to verify that the | |||
record is still there. Once a subscription is cancelled | record is still there. Once a subscription is canceled | |||
(individually, or as a result of the DSO session being closed) record | (individually, or as a result of the DSO session being closed), | |||
aging for records covered by the subscription resumes and records are | record aging for records covered by the subscription resumes and | |||
removed from the local cache when their TTL reaches zero. | records are removed from the local cache when their TTL reaches zero. | |||
6.4. DNS Push Notification UNSUBSCRIBE | 6.4. DNS Push Notification UNSUBSCRIBE | |||
To cancel an individual subscription without closing the entire DSO | To cancel an individual subscription without closing the entire DSO | |||
session, the client sends an UNSUBSCRIBE message over the established | session, the client sends an UNSUBSCRIBE message over the established | |||
DSO session to the server. | DSO session to the server. | |||
The entity that initiates an UNSUBSCRIBE message is by definition the | The entity that initiates an UNSUBSCRIBE message is by definition the | |||
client. A server MUST NOT send an UNSUBSCRIBE message over an | client. A server MUST NOT send an UNSUBSCRIBE message over an | |||
existing session from a client. If a server does send an UNSUBSCRIBE | existing session from a client. If a server does send an UNSUBSCRIBE | |||
message over a DSO session initiated by a client, or an UNSUBSCRIBE | message over a DSO session initiated by a client, or an UNSUBSCRIBE | |||
message is sent with the QR bit set indicating that it is a response, | message is sent with the QR bit set indicating that it is a response, | |||
this is a fatal error and the receiver MUST forcibly abort the | this is a fatal error and the receiver MUST forcibly abort the | |||
connection immediately. | connection immediately. | |||
6.4.1. UNSUBSCRIBE Message | 6.4.1. UNSUBSCRIBE Message | |||
An UNSUBSCRIBE unidirectional message begins with the standard DSO | An UNSUBSCRIBE unidirectional message begins with the standard DSO | |||
12-byte header [RFC8490], followed by the UNSUBSCRIBE primary TLV. | 12-byte header [RFC8490], followed by the UNSUBSCRIBE Primary TLV. | |||
An UNSUBSCRIBE message is illustrated in Figure 4. | An UNSUBSCRIBE message is illustrated in Figure 4. | |||
In accordance with the definition of DSO unidirectional messages, the | In accordance with the definition of DSO unidirectional messages, the | |||
MESSAGE ID field MUST be zero. There is no server response to an | MESSAGE ID field MUST be zero. There is no server response to an | |||
UNSUBSCRIBE message. | UNSUBSCRIBE message. | |||
The other header fields MUST be set as described in the DSO spec- | The other header fields MUST be set as described in the DSO | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | specification [RFC8490]. The DNS OPCODE field contains the OPCODE | |||
for DNS Stateful Operations (6). The four count fields must be zero, | value for DNS Stateful Operations (6). The four count fields must be | |||
and the corresponding four sections must be empty (i.e., absent). | zero, and the corresponding four sections must be empty (i.e., | |||
absent). | ||||
The DSO-TYPE is UNSUBSCRIBE (tentatively 0x42). | The DSO-TYPE is UNSUBSCRIBE (0x0042). | |||
The DSO-LENGTH field contains the value 2, the length of the 2-octet | The DSO-LENGTH field contains the value 2, the length of the 2-octet | |||
MESSAGE ID contained in the DSO-DATA. | MESSAGE ID contained in the DSO-DATA. | |||
The DSO-DATA contains the value previously given in the MESSAGE ID | The DSO-DATA contains the value previously given in the MESSAGE ID | |||
field of an active SUBSCRIBE request. This is how the server knows | field of an active SUBSCRIBE request. This is how the server knows | |||
which SUBSCRIBE request is being cancelled. After receipt of the | which SUBSCRIBE request is being canceled. After receipt of the | |||
UNSUBSCRIBE message, the SUBSCRIBE request is no longer active. | UNSUBSCRIBE message, the SUBSCRIBE request is no longer active. | |||
It is allowable for the client to issue an UNSUBSCRIBE message for a | It is allowable for the client to issue an UNSUBSCRIBE message for a | |||
previous SUBSCRIBE request for which the client has not yet received | previous SUBSCRIBE request for which the client has not yet received | |||
a SUBSCRIBE response. This is to allow for the case where a client | a SUBSCRIBE response. This is to allow for the case where a client | |||
starts and stops a subscription in less than the round-trip time to | starts and stops a subscription in less than the round-trip time to | |||
the server. The client is NOT required to wait for the SUBSCRIBE | the server. The client is NOT required to wait for the SUBSCRIBE | |||
response before issuing the UNSUBSCRIBE message. | response before issuing the UNSUBSCRIBE message. | |||
Consequently, it is possible for a server to receive an UNSUBSCRIBE | Consequently, it is possible for a server to receive an UNSUBSCRIBE | |||
skipping to change at page 27, line 28 ¶ | skipping to change at line 1136 ¶ | |||
|QR| OPCODE(6) | Z | RCODE | | | |QR| OPCODE(6) | Z | RCODE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| QDCOUNT (MUST BE ZERO) | | | | QDCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | |||
| ANCOUNT (MUST BE ZERO) | | | | ANCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| NSCOUNT (MUST BE ZERO) | | | | NSCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| ARCOUNT (MUST BE ZERO) | / | | ARCOUNT (MUST BE ZERO) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
| DSO-TYPE = UNSUBSCRIBE (tentatively 0x42) | | | DSO-TYPE = UNSUBSCRIBE (0x0042) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
| DSO-LENGTH (2) | | | DSO-LENGTH (2) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| SUBSCRIBE MESSAGE ID | > DSO-DATA | | SUBSCRIBE MESSAGE ID | > DSO-DATA | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
Figure 4: UNSUBSCRIBE Message | Figure 4: UNSUBSCRIBE Message | |||
6.5. DNS Push Notification RECONFIRM | 6.5. DNS Push Notification RECONFIRM | |||
Sometimes, particularly when used with a Discovery Proxy [DisProx], a | Sometimes, particularly when used with a Discovery Proxy [RFC8766], a | |||
DNS Zone may contain stale data. When a client encounters data that | DNS Zone may contain stale data. When a client encounters data that | |||
it believes may be stale (e.g., an SRV record referencing a target | it believes may be stale (e.g., an SRV record referencing a target | |||
host+port that is not responding to connection requests) the client | host+port that is not responding to connection requests), the client | |||
can send a RECONFIRM message to ask the server to re-verify that the | can send a RECONFIRM message to ask the server to re-verify that the | |||
data is still valid. For a Discovery Proxy, this causes it to issue | data is still valid. For a Discovery Proxy, this causes it to issue | |||
new Multicast DNS queries to ascertain whether the target device is | new Multicast DNS queries to ascertain whether the target device is | |||
still present. How the Discovery Proxy causes these new Multicast | still present. How the Discovery Proxy causes these new Multicast | |||
DNS queries to be issued depends on the details of the underlying | DNS queries to be issued depends on the details of the underlying | |||
Multicast DNS implementation being used. For example, a Discovery | Multicast DNS implementation being used. For example, a Discovery | |||
Proxy built on Apple's dns_sd.h API [SD-API] responds to a DNS Push | Proxy built on Apple's dns_sd.h API [SD-API] responds to a DNS Push | |||
Notification RECONFIRM message by calling the underlying API's | Notification RECONFIRM message by calling the underlying API's | |||
DNSServiceReconfirmRecord() routine. | DNSServiceReconfirmRecord() routine. | |||
For other types of DNS server, the RECONFIRM operation is currently | For other types of DNS server, the RECONFIRM operation is currently | |||
undefined, and SHOULD result in a NOERROR response, but otherwise | undefined and SHOULD result in a NOERROR response, but it need not | |||
need not cause any action to occur. | cause any other action to occur. | |||
Frequent use of RECONFIRM operations may be a sign of network | Frequent use of RECONFIRM operations may be a sign of network | |||
unreliability, or some kind of misconfiguration, so RECONFIRM | unreliability, or some kind of misconfiguration, so RECONFIRM | |||
operations MAY be logged or otherwise communicated to a human | operations MAY be logged or otherwise communicated to a human | |||
administrator to assist in detecting and remedying such network | administrator to assist in detecting and remedying such network | |||
problems. | problems. | |||
If, after receiving a valid RECONFIRM message, the server determines | If, after receiving a valid RECONFIRM message, the server determines | |||
that the disputed records are in fact no longer valid, then | that the disputed records are in fact no longer valid, then | |||
subsequent DNS PUSH Messages will be generated to inform interested | subsequent DNS PUSH Messages will be generated to inform interested | |||
clients. Thus, one client discovering that a previously-advertised | clients. Thus, one client discovering that a previously advertised | |||
device (like a network printer) is no longer present has the side | device (like a network printer) is no longer present has the side | |||
effect of informing all other interested clients that the device in | effect of informing all other interested clients that the device in | |||
question is now gone. | question is now gone. | |||
The entity that initiates a RECONFIRM message is by definition the | The entity that initiates a RECONFIRM message is by definition the | |||
client. A server MUST NOT send a RECONFIRM message over an existing | client. A server MUST NOT send a RECONFIRM message over an existing | |||
session from a client. If a server does send a RECONFIRM message | session from a client. If a server does send a RECONFIRM message | |||
over a DSO session initiated by a client, or a RECONFIRM message is | over a DSO session initiated by a client, or a RECONFIRM message is | |||
sent with the QR bit set indicating that it is a response, this is a | sent with the QR bit set indicating that it is a response, this is a | |||
fatal error and the receiver MUST forcibly abort the connection | fatal error and the receiver MUST forcibly abort the connection | |||
immediately. | immediately. | |||
6.5.1. RECONFIRM Message | 6.5.1. RECONFIRM Message | |||
A RECONFIRM unidirectional message begins with the standard DSO | A RECONFIRM unidirectional message begins with the standard DSO | |||
12-byte header [RFC8490], followed by the RECONFIRM primary TLV. | 12-byte header [RFC8490], followed by the RECONFIRM Primary TLV. A | |||
A RECONFIRM message is illustrated in Figure 5. | RECONFIRM message is illustrated in Figure 5. | |||
In accordance with the definition of DSO unidirectional messages, the | In accordance with the definition of DSO unidirectional messages, the | |||
MESSAGE ID field MUST be zero. There is no server response to a | MESSAGE ID field MUST be zero. There is no server response to a | |||
RECONFIRM message. | RECONFIRM message. | |||
The other header fields MUST be set as described in the DSO spec- | The other header fields MUST be set as described in the DSO | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | specification [RFC8490]. The DNS OPCODE field contains the OPCODE | |||
for DNS Stateful Operations (6). The four count fields must be zero, | value for DNS Stateful Operations (6). The four count fields must be | |||
and the corresponding four sections must be empty (i.e., absent). | zero, and the corresponding four sections must be empty (i.e., | |||
absent). | ||||
The DSO-TYPE is RECONFIRM (tentatively 0x43). | The DSO-TYPE is RECONFIRM (0x0043). | |||
The DSO-LENGTH is the length of the data that follows, which | The DSO-LENGTH is the length of the data that follows, which | |||
specifies the name, type, class, and content of the record being | specifies the name, type, class, and content of the record being | |||
disputed. | disputed. | |||
The DSO-DATA for a RECONFIRM message MUST contain exactly one record. | A DNS Push Notifications RECONFIRM message contains exactly one | |||
The DSO-DATA for a RECONFIRM message has no count field to specify | RECONFIRM Primary TLV. The DSO-DATA in a RECONFIRM Primary TLV MUST | |||
more than one record. Since RECONFIRM messages are sent over TCP, | contain exactly one record. The DSO-DATA in a RECONFIRM Primary TLV | |||
multiple RECONFIRM messages can be concatenated in a single TCP | has no count field to specify more than one record. Since RECONFIRM | |||
stream and packed efficiently into TCP segments. | messages are sent over TCP, multiple RECONFIRM messages can be | |||
concatenated in a single TCP stream and packed efficiently into TCP | ||||
segments. Note that this means that DNS name compression cannot be | ||||
used between different RECONFIRM messages. However, when a client is | ||||
sending multiple RECONFIRM messages this indicates a situation with | ||||
serious network problems, and this is not expected to occur | ||||
frequently enough that optimizing efficiency in this case is | ||||
important. | ||||
TYPE MUST NOT be the value ANY (255) and CLASS MUST NOT be the value | TYPE MUST NOT be the value ANY (255) and CLASS MUST NOT be the value | |||
ANY (255). | ANY (255). | |||
DNS wildcarding is not supported. That is, a wildcard ("*") in a | DNS wildcarding is not supported. That is, an asterisk character | |||
RECONFIRM message matches only a literal wildcard character ("*") in | ("*") in a RECONFIRM message matches only a literal asterisk | |||
the zone, and nothing else. | character ("*") in a name and nothing else. Similarly, a CNAME in a | |||
RECONFIRM message matches only a CNAME record with that name in the | ||||
Aliasing is not supported. That is, a CNAME in a RECONFIRM message | zone and no other records with that name. | |||
matches only a literal CNAME record in the zone, and no other records | ||||
with the same owner name. | ||||
Note that there is no RDLEN field, since the length of the RDATA can | Note that there is no RDLEN field, since the length of the RDATA can | |||
be inferred from DSO-LENGTH, so an additional RDLEN field would be | be inferred from DSO-LENGTH, so an additional RDLEN field would be | |||
redundant. | redundant. | |||
Following the same rules as for PUSH messages, DNS name compression | ||||
SHOULD be used within the RDATA of the RECONFIRM message, with | ||||
offsets relative to the beginning of the DNS message [RFC1035]. | ||||
1 1 1 1 1 1 | 1 1 1 1 1 1 | |||
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| MESSAGE ID (MUST BE ZERO) | \ | | MESSAGE ID (MUST BE ZERO) | \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
|QR| OPCODE(6) | Z | RCODE | | | |QR| OPCODE(6) | Z | RCODE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| QDCOUNT (MUST BE ZERO) | | | | QDCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > HEADER | |||
| ANCOUNT (MUST BE ZERO) | | | | ANCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| NSCOUNT (MUST BE ZERO) | | | | NSCOUNT (MUST BE ZERO) | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| ARCOUNT (MUST BE ZERO) | / | | ARCOUNT (MUST BE ZERO) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
| DSO-TYPE = RECONFIRM (tentatively 0x43) | | | DSO-TYPE = RECONFIRM (0x0043) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
| DSO-LENGTH (number of octets in DSO-DATA) | | | DSO-LENGTH (number of octets in DSO-DATA) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
\ NAME \ \ | \ NAME \ \ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| TYPE | | | | TYPE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > DSO-DATA | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > DSO-DATA | |||
| CLASS | | | | CLASS | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
\ RDATA \ / | \ RDATA \ / | |||
skipping to change at page 31, line 13 ¶ | skipping to change at line 1277 ¶ | |||
Figure 5: RECONFIRM Message | Figure 5: RECONFIRM Message | |||
6.6. DNS Stateful Operations TLV Context Summary | 6.6. DNS Stateful Operations TLV Context Summary | |||
This document defines four new DSO TLVs. As recommended in | This document defines four new DSO TLVs. As recommended in | |||
Section 8.2 of the DNS Stateful Operations specification [RFC8490], | Section 8.2 of the DNS Stateful Operations specification [RFC8490], | |||
the valid contexts of these new TLV types are summarized below. | the valid contexts of these new TLV types are summarized below. | |||
The client TLV contexts are: | The client TLV contexts are: | |||
C-P: Client request message, primary TLV | C-P: Client request message, Primary TLV | |||
C-U: Client unidirectional message, primary TLV | C-U: Client Unidirectional message, primary TLV | |||
C-A: Client request or unidirectional message, additional TLV | C-A: Client request or unidirectional message, Additional TLV | |||
CRP: Response back to client, primary TLV | CRP: Response back to client, Primary TLV | |||
CRA: Response back to client, additional TLV | CRA: Response back to client, Additional TLV | |||
+-------------+-----+-----+-----+-----+-----+ | +-------------+-----+-----+-----+-----+-----+ | |||
| TLV Type | C-P | C-U | C-A | CRP | CRA | | | TLV Type | C-P | C-U | C-A | CRP | CRA | | |||
+-------------+-----+-----+-----+-----+-----+ | +=============+=====+=====+=====+=====+=====+ | |||
| SUBSCRIBE | X | | | | | | | SUBSCRIBE | X | | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| PUSH | | | | | | | | PUSH | | | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| UNSUBSCRIBE | | X | | | | | | UNSUBSCRIBE | | X | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| RECONFIRM | | X | | | | | | RECONFIRM | | X | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | +-------------+-----+-----+-----+-----+-----+ | |||
Table 2: DSO TLV Client Context Summary | Table 2: DSO TLV Client Context Summary | |||
The server TLV contexts are: | The server TLV contexts are: | |||
S-P: Server request message, primary TLV | S-P: Server request message, Primary TLV | |||
S-U: Server unidirectional message, primary TLV | S-U: Server Unidirectional message, primary TLV | |||
S-A: Server request or unidirectional message, additional TLV | S-A: Server request or unidirectional message, Additional TLV | |||
SRP: Response back to server, primary TLV | SRP: Response back to server, Primary TLV | |||
SRA: Response back to server, additional TLV | SRA: Response back to server, Additional TLV | |||
+-------------+-----+-----+-----+-----+-----+ | +-------------+-----+-----+-----+-----+-----+ | |||
| TLV Type | S-P | S-U | S-A | SRP | SRA | | | TLV Type | S-P | S-U | S-A | SRP | SRA | | |||
+-------------+-----+-----+-----+-----+-----+ | +=============+=====+=====+=====+=====+=====+ | |||
| SUBSCRIBE | | | | | | | | SUBSCRIBE | | | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| PUSH | | X | | | | | | PUSH | | X | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| UNSUBSCRIBE | | | | | | | | UNSUBSCRIBE | | | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | ||||
| RECONFIRM | | | | | | | | RECONFIRM | | | | | | | |||
+-------------+-----+-----+-----+-----+-----+ | +-------------+-----+-----+-----+-----+-----+ | |||
Table 3: DSO TLV Server Context Summary | Table 3: DSO TLV Server Context Summary | |||
6.7. Client-Initiated Termination | 6.7. Client-Initiated Termination | |||
An individual subscription is terminated by sending an UNSUBSCRIBE | An individual subscription is terminated by sending an UNSUBSCRIBE | |||
TLV for that specific subscription, or all subscriptions can be | TLV for that specific subscription, or all subscriptions can be | |||
cancelled at once by the client closing the DSO session. When a | canceled at once by the client closing the DSO session. When a | |||
client terminates an individual subscription (via UNSUBSCRIBE) or all | client terminates an individual subscription (via UNSUBSCRIBE) or all | |||
subscriptions on that DSO session (by ending the session) it is | subscriptions on that DSO session (by ending the session), it is | |||
signaling to the server that it is no longer interested in receiving | signaling to the server that it is no longer interested in receiving | |||
those particular updates. It is informing the server that the server | those particular updates. It is informing the server that the server | |||
may release any state information it has been keeping with regards to | may release any state information it has been keeping with regards to | |||
these particular subscriptions. | these particular subscriptions. | |||
After terminating its last subscription on a session via UNSUBSCRIBE, | After terminating its last subscription on a session via UNSUBSCRIBE, | |||
a client MAY close the session immediately, or it may keep it open if | a client MAY close the session immediately or it may keep it open if | |||
it anticipates performing further operations on that session in the | it anticipates performing further operations on that session in the | |||
future. If a client wishes to keep an idle session open, it MUST | future. If a client wishes to keep an idle session open, it MUST | |||
respect the maximum idle time required by the server [RFC8490]. | respect the maximum idle time required by the server [RFC8490]. | |||
If a client plans to terminate one or more subscriptions on a session | If a client plans to terminate one or more subscriptions on a session | |||
and doesn't intend to keep that session open, then as an efficiency | and doesn't intend to keep that session open, then as an efficiency | |||
optimization it MAY instead choose to simply close the session, which | optimization, it MAY instead choose to simply close the session, | |||
implicitly terminates all subscriptions on that session. This may | which implicitly terminates all subscriptions on that session. This | |||
occur because the client computer is being shut down, is going to | may occur because the client computer is being shut down, is going to | |||
sleep, the application requiring the subscriptions has terminated, or | sleep, the application requiring the subscriptions has terminated, or | |||
simply because the last active subscription on that session has been | simply because the last active subscription on that session has been | |||
cancelled. | canceled. | |||
When closing a session, a client should perform an orderly close of | When closing a session, a client should perform an orderly close of | |||
the TLS session. Typical APIs will provide a session close method | the TLS session. Typical APIs will provide a session close method | |||
that will send a TLS close_notify alert (see Section 6.1 of the TLS | that will send a TLS close_notify alert as described in Section 6.1 | |||
1.3 specification [RFC8446]). This instructs the recipient that the | of the TLS 1.3 specification [RFC8446]. This instructs the recipient | |||
sender will not send any more data over the session. After sending | that the sender will not send any more data over the session. After | |||
the TLS close_notify alert the client MUST gracefully close the | sending the TLS close_notify alert, the client MUST gracefully close | |||
underlying connection using a TCP FIN, so that the TLS close_notify | the underlying connection using a TCP FIN so that the TLS | |||
is reliably delivered. The mechanisms for gracefully closing a TCP | close_notify is reliably delivered. The mechanisms for gracefully | |||
connection with a TCP FIN vary depending on the networking API. For | closing a TCP connection with a TCP FIN vary depending on the | |||
example, in the BSD Sockets API, sending a TCP FIN is achieved by | networking API. For example, in the BSD Sockets API, sending a TCP | |||
calling "shutdown(s,SHUT_WR)" and keeping the socket open until all | FIN is achieved by calling "shutdown(s,SHUT_WR)" and keeping the | |||
remaining data has been read from it. | socket open until all remaining data has been read from it. | |||
If the session is forcibly closed at the TCP level by sending a RST | If the session is forcibly closed at the TCP level by sending a RST | |||
from either end of the connection, data may be lost. | from either end of the connection, data may be lost. | |||
6.8. Client Fallback to Polling | 6.8. Client Fallback to Polling | |||
There are cases where a client may exhaust all avenues for | There are cases where a client may exhaust all avenues for | |||
establishing a DNS Push Notification subscription without success. | establishing a DNS Push Notification subscription without success. | |||
This can happen if the client's configured recursive resolver does | This can happen if the client's configured recursive resolver does | |||
not support DNS over TLS, or supports DNS over TLS but is not | not support DNS over TLS, or supports DNS over TLS but is not | |||
listening on TCP port 853, or supports DNS over TLS on TCP port 853 | listening on TCP port 853, or supports DNS over TLS on TCP port 853 | |||
but does not support DSO on that port, or for some other reason is | but does not support DSO on that port, or for some other reason is | |||
unable to provide a DNS Push Notification subscription. In this case | unable to provide a DNS Push Notification subscription. In this | |||
the client will attempt to communicate directly with an appropriate | case, the client will attempt to communicate directly with an | |||
server, and it may be that the zone apex discovery fails, or there is | appropriate server, and it may be that the zone apex discovery fails, | |||
no "_dns-push-tls._tcp.<zone>" SRV record, or server indicated in the | or there is no "_dns-push-tls._tcp.<zone>" SRV record, or the server | |||
SRV record is misconfigured, or is unresponsive for some other | indicated in the SRV record is misconfigured, overloaded, or is | |||
reason. | unresponsive for some other reason. | |||
Regardless of the reason for the failure, after being unable to | Regardless of the reason for the failure, after being unable to | |||
establish the desired DNS Push Notification subscription, it is | establish the desired DNS Push Notification subscription, it is | |||
likely that the client will still wish to know the answer it seeks, | likely that the client will still wish to know the answer it seeks, | |||
even if that answer cannot be obtained with the timely change | even if that answer cannot be obtained with the timely change | |||
notifications provided by DNS Push Notifications. In such cases it | notifications provided by DNS Push Notifications. In such cases, it | |||
is likely that the client will obtain the answer it seeks via a | is likely that the client will obtain the answer it seeks via a | |||
conventional DNS query instead, repeated at some interval to detect | conventional DNS query instead, repeated at some interval to detect | |||
when the answer RRset changes. | when the answer RRset changes. | |||
In the case where a client responds to its failure to establish a DNS | In the case where a client responds to its failure to establish a DNS | |||
Push Notification subscription by falling back to polling with | Push Notification subscription by falling back to polling with | |||
conventional DNS queries instead, the polling rate should be | conventional DNS queries instead, the polling rate should be | |||
controlled to avoid placing excessive burden on the server. The | controlled to avoid placing excessive burden on the server. The | |||
interval between successive DNS queries for the same name, type and | interval between successive DNS queries for the same name, type, and | |||
class SHOULD be at least the minimum of: 900 seconds (15 minutes), or | class SHOULD be at least the minimum of 900 seconds (15 minutes) or | |||
two seconds more than the TTL of the answer RRset. | two seconds more than the TTL of the answer RRset. | |||
The reason that for TTLs shorter than 898 seconds the query should | The reason that for TTLs up to 898 seconds the query should not be | |||
not be reissued until two seconds *after* the answer RRset has | reissued until two seconds _after_ the answer RRset has expired, is | |||
expired is to ensure that the answer RRset has also expired from the | to ensure that the answer RRset has also expired from the cache on | |||
cache on the client's configured recursive resolver. Otherwise | the client's configured recursive resolver. Otherwise (particularly | |||
(particularly if the clocks on the client and the recursive resolver | if the clocks on the client and the recursive resolver do not run at | |||
do not run at precisely the same rate) there's a risk of a race | precisely the same rate), there's a risk of a race condition where | |||
condition where the client queries its configured recursive resolver | the client queries its configured recursive resolver just as the | |||
just as the answer RRset has one second remaining in the recursive | answer RRset has one second remaining in the recursive resolver's | |||
resolver's cache. The client would then receive a reply telling it | cache. The client would receive a reply telling it that the answer | |||
that the answer RRset has one second remaining, and then the client | RRset has one second remaining; the client would then requery the | |||
would then re-query the recursive resolver again one second later | recursive resolver again one second later. If by this time the | |||
when the answer RRset actually expires, and only then would the | answer RRset has actually expired from the recursive resolver's | |||
recursive resolver issue a new query to fetch new fresh data from the | cache, the recursive resolver would then issue a new query to fetch | |||
authoritative server. Waiting until the answer RRset has definitely | fresh data from the authoritative server. Waiting until the answer | |||
expired from the the cache on the client's configured recursive | RRset has definitely expired from the cache on the client's | |||
resolver avoids this race condition and unnecessary additional | configured recursive resolver avoids this race condition and any | |||
queries it causes. | unnecessary additional queries it causes. | |||
Each time a client is about to reissue its query to discover changes | Each time a client is about to reissue its query to discover changes | |||
to the answer RRset, it should first make a new attempt to establish | to the answer RRset, it should first make a new attempt to establish | |||
a DNS Push Notification subscription, using previously cached DNS | a DNS Push Notification subscription using previously cached DNS | |||
answers as appropriate. After a temporary misconfiguration has been | answers as appropriate. After a temporary misconfiguration has been | |||
remedied, this allows a client that is polling to return to using DNS | remedied, this allows a client that is polling to return to using DNS | |||
Push Notifications for asynchronous notification of changes. | Push Notifications for asynchronous notification of changes. | |||
7. Security Considerations | 7. Security Considerations | |||
The Strict Privacy Usage Profile for DNS over TLS is REQUIRED for DNS | The Strict Privacy profile for DNS over TLS is REQUIRED for DNS Push | |||
Push Notifications [RFC8310]. Cleartext connections for DNS Push | Notifications [RFC8310]. Cleartext connections for DNS Push | |||
Notifications are not permissible. Since this is a new protocol, | Notifications are not permissible. Since this is a new protocol, | |||
transition mechanisms from the Opportunistic Privacy profile are | transition mechanisms from the Opportunistic Privacy profile are | |||
unnecessary. | unnecessary. | |||
Also, see Section 9 of the DNS over (D)TLS Usage Profiles document | Also, see Section 9 of the document Usage Profiles for DNS over | |||
[RFC8310] for additional recommendations for various versions of TLS | (D)TLS [RFC8310] for additional recommendations for various versions | |||
usage. | of TLS usage. | |||
As a consequence of requiring TLS, client certificate authentication | As a consequence of requiring TLS, client certificate authentication | |||
and verification may also be enforced by the server for stronger | and verification may also be enforced by the server for stronger | |||
client-server security or end-to-end security. However, | client-server security or end-to-end security. However, | |||
recommendations for security in particular deployment scenarios are | recommendations for security in particular deployment scenarios are | |||
outside the scope of this document. | outside the scope of this document. | |||
DNSSEC is RECOMMENDED for the authentication of DNS Push Notification | DNSSEC is RECOMMENDED for the authentication of DNS Push Notification | |||
servers. TLS alone does not provide complete security. TLS | servers. TLS alone does not provide complete security. TLS | |||
certificate verification can provide reasonable assurance that the | certificate verification can provide reasonable assurance that the | |||
client is really talking to the server associated with the desired | client is really talking to the server associated with the desired | |||
host name, but since the desired host name is learned via a DNS SRV | host name, but since the desired host name is learned via a DNS SRV | |||
query, if the SRV query is subverted then the client may have a | query, if the SRV query is subverted, then the client may have a | |||
secure connection to a rogue server. DNSSEC can provide added | secure connection to a rogue server. DNSSEC can provide added | |||
confidence that the SRV query has not been subverted. | confidence that the SRV query has not been subverted. | |||
7.1. Security Services | 7.1. Security Services | |||
It is the goal of using TLS to provide the following security | It is the goal of using TLS to provide the following security | |||
services: | services: | |||
Confidentiality: All application-layer communication is encrypted | Confidentiality: All application-layer communication is encrypted | |||
with the goal that no party should be able to decrypt it except | with the goal that no party should be able to decrypt it except | |||
the intended receiver. | the intended receiver. | |||
Data integrity protection: Any changes made to the communication in | Data integrity protection: Any changes made to the communication in | |||
transit are detectable by the receiver. | transit are detectable by the receiver. | |||
Authentication: An end-point of the TLS communication is | Authentication: An endpoint of the TLS communication is | |||
authenticated as the intended entity to communicate with. | authenticated as the intended entity to communicate with. | |||
Anti-replay protection: TLS provides for the detection of and | Anti-replay protection: TLS provides for the detection of and | |||
prevention against messages sent previously over a TLS connection | prevention against messages sent previously over a TLS connection | |||
(such as DNS Push Notifications). If prior messages are re-sent | (such as DNS Push Notifications). If prior messages are re-sent | |||
at a later time as a form of a man-in-the-middle attack then the | at a later time as a form of a man-in-the-middle attack, then the | |||
receiver will detect this and reject the replayed messages. | receiver will detect this and reject the replayed messages. | |||
Deployment recommendations on the appropriate key lengths and cypher | Deployment recommendations on the appropriate key lengths and cipher | |||
suites are beyond the scope of this document. Please refer to TLS | suites are beyond the scope of this document. Please refer to the | |||
Recommendations [BCP195] for the best current practices. Keep in | current TLS Recommendations [BCP195] for the best current practices. | |||
mind that best practices only exist for a snapshot in time and | Keep in mind that best practices only exist for a snapshot in time, | |||
recommendations will continue to change. Updated versions or errata | and recommendations will continue to change. Updated versions or | |||
may exist for these recommendations. | errata may exist for these recommendations. | |||
7.2. TLS Name Authentication | 7.2. TLS Name Authentication | |||
As described in Section 6.1, the client discovers the DNS Push | As described in Section 6.1, the client discovers the DNS Push | |||
Notification server using an SRV lookup for the record name | Notification server using an SRV lookup for the record name | |||
"_dns-push-tls._tcp.<zone>". The server connection endpoint SHOULD | "_dns-push-tls._tcp.<zone>". The server connection endpoint SHOULD | |||
then be authenticated using DANE TLSA records for the associated SRV | then be authenticated using DANE TLSA records for the associated SRV | |||
record. This associates the target's name and port number with a | record. This associates the target's name and port number with a | |||
trusted TLS certificate [RFC7673]. This procedure uses the TLS | trusted TLS certificate [RFC7673]. This procedure uses the TLS | |||
Server Name Indication (SNI) extension [RFC6066] to inform the server | Server Name Indication (SNI) extension [RFC6066] to inform the server | |||
of the name the client has authenticated through the use of TLSA | of the name the client has authenticated through the use of TLSA | |||
records. Therefore, if the SRV record passes DNSSEC validation and a | records. Therefore, if the SRV record passes DNSSEC validation and a | |||
TLSA record matching the target name is useable, an SNI extension | TLSA record matching the target name is usable, an SNI extension must | |||
must be used for the target name to ensure the client is connecting | be used for the target name to ensure the client is connecting to the | |||
to the server it has authenticated. If the target name does not have | server it has authenticated. If the target name does not have a | |||
a usable TLSA record, then the use of the SNI extension is optional. | usable TLSA record, then the use of the SNI extension is optional. | |||
See Usage Profiles for DNS over TLS and DNS over DTLS [RFC8310] for | See Usage Profiles for DNS over TLS and DNS over DTLS [RFC8310] for | |||
more information on authenticating domain names. | more information on authenticating domain names. | |||
7.3. TLS Early Data | 7.3. TLS Early Data | |||
DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted | DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted | |||
in TLS early data. Using TLS early data can save one network round | in TLS early data. Using TLS early data can save one network round | |||
trip, and can result in the client obtaining results faster. | trip and can result in the client obtaining results faster. | |||
However, there are some factors to consider before using TLS early | However, there are some factors to consider before using TLS early | |||
data. | data. | |||
TLS Early Data is not forward secret. In cases where forward secrecy | TLS early data is not forward secret. In cases where forward secrecy | |||
of DNS Push Notification subscriptions is required, the client should | of DNS Push Notification subscriptions is required, the client should | |||
not use TLS Early Data. | not use TLS early data. | |||
With TLS early data there are no guarantees of non-replay between | With TLS early data, there are no guarantees of non-replay between | |||
connections. If packets are duplicated and delayed in the network, | connections. If packets are duplicated and delayed in the network, | |||
the later arrivals could be mistaken for new subscription requests. | the later arrivals could be mistaken for new subscription requests. | |||
Generally this is not a major concern, since the amount of state | Generally, this is not a major concern since the amount of state | |||
generated on the server for these spurious subscriptions is small and | generated on the server for these spurious subscriptions is small and | |||
short-lived, since the TCP connection will not complete the three-way | short lived since the TCP connection will not complete the three-way | |||
handshake. Servers MAY choose to implement rate-limiting measures | handshake. Servers MAY choose to implement rate-limiting measures | |||
that are activated when the server detects an excessive number of | that are activated when the server detects an excessive number of | |||
spurious subscription requests. | spurious subscription requests. | |||
For further guidance please see discussion of zero round-trip data | For further guidance on use of TLS early data, please see discussion | |||
(Section 2.3, Section 8, and Appendix E.5) in the TLS 1.3 | of zero round-trip data in Sections 2.3 and 8, and Appendix E.5, of | |||
specification, [RFC8446]. | the TLS 1.3 specification [RFC8446]. | |||
7.4. TLS Session Resumption | 7.4. TLS Session Resumption | |||
TLS Session Resumption [RFC8446] is permissible on DNS Push | TLS session resumption [RFC8446] is permissible on DNS Push | |||
Notification servers. However, closing the TLS connection terminates | Notification servers. However, closing the TLS connection terminates | |||
the DSO session. When the TLS session is resumed, the DNS Push | the DSO session. When the TLS session is resumed, the DNS Push | |||
Notification server will not have any subscription state and will | Notification server will not have any subscription state and will | |||
proceed as with any other new DSO session. Use of TLS Session | proceed as with any other new DSO session. Use of TLS session | |||
Resumption may allow a TLS connection to be set up more quickly, but | resumption may allow a TLS connection to be set up more quickly, but | |||
the client will still have to recreate any desired subscriptions. | the client will still have to recreate any desired subscriptions. | |||
8. IANA Considerations | 8. IANA Considerations | |||
This document defines a new service name, only applicable for the TCP | This document defines a new service name, only applicable for the TCP | |||
protocol, to be recorded in the IANA Service Type Registry | protocol, which has been recorded in the IANA "Service Name and | |||
[RFC6335][SRVTYPE]. | Transport Protocol Port Number Registry" [RFC6335] [SRVTYPE]. | |||
+-----------------------+------+----------------------+-------------+ | +-----------------------+------+----------------------+---------+ | |||
| Name | Port | Value | Definition | | | Name | Port | Value | Section | | |||
+-----------------------+------+----------------------+-------------+ | +=======================+======+======================+=========+ | |||
| DNS Push Notification | None | "_dns-push-tls._tcp" | Section 6.1 | | | DNS Push Notification | None | "_dns-push-tls._tcp" | 6.1 | | |||
| Service Type | | | | | | Service Type | | | | | |||
+-----------------------+------+----------------------+-------------+ | +-----------------------+------+----------------------+---------+ | |||
Table 4: IANA Service Type Assignments | Table 4: IANA Service Type Assignments | |||
This document defines four new DNS Stateful Operation TLV types to be | This document defines four new DNS Stateful Operation TLV types, | |||
recorded in the IANA DSO Type Code Registry [RFC8490][DSOTYPE]. | which have been recorded in the IANA "DSO Type Codes" registry | |||
[RFC8490] [DSOTYPE]. | ||||
+-------------+------------+--------+-----------------+-------------+ | +-------------+--------+------------+-----------------+---------+ | |||
| Name | Value | Early | Status | Definition | | | Name | Value | Early Data | Status | Section | | |||
| | | Data | | | | +=============+========+============+=================+=========+ | |||
+-------------+------------+--------+-----------------+-------------+ | | SUBSCRIBE | 0x0040 | OK | Standards Track | 6.2 | | |||
| SUBSCRIBE | TBA (0x40) | OK | Standards Track | Section 6.2 | | +-------------+--------+------------+-----------------+---------+ | |||
| PUSH | TBA (0x41) | NO | Standards Track | Section 6.3 | | | PUSH | 0x0041 | NO | Standards Track | 6.3 | | |||
| UNSUBSCRIBE | TBA (0x42) | NO | Standards Track | Section 6.4 | | +-------------+--------+------------+-----------------+---------+ | |||
| RECONFIRM | TBA (0x43) | NO | Standards Track | Section 6.5 | | | UNSUBSCRIBE | 0x0042 | NO | Standards Track | 6.4 | | |||
+-------------+------------+--------+-----------------+-------------+ | +-------------+--------+------------+-----------------+---------+ | |||
| RECONFIRM | 0x0043 | NO | Standards Track | 6.5 | | ||||
+-------------+--------+------------+-----------------+---------+ | ||||
Table 5: IANA DSO TLV Type Code Assignments | Table 5: IANA DSO TLV Type Code Assignments | |||
This document defines no new DNS OPCODEs or RCODEs. | This document defines no new DNS OPCODEs or RCODEs. | |||
9. Acknowledgements | 9. References | |||
The authors would like to thank Kiren Sekar and Marc Krochmal for | ||||
previous work completed in this field. | ||||
This draft has been improved due to comments from Ran Atkinson, Tim | ||||
Chown, Sara Dickinson, Mark Delany, Ralph Droms, Jan Komissar, Eric | ||||
Rescorla, Michael Richardson, David Schinazi, Manju Shankar Rao, | ||||
Robert Sparks, Markus Stenberg, Andrew Sullivan, Michael Sweet, Dave | ||||
Thaler, Brian Trammell, Bernie Volz, Eric Vyncke, Christopher Wood, | ||||
Liang Xia, and Soraia Zlatkovic. Ted Lemon provided clarifying text | ||||
that was greatly appreciated. | ||||
10. References | ||||
10.1. Normative References | 9.1. Normative References | |||
[DSOTYPE] "DSO Type Code Registry", | [DSOTYPE] IANA, "Domain Name System (DNS) Parameters", | |||
<https://www.iana.org/assignments/dns-parameters/>. | <https://www.iana.org/assignments/dns-parameters/>. | |||
[RFC0020] Cerf, V., "ASCII format for network interchange", STD 80, | [RFC0020] Cerf, V., "ASCII format for network interchange", STD 80, | |||
RFC 20, DOI 10.17487/RFC0020, October 1969, | RFC 20, DOI 10.17487/RFC0020, October 1969, | |||
<https://www.rfc-editor.org/info/rfc20>. | <https://www.rfc-editor.org/info/rfc20>. | |||
[RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | [RFC0768] Postel, J., "User Datagram Protocol", STD 6, RFC 768, | |||
DOI 10.17487/RFC0768, August 1980, | DOI 10.17487/RFC0768, August 1980, | |||
<https://www.rfc-editor.org/info/rfc768>. | <https://www.rfc-editor.org/info/rfc768>. | |||
skipping to change at page 40, line 10 ¶ | skipping to change at line 1664 ¶ | |||
[RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | [RFC8446] Rescorla, E., "The Transport Layer Security (TLS) Protocol | |||
Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | Version 1.3", RFC 8446, DOI 10.17487/RFC8446, August 2018, | |||
<https://www.rfc-editor.org/info/rfc8446>. | <https://www.rfc-editor.org/info/rfc8446>. | |||
[RFC8490] Bellis, R., Cheshire, S., Dickinson, J., Dickinson, S., | [RFC8490] Bellis, R., Cheshire, S., Dickinson, J., Dickinson, S., | |||
Lemon, T., and T. Pusateri, "DNS Stateful Operations", | Lemon, T., and T. Pusateri, "DNS Stateful Operations", | |||
RFC 8490, DOI 10.17487/RFC8490, March 2019, | RFC 8490, DOI 10.17487/RFC8490, March 2019, | |||
<https://www.rfc-editor.org/info/rfc8490>. | <https://www.rfc-editor.org/info/rfc8490>. | |||
[SRVTYPE] "Service Name and Transport Protocol Port Number | [SRVTYPE] IANA, "Service Name and Transport Protocol Port Number | |||
Registry", <http://www.iana.org/assignments/service-names- | Registry", <https://www.iana.org/assignments/service- | |||
port-numbers/>. | names-port-numbers/>. | |||
10.2. Informative References | 9.2. Informative References | |||
[BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | [BCP195] Sheffer, Y., Holz, R., and P. Saint-Andre, | |||
"Recommendations for Secure Use of Transport Layer | "Recommendations for Secure Use of Transport Layer | |||
Security (TLS) and Datagram Transport Layer Security | Security (TLS) and Datagram Transport Layer Security | |||
(DTLS)", BCP 195, RFC 7525, May 2015, | (DTLS)", BCP 195, RFC 7525, May 2015, | |||
<http://www.rfc-editor.org/info/bcp195>. | <https://www.rfc-editor.org/info/bcp195>. | |||
[DisProx] Cheshire, S., "Discovery Proxy for Multicast DNS-Based | ||||
Service Discovery", draft-ietf-dnssd-hybrid-10 (work in | ||||
progress), March 2019. | ||||
[I-D.ietf-tcpm-rack] | ||||
Cheng, Y., Cardwell, N., Dukkipati, N., and P. Jha, "RACK: | ||||
a time-based fast loss detection algorithm for TCP", | ||||
draft-ietf-tcpm-rack-05 (work in progress), April 2019. | ||||
[LLQ] Cheshire, S. and M. Krochmal, "DNS Long-Lived Queries", | ||||
draft-sekar-dns-llq-03 (work in progress), March 2019. | ||||
[obs] "Observer Pattern", | [OBS] Wikipedia, "Observer pattern", February 2020, | |||
<https://en.wikipedia.org/wiki/Observer_pattern>. | <https://en.wikipedia.org/w/ | |||
index.php?title=Observer_pattern&oldid=939702131>. | ||||
[RFC2308] Andrews, M., "Negative Caching of DNS Queries (DNS | [RFC2308] Andrews, M., "Negative Caching of DNS Queries (DNS | |||
NCACHE)", RFC 2308, DOI 10.17487/RFC2308, March 1998, | NCACHE)", RFC 2308, DOI 10.17487/RFC2308, March 1998, | |||
<https://www.rfc-editor.org/info/rfc2308>. | <https://www.rfc-editor.org/info/rfc2308>. | |||
[RFC3123] Koch, P., "A DNS RR Type for Lists of Address Prefixes | [RFC3123] Koch, P., "A DNS RR Type for Lists of Address Prefixes | |||
(APL RR)", RFC 3123, DOI 10.17487/RFC3123, June 2001, | (APL RR)", RFC 3123, DOI 10.17487/RFC3123, June 2001, | |||
<https://www.rfc-editor.org/info/rfc3123>. | <https://www.rfc-editor.org/info/rfc3123>. | |||
[RFC4287] Nottingham, M., Ed. and R. Sayre, Ed., "The Atom | [RFC4287] Nottingham, M., Ed. and R. Sayre, Ed., "The Atom | |||
skipping to change at page 41, line 18 ¶ | skipping to change at line 1709 ¶ | |||
<https://www.rfc-editor.org/info/rfc6281>. | <https://www.rfc-editor.org/info/rfc6281>. | |||
[RFC6762] Cheshire, S. and M. Krochmal, "Multicast DNS", RFC 6762, | [RFC6762] Cheshire, S. and M. Krochmal, "Multicast DNS", RFC 6762, | |||
DOI 10.17487/RFC6762, February 2013, | DOI 10.17487/RFC6762, February 2013, | |||
<https://www.rfc-editor.org/info/rfc6762>. | <https://www.rfc-editor.org/info/rfc6762>. | |||
[RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service | [RFC6763] Cheshire, S. and M. Krochmal, "DNS-Based Service | |||
Discovery", RFC 6763, DOI 10.17487/RFC6763, February 2013, | Discovery", RFC 6763, DOI 10.17487/RFC6763, February 2013, | |||
<https://www.rfc-editor.org/info/rfc6763>. | <https://www.rfc-editor.org/info/rfc6763>. | |||
[RFC6824] Ford, A., Raiciu, C., Handley, M., and O. Bonaventure, | ||||
"TCP Extensions for Multipath Operation with Multiple | ||||
Addresses", RFC 6824, DOI 10.17487/RFC6824, January 2013, | ||||
<https://www.rfc-editor.org/info/rfc6824>. | ||||
[RFC6886] Cheshire, S. and M. Krochmal, "NAT Port Mapping Protocol | [RFC6886] Cheshire, S. and M. Krochmal, "NAT Port Mapping Protocol | |||
(NAT-PMP)", RFC 6886, DOI 10.17487/RFC6886, April 2013, | (NAT-PMP)", RFC 6886, DOI 10.17487/RFC6886, April 2013, | |||
<https://www.rfc-editor.org/info/rfc6886>. | <https://www.rfc-editor.org/info/rfc6886>. | |||
[RFC6887] Wing, D., Ed., Cheshire, S., Boucadair, M., Penno, R., and | [RFC6887] Wing, D., Ed., Cheshire, S., Boucadair, M., Penno, R., and | |||
P. Selkirk, "Port Control Protocol (PCP)", RFC 6887, | P. Selkirk, "Port Control Protocol (PCP)", RFC 6887, | |||
DOI 10.17487/RFC6887, April 2013, | DOI 10.17487/RFC6887, April 2013, | |||
<https://www.rfc-editor.org/info/rfc6887>. | <https://www.rfc-editor.org/info/rfc6887>. | |||
[RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | [RFC7413] Cheng, Y., Chu, J., Radhakrishnan, S., and A. Jain, "TCP | |||
Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | Fast Open", RFC 7413, DOI 10.17487/RFC7413, December 2014, | |||
<https://www.rfc-editor.org/info/rfc7413>. | <https://www.rfc-editor.org/info/rfc7413>. | |||
[RFC7719] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | ||||
Terminology", RFC 7719, DOI 10.17487/RFC7719, December | ||||
2015, <https://www.rfc-editor.org/info/rfc7719>. | ||||
[RFC8010] Sweet, M. and I. McDonald, "Internet Printing | [RFC8010] Sweet, M. and I. McDonald, "Internet Printing | |||
Protocol/1.1: Encoding and Transport", STD 92, RFC 8010, | Protocol/1.1: Encoding and Transport", STD 92, RFC 8010, | |||
DOI 10.17487/RFC8010, January 2017, | DOI 10.17487/RFC8010, January 2017, | |||
<https://www.rfc-editor.org/info/rfc8010>. | <https://www.rfc-editor.org/info/rfc8010>. | |||
[RFC8011] Sweet, M. and I. McDonald, "Internet Printing | [RFC8011] Sweet, M. and I. McDonald, "Internet Printing | |||
Protocol/1.1: Model and Semantics", STD 92, RFC 8011, | Protocol/1.1: Model and Semantics", STD 92, RFC 8011, | |||
DOI 10.17487/RFC8011, January 2017, | DOI 10.17487/RFC8011, January 2017, | |||
<https://www.rfc-editor.org/info/rfc8011>. | <https://www.rfc-editor.org/info/rfc8011>. | |||
[RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | [RFC8499] Hoffman, P., Sullivan, A., and K. Fujiwara, "DNS | |||
Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | Terminology", BCP 219, RFC 8499, DOI 10.17487/RFC8499, | |||
January 2019, <https://www.rfc-editor.org/info/rfc8499>. | January 2019, <https://www.rfc-editor.org/info/rfc8499>. | |||
[SD-API] "dns_sd.h API", | [RFC8684] Ford, A., Raiciu, C., Handley, M., Bonaventure, O., and C. | |||
Paasch, "TCP Extensions for Multipath Operation with | ||||
Multiple Addresses", RFC 8684, DOI 10.17487/RFC8684, March | ||||
2020, <https://www.rfc-editor.org/info/rfc8684>. | ||||
[RFC8764] Cheshire, S. and M. Krochmal, "Apple's DNS Long-Lived | ||||
Queries Protocol", RFC 8764, DOI 10.17487/RFC8764, June | ||||
2020, <https://www.rfc-editor.org/info/rfc8764>. | ||||
[RFC8766] Cheshire, S., "Discovery Proxy for Multicast DNS-Based | ||||
Service Discovery", RFC 8766, DOI 10.17487/RFC8766, June | ||||
2020, <https://www.rfc-editor.org/info/rfc8766>. | ||||
[SD-API] Apple Inc., "dns_sd.h", | ||||
<https://opensource.apple.com/source/mDNSResponder/ | <https://opensource.apple.com/source/mDNSResponder/ | |||
mDNSResponder-878.70.2/mDNSShared/dns_sd.h.auto.html>. | mDNSResponder-878.70.2/mDNSShared/dns_sd.h.auto.html>. | |||
[SYN] Eddy, W., "Defenses Against TCP SYN Flooding Attacks", The | [SYN] Eddy, W., "Defenses Against TCP SYN Flooding Attacks", The | |||
Internet Protocol Journal, Cisco Systems, Volume 9, | Internet Protocol Journal, Cisco Systems, Volume 9, Number | |||
Number 4, December 2006. | 4, December 2006, | |||
<https://www.cisco.com/web/about/ac123/ac147/ | ||||
archived_issues/ipj_9-4/ipj_9-4.pdf>. | ||||
[TCPRACK] Cheng, Y., Cardwell, N., Dukkipati, N., and P. Jha, "RACK: | ||||
a time-based fast loss detection algorithm for TCP", Work | ||||
in Progress, Internet-Draft, draft-ietf-tcpm-rack-08, 9 | ||||
March 2020, | ||||
<https://tools.ietf.org/html/draft-ietf-tcpm-rack-08>. | ||||
[XEP0060] Millard, P., Saint-Andre, P., and R. Meijer, "Publish- | [XEP0060] Millard, P., Saint-Andre, P., and R. Meijer, "Publish- | |||
Subscribe", XSF XEP 0060, July 2010. | Subscribe", XSF XEP 0060, October 2019, | |||
<https://xmpp.org/extensions/xep-0060.html>. | ||||
Acknowledgments | ||||
The authors would like to thank Kiren Sekar and Marc Krochmal for | ||||
previous work completed in this field. | ||||
This document has been improved due to comments from Ran Atkinson, | ||||
Tim Chown, Sara Dickinson, Mark Delany, Ralph Droms, Jan Komissar, | ||||
Eric Rescorla, Michael Richardson, David Schinazi, Manju Shankar Rao, | ||||
Robert Sparks, Markus Stenberg, Andrew Sullivan, Michael Sweet, Dave | ||||
Thaler, Brian Trammell, Bernie Volz, Éric Vyncke, Christopher Wood, | ||||
Liang Xia, and Soraia Zlatkovic. Ted Lemon provided clarifying text | ||||
that was greatly appreciated. | ||||
Authors' Addresses | Authors' Addresses | |||
Tom Pusateri | Tom Pusateri | |||
Unaffiliated | Unaffiliated | |||
Raleigh, NC 27608 | Raleigh, NC 27608 | |||
USA | United States of America | |||
Phone: +1 919 867 1330 | Phone: +1 919 867 1330 | |||
Email: pusateri@bangj.com | Email: pusateri@bangj.com | |||
Stuart Cheshire | Stuart Cheshire | |||
Apple Inc. | Apple Inc. | |||
One Apple Park Way | One Apple Park Way | |||
Cupertino, CA 95014 | Cupertino, CA 95014 | |||
USA | United States of America | |||
Phone: +1 (408) 996-1010 | Phone: +1 (408) 996-1010 | |||
Email: cheshire@apple.com | Email: cheshire@apple.com | |||
End of changes. 193 change blocks. | ||||
578 lines changed or deleted | 631 lines changed or added | |||
This html diff was produced by rfcdiff 1.47. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |