draft-ietf-dnssd-push-22.txt | draft-ietf-dnssd-push-23.txt | |||
---|---|---|---|---|
Internet Engineering Task Force T. Pusateri | Internet Engineering Task Force T. Pusateri | |||
Internet-Draft Unaffiliated | Internet-Draft Unaffiliated | |||
Intended status: Standards Track S. Cheshire | Intended status: Standards Track S. Cheshire | |||
Expires: January 9, 2020 Apple Inc. | Expires: January 22, 2020 Apple Inc. | |||
July 8, 2019 | July 21, 2019 | |||
DNS Push Notifications | DNS Push Notifications | |||
draft-ietf-dnssd-push-22 | draft-ietf-dnssd-push-23 | |||
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 | |||
skipping to change at page 1, line 38 ¶ | skipping to change at page 1, line 38 ¶ | |||
Internet-Drafts are working documents of the Internet Engineering | Internet-Drafts are working documents of the Internet Engineering | |||
Task Force (IETF). Note that other groups may also distribute | Task Force (IETF). Note that other groups may also distribute | |||
working documents as Internet-Drafts. The list of current Internet- | working documents as Internet-Drafts. The list of current Internet- | |||
Drafts is at https://datatracker.ietf.org/drafts/current/. | Drafts is at https://datatracker.ietf.org/drafts/current/. | |||
Internet-Drafts are draft documents valid for a maximum of six months | Internet-Drafts are draft documents valid for a maximum of six months | |||
and may be updated, replaced, or obsoleted by other documents at any | and may be updated, replaced, or obsoleted by other documents at any | |||
time. It is inappropriate to use Internet-Drafts as reference | time. It is inappropriate to use Internet-Drafts as reference | |||
material or to cite them other than as "work in progress." | material or to cite them other than as "work in progress." | |||
This Internet-Draft will expire on January 9, 2020. | This Internet-Draft will expire on January 22, 2020. | |||
Copyright Notice | Copyright Notice | |||
Copyright (c) 2019 IETF Trust and the persons identified as the | Copyright (c) 2019 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 . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3 | 1.1. Requirements Language . . . . . . . . . . . . . . . . . . 3 | |||
1.2. Fatal Errors . . . . . . . . . . . . . . . . . . . . . . 3 | ||||
2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . 4 | 2. Motivation . . . . . . . . . . . . . . . . . . . . . . . . . 4 | |||
3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | 3. Overview . . . . . . . . . . . . . . . . . . . . . . . . . . 5 | |||
4. Transport . . . . . . . . . . . . . . . . . . . . . . . . . . 6 | 4. State Considerations . . . . . . . . . . . . . . . . . . . . 6 | |||
5. State Considerations . . . . . . . . . . . . . . . . . . . . 7 | 5. Transport . . . . . . . . . . . . . . . . . . . . . . . . . . 7 | |||
6. Protocol Operation . . . . . . . . . . . . . . . . . . . . . 8 | 6. Protocol Operation . . . . . . . . . . . . . . . . . . . . . 8 | |||
6.1. Discovery . . . . . . . . . . . . . . . . . . . . . . . . 9 | 6.1. Discovery . . . . . . . . . . . . . . . . . . . . . . . . 9 | |||
6.2. DNS Push Notification SUBSCRIBE . . . . . . . . . . . . . 13 | 6.2. DNS Push Notification SUBSCRIBE . . . . . . . . . . . . . 13 | |||
6.2.1. SUBSCRIBE Request . . . . . . . . . . . . . . . . . . 13 | 6.2.1. SUBSCRIBE Request . . . . . . . . . . . . . . . . . . 13 | |||
6.2.2. SUBSCRIBE Response . . . . . . . . . . . . . . . . . 16 | 6.2.2. SUBSCRIBE Response . . . . . . . . . . . . . . . . . 16 | |||
6.3. DNS Push Notification Updates . . . . . . . . . . . . . . 20 | 6.3. DNS Push Notification Updates . . . . . . . . . . . . . . 20 | |||
6.3.1. PUSH Message . . . . . . . . . . . . . . . . . . . . 20 | 6.3.1. PUSH Message . . . . . . . . . . . . . . . . . . . . 20 | |||
6.4. DNS Push Notification UNSUBSCRIBE . . . . . . . . . . . . 25 | 6.4. DNS Push Notification UNSUBSCRIBE . . . . . . . . . . . . 25 | |||
6.4.1. UNSUBSCRIBE Message . . . . . . . . . . . . . . . . . 25 | 6.4.1. UNSUBSCRIBE Message . . . . . . . . . . . . . . . . . 25 | |||
6.5. DNS Push Notification RECONFIRM . . . . . . . . . . . . . 27 | 6.5. DNS Push Notification RECONFIRM . . . . . . . . . . . . . 27 | |||
6.5.1. RECONFIRM Message . . . . . . . . . . . . . . . . . . 28 | 6.5.1. RECONFIRM Message . . . . . . . . . . . . . . . . . . 28 | |||
6.6. DNS Stateful Operations TLV Context Summary . . . . . . . 30 | 6.6. DNS Stateful Operations TLV Context Summary . . . . . . . 30 | |||
6.7. Client-Initiated Termination . . . . . . . . . . . . . . 31 | 6.7. Client-Initiated Termination . . . . . . . . . . . . . . 31 | |||
7. Security Considerations . . . . . . . . . . . . . . . . . . . 32 | 6.8. Client Fallback to Polling . . . . . . . . . . . . . . . 32 | |||
7.1. Security Services . . . . . . . . . . . . . . . . . . . . 32 | 7. Security Considerations . . . . . . . . . . . . . . . . . . . 33 | |||
7.2. TLS Name Authentication . . . . . . . . . . . . . . . . . 33 | 7.1. Security Services . . . . . . . . . . . . . . . . . . . . 33 | |||
7.3. TLS Early Data . . . . . . . . . . . . . . . . . . . . . 33 | 7.2. TLS Name Authentication . . . . . . . . . . . . . . . . . 34 | |||
7.4. TLS Session Resumption . . . . . . . . . . . . . . . . . 34 | 7.3. TLS Early Data . . . . . . . . . . . . . . . . . . . . . 34 | |||
8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 34 | 7.4. TLS Session Resumption . . . . . . . . . . . . . . . . . 35 | |||
9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 35 | 8. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 36 | |||
10. References . . . . . . . . . . . . . . . . . . . . . . . . . 35 | 9. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . 36 | |||
10.1. Normative References . . . . . . . . . . . . . . . . . . 35 | 10. References . . . . . . . . . . . . . . . . . . . . . . . . . 37 | |||
10.2. Informative References . . . . . . . . . . . . . . . . . 37 | 10.1. Normative References . . . . . . . . . . . . . . . . . . 37 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 39 | 10.2. Informative References . . . . . . . . . . . . . . . . . 38 | |||
Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 41 | ||||
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 [DisProx] 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 Service Discovery [RFC6763] but is not | |||
limited to that use case, and provides a general DNS mechanism for | limited to that use case, and 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. These words may also appear in this | |||
document in lower case as plain English words, absent their normative | document in lower case as plain English words, absent their normative | |||
meanings. | meanings. | |||
1.2. Fatal Errors | ||||
Certain invalid situations are described in this specification, like | ||||
a server sending a Push Notification subscription request to a | ||||
client, or a client sending a Push Notification response to a server. | ||||
These should never occur with a correctly implemented client and | ||||
server, and if they do occur then they indicate a serious | ||||
implementation error. In these extreme cases there is no reasonable | ||||
expectation of a graceful recovery, and the recipient detecting the | ||||
error should respond by unilaterally aborting the session without | ||||
regard for data loss. Such cases are addressed by having an engineer | ||||
investigate the cause of the failure and fixing the problem in the | ||||
software. | ||||
Where this specification says "forcibly abort", it means sending a | ||||
TCP RST to terminate the TCP connection, and the TLS session running | ||||
over that TCP connection. In the BSD Sockets API, this is achieved | ||||
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]. XMPP Publish-Subscribe [XEP0060] and | |||
Atom [RFC4287] are examples. While DNS servers are generally highly | Atom [RFC4287] are examples. While DNS servers are generally highly | |||
tuned and capable of a high rate of query/response traffic, adding a | tuned and capable of a high rate of query/response traffic, adding a | |||
publish/subscribe model for tracking changes to DNS records can | publish/subscribe model for tracking changes to DNS records can | |||
deliver more timely notification of changes with reduced CPU usage | deliver more timely notification of changes with reduced CPU usage | |||
and lower network traffic. | and lower network traffic. | |||
Multicast DNS [RFC6762] implementations always listen on a well known | Multicast DNS [RFC6762] implementations always listen on a well known | |||
link-local IP multicast group, and record changes are sent to that | link-local IP multicast group address, and record changes are sent to | |||
multicast group address for all group members to receive. Therefore, | that multicast group address for all group members to receive. | |||
Multicast DNS already has asynchronous change notification | Therefore, Multicast DNS already has asynchronous change notification | |||
capability. However, when DNS Service Discovery [RFC6763] is used | capability. However, when DNS Service Discovery [RFC6763] is used | |||
across a wide area network using Unicast DNS (possibly facilitated | across a wide area network using Unicast DNS (possibly facilitated | |||
via a Discovery Proxy [DisProx]) it would be beneficial to have an | via a Discovery Proxy [DisProx]) it would be beneficial to have an | |||
equivalent capability for Unicast DNS, to allow clients to learn | equivalent capability for Unicast DNS, to allow clients to learn | |||
about DNS record changes in a timely manner without polling. | 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 [LLQ] is an existing | |||
deployed solution to provide asynchronous change notifications, used | deployed solution to provide asynchronous change notifications, used | |||
by Apple's Back to My Mac [RFC6281] service introduced in Mac OS X | by Apple's Back to My Mac [RFC6281] service introduced in Mac OS X | |||
10.5 Leopard in 2007. Back to My Mac was designed in an era when the | 10.5 Leopard in 2007. Back to My Mac was designed in an era when the | |||
skipping to change at page 5, line 8 ¶ | skipping to change at page 5, line 8 ¶ | |||
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 [RFC7719]. | |||
Consequently, the "_dns-push-tls._tcp.<zone>" SRV record for a zone | ||||
MAY reference the same target host and port as that zone's | The "_dns-push-tls._tcp.<zone>" SRV record for a zone MAY reference | |||
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 TCP connection 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. | Updates and DNS Push Notification Subscriptions. DNS Updates and DNS | |||
Push Notifications may be handled on different ports on the same | ||||
Supporting DNS Updates and DNS Push Notifications on the same server | target host, in which case they are not considered to be the "same | |||
is OPTIONAL. A DNS Push Notification server is not required to | server" for the purposes of this specification, and communications | |||
support DNS Update. | with these two ports are handled independently. Supporting DNS | |||
Updates and DNS Push Notifications on the same server is OPTIONAL. A | ||||
DNS Updates and DNS Push Notifications may be handled on different | DNS Push Notification server is not required to support DNS Update. | |||
ports on the same target host, in which case they are not considered | ||||
to be the "same server" for the purposes of this specification, and | ||||
communications with these two ports are handled independently. | ||||
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 on names falling within that | MUST respond authoritatively for queries for names falling within | |||
zone (e.g., the <zone> in the "_dns-push-tls._tcp.<zone>" SRV record) | that zone (e.g., the "_dns-push-tls._tcp.<zone>" SRV record) both for | |||
both for normal DNS queries and for DNS Push Notification | normal DNS queries and for DNS Push Notification subscriptions. For | |||
subscriptions. For names for which the server is acting as a | names for which the server is acting as a recursive resolver, e.g., | |||
recursive resolver, e.g. when the server is the local recursive | when the server is the local recursive resolver, for any query for | |||
resolver, for any query for which it supports DNS Push Notification | which it supports DNS Push Notification subscriptions, it MUST also | |||
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, so | |||
DNS Push Notification clients MUST NOT recklessly create an excessive | DNS Push Notification clients MUST NOT recklessly create an excessive | |||
number of Push Notification subscriptions. Specifically: | 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 reason | |||
to need live data (for example, an on-screen display is currently | to need live data (for example, an on-screen display is currently | |||
showing the results to the user) and the subscription SHOULD be | showing the results to the user) and the subscription SHOULD be | |||
cancelled as soon as the need for that data ends (for example, when | cancelled as soon as the need for that data ends (for example, when | |||
the user dismisses that display). In the case of a device like a | the user dismisses that display). In the case of a device like a | |||
smartphone which, after some period of inactivity, goes to sleep or | smartphone which, after some period of inactivity, goes to sleep or | |||
otherwise darkens its screen, it should cancel its subscriptions when | otherwise darkens its screen, it should cancel its subscriptions when | |||
darkening the screen (since the user cannot see any changes in the | darkening the screen (since the user cannot see any changes on the | |||
display anyway) and reinstate its subscriptions when re-awakening | display anyway) and reinstate its subscriptions when re-awakening | |||
from display sleep. | 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 week, | |||
just to keep a list in memory up to date so that if the user does | just to keep a list in memory up to date so that if the user does | |||
choose to bring up an on-screen display of that data, it can be | choose to bring up an on-screen display of that data, it can be | |||
displayed really fast. DNS Push Notifications are designed to be | displayed really fast. DNS Push Notifications are designed to be | |||
fast enough that there is no need to pre-load a "warm" list in memory | fast enough that there is no need to pre-load a "warm" list in memory | |||
just in case it might be needed later. | just in case it might be needed later. | |||
skipping to change at page 6, line 27 ¶ | skipping to change at page 6, line 25 ¶ | |||
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 session to a server open | [RFC8490], a client must not keep a 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 session as soon as it becomes | on that session. A client MAY close a session as soon as it becomes | |||
idle, and then if needed in the future, open a new session when | idle, and then if needed in the future, open a new session when | |||
required. Alternatively, a client MAY speculatively keep an idle | required. Alternatively, a client MAY speculatively keep an idle | |||
session open for some time, subject to the constraint that it MUST | session open for some time, subject to the constraint that it MUST | |||
NOT keep a session open that has been idle for more than the | NOT keep a session open that has been idle for more than the | |||
session's idle timeout (15 seconds by default) [RFC8490]. | session's idle timeout (15 seconds by default) [RFC8490]. | |||
4. Transport | 4. State Considerations | |||
Each DNS Push Notification server is capable of handling some finite | ||||
number of Push Notification subscriptions. This number will vary | ||||
from server to server and is based on physical machine | ||||
characteristics, network bandwidth, and operating system resource | ||||
allocation. After a client establishes a session to a DNS server, | ||||
each subscription is individually accepted or rejected. Servers may | ||||
employ various techniques to limit subscriptions to a manageable | ||||
level. Correspondingly, the client is free to establish simultaneous | ||||
sessions to alternate DNS servers that support DNS Push Notifications | ||||
for the zone and distribute subscriptions at the client's discretion. | ||||
In this way, both clients and servers can react to resource | ||||
constraints. | ||||
5. Transport | ||||
Other DNS operations like DNS Update [RFC2136] MAY use either User | Other DNS operations like DNS Update [RFC2136] MAY use either User | |||
Datagram Protocol (UDP) [RFC0768] or Transmission Control Protocol | Datagram Protocol (UDP) [RFC0768] or Transmission Control Protocol | |||
(TCP) [RFC0793] as the transport protocol, in keeping with the | (TCP) [RFC0793] as the transport protocol, in keeping with the | |||
historical precedent that DNS queries must first be sent over UDP | historical precedent that DNS queries must first be sent over UDP | |||
[RFC1123]. This requirement to use UDP has subsequently been relaxed | [RFC1123]. This requirement to use UDP has subsequently been relaxed | |||
[RFC7766]. | [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 | |||
skipping to change at page 7, line 4 ¶ | skipping to change at page 7, line 29 ¶ | |||
concerns of state overload at the server which is a potential problem | concerns of state overload at the server which is a potential problem | |||
with connectionless protocols using spoofed source addresses. All | with connectionless protocols 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], Tail Loss Probe (TLP) | [RFC6824], TCP Fast Open (TFO) [RFC7413], Tail Loss Probe (TLP) | |||
[I-D.dukkipati-tcpm-tcp-loss-probe], and so on. | [I-D.dukkipati-tcpm-tcp-loss-probe], and so on. | |||
Transport Layer Security (TLS) [RFC8446] is well understood and | Transport Layer Security (TLS) [RFC8446] is well understood, and used | |||
deployed across many protocols running over TCP. It is designed to | by many application-layer protocols running over TCP. TLS is | |||
prevent eavesdropping, tampering, and message forgery. TLS is | designed to prevent eavesdropping, tampering, and message forgery. | |||
REQUIRED for every connection between a client subscriber and server | TLS is REQUIRED for every connection between a client subscriber and | |||
in this protocol specification. Additional security measures such as | server in this protocol specification. Additional security measures | |||
client authentication during TLS negotiation MAY also be employed to | such as client authentication during TLS negotiation MAY also be | |||
increase the trust relationship between client and server. | employed to increase the trust relationship between client and | |||
server. | ||||
5. State Considerations | ||||
Each DNS Push Notification server is capable of handling some finite | ||||
number of Push Notification subscriptions. This number will vary | ||||
from server to server and is based on physical machine | ||||
characteristics, network bandwidth, and operating system resource | ||||
allocation. After a client establishes a session to a DNS server, | ||||
each subscription is individually accepted or rejected. Servers may | ||||
employ various techniques to limit subscriptions to a manageable | ||||
level. Correspondingly, the client is free to establish simultaneous | ||||
sessions to alternate DNS servers that support DNS Push Notifications | ||||
for the zone and distribute subscriptions at the client's discretion. | ||||
In this way, both clients and servers can react to resource | ||||
constraints. | ||||
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 makes use of DNS Stateful Operations (DSO) [RFC8490]. | and 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 Oper- | |||
ations specification [RFC8490]. Those details are not repeated here. | ations 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 | |||
skipping to change at page 8, line 28 ¶ | skipping to change at page 8, line 28 ¶ | |||
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 | A typical DNS Push Notification client will immediately issue a DSO | |||
Keepalive operation to request a session timeout and/or keepalive | Keepalive operation to request a session timeout and/or keepalive | |||
interval longer than the the 15-second default values, but this is | interval longer than the the 15-second default values, but this is | |||
not required. A DNS Push Notification client MAY issue other | not required. A DNS Push Notification client MAY issue other | |||
requests on the session first, and only issue a DSO Keepalive | requests on the session first, and only issue a DSO Keepalive | |||
operation later if it determines that to be necessary. Sending | operation later if it determines that to be necessary. Sending | |||
either a DSO Keepalive operation or a Push Notification subscription | either a DSO Keepalive operation or a Push Notification subscription | |||
over the TLS/TCP connection to the server signals the client's | request over the TLS/TCP connection to the server signals the | |||
support of DSO and serves to establish a DSO session. | 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 cancelling that subscription is simultaneously in flight from | |||
client to server. | client to server. | |||
skipping to change at page 9, line 31 ¶ | skipping to change at page 9, line 31 ¶ | |||
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 split-view DNS can create some additional | of VPN tunnels and split-view DNS 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 split-view DNS for DNS Push Notifications are the same as | tunnels and split-view 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 does | If the recursive resolver does not support DNS over TLS, or supports | |||
support DNS over TLS but is not listening on TCP port 853, or does | DNS over TLS but is not listening on TCP port 853, or supports DNS | |||
support DNS over TLS on TCP port 853 but does not support DSO on that | over TLS on TCP port 853 but does not support DSO on that port, then | |||
port, then the DSO Session session establishment will fail [RFC8490]. | the DSO Session session establishment will fail [RFC8490]. | |||
If the recursive resolver does support DSO but not Push Notification | If the recursive resolver does support DSO but not Push Notification | |||
subscriptions, then it will return the DSO error code, DSOTYPENI | subscriptions, then it will return the DSO error code, DSOTYPENI | |||
(11). | (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 | |||
skipping to change at page 10, line 22 ¶ | skipping to change at page 10, line 22 ¶ | |||
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.foo.example.com (to discover Internet Printing Protocol | _ipp._tcp.headoffice.example.com (to discover Internet Printing | |||
(IPP) printers [RFC8010] [RFC8011] being advertised at | Protocol (IPP) printers [RFC8010] [RFC8011] being advertised in | |||
"foo.example.com"). The client begins by sending an SOA query | the head office of Example Company.). The client begins by | |||
for _ipp._tcp.foo.example.com to the local recursive resolver. | sending an SOA query for _ipp._tcp.headoffice.example.com to the | |||
The goal is to determine the server authoritative for the name | local recursive resolver. The goal is to determine the server | |||
_ipp._tcp.foo.example.com. The closest enclosing DNS zone | authoritative for the name _ipp._tcp.headoffice.example.com. The | |||
containing the name _ipp._tcp.foo.example.com could be | closest enclosing DNS zone containing the name | |||
example.com, or foo.example.com, or _tcp.foo.example.com, or even | _ipp._tcp.headoffice.example.com could be example.com, or | |||
_ipp._tcp.foo.example.com. The client does not know in advance | headoffice.example.com, or _tcp.headoffice.example.com, or even | |||
where the closest enclosing zone cut occurs, which is why it uses | _ipp._tcp.headoffice.example.com. The client does not know in | |||
the iterative procedure described here to discover this | advance where the closest enclosing zone cut occurs, which is why | |||
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 | |||
skipping to change at page 11, line 9 ¶ | skipping to change at page 11, line 9 ¶ | |||
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 one label in it, the client sends an SOA query | name has at least two labels in it, the client sends an SOA query | |||
for that new name, and processing continues at step 2 above, | 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 the query name consists of a single label, i.e., a Top Level | or the query name consists of a single label, i.e., a Top Level | |||
Domain (TLD). In the case of a single-label TLD, this is a | Domain (TLD). In the case of a single-label (TLD), this is a | |||
network configuration error which should not happen and the | 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 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 (either by virtue of being seen 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. | |||
skipping to change at page 12, line 11 ¶ | skipping to change at page 12, line 11 ¶ | |||
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 | Each time a client makes a new DNS Push Notification subscription | |||
session, it SHOULD repeat the discovery process in order to determine | session, it SHOULD repeat the discovery process in order to determine | |||
the preferred DNS server for subscriptions at that time. However, | the preferred DNS server for subscriptions at that time. However, | |||
the client device MUST respect the DNS TTL values on records it | the client device MUST respect the DNS TTL values on records it | |||
receives, and store them in its local cache with this lifetime. This | receives, and store them in its local cache with this lifetime. 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 were set to reasonable values, repeated application of this | records are set to reasonable values, repeated application of this | |||
discovery process can be completed nearly instantaneously by the | discovery process can be completed nearly 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 indicates its desire to receive DNS Push Notifications for | then indicates its desire to receive DNS Push Notifications for | |||
a given domain name by sending a SUBSCRIBE request to the server. | a given domain name by sending a SUBSCRIBE request to the server. | |||
A SUBSCRIBE request is encoded in a DSO message [RFC8490]. | A SUBSCRIBE request is encoded in a DSO message [RFC8490]. | |||
This specification defines a primary DSO TLV for DNS Push | This specification defines a primary DSO TLV for DNS Push | |||
Notification SUBSCRIBE Requests (tentatively DSO Type Code 0x40). | Notification SUBSCRIBE Requests (tentatively DSO Type Code 0x40). | |||
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 early data, provided that the precautions described in Section 7.3 | in TLS early data, provided that the precautions described in | |||
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 should immediately abort the connection with a TLS | the client MUST forcibly abort the connection immediately. | |||
close_notify alert (see Section 6.1 of the TLS 1.3 specification | ||||
[RFC8446]). After sending the TLS close_notify alert the client MUST | ||||
gracefully close the underlying connection using a TCP FIN, so that | ||||
the TLS close_notify is reliably delivered. The mechanisms for | ||||
gracefully closing a TCP connection with a TCP FIN vary depending on | ||||
the networking API. For example, in the BSD Sockets API, sending a | ||||
TCP FIN is achieved by calling "shutdown(s,SHUT_WR)" and keeping the | ||||
socket open until all remaining data has been read from it. | ||||
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 message is illustrated in Figure 1. | request message 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 not using for any other active operation on this DSO session. For | is 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 the | |||
skipping to change at page 14, line 52 ¶ | skipping to change at page 14, line 49 ¶ | |||
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 applies (e.g., "example.com" and "Example.com" are | US-ASCII letters applies (e.g., "example.com" and "Example.com" are | |||
the same). If a server receives such a duplicate SUBSCRIBE message | the same). If a server receives such a duplicate SUBSCRIBE message, | |||
this is a fatal error and the server MUST immediately terminate the | this is a fatal error and the server MUST forcibly abort the | |||
connection with a TLS close_notify alert followed by a TCP FIN. | connection immediately. | |||
DNS wildcarding is not supported. That is, a wildcard ("*") in a | DNS wildcarding is not supported. That is, a wildcard ("*") in a | |||
SUBSCRIBE message matches only a literal wildcard character ("*") in | SUBSCRIBE message matches only a literal wildcard character ("*") in | |||
the zone, and nothing else. | the zone, and nothing else. | |||
Aliasing is not supported. That is, a CNAME in a SUBSCRIBE message | Aliasing is not supported. That is, a CNAME in a SUBSCRIBE message | |||
matches only a literal CNAME record in the zone, and not to any | matches only a literal CNAME record in the zone, and no other records | |||
records referenced by the owner name. | 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 | |||
skipping to change at page 16, line 24 ¶ | skipping to change at page 16, line 24 ¶ | |||
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. | |||
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 MUST | |||
be silently ignored. | be silently ignored. | |||
A client MUST NOT send a SUBSCRIBE response. If a client does send a | ||||
SUBSCRIBE message, with the QR bit set indicating that it is a | ||||
response, this is a fatal error and the server MUST forcibly 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 | \ | | 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) | | | |||
skipping to change at page 20, line 30 ¶ | skipping to change at page 20, line 30 ¶ | |||
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 spec- | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | |||
for DNS Stateful Operations (6). The four count fields MUST be zero, | for DNS Stateful Operations (6). The four count fields MUST be zero, | |||
and the corresponding four sections MUST be empty (i.e., absent). | and the corresponding four sections MUST be empty (i.e., absent). | |||
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 | ||||
that it is a response, this is a fatal error and the receiver MUST | ||||
forcibly abort the connection immediately. | ||||
The DSO-TYPE is PUSH (tentatively 0x41). | The DSO-TYPE is PUSH (tentatively 0x41). | |||
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 receiver MUST immediately terminate the | fatal error, and the client MUST forcibly abort the connection | |||
connection with a TLS close_notify alert followed by a TCP FIN. | 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 (2^31 - 1, or 0x7FFFFFFF), | is in the range 0 to 2,147,483,647 seconds (2^31 - 1, or 0x7FFFFFFF), | |||
then a new DNS Resource Record with the given name, type, class and | then a new DNS Resource Record with the given name, type, class and | |||
RDATA is added. A TTL of 0 means that this record should be retained | RDATA is added. A TTL of 0 means that this record should be retained | |||
for as long as the subscription is active, and should be discarded | for as long as the subscription is active, and should be discarded | |||
immediately the moment the subscription is cancelled. | immediately the moment the subscription is cancelled. | |||
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. | with the given name, type, class and RDATA is removed. | |||
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 receiver MUST immediately | zero, this is a fatal error, and the client MUST forcibly abort the | |||
terminate the connection with a TLS close_notify alert followed by a | connection immediately. | |||
TCP FIN. There are three types of collective remove notification: | ||||
For collective remove notifications, if CLASS is 255 (ANY), then for | There are three types of collective remove notification: | |||
the given name this deletes all records of all types in all classes. | ||||
In this case TYPE MUST be set to zero on transmission, and MUST be | For collective remove notifications, if CLASS is not 255 (ANY) and | |||
silently ignored on reception. | TYPE is not 255 (ANY) then for the given name this deletes all | |||
records of the specified type in the specified class. | ||||
For collective remove notifications, if CLASS is not 255 (ANY) and | For collective remove notifications, if CLASS is not 255 (ANY) and | |||
TYPE is 255 (ANY) then for the given name this deletes all records of | TYPE is 255 (ANY) then for the given name this deletes all records of | |||
all types in the specified class. | all types in the specified class. | |||
For collective remove notifications, if CLASS is not 255 (ANY) and | For collective remove notifications, if CLASS is 255 (ANY), then for | |||
TYPE is not 255 (ANY) then for the given name this deletes all | the given name this deletes all records of all types in all classes. | |||
records of the specified type in the specified class. | In this case TYPE MUST be set to zero on transmission, and MUST be | |||
silently ignored on reception. | ||||
Summary of change notification types: | Summary of change notification types: | |||
Delete all RRsets from a name, in all classes | Delete all RRsets from a name, in all classes | |||
TTL=0xFFFFFFFE, RDLENGTH=0, CLASS=255 (ANY) | TTL=0xFFFFFFFE, RDLENGTH=0, CLASS=255 (ANY) | |||
Delete all RRsets from a name, in given class: | Delete all RRsets from a name, in given class: | |||
TTL=0xFFFFFFFE, RDLENGTH=0, CLASS specifies class, TYPE=255 (ANY) | TTL=0xFFFFFFFE, RDLENGTH=0, CLASS specifies class, TYPE=255 (ANY) | |||
Delete specified RRset from a name, in given class: | Delete specified RRset from a name, in given class: | |||
TTL=0xFFFFFFFE, RDLENGTH=0 | TTL=0xFFFFFFFE, RDLENGTH=0 | |||
CLASS and TYPE specify the RRset being deleted | CLASS and TYPE specify the RRset being deleted | |||
Delete an individual RR from a name: | Delete an individual RR from a name: | |||
TTL=0xFFFFFFFF | TTL=0xFFFFFFFF | |||
CLASS, TYPE, RDLENGTH and RDATA specify the RR being deleted. | CLASS, TYPE, RDLENGTH and RDATA specify the RR being deleted. | |||
Add individual RR to a name | Add individual RR to a name | |||
TTL>=0 | TTL⩾0 | |||
CLASS, TYPE, RDLENGTH, RDATA and TTL specify the RR being added. | CLASS, TYPE, RDLENGTH, 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 automatically | Therefore, a change notification with RDLEN=0 does not automatically | |||
indicate a remove notification. If RDLEN=0 and TTL is the in the | indicate a remove notification. If RDLEN=0 and TTL is the in the | |||
range 0 - 0x7FFFFFFF, this change notification signals the addition | range 0 - 0x7FFFFFFF, this change notification signals the addition | |||
of a record with the given name, type, class, and empty RDATA. If | of a record with the given name, type, class, and empty RDATA. If | |||
RDLEN=0 and TTL = 0xFFFFFFFF, this change notification signals the | RDLEN=0 and TTL = 0xFFFFFFFF, this change notification signals the | |||
skipping to change at page 22, line 50 ¶ | skipping to change at page 23, line 6 ¶ | |||
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, the this is a fatal error, and the receiver MUST | than 16,382 bytes, this is a fatal error, and the client MUST | |||
immediately terminate the connection with a TLS close_notify alert | forcibly abort the connection immediately. | |||
followed by a TCP FIN. | ||||
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 | |||
skipping to change at page 23, line 35 ¶ | skipping to change at page 23, line 37 ¶ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
\ 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 | | | | 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 | |||
skipping to change at page 25, line 14 ¶ | skipping to change at page 25, line 14 ¶ | |||
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. The UNSUBSCRIBE message is encoded as a | DSO session to the server. The UNSUBSCRIBE message is encoded as a | |||
DSO unidirectional message [RFC8490]. This specification defines a | DSO unidirectional message [RFC8490]. This specification defines a | |||
primary unidirectional DSO TLV for DNS Push Notification UNSUBSCRIBE | primary unidirectional DSO TLV for DNS Push Notification UNSUBSCRIBE | |||
Messages (tentatively DSO Type Code 0x42). | Messages (tentatively DSO Type Code 0x42). | |||
A server MUST NOT initiate an UNSUBSCRIBE message. If a server does | A server MUST NOT send an UNSUBSCRIBE message. If a server does send | |||
send an UNSUBSCRIBE message over a DSO session initiated by a client, | an UNSUBSCRIBE message over a DSO session initiated by a client, or | |||
this is a fatal error and the client should immediately abort the | an UNSUBSCRIBE message is sent with the QR bit set indicating that it | |||
connection with a TLS close_notify alert followed by a TCP FIN. | is a response, this is a fatal error and the receiver MUST forcibly | |||
abort the 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. | |||
skipping to change at page 27, line 28 ¶ | skipping to change at page 27, line 28 ¶ | |||
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 otherwise | |||
need not cause any action to occur. | need not cause any 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. | |||
A server MUST NOT send a RECONFIRM message. If a server does send a | ||||
RECONFIRM message 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 fatal error and the receiver MUST forcibly abort | ||||
the connection 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 RECONFIRM message is illustrated in Figure 5. | A 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. | |||
skipping to change at page 29, line 5 ¶ | skipping to change at page 28, line 26 ¶ | |||
ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | ification [RFC8490]. The DNS OPCODE field contains the OPCODE value | |||
for DNS Stateful Operations (6). The four count fields MUST be zero, | for DNS Stateful Operations (6). The four count fields MUST be zero, | |||
and the corresponding four sections MUST be empty (i.e., absent). | and the corresponding four sections MUST be empty (i.e., absent). | |||
The DSO-TYPE is RECONFIRM (tentatively 0x43). | The DSO-TYPE is RECONFIRM (tentatively 0x43). | |||
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. | ||||
The DSO-DATA for a RECONFIRM message has no count field to specify | ||||
more than one record. Since RECONFIRM messages are sent over TCP, | ||||
multiple RECONFIRM messages can be concatenated in a single TCP | ||||
stream and packed efficiently into TCP segments. | ||||
TYPE MUST NOT be the value ANY (255) and CLASS MUST NOT be the value | ||||
ANY (255). | ||||
DNS wildcarding is not supported. That is, a wildcard ("*") in a | ||||
RECONFIRM message matches only a literal wildcard character ("*") in | ||||
the zone, and nothing else. | ||||
Aliasing is not supported. That is, a CNAME in a RECONFIRM message | ||||
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 | ||||
be inferred from DSO-LENGTH, so an additional RDLEN field would be | ||||
redundant. | ||||
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) | | | |||
skipping to change at page 29, line 35 ¶ | skipping to change at page 30, line 5 ¶ | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
| TYPE | | | | TYPE | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > DSO-DATA | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ > DSO-DATA | |||
| CLASS | | | | CLASS | | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | |||
\ RDATA \ / | \ RDATA \ / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
Figure 5: RECONFIRM Message | Figure 5: RECONFIRM Message | |||
The DSO-DATA for a RECONFIRM message MUST contain exactly one record. | ||||
The DSO-DATA for a RECONFIRM message has no count field to specify | ||||
more than one record. Since RECONFIRM messages are sent over TCP, | ||||
multiple RECONFIRM messages can be concatenated in a single TCP | ||||
stream and packed efficiently into TCP segments. | ||||
TYPE MUST NOT be the value ANY (255) and CLASS MUST NOT be the value | ||||
ANY (255). | ||||
DNS wildcarding is not supported. That is, a wildcard ("*") in a | ||||
RECONFIRM message matches only a literal wildcard character ("*") in | ||||
the zone, and nothing else. | ||||
Aliasing is not supported. That is, a CNAME in a RECONFIRM message | ||||
matches only a literal CNAME record in the zone, and nothing else. | ||||
6.6. DNS Stateful Operations TLV Context Summary | 6.6. DNS Stateful Operations TLV Context Summary | |||
This document defines four new DSO TLVs. As suggested in Section 8.2 | This document defines four new DSO TLVs. As suggested in Section 8.2 | |||
of the DNS Stateful Operations specification [RFC8490], the valid | of the DNS Stateful Operations specification [RFC8490], the valid | |||
contexts of these new TLV types are summarized below. | 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 | |||
skipping to change at page 31, line 36 ¶ | skipping to change at page 31, line 36 ¶ | |||
implicitly terminates all subscriptions on that session. This may | implicitly terminates all subscriptions on that session. This may | |||
occur because the client computer is being shut down, is going to | 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. | cancelled. | |||
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 in order to allow for future TLS session resumption | the TLS session in order to allow for future TLS session resumption | |||
with the server (if available). See Section 7.4 below. Typical APIs | with the server (if available). See Section 7.4 below. Typical APIs | |||
will provide a session close method that will send a TLS close_notify | will provide a session close method that will send a TLS close_notify | |||
alert. This instructs the recipient that the sender will not send | alert (see Section 6.1 of the TLS 1.3 specification [RFC8446]). This | |||
any more data over the session. | instructs the recipient that the sender will not send any more data | |||
over the session. After sending the TLS close_notify alert the | ||||
client MUST gracefully close the underlying connection using a TCP | ||||
FIN, so that the TLS close_notify is reliably delivered. The | ||||
mechanisms for gracefully closing a TCP connection with a TCP FIN | ||||
vary depending on the networking API. For example, in the BSD | ||||
Sockets API, sending a TCP FIN is achieved by calling | ||||
"shutdown(s,SHUT_WR)" and keeping the 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 and TLS session | from either end of the connection, data may be lost and TLS session | |||
resumption of this session will not be possible. | resumption of this session will not be possible. | |||
6.8. Client Fallback to Polling | ||||
There are cases where a client may exhaust all avenues for | ||||
establishing a DNS Push Notification subscription without success. | ||||
This can happen if the client's configured recursive resolver does | ||||
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 | ||||
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 | ||||
the client will attempt to communicate directly with an appropriate | ||||
server, and it may be that the zone apex discovery fails, or there is | ||||
no "_dns-push-tls._tcp.<zone>" SRV record, or server indicated in the | ||||
SRV record is misconfigured, or is unresponsive for some other | ||||
reason. | ||||
Regardless of the reason for the failure, after being unable to | ||||
establish the desired DNS Push Notification subscription, it is | ||||
likely that the client will still wish to know the answer it seeks, | ||||
even if that answer cannot be obtained with the timely change | ||||
notifications provided by DNS Push Notifications. In such cases it | ||||
is likely that the client will obtain the answer it seeks via a | ||||
conventional DNS query instead, repeated at some interval to detect | ||||
when the answer RRset changes. | ||||
In the case where a client responds to its failure to establish a DNS | ||||
Push Notification subscription by falling back to polling with | ||||
conventional DNS queries instead, the polling rate should be | ||||
controlled to avoid placing excessive burden on the server. The | ||||
interval between successive DNS queries for the same name, type and | ||||
class SHOULD be at least the minimum of: 900 seconds (15 minutes), or | ||||
two seconds more than the TTL of the answer RRset. | ||||
The reason that for TTLs shorter than 898 seconds the query should | ||||
not be reissued until two seconds *after* the answer RRset has | ||||
expired is to ensure that the answer RRset has also expired from the | ||||
cache on the client's configured recursive resolver. Otherwise | ||||
(particularly if the clocks on the client and the recursive resolver | ||||
do not run at precisely the same rate) there's a risk of a race | ||||
condition where the client queries its configured recursive resolver | ||||
just as the answer RRset has one second remaining in the recursive | ||||
resolver's cache. The client would then receive a reply telling it | ||||
that the answer RRset has one second remaining, and then the client | ||||
would then re-query the recursive resolver again one second later | ||||
when the answer RRset actually expires, and only then would the | ||||
recursive resolver issue a new query to fetch new fresh data from the | ||||
authoritative server. Waiting until the answer RRset has definitely | ||||
expired from the the cache on the client's configured recursive | ||||
resolver avoids this race condition and unnecessary additional | ||||
queries it causes. | ||||
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 | ||||
a DNS Push Notification subscription, using previously cached DNS | ||||
answers as appropriate. After a temporary misconfiguration has been | ||||
remedied, this allows a client that is polling to return to using DNS | ||||
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 Usage Profile for DNS over TLS is REQUIRED for DNS | |||
Push Notifications [RFC8310]. Cleartext connections for DNS Push | 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 DNS over (D)TLS Usage Profiles document | |||
[RFC8310] for additional recommendations for various versions of TLS | [RFC8310] for additional recommendations for various versions of TLS | |||
skipping to change at page 33, line 34 ¶ | skipping to change at page 34, line 42 ¶ | |||
must be used for the target name to ensure the client is connecting | must be used for the target name to ensure the client is connecting | |||
to the server it has authenticated. If the target name does not have | to the server it has authenticated. If the target name does not have | |||
a usable TLSA record, then the use of the SNI extension is optional. | a 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 obtaining results faster. However, there are | trip, and can result in the client obtaining results faster. | |||
some factors to consider before using TLS early data. | ||||
However, there are some factors to consider before using TLS early | ||||
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 imposed when the server detects excessive numbers of | that are activated when the server detects an excessive number of | |||
spurious subscription requests. | spurious subscription requests. | |||
For further guidance please see Section 2.3, Section 8, and | For further guidance please see Section 2.3, Section 8, and | |||
Appendix E.5 of the TLS 1.3 specification [RFC8446]. | Appendix E.5 of the TLS 1.3 specification [RFC8446]. | |||
7.4. TLS Session Resumption | 7.4. TLS Session Resumption | |||
TLS Session Resumption is permissible on DNS Push Notification | TLS Session Resumption is permissible on DNS Push Notification | |||
servers. The server may keep TLS state with Session IDs [RFC8446] or | servers. The server may keep TLS state with Session IDs [RFC8446] or | |||
operate in stateless mode by sending a Session Ticket [RFC5077] to | operate in stateless mode by sending a Session Ticket [RFC5077] to | |||
skipping to change at page 35, line 5 ¶ | skipping to change at page 36, line 35 ¶ | |||
| | | Data | | | | | | | Data | | | | |||
+-------------+------------+--------+-----------------+-------------+ | +-------------+------------+--------+-----------------+-------------+ | |||
| SUBSCRIBE | TBA (0x40) | OK | Standards Track | Section 6.2 | | | SUBSCRIBE | TBA (0x40) | OK | Standards Track | Section 6.2 | | |||
| PUSH | TBA (0x41) | NO | Standards Track | Section 6.3 | | | PUSH | TBA (0x41) | NO | Standards Track | Section 6.3 | | |||
| UNSUBSCRIBE | TBA (0x42) | NO | Standards Track | Section 6.4 | | | UNSUBSCRIBE | TBA (0x42) | NO | Standards Track | Section 6.4 | | |||
| RECONFIRM | TBA (0x43) | NO | Standards Track | Section 6.5 | | | RECONFIRM | TBA (0x43) | NO | Standards Track | Section 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. | ||||
9. Acknowledgements | 9. Acknowledgements | |||
The authors would like to thank Kiren Sekar and Marc Krochmal for | The authors would like to thank Kiren Sekar and Marc Krochmal for | |||
previous work completed in this field. | previous work completed in this field. | |||
This draft has been improved due to comments from Ran Atkinson, Tim | This draft has been improved due to comments from Ran Atkinson, Tim | |||
Chown, Mark Delany, Ralph Droms, Bernie Volz, Jan Komissar, Manju | Chown, Sara Dickinson, Mark Delany, Ralph Droms, Jan Komissar, Eric | |||
Shankar Rao, Markus Stenberg, Dave Thaler, Soraia Zlatkovic, Sara | Rescorla, Michael Richardson, David Schinazi, Manju Shankar Rao, | |||
Dickinson, and Andrew Sullivan. Ted Lemon provided clarifying text | 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. | that was greatly appreciated. | |||
10. References | 10. References | |||
10.1. Normative References | 10.1. Normative References | |||
[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>. | |||
End of changes. 47 change blocks. | ||||
153 lines changed or deleted | 258 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/ |