rfc8765xml2.original.xml | rfc8765.xml | |||
---|---|---|---|---|
<?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | |||
<!-- This template is for creating an Internet Draft using xml2rfc, | ||||
which is available here: http://xml.resource.org. --> | ||||
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [ | ||||
<!-- One method to get references from the online citation libraries. | ||||
There has to be one entity for each item to be referenced. | ||||
An alternate method (rfc include) is described in the references. --> | ||||
<!ENTITY RFC0020 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.0020.xml"> | ||||
<!ENTITY RFC0768 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.0768.xml"> | ||||
<!ENTITY RFC0793 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.0793.xml"> | ||||
<!ENTITY RFC1034 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1034.xml"> | ||||
<!ENTITY RFC1035 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1035.xml"> | ||||
<!ENTITY RFC1123 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.1123.xml"> | ||||
<!ENTITY RFC2119 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2119.xml"> | ||||
<!ENTITY RFC2136 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2136.xml"> | ||||
<!ENTITY RFC2181 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2181.xml"> | ||||
<!ENTITY RFC2308 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2308.xml"> | ||||
<!ENTITY RFC3123 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.3123.xml"> | ||||
<!ENTITY RFC2782 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.2782.xml"> | ||||
<!ENTITY RFC4287 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.4287.xml"> | ||||
<!ENTITY RFC4953 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.4953.xml"> | ||||
<!ENTITY RFC6066 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6066.xml"> | ||||
<!ENTITY RFC6281 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6281.xml"> | ||||
<!ENTITY RFC6762 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6762.xml"> | ||||
<!ENTITY RFC6763 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6763.xml"> | ||||
<!ENTITY RFC6824 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6824.xml"> | ||||
<!ENTITY RFC6886 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6886.xml"> | ||||
<!ENTITY RFC6887 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6887.xml"> | ||||
<!ENTITY RFC6895 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.6895.xml"> | ||||
<!ENTITY RFC7413 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7413.xml"> | ||||
<!ENTITY RFC7673 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7673.xml"> | ||||
<!ENTITY RFC7719 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7719.xml"> | ||||
<!ENTITY RFC7766 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7766.xml"> | ||||
<!ENTITY RFC7858 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.7858.xml"> | ||||
<!ENTITY RFC8010 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8010.xml"> | ||||
<!ENTITY RFC8011 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8011.xml"> | ||||
<!ENTITY RFC8174 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8174.xml"> | ||||
<!ENTITY RFC8310 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8310.xml"> | ||||
<!ENTITY RFC8446 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8446.xml"> | ||||
<!ENTITY RFC8490 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8490.xml"> | ||||
<!ENTITY RFC8499 SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/bibxml/refer | ||||
ence.RFC.8499.xml"> | ||||
<!ENTITY I-D.ietf-tcpm-rack SYSTEM "https://xml2rfc.tools.ietf.org/public/rfc/b | ||||
ibxml3/reference.I-D.ietf-tcpm-rack.xml"> | ||||
]> | ||||
<?xml-stylesheet type='text/xsl' href='rfc2629.xslt' ?> | ||||
<!-- used by XSLT processors --> | ||||
<!-- For a complete list and description of processing instructions (PIs), | ||||
please see http://xml.resource.org/authoring/README.html. --> | ||||
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds | ||||
might want to use. | ||||
(Here they are set differently than their defaults in xml2rfc v1.32) --> | ||||
<?rfc strict="yes" ?> | ||||
<!-- give errors regarding ID-nits and DTD validation --> | ||||
<!-- control the table of contents (ToC) --> | ||||
<?rfc toc="yes"?> | ||||
<!-- generate a ToC --> | ||||
<?rfc tocdepth="4"?> | ||||
<!-- the number of levels of subsections in ToC. default: 3 --> | ||||
<!-- control references --> | ||||
<?rfc symrefs="yes"?> | ||||
<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] --> | ||||
<?rfc sortrefs="yes" ?> | ||||
<!-- sort the reference entries alphabetically --> | ||||
<!-- control vertical white space | ||||
(using these PIs as follows is recommended by the RFC Editor) --> | ||||
<?rfc compact="yes" ?> | ||||
<!-- do not start each main section on a new page --> | ||||
<?rfc subcompact="no" ?> | ||||
<!-- keep one blank line between list items --> | ||||
<!-- end of list of popular I-D processing instructions --> | ||||
<rfc category="std" docName="draft-ietf-dnssd-push-25" ipr="trust200902"> | ||||
<!-- category values: std, bcp, info, exp, and historic | ||||
ipr values: trust200902, noModificationTrust200902, noDerivativesTrust200902 | ||||
, | ||||
or pre5378Trust200902 | ||||
you can add the attributes updates="NNNN" and obsoletes="NNNN" | ||||
they will automatically be output with "(if approved)" --> | ||||
<!-- ***** FRONT MATTER ***** --> | <!DOCTYPE rfc SYSTEM "rfc2629-xhtml.ent"> | |||
<front> | ||||
<!-- The abbreviated title is used in the page header - it is only necessary | ||||
if the | ||||
full title is longer than 39 characters --> | ||||
<title abbrev="DNS Push Notifications">DNS Push Notifications</title> | ||||
<!-- add 'role="editor"' below for the editors if appropriate --> | ||||
<!-- Another author who claims to be an editor --> | ||||
<author fullname="Tom Pusateri" initials="T.J." surname="Pusateri"> | ||||
<organization>Unaffiliated</organization> | ||||
<address> | ||||
<postal> | ||||
<street></street> | ||||
<!-- Reorder these if your country does things differently --> | ||||
<city>Raleigh</city> | ||||
<region>NC</region> | ||||
<code>27608</code> | ||||
<country>USA</country> | ||||
</postal> | ||||
<phone>+1 919 867 1330</phone> | ||||
<email>pusateri@bangj.com</email> | ||||
<!-- uri and facsimile elements may also be added --> | ||||
</address> | ||||
</author> | ||||
<author fullname="Stuart Cheshire" initials="S." surname="Cheshire"> | ||||
<organization>Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>One Apple Park Way</street> | ||||
<!-- Reorder these if your country does things differently --> | ||||
<city>Cupertino</city> | ||||
<region>CA</region> | ||||
<code>95014</code> | ||||
<country>USA</country> | ||||
</postal> | ||||
<phone>+1 (408) 996-1010</phone> | ||||
<email>cheshire@apple.com</email> | ||||
<!-- uri and facsimile elements may also be added --> | ||||
</address> | ||||
</author> | ||||
<date year='2019' month='October' day='13'/> | ||||
<!-- If the month and year are both specified and are the current ones, xml2r | <rfc xmlns:xi="http://www.w3.org/2001/XInclude" category="std" | |||
fc will fill | consensus="true" docName="draft-ietf-dnssd-push-25" number="8765" | |||
in the current day for you. If only the current year is specified, xml2r | ipr="trust200902" obsoletes="" updates="" submissionType="IETF" | |||
fc will fill | xml:lang="en" tocInclude="true" tocDepth="4" symRefs="true" | |||
in the current day and month for you. If the year is not the current one | sortRefs="true" version="3"> | |||
, it is | ||||
necessary to specify at least a month (xml2rfc assumes day="1" if not sp | ||||
ecified for the | ||||
purpose of calculating the expiry date). With drafts it is normally suf | ||||
ficient to | ||||
specify just the year. --> | ||||
<!-- Meta-data Declarations --> | <front> | |||
<area>DNSSD</area> | <title abbrev="DNS Push Notifications">DNS Push Notifications</title> | |||
<seriesInfo name="RFC" value="8765"/> | ||||
<workgroup>Internet Engineering Task Force</workgroup> | <author fullname="Tom Pusateri" initials="T." surname="Pusateri"> | |||
<organization>Unaffiliated</organization> | ||||
<address> | ||||
<postal> | ||||
<street/> | ||||
<!-- WG name at the upper left corner of the doc, | <city>Raleigh</city> | |||
IETF is fine for individual submissions. | <region>NC</region> | |||
If this element is not present, the default is "Network Working Group", | <code>27608</code> | |||
which is used by the RFC Editor as a nod to the history of the IETF. --> | <country>United States of America</country> | |||
</postal> | ||||
<phone>+1 919 867 1330</phone> | ||||
<email>pusateri@bangj.com</email> | ||||
<keyword>dns update push notification</keyword> | </address> | |||
</author> | ||||
<author fullname="Stuart Cheshire" initials="S." surname="Cheshire"> | ||||
<organization>Apple Inc.</organization> | ||||
<address> | ||||
<postal> | ||||
<street>One Apple Park Way</street> | ||||
<!-- Keywords will be incorporated into HTML output | <city>Cupertino</city> | |||
files in a meta tag but they have no effect on text or nroff | <region>CA</region> | |||
output. If you submit your draft to the RFC Editor, the | <code>95014</code> | |||
keywords will be used for the search engine. --> | <country>United States of America</country> | |||
</postal> | ||||
<phone>+1 (408) 996-1010</phone> | ||||
<email>cheshire@apple.com</email> | ||||
<abstract> | </address> | |||
<t>The Domain Name System (DNS) was designed to return matching records | </author> | |||
efficiently for queries for data that are relatively static. | <date year="2020" month="June"/> | |||
When those records change frequently, DNS is still efficient at returning | ||||
the updated results when polled, as long as the polling rate is not too hig | ||||
h. | ||||
But there exists no mechanism | ||||
for a client to be asynchronously notified when these changes occur. | ||||
This document defines a mechanism for a client to be notified | ||||
of such changes to DNS records, called DNS Push Notifications.</t> | ||||
</abstract> | ||||
</front> | ||||
<middle> | <area>INT</area> | |||
<?rfc needLines="14" ?> | <workgroup>DNSSD</workgroup> | |||
<section title="Introduction"> | ||||
<t>Domain Name System (DNS) records may be updated using <xref target="RFC2 | <keyword>Push notification</keyword> | |||
136">DNS Update</xref>. | <keyword>Asynchronous notification</keyword> | |||
Other mechanisms such as a <xref target="DisProx">Discovery Proxy</xref> ca | ||||
n also generate changes to a DNS zone. | ||||
This document specifies a protocol for DNS clients to subscribe to receive | ||||
asynchronous notifications of changes to RRsets of interest. It is immediately r | ||||
elevant in the case of <xref target="RFC6763">DNS Service Discovery</xref> but i | ||||
s not limited to that use case, and provides a general DNS mechanism for DNS rec | ||||
ord change notifications. Familiarity with the DNS protocol and DNS packet forma | ||||
ts is assumed <xref target="RFC1034"/> <xref target="RFC1035"/> <xref target="RF | ||||
C6895"/>.</t> | ||||
<?rfc needLines="7" ?> | <abstract> | |||
<section title="Requirements Language"> | <t>The Domain Name System (DNS) was designed to return matching records | |||
<t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | efficiently for queries for data that are relatively static. When those | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", | records change frequently, DNS is still efficient at returning the | |||
and "OPTIONAL" in this document are to be interpreted as described | updated results when polled, as long as the polling rate is not too | |||
in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | high. | |||
when, and only when, they appear in all capitals, as shown here. | But, there exists no mechanism for a client to be asynchronously | |||
These words may also appear in this document in lower case as | notified | |||
plain English words, absent their normative meanings.</t> | when these changes occur. This document defines a mechanism for a | |||
</section> | client to be notified of such changes to DNS records, called DNS Push | |||
Notifications.</t> | ||||
</abstract> | ||||
</front> | ||||
<middle> | ||||
<section numbered="true" toc="default"> | ||||
<name>Introduction</name> | ||||
<t>Domain Name System (DNS) records may be updated using DNS Update | ||||
<xref target="RFC2136" format="default"></xref>. Other mechanisms such | ||||
as a Discovery Proxy <xref target="RFC8766" format="default"></xref> can | ||||
also generate changes to a DNS zone. This document specifies a protocol | ||||
for DNS clients to subscribe to receive asynchronous notifications of | ||||
changes to RRsets of interest. It is immediately relevant in the case of | ||||
DNS-based Service Discovery <xref target="RFC6763" format="default"></xref | ||||
> | ||||
but is not limited to that use case; it provides a general DNS | ||||
mechanism for DNS record change notifications. Familiarity with the DNS | ||||
protocol and DNS packet formats is assumed <xref target="RFC1034" | ||||
format="default"/> <xref target="RFC1035" format="default"/> <xref | ||||
target="RFC6895" format="default"/>.</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>Requirements Language</name> | ||||
<section title="Fatal Errors"> | <t> | |||
<t>Certain invalid situations are described in this specification, | The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", | |||
like a server sending a Push Notification subscription request to a clien | "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
t, | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", | |||
or a client sending a Push Notification response to a server. | "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
These should never occur with a correctly implemented client and server, | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are | |||
and if they do occur then they indicate a serious implementation error. | to be interpreted as | |||
In these extreme cases there is no reasonable expectation of a graceful r | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
ecovery, | when, and only when, they appear in all capitals, as shown here. | |||
and the recipient detecting the error should respond by unilaterally | </t> | |||
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.</t> | ||||
<t>Where this specification says "forcibly abort", it means | </section> | |||
sending a TCP RST to terminate the TCP connection, | <section numbered="true" toc="default"> | |||
<name>Fatal Errors</name> | ||||
<t>Certain invalid situations are described in this specification, | ||||
such | ||||
as 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.</t> | ||||
<t>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. | and the TLS session running over that TCP connection. | |||
In the BSD Sockets API, this is achieved by setting the | In the BSD Sockets API, this is achieved by setting the | |||
SO_LINGER option to zero before closing the socket.</t> | SO_LINGER option to zero before closing the socket.</t> | |||
</section> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Motivation</name> | ||||
<t>As the domain name system continues to adapt to new uses and changes | ||||
in deployment, polling has the potential to burden DNS servers at many | ||||
levels throughout the network. Other network protocols have successfully | ||||
deployed a publish/subscribe model following the Observer design pattern | ||||
<xref target="OBS" format="default"></xref>. Extensible Messaging and | ||||
Presence Protocol (XMPP) Publish-Subscribe | ||||
<xref target="XEP0060" format="default"></xref> and Atom <xref | ||||
target="RFC4287" format="default"></xref> are examples. While DNS | ||||
servers are generally highly tuned and capable of a high rate of | ||||
query/response traffic, adding a publish/subscribe model for tracking | ||||
changes to DNS records can deliver more timely notifications of changes | ||||
with reduced CPU usage and lower network traffic.</t> | ||||
<t>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 <xref target="RFC1034" | ||||
format="default"/>. | ||||
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.</t> | ||||
<t>Multicast DNS <xref target="RFC6762" format="default"></xref> | ||||
implementations always listen on a well-known link-local IP multicast | ||||
group address, and changes are sent to that multicast group address for | ||||
all group members to receive. Therefore, Multicast DNS already has | ||||
asynchronous change notification capability. When DNS-based Service Disco | ||||
very | ||||
<xref target="RFC6763" format="default"></xref> is used across a wide | ||||
area network using Unicast DNS (possibly facilitated via a Discovery | ||||
Proxy <xref target="RFC8766" format="default"></xref>), it would be | ||||
beneficial to have an equivalent capability for Unicast DNS in order to | ||||
allow clients to learn about DNS record changes in a timely manner | ||||
without polling.</t> | ||||
<t>The DNS Long-Lived Queries (LLQ) mechanism <xref target="RFC8764" | ||||
format="default"></xref> is an existing deployed solution to provide | ||||
asynchronous change notifications; it was used by Apple's Back to | ||||
My Mac <xref target="RFC6281" format="default"></xref> service | ||||
introduced in Mac OS X 10.5 Leopard in 2007. Back to My Mac was | ||||
designed in an era when the data center operations staff asserted that | ||||
it was impossible for a server to handle large numbers of | ||||
TCP connections, even if those connections carried | ||||
very little traffic and spent most of their time idle. | ||||
Consequently, LLQ was defined as a UDP-based protocol, effectively | ||||
replicating much of TCP's connection state management logic in user | ||||
space and creating its own imitation of existing TCP features like flow | ||||
control, reliability, and the three-way handshake.</t> | ||||
<?rfc needLines="40" ?> | <t>This document builds on experience gained with the LLQ protocol, with | |||
</section> | an improved design. Instead of using UDP, this specification uses DNS | |||
</section> | Stateful Operations (DSO) <xref target="RFC8490" | |||
format="default"></xref> running over TLS over TCP, and therefore | ||||
<section title="Motivation"> | doesn't need to reinvent existing TCP functionality. Using TCP also | |||
<t>As the domain name system continues to adapt to new uses and changes in | gives long-lived low-traffic connections better longevity through NAT | |||
deployment, polling has the potential to burden DNS servers at many levels throu | gateways without depending on the gateway to support NAT Port Mapping | |||
ghout the network. Other network protocols have successfully deployed a publish/ | Protocol (NAT-PMP) <xref target="RFC6886" format="default"></xref> or | |||
subscribe model following the <xref target="obs">Observer design pattern</xref>. | Port Control Protocol (PCP) <xref target="RFC6887" | |||
<xref target="XEP0060">XMPP Publish-Subscribe</xref> and <xref target="RFC4 | format="default"></xref>, or resorting to excessive keepalive | |||
287">Atom</xref> are examples. While DNS servers are generally highly tuned and | traffic.</t> | |||
capable of a high rate of query/response traffic, adding a publish/subscribe mod | </section> | |||
el for tracking changes to DNS records can deliver more timely notification of c | ||||
hanges with reduced CPU usage and lower network traffic.</t> | ||||
<t><xref target="RFC6762">Multicast DNS</xref> implementations always liste | ||||
n on a well known link-local | ||||
IP multicast group address, and changes are sent to that multicast group ad | ||||
dress for all group members to receive. | ||||
Therefore, Multicast DNS already has asynchronous change notification capab | ||||
ility. | ||||
When <xref target="RFC6763">DNS Service Discovery</xref> is used across a w | ||||
ide area network using Unicast DNS | ||||
(possibly facilitated via a <xref target="DisProx">Discovery Proxy</xref>) | ||||
it would be beneficial to have an equivalent | ||||
capability for Unicast DNS, to allow clients to learn about DNS record chan | ||||
ges in a timely manner without polling.</t> | ||||
<t>The <xref target="LLQ">DNS Long-Lived Queries (LLQ) mechanism</xref> is | ||||
an existing deployed solution to provide asynchronous change notifications, used | ||||
by Apple's <xref target="RFC6281">Back to My Mac</xref> service | ||||
introduced in Mac OS X 10.5 Leopard in 2007. | ||||
Back to My Mac was designed in an era when the data center operations staff | ||||
asserted that it was impossible for a server to handle large numbers of mostly- | ||||
idle TCP connections, so LLQ was defined as a UDP-based protocol, effectively re | ||||
plicating much of TCP's connection state management logic in user space, and cre | ||||
ating its own imitation of existing TCP features like the three-way handshake, f | ||||
low control, and reliability.</t> | ||||
<t>This document builds on experience gained with the LLQ protocol, with an | ||||
improved design. | ||||
Instead of using UDP, this specification uses | ||||
<xref target="RFC8490">DNS Stateful Operations (DSO)</xref> | ||||
running over TLS over TCP, | ||||
and therefore doesn't need to reinvent existing TCP functionality. | ||||
Using TCP also gives long-lived low-traffic connections better longevity th | ||||
rough NAT gateways | ||||
without depending on the gateway to support | ||||
<xref target="RFC6886">NAT Port Mapping Protocol (NAT-PMP)</xref> or | ||||
<xref target="RFC6887">Port Control Protocol (PCP)</xref>, or | ||||
resorting to excessive keepalive traffic.</t> | ||||
<?rfc needLines="9" ?> | ||||
</section> | ||||
<section title="Overview"> | ||||
<t>A DNS Push Notification client subscribes for Push Notifications for a p | ||||
articular RRset by connecting to the appropriate Push Notification server for th | ||||
at RRset, and sending DSO message(s) indicating the RRset(s) of interest. When t | ||||
he client loses interest in receiving further updates to these records, it unsub | ||||
scribes.</t> | ||||
<t>The DNS Push Notification server for a DNS zone is any server capable | <section numbered="true" toc="default"> | |||
<name>Overview</name> | ||||
<t>A DNS Push Notification client subscribes for Push Notifications for | ||||
a particular RRset by connecting to the appropriate Push Notification | ||||
server for that RRset and sending DSO message(s) indicating the | ||||
RRset(s) of interest. When the client loses interest in receiving | ||||
further updates to these records, it unsubscribes.</t> | ||||
<t>The DNS Push Notification server for a DNS zone is any server capable | ||||
of generating the correct change notifications for a name. | of generating the correct change notifications for a name. | |||
It may be a primary, secondary, or stealth name server <xref target="RFC771 | It may be a primary, secondary, or stealth name server <xref | |||
9"/>.</t> | target="RFC8499" format="default"/>.</t> | |||
<t>The <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> SRV record for | ||||
<t>The <spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx | a zone <bcp14>MAY</bcp14> reference the same target host and port as | |||
> SRV record for a | that zone's <tt>_dns&nbhy;update&nbhy;tls._tcp.<zone></tt> SRV | |||
zone MAY reference the same target host and port as that zone's | record. When the same target host and port is offered for both DNS | |||
<spanx style="verb">_dns&nbhy;update&nbhy;tls._tcp.<zone></spanx> SRV | Updates and DNS Push Notifications, a client <bcp14>MAY</bcp14> use a | |||
record. When the same target host and port is offered for both DNS Updates and | single DSO session to that server for both DNS Updates and DNS Push | |||
DNS Push Notifications, a client MAY use a single DSO session to that server for | Notification subscriptions. DNS Updates and DNS Push Notifications may | |||
both DNS Updates and DNS Push Notification Subscriptions. | be handled on different ports on the same target host, in which case | |||
DNS Updates and DNS Push Notifications may be handled on different ports on | they are not considered to be the "same server" for the purposes of this | |||
the same target host, in which case they are not considered to be the "same ser | specification, and communications with these two ports are handled | |||
ver" for the purposes of this specification, and communications with these two p | independently. Supporting DNS Updates and DNS Push Notifications on the | |||
orts are handled independently. | same server is <bcp14>OPTIONAL</bcp14>. A DNS Push Notification server | |||
Supporting DNS Updates and DNS Push Notifications on the same server is OPT | is not required to support DNS Update.</t> | |||
IONAL. A DNS Push Notification server is not required to support DNS Update.</t> | <t>Standard DNS Queries <bcp14>MAY</bcp14> be sent over a DNS Push | |||
Notification (i.e., DSO) session. For any zone for which the server is | ||||
<t>Standard DNS Queries MAY be sent over a DNS Push Notification (i.e., DSO | authoritative, it <bcp14>MUST</bcp14> respond authoritatively for | |||
) | queries for names falling within that zone (e.g., the | |||
session. For any zone for which the server is authoritative, it | <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> SRV record) both for | |||
MUST respond authoritatively for queries for names falling within | normal DNS queries and for DNS Push Notification subscriptions. For | |||
that zone (e.g., the <spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zon | names for which the server is acting as a recursive resolver (e.g., when | |||
e></spanx> SRV | the server is the local recursive resolver) for any query for which it | |||
record) both for normal DNS queries and for DNS Push Notification subscriptio | supports DNS Push Notification subscriptions, it <bcp14>MUST</bcp14> | |||
ns. | also support standard queries.</t> | |||
For names for which the server is acting as a recursive | <t>DNS Push Notifications impose less load on the responding server than | |||
resolver (e.g., when the server is the local recursive resolver) for any quer | rapid polling would, but Push Notifications do still have a | |||
y | cost. Therefore, DNS Push Notification clients <bcp14>MUST NOT</bcp14> | |||
for which it supports DNS Push Notification subscriptions, it MUST also suppo | recklessly create an excessive number of Push Notification | |||
rt | subscriptions. Specifically:</t> | |||
standard queries.</t> | <ol type="(%c)" > | |||
<li>A subscription should only be active when there is a valid reason to need | ||||
<t>DNS Push Notifications impose less load on the responding server than ra | live data (for example, an on-screen display is currently showing the results | |||
pid polling would, but Push Notifications do still have a cost, so DNS Push Noti | to the user), and the subscription <bcp14>SHOULD</bcp14> be canceled as soon | |||
fication clients MUST NOT recklessly create an excessive number of Push Notifica | as the need for that data ends (for example, when the user dismisses that | |||
tion subscriptions. Specifically:</t> | display). In the case of a device like a smartphone that, after some period | |||
of inactivity, goes to sleep or otherwise darkens its screen, it should cancel | ||||
<t>(a) A subscription should only be active when there is a valid reason to | its subscriptions when darkening the screen (since the user cannot see any | |||
need live data (for example, an on-screen display is currently showing the resu | changes on the display anyway) and reinstate its subscriptions when | |||
lts to the user) and the subscription SHOULD be cancelled as soon as the need fo | reawakening from display sleep. | |||
r that data ends (for example, when the user dismisses that display). In the cas | </li> | |||
e of a device like a smartphone which, after some period of inactivity, goes to | <li>A DNS Push Notification client <bcp14>SHOULD NOT</bcp14> routinely keep a | |||
sleep or otherwise darkens its screen, it should cancel its subscriptions when d | DNS Push Notification subscription active 24 hours a day, 7 days a week, just | |||
arkening the screen (since the user cannot see any changes on the display anyway | to keep a list in memory up to date so that if the user does choose to bring | |||
) and reinstate its subscriptions when re-awakening from display sleep.</t> | up an on-screen display of that data, it can be displayed really fast. DNS | |||
Push Notifications are designed to be fast enough that there is no need to | ||||
<t>(b) A DNS Push Notification client SHOULD NOT routinely keep a DNS Push | pre-load a "warm" list in memory just in case it might be needed later. | |||
Notification subscription active 24 hours a day, 7 days a week, just to keep a l | </li> | |||
ist in memory up to date so that if the user does choose to bring up an on-scree | </ol> | |||
n display of that data, it can be displayed really fast. DNS Push Notifications | ||||
are designed to be fast enough that there is no need to pre-load a "warm" list i | ||||
n memory just in case it might be needed later.</t> | ||||
<t>Generally, as described in the <xref target="RFC8490">DNS Stateful Opera | ||||
tions specification</xref>, a client must not keep a DSO session to a server ope | ||||
n indefinitely if it has no subscriptions (or other operations) active on that s | ||||
ession. A client may close a DSO session immediately it becomes idle, and then i | ||||
f needed in the future, open a new session when required. Alternatively, a clien | ||||
t may speculatively keep an idle DSO 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 session's idle timeout (15 seconds by default) <xref target="RFC8490"/>.</t | ||||
> | ||||
<t>Note that a DSO session that has an active DNS Push Notification subscri | ||||
ption is not considered idle, | ||||
even if there is no traffic flowing for an extended period of time. | ||||
In this case the DSO inactivity timeout does not apply, because the session | ||||
is not inactive, | ||||
but the keepalive interval does still apply, to ensure generation of | ||||
sufficient messages to maintain state in middleboxes (such at NAT gateways | ||||
or firewalls) | ||||
and for the client and server to periodically verify that they still have c | ||||
onnectivity to each other. | ||||
This is described in Section 6.2 of the <xref target="RFC8490">DSO specific | ||||
ation</xref>.</t> | ||||
<?rfc needLines="14" ?> | ||||
</section> | ||||
<section title="State Considerations"> | <t>Generally, as described in the DNS Stateful Operations specification | |||
<t>Each DNS Push Notification server is capable of handling some finite | <xref target="RFC8490" | |||
format="default"></xref>, a client | ||||
must not keep a DSO session to a server open indefinitely if it has no | ||||
subscriptions (or other operations) active on that session. A client | ||||
should begin closing a DSO session immediately after it becomes idle, | ||||
and then, if needed in | ||||
the future, open a new session when required. Alternatively, a client | ||||
may speculatively keep an idle DSO 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 session's idle timeout (15 seconds by default) | ||||
<xref target="RFC8490" format="default"/>.</t> | ||||
<t>Note that a DSO session that has an active DNS Push Notification | ||||
subscription is not considered idle, even if there is no traffic flowing | ||||
for an extended period of time. In this case, the DSO inactivity | ||||
timeout does not apply, because the session is not inactive, but the | ||||
keepalive interval does still apply, to ensure the generation of | ||||
sufficient messages to maintain state in middleboxes (such at NAT | ||||
gateways or firewalls) and for the client and server to periodically | ||||
verify that they still have connectivity to each other. This is | ||||
described in <xref target="RFC8490" sectionFormat="of" | ||||
section="6.2">the DSO specification</xref>.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>State Considerations</name> | ||||
<t>Each DNS Push Notification server is capable of handling some finite | ||||
number of Push Notification subscriptions. This number will vary from | number of Push Notification subscriptions. This number will vary from | |||
server to server and is based on physical machine characteristics, | server to server and is based on physical machine characteristics, | |||
network bandwidth, and operating system resource allocation. After a | network capacity, and operating system resource allocation. After a | |||
client establishes a session to a DNS server, each subscription is | client establishes a session to a DNS server, each subscription is | |||
individually accepted or rejected. Servers may employ various techniques | individually accepted or rejected. Servers may employ various techniques | |||
to limit subscriptions to a manageable level. Correspondingly, the client | to limit subscriptions to a manageable level. Correspondingly, the client | |||
is free to establish simultaneous sessions to alternate DNS servers that | is free to establish simultaneous sessions to alternate DNS servers that | |||
support DNS Push Notifications for the zone and distribute subscriptions | support DNS Push Notifications for the zone and distribute subscriptions | |||
at the client's discretion. In this way, both clients and servers can | at the client's discretion. In this way, both clients and servers can | |||
react to resource constraints.</t> | react to resource constraints.</t> | |||
<?rfc needLines="35" ?> | </section> | |||
</section> | <section numbered="true" toc="default"> | |||
<name>Transport</name> | ||||
<section title="Transport"> | <t>Other DNS operations like DNS Update <xref target="RFC2136" | |||
<t>Other DNS operations like <xref target="RFC2136">DNS Update</xref> MAY u | format="default"></xref> <bcp14>MAY</bcp14> use either DNS over User | |||
se either User Datagram Protocol <xref target="RFC0768">(UDP)</xref> or Transmis | Datagram | |||
sion Control Protocol <xref target="RFC0793">(TCP)</xref> as the transport proto | Protocol (UDP) <xref target="RFC0768" format="default"></xref> or | |||
col, in keeping with the historical precedent that DNS queries must first be sen | DNS over Transmission Control Protocol (TCP) <xref target="RFC0793" | |||
t over UDP <xref target="RFC1123"/>. This requirement to use UDP has subsequentl | format="default"></xref> as the transport protocol, provided they follow | |||
y been relaxed <xref target="RFC7766"/>.</t> | the historical precedent that DNS queries must first be sent using DNS | |||
over UDP | ||||
<t>In keeping with the more recent precedent, DNS Push Notification is defi | and only switch to DNS over TCP if needed <xref target="RFC1123" | |||
ned only for TCP. | format="default"/>. | |||
DNS Push Notification clients MUST use | This requirement to prefer UDP | |||
<xref target="RFC8490">DNS Stateful Operations</xref> | has subsequently been relaxed <xref target="RFC7766" | |||
running over TLS over TCP <xref target="RFC7858"/>.</t> | format="default"/>.</t> | |||
<t>In keeping with the more recent precedent, DNS Push Notification is | ||||
<t>Connection setup over TCP ensures return reachability | defined only for TCP. | |||
and alleviates concerns of state overload at the server, | DNS Push Notification clients <bcp14>MUST</bcp14> use | |||
which is a potential problem with connectionless protocols, | DNS Stateful Operations <xref target="RFC8490" format="default"></xref> | |||
which can be more vulnerable to being exploited by attackers using spoofed | running over TLS over TCP <xref target="RFC7858" format="default"/>.</t> | |||
source addresses. | ||||
All subscribers are guaranteed to be reachable by the server by virtue of t | ||||
he TCP three-way handshake. | ||||
Flooding attacks are possible with any protocol, and a benefit of TCP is th | ||||
at there are already established industry best practices to guard against SYN fl | ||||
ooding and similar attacks <xref target="SYN"/> <xref target="RFC4953"/>.</t> | ||||
<t>Use of TCP also allows DNS Push Notifications to take advantage of curre | ||||
nt and future developments in TCP, such as | ||||
<xref target="RFC6824">Multipath TCP (MPTCP)</xref>, | ||||
<xref target="RFC7413">TCP Fast Open (TFO)</xref>, | ||||
<xref target="I-D.ietf-tcpm-rack">the TCP RACK fast loss detection algorith | ||||
m</xref>, | ||||
and so on.</t> | ||||
<t>Transport Layer Security <xref target="RFC8446">(TLS)</xref> is well und | ||||
erstood, and used by many application-layer protocols running over TCP. TLS is d | ||||
esigned to prevent eavesdropping, tampering, and message forgery. TLS is REQUIRE | ||||
D for every connection between a client subscriber and server in this protocol s | ||||
pecification. Additional security measures such as client authentication during | ||||
TLS negotiation may also be employed to increase the trust relationship between | ||||
client and server.</t> | ||||
<?rfc needLines="25" ?> | ||||
</section> | ||||
<section title="Protocol Operation"> | <t> | |||
<t>The DNS Push Notification protocol is a session-oriented protocol, and m | Connection setup over TCP ensures return reachability and alleviates concerns | |||
akes use of | of state overload at the server, a potential problem with connectionless | |||
<xref target="RFC8490">DNS Stateful Operations (DSO)</xref>.</t> | protocols, which can be more vulnerable to being exploited by attackers using | |||
spoofed source addresses. | ||||
<t>For details of the DSO message format refer to the | All subscribers are guaranteed to be reachable by the server by virtue of | |||
<xref target="RFC8490">DNS Stateful Oper-ations specification</xref>. | the TCP three-way handshake. Flooding attacks are possible with any | |||
protocol, and a benefit of TCP is that there are already established | ||||
industry best practices to guard against SYN flooding and similar attacks | ||||
<xref target="SYN" format="default"/> <xref target="RFC4953" | ||||
format="default"/>.</t> | ||||
<t>Use of TCP also allows DNS Push Notifications to take advantage of | ||||
current and future developments in TCP such as Multipath TCP (MPTCP) | ||||
<xref target="RFC8684" format="default"></xref>, TCP Fast Open (TFO) | ||||
<xref target="RFC7413" format="default"></xref>, the TCP RACK fast loss | ||||
detection algorithm <xref target="I-D.ietf-tcpm-rack" | ||||
format="default"></xref>, and so on.</t> | ||||
<t>Transport Layer Security (TLS) <xref target="RFC8446" | ||||
format="default"></xref> is well understood and is used by many | ||||
application-layer protocols running over TCP. TLS is designed to prevent | ||||
eavesdropping, tampering, and message forgery. TLS is | ||||
<bcp14>REQUIRED</bcp14> for every connection between a client subscriber | ||||
and server in this protocol specification. Additional security measures | ||||
such as client authentication during TLS negotiation may also be | ||||
employed to increase the trust relationship between client and | ||||
server.</t> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Protocol Operation</name> | ||||
<t>The DNS Push Notification protocol is a session-oriented protocol and | ||||
makes use of | ||||
DNS Stateful Operations (DSO) <xref target="RFC8490" | ||||
format="default"></xref>.</t> | ||||
<t>For details of the DSO message format, refer to the | ||||
DNS Stateful Operations specification <xref target="RFC8490" | ||||
format="default"></xref>. | ||||
Those details are not repeated here.</t> | Those details are not repeated here.</t> | |||
<t>DNS Push Notification clients and servers <bcp14>MUST</bcp14> support | ||||
<t>DNS Push Notification clients and servers MUST support DSO. | DSO. | |||
A single server can support DNS Queries, DNS Updates, and DNS Push | A single server can support DNS Queries, DNS Updates, and DNS Push | |||
Notifications (using DSO) on the same TCP port.</t> | Notifications (using DSO) on the same TCP port.</t> | |||
<t>A DNS Push Notification exchange begins with the client discovering | ||||
<t>A DNS Push Notification exchange begins with the client discovering the | the appropriate server, using the procedure described in <xref | |||
appropriate server, | target="discovery" format="default"/>, and then making a TLS/TCP | |||
using the procedure described in <xref target="discovery"/>, and then makin | connection to it.</t> | |||
g a TLS/TCP connection to it.</t> | <t>After making the TLS/TCP connection to the server, | |||
a typical DNS Push Notification client will then immediately issue a DSO | ||||
<t>A typical DNS Push Notification client will immediately issue a DSO | Keepalive operation to establish the DSO session | |||
Keepalive operation to request a session timeout and/or keepalive interval | and request a session timeout and/or keepalive interval | |||
longer than the 15-second default values, but this is not required. | longer than the 15-second default values, but this is not required. | |||
A DNS Push Notification client MAY issue other requests on the | A DNS Push Notification client <bcp14>MAY</bcp14> issue other requests on | |||
the | ||||
session first, and only issue a DSO Keepalive | session first, and only issue a DSO Keepalive | |||
operation later if it determines that to be necessary. | operation later if it determines that to be necessary. | |||
Sending either a DSO Keepalive operation or a Push Notification | Sending either a DSO Keepalive operation or a Push Notification | |||
subscription request over the TLS/TCP connection to the server signals the | subscription request over the TLS/TCP connection to the server signals | |||
the | ||||
client's support of DSO and serves to establish a DSO session.</t> | client's support of DSO and serves to establish a DSO session.</t> | |||
<t>In accordance with the current set of active subscriptions, | ||||
<t>In accordance with the current set of active subscriptions, | ||||
the server sends relevant asynchronous Push Notifications to | the server sends relevant asynchronous Push Notifications to | |||
the client. Note that a client MUST be prepared to receive | the client. Note that a client <bcp14>MUST</bcp14> be prepared to receive | |||
(and silently ignore) Push Notifications for subscriptions it | (and silently ignore) Push Notifications for subscriptions it | |||
has previously removed, since there is no way to prevent the | has previously removed, since there is no way to prevent the | |||
situation where a Push Notification is in flight from server | situation where a Push Notification is in flight from server | |||
to client while the client's UNSUBSCRIBE message cancelling | to client while the client's UNSUBSCRIBE message canceling | |||
that subscription is simultaneously in flight from client to | that subscription is simultaneously in flight from client to | |||
server.</t> | server.</t> | |||
<section anchor="discovery" numbered="true" toc="default"> | ||||
<?rfc needLines="30" ?> | <name>Discovery</name> | |||
<section title="Discovery" anchor="discovery"> | <t>The first step in establishing a DNS Push Notification | |||
<t>The first step in establishing a DNS Push Notification subscription i | subscription is to discover an appropriate DNS server that | |||
s to discover an appropriate DNS server that supports DNS Push Notifications for | supports DNS Push Notifications for the desired zone.</t> | |||
the desired zone.</t> | <t>The client begins by opening a DSO session to its normal configured | |||
DNS recursive resolver and requesting a Push Notification | ||||
<t>The client begins by opening a DSO Session to its normal configured | subscription. | |||
DNS recursive resolver and requesting a Push Notification subscription. | ||||
This connection is made to TCP port 853, the default port for | This connection is made to TCP port 853, the default port for | |||
<xref target="RFC7858">DNS-over-TLS</xref>. | DNS over TLS <xref target="RFC7858" format="default"></xref>. | |||
If the request for a Push Notification subscription is successful, | If the request for a Push Notification subscription is successful, | |||
and the recursive resolver doesn't already have an active subscription f | and the recursive resolver doesn't already have an active subscription | |||
or that name, type, and class, | for that name, type, and class, | |||
then the recursive resolver will make a corresponding | then the recursive resolver will make a corresponding | |||
Push Notification subscription on the client's behalf. | Push Notification subscription on the client's behalf. | |||
Results received are relayed to the client. | Results received are relayed to the client. | |||
This is closely analogous to how a client sends a normal DNS | This is closely analogous to how a client sends a normal DNS | |||
query to its configured DNS recursive resolver which, | query to its configured DNS recursive resolver, which, | |||
if it doesn't already have appropriate answer(s) in its cache, | if it doesn't already have appropriate answer(s) in its cache, | |||
issues an upstream query to satisfy the request.</t> | issues an upstream query to satisfy the request.</t> | |||
<t>In many contexts, the recursive resolver will be able to handle | <t>In many contexts, the recursive resolver will be able to handle | |||
Push Notifications for all names that the client may need to follow. | Push Notifications for all names that the client may need to follow. | |||
Use of VPN tunnels and Private DNS <xref target="RFC8499"/> | Use of VPN tunnels and Private DNS <xref target="RFC8499" | |||
format="default"/> | ||||
can create some additional complexity in the client software here; | can create some additional complexity in the client software here; | |||
the techniques to handle VPN tunnels and Private DNS for DNS Push | the techniques to handle VPN tunnels and Private DNS for DNS Push | |||
Notifications are the same as those already used to handle this for | Notifications are the same as those already used to handle this for | |||
normal DNS queries.</t> | normal DNS queries.</t> | |||
<t>If the recursive resolver | <t>If the recursive resolver does not support DNS over TLS, or | |||
does not support DNS over TLS, or | ||||
supports DNS over TLS but is not listening on TCP port 853, 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 p | supports DNS over TLS on TCP port 853 but does not support DSO on that | |||
ort, | port, then the DSO session establishment will fail <xref | |||
then the DSO Session session establishment will fail <xref target="RFC84 | target="RFC8490" format="default"/>.</t> | |||
90"/>.</t> | <t>If the recursive resolver does support DSO on TCP port 853 | |||
but does not support Push Notification subscriptions, | ||||
<t>If the recursive resolver does support DSO but not Push Notification | then when the client attempts to create a subscription, | |||
subscriptions, then it will return the DSO error code DSOTYPENI (11).</t | the server will return the DSO error code DSOTYPENI (11).</t> | |||
> | ||||
<t>In some cases, the recursive resolver may support DSO and Push | <t>In some cases, the recursive resolver may support DSO and Push | |||
Notification subscriptions, but may not be able | Notification subscriptions but may not be able | |||
to subscribe for Push Notifications for a particular name. | to subscribe for Push Notifications for a particular name. | |||
In this case, the recursive resolver should return | In this case, the recursive resolver should return | |||
SERVFAIL to the client. This includes being unable | SERVFAIL to the client. This includes being unable | |||
to establish a connection | to establish a connection | |||
to the zone's DNS Push Notification server or establishing | to the zone's DNS Push Notification server or establishing | |||
a connection but receiving a non success response code. | a connection but receiving a non-success response code. | |||
In some cases, where the client has a pre-established trust | In some cases, where the client has a pre-established trust | |||
relationship with the owner of the zone (that is not handled | relationship with the owner of the zone (that is not handled | |||
via the usual mechanisms for VPN software) the client may | via the usual mechanisms for VPN software), the client may | |||
handle these failures by contacting the zone's DNS Push server | handle these failures by contacting the zone's DNS Push Notification | |||
server | ||||
directly.</t> | directly.</t> | |||
<t>In any of the cases described above where the client | <t>In any of the cases described above where the client | |||
fails to establish a DNS Push Notification subscription via its | fails to establish a DNS Push Notification subscription via its | |||
configured recursive resolver, the client should proceed to discover | configured recursive resolver, the client should proceed to discover | |||
the appropriate server for direct communication. The client MUST | the appropriate server for direct communication. The client | |||
also determine which TCP port on the server is listening for | <bcp14>MUST</bcp14> | |||
connections, which need not be (and often is not) the typical TCP | also determine on which TCP port the server is listening for | |||
port 53 used for conventional DNS, or TCP port 853 used for DNS | connections, which need not be, and often is not, | |||
over TLS.</t> | TCP port 53 (traditionally used for conventional DNS) or | |||
TCP port 853 (traditionally used for DNS over TLS).</t> | ||||
<t>The discovery algorithm described here is an iterative algorithm, | <t>The discovery algorithm described here is an iterative algorithm, | |||
which starts with the full name of the record to which the | which starts with the full name of the record to which the | |||
client wishes to subscribe. Successive SOA queries are then | client wishes to subscribe. Successive SOA queries are then | |||
issued, trimming one label each time, until | issued, trimming one label each time, until | |||
the closest enclosing authoritative server is discovered. | the closest enclosing authoritative server is discovered. | |||
There is also an optimization to enable the client to | There is also an optimization to enable the client to | |||
take a "short cut" directly to the SOA record of | take a "short cut" directly to the SOA record of | |||
the closest enclosing authoritative server in many cases.</t> | the closest enclosing authoritative server in many cases.</t> | |||
<ol spacing="normal" type="1"> | ||||
<li>The client begins the discovery by sending a DNS query to its | ||||
local resolver, with record type SOA <xref target="RFC1035" | ||||
format="default"></xref> for the record name to which it wishes to | ||||
subscribe. As an example, suppose the client wishes to subscribe to | ||||
PTR records with the name <tt>_ipp._tcp.headoffice.example.com</tt> | ||||
(to | ||||
discover Internet Printing Protocol (IPP) printers <xref | ||||
target="RFC8010" format="default"/> <xref target="RFC8011" | ||||
format="default"/> being advertised in the head office of Example | ||||
Company). The client begins by sending an SOA query for | ||||
<tt>_ipp._tcp.headoffice.example.com</tt> to the local recursive | ||||
resolver. | ||||
The goal is to determine the server that is authoritative for the | ||||
name | ||||
<tt>_ipp._tcp.headoffice.example.com</tt>. The closest enclosing | ||||
DNS zone | ||||
containing the name <tt>_ipp._tcp.headoffice.example.com</tt> could | ||||
be | ||||
<tt>example.com</tt>, or <tt>headoffice.example.com</tt>, or | ||||
<tt>_tcp.headoffice.example.com</tt>, or even | ||||
<tt>_ipp._tcp.headoffice.example.com</tt>. The client does not know | ||||
in | ||||
advance where the closest enclosing zone cut occurs, which is why it | ||||
uses the iterative procedure described here to discover this | ||||
information.</li> | ||||
<li> | ||||
<t>If the requested SOA record exists, it will be returned in the | ||||
Answer Section with a NOERROR response code, and the client has | ||||
succeeded in discovering the information it needs. | ||||
</t> | ||||
<t> | ||||
(This language is not placing any new requirements on DNS | ||||
recursive resolvers. | ||||
This text merely describes the existing operation of the DNS | ||||
protocol | ||||
<xref target="RFC1034" format="default"/> <xref target="RFC1035" | ||||
format="default"/>.)</t> | ||||
</li> | ||||
<t> | <li> | |||
<list style="numbers"> | <t>If the requested SOA record does not exist, the client will get | |||
<t>The client begins the discovery by sending a DNS query to its loc | back a NOERROR/NODATA response or an NXDOMAIN/Name Error response. | |||
al resolver, with record type | In either case, the local resolver would normally include the SOA | |||
<xref target="RFC1035">SOA</xref> for the record name to which it wi | record for the closest enclosing zone of the requested name in the | |||
shes to subscribe. | Authority Section. If the SOA record is received in the Authority | |||
As an example, suppose the client wishes to subscribe to PTR records | Section, then the client has succeeded in discovering the | |||
with the name _ipp._tcp.headoffice.example.com | information it needs. | |||
(to discover Internet Printing Protocol (IPP) printers <xref target= | </t> | |||
"RFC8010"/> <xref target="RFC8011"/> | ||||
being advertised in the head office of Example Company.). | ||||
The client begins by sending an SOA query for _ipp._tcp.headoffice.e | ||||
xample.com to the local recursive resolver. | ||||
The goal is to determine the server authoritative for the name _ipp. | ||||
_tcp.headoffice.example.com. | ||||
The closest enclosing DNS zone containing the name _ipp._tcp.headoff | ||||
ice.example.com could be example.com, | ||||
or headoffice.example.com, or _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 it uses the iterative procedure described here to disco | ||||
ver this information.</t> | ||||
<t>If the requested SOA record exists, it will be returned in the An | ||||
swer section with a NOERROR response code, and | ||||
the client has succeeded in discovering the information it needs. | ||||
<vspace /> | ||||
(This language is not placing any new requirements on DNS recursive | ||||
resolvers. | ||||
This text merely describes the existing operation of the DNS protoco | ||||
l | ||||
<xref target="RFC1034"/> <xref target="RFC1035"/>.)</t> | ||||
<t>If the requested SOA record does not exist, the client will get b | ||||
ack a NOERROR/NODATA response or an NXDOMAIN/Name Error response. | ||||
In either case, the local resolver would normally include the SOA re | ||||
cord for the closest enclosing zone of the requested name in the Authority Secti | ||||
on. | ||||
If the SOA record is received in the Authority Section, then | ||||
the client has succeeded in discovering the information it needs. | ||||
<vspace /> | ||||
(This language is not placing any new requirements on DNS recursive | ||||
resolvers. | ||||
This text merely describes the existing operation of the DNS protoco | ||||
l | ||||
regarding negative responses <xref target="RFC2308"/>.)</t> | ||||
<t>If the client receives a response containing no SOA record, | ||||
then it proceeds with the iterative approach. | ||||
The client strips the 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 for that new name, | ||||
and processing continues at step 2 above, | ||||
repeating the iterative search until either an SOA is received, | ||||
or the query name consists of a single label, i.e., a Top Level Doma | ||||
in (TLD). | ||||
In the case of a single-label name (TLD), this is a network configur | ||||
ation error, | ||||
which should not happen, and the client gives up. | ||||
The client may retry the operation at a later time, of the client's | ||||
choosing, | ||||
such after a change in network attachment.</t> | ||||
<t>Once the SOA is known (either by virtue of being seen in the Answ | ||||
er Section, or in the Authority Section), the client sends a DNS query with type | ||||
<xref target="RFC2782">SRV</xref> for the record name | ||||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx | ||||
>, where <zone> is the owner name of the discovered SOA record.</t> | ||||
<t>If the zone in question is set up to offer DNS Push Notifications | ||||
then this SRV record MUST exist. | ||||
(If this SRV record does not exist then the zone is not correctly | ||||
configured for DNS Push Notifications as specified in this document. | ||||
) | ||||
The SRV <spanx style="verb">target</spanx> contains the name of the | ||||
server providing DNS Push Notifications for the zone. The port number on which t | ||||
o contact the server is in the SRV record <spanx style="verb">port</spanx> field | ||||
. The address(es) of the target host MAY be included in the Additional Section, | ||||
however, the address records SHOULD be authenticated before use as described bel | ||||
ow in <xref target="tls_name_auth"/> and in | ||||
<xref target="RFC7673">the specification for using DANE TLSA Records | ||||
with SRV Records</xref>, if applicable.</t> | ||||
<t anchor="SRV">More than one SRV record may be returned. In this ca | ||||
se, the <spanx style="verb">priority</spanx> and <spanx style="verb">weight</spa | ||||
nx> values in the returned SRV records are used to determine the order in which | ||||
to contact the servers for subscription requests. As described in <xref target=" | ||||
RFC2782">the SRV specification</xref>, the server with the lowest <spanx style=" | ||||
verb">priority</spanx> is first contacted. If more than one server has the same | ||||
<spanx style="verb">priority</spanx>, the <spanx style="verb">weight</spanx> ind | ||||
icates the weighted probability that the client should contact that server. High | ||||
er weights have higher probabilities of being selected. | ||||
If a server is not willing to accept a subscription request, | ||||
or is not reachable within a reasonable time, as determined by the c | ||||
lient, | ||||
then a subsequent server is to be contacted.</t> | ||||
</list> | ||||
</t> | ||||
<t> | ||||
(This language is not placing any new requirements on DNS | ||||
recursive resolvers. | ||||
This text merely describes the existing operation of the DNS | ||||
protocol | ||||
regarding negative responses <xref target="RFC2308" | ||||
format="default"/>.)</t> | ||||
</li> | ||||
<li>If the client receives a response containing no SOA record, then | ||||
it proceeds with the iterative approach. The client strips the | ||||
leading label from the current query name, and if the resulting name | ||||
has at least two labels in it, then the client sends an SOA query | ||||
for | ||||
that new name and processing continues at step 2 above, repeating | ||||
the iterative search until either an SOA is received or 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 a network | ||||
configuration error, which should not happen, and the client gives | ||||
up. The client may retry the operation at a later time of the | ||||
client's choosing, such as after a change in network | ||||
attachment.</li> | ||||
<li>Once the SOA is known (by virtue of being seen either in the | ||||
Answer Section or in the Authority Section), the client sends a DNS | ||||
query with type SRV <xref target="RFC2782" format="default"></xref> | ||||
for the record name | ||||
<tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt>, where | ||||
<zone> is the owner name of the discovered SOA record.</li> | ||||
<li>If the zone in question is set up to offer DNS Push | ||||
Notifications, then this SRV record <bcp14>MUST</bcp14> exist. (If | ||||
this SRV record does not exist, then the zone is not correctly | ||||
configured for DNS Push Notifications as specified in this | ||||
document.) The SRV <tt>target</tt> contains the name of the server | ||||
providing DNS Push Notifications for the zone. The port number on | ||||
which to contact the server is in the SRV record <tt>port</tt> | ||||
field. The address(es) of the target host <bcp14>MAY</bcp14> be | ||||
included in the Additional Section, however, the address records | ||||
<bcp14>SHOULD</bcp14> be authenticated before use as described in | ||||
<xref target="tls_name_auth" format="default"/> and in the | ||||
specification for using DNS-Based Authentication of Named Entities | ||||
(DANE) TLSA Records with SRV Records <xref | ||||
target="RFC7673" format="default"></xref>, if applicable.</li> | ||||
<li anchor="SRV">More than one SRV record may be returned. In this | ||||
case, the <tt>priority</tt> and <tt>weight</tt> values in the | ||||
returned SRV records are used to determine the order in which to | ||||
contact the servers for subscription requests. As described in the | ||||
SRV specification <xref target="RFC2782" format="default"></xref>, | ||||
the server with the lowest <tt>priority</tt> is first contacted. If | ||||
more than one server has the same <tt>priority</tt>, the | ||||
<tt>weight</tt> indicates the weighted probability that the client | ||||
should contact that server. Higher weights have higher probabilities | ||||
of being selected. If a server is not willing to accept a | ||||
subscription request, or is not reachable within a reasonable time, | ||||
as determined by the client, then a subsequent server is to be | ||||
contacted.</li> | ||||
</ol> | ||||
<t>Each time a client makes a new DNS Push Notification subscription, | <t>Each time a client makes a new DNS Push Notification subscription, | |||
it SHOULD repeat the discovery process in order to determine | it <bcp14>SHOULD</bcp14> repeat the discovery process in order to | |||
the preferred DNS server for that subscription at that time. | determine the preferred DNS server for that subscription at that time. | |||
If a client already has a DSO session with that DNS server | If a client already has a DSO session with that DNS server, the client | |||
the client SHOULD reuse that existing DSO session for the new subscripti | <bcp14>SHOULD</bcp14> reuse that existing DSO session for the new | |||
on, | subscription; otherwise, a new DSO session is established. The client | |||
otherwise, a new DSO session is established. | <bcp14>MUST</bcp14> respect the DNS TTL values on records it receives | |||
The client MUST respect the DNS TTL values on records it receives while | while performing the discovery process and store them in its local | |||
performing | cache with this lifetime (as it will generally do anyway for all | |||
the discovery process and store them in its local cache with this lifeti | DNS queries it performs). This means that, as long as the DNS TTL | |||
me | values on the authoritative records are set to reasonable values, | |||
(as it will generally be do anyway for all DNS queries it performs). | repeated application of the discovery process can be completed | |||
This means that, as long as the DNS TTL values on the authoritative reco | practically | |||
rds are set | instantaneously by the client, using only locally stored cached | |||
to reasonable values, repeated application of the discovery process can | data.</t> | |||
be completed | </section> | |||
nearly instantaneously by the client, using only locally-stored cached d | ||||
ata.</t> | ||||
<?rfc needLines="48" ?> | ||||
</section> | ||||
<section title="DNS Push Notification SUBSCRIBE" anchor="subscribe"> | ||||
<t>After connecting, and requesting a longer idle timeout and/or | ||||
keepalive interval if necessary, a DNS Push Notification client<vspace /> | ||||
then indicates its desire to receive DNS Push Notifications for<vspace /> | ||||
a given domain name by sending a SUBSCRIBE request to the server.<vspace | ||||
/> | ||||
A SUBSCRIBE request is encoded in a DSO message <xref target="RFC8490"/>. | ||||
<vspace /> | ||||
This specification defines a primary DSO TLV for DNS Push Notification SU | ||||
BSCRIBE Requests (tentatively DSO Type Code 0x40).</t> | ||||
<t>DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted i | ||||
n TLS early data, | ||||
provided that the precautions described in <xref target="early_data"/> ar | ||||
e followed.</t> | ||||
<t>The entity that initiates a SUBSCRIBE request is by definition the cli | ||||
ent. | ||||
A server MUST NOT send a SUBSCRIBE request over an existing 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 the client MUST forcibly abort the connection i | ||||
mmediately.</t> | ||||
<t>Each SUBSCRIBE request generates exactly one SUBSCRIBE response from t | ||||
he server. | ||||
The entity that initiates a SUBSCRIBE response is by definition the serve | ||||
r. | ||||
A client MUST NOT send a SUBSCRIBE response. | ||||
If a client does send a SUBSCRIBE response, | ||||
this is a fatal error and the server MUST forcibly abort the connection i | ||||
mmediately.</t> | ||||
<section title="SUBSCRIBE Request"> | ||||
<t>A SUBSCRIBE request begins with the standard | ||||
<xref target="RFC8490">DSO 12-byte header</xref>, followed by the SUBSC | ||||
RIBE primary TLV. | ||||
A SUBSCRIBE request is illustrated in <xref target="subscribe_req"/>.</ | ||||
t> | ||||
<t>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 the purpose | ||||
s here, a MESSAGE ID is in use on this session if the client has used it in a re | ||||
quest for which it has not yet received a response, or if the client has used it | ||||
for a subscription which it has not yet cancelled using UNSUBSCRIBE. In the SUB | ||||
SCRIBE response the server MUST echo back the MESSAGE ID value unchanged.</t> | ||||
<t>The other header fields MUST be set as described in the | ||||
<xref target="RFC8490">DSO spec-ification</xref>. | ||||
The DNS OPCODE field contains the OPCODE value for DNS Stateful Operati | ||||
ons (6). | ||||
The four count fields must be zero, and the corresponding four sections | ||||
must be empty (i.e., absent).</t> | ||||
<t>The DSO-TYPE is SUBSCRIBE (tentatively 0x40).</t> | ||||
<t>The DSO-LENGTH is the length of the DSO-DATA that follows, which spe | <section anchor="subscribe" numbered="true" toc="default"> | |||
cifies | <name>DNS Push Notification SUBSCRIBE</name> | |||
<t>After connecting, and requesting a longer idle timeout and/or | ||||
keepalive interval if necessary, a DNS Push Notification client then | ||||
indicates its desire to receive DNS Push Notifications for a given | ||||
domain name by sending a SUBSCRIBE request to the server. A SUBSCRIBE | ||||
request is encoded in a DSO message <xref target="RFC8490" | ||||
format="default"/>. This specification defines a | ||||
DSO Primary TLV for DNS Push Notification SUBSCRIBE Requests | ||||
(DSO Type Code 0x0040).</t> | ||||
<t>DSO messages with the SUBSCRIBE TLV as the Primary TLV are | ||||
permitted in TLS early data, provided that the precautions described | ||||
in | ||||
<xref target="early_data" format="default"/> are followed.</t> | ||||
<t>The entity that initiates a SUBSCRIBE request is by definition the | ||||
client. A server <bcp14>MUST NOT</bcp14> send a SUBSCRIBE request | ||||
over an existing 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 the client <bcp14>MUST</bcp14> forcibly abort the | ||||
connection immediately.</t> | ||||
<t>Each SUBSCRIBE request generates exactly one SUBSCRIBE response | ||||
from the server. The entity that initiates a SUBSCRIBE response is by | ||||
definition the server. A client <bcp14>MUST NOT</bcp14> send a | ||||
SUBSCRIBE response. If a client does send a SUBSCRIBE response, this | ||||
is a fatal error and the server <bcp14>MUST</bcp14> forcibly abort the | ||||
connection immediately.</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>SUBSCRIBE Request</name> | ||||
<t>A SUBSCRIBE request begins with the standard DSO 12-byte header | ||||
<xref target="RFC8490" format="default"></xref>, followed by the | ||||
SUBSCRIBE Primary TLV. A SUBSCRIBE request is illustrated in <xref | ||||
target="subscribe_req" format="default"/>.</t> | ||||
<t>The MESSAGE ID field <bcp14>MUST</bcp14> be set to a unique | ||||
value that the client 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 either the client has used it in a request for | ||||
which it | ||||
has not yet received a response, or if the client has used it for a | ||||
subscription that it has not yet canceled using UNSUBSCRIBE. In | ||||
the SUBSCRIBE response, the server <bcp14>MUST</bcp14> echo back the | ||||
MESSAGE ID value unchanged.</t> | ||||
<t>The other header fields <bcp14>MUST</bcp14> be set as described | ||||
in the | ||||
<xref target="RFC8490" format="default">DSO specification</xref>. | ||||
The DNS OPCODE field contains the OPCODE value for DNS Stateful | ||||
Operations (6). | ||||
The four count fields must be zero, and the corresponding four | ||||
sections must be empty (i.e., absent).</t> | ||||
<t>The DSO-TYPE is SUBSCRIBE (0x0040).</t> | ||||
<t>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.</t> | the name, type, and class of the record(s) being sought.</t> | |||
<figure anchor="subscribe_req"> | ||||
<figure align="left" anchor="subscribe_req" title="SUBSCRIBE Request">< | <name>SUBSCRIBE Request</name> | |||
artwork align="left"><![CDATA[ | <artwork align="left" name="" type="" alt=""><![CDATA[ | |||
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 | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork></figure> | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork> | |||
</figure> | ||||
<t>The DSO-DATA for a SUBSCRIBE request MUST contain exactly one NAME, | <t>The DSO-DATA for a SUBSCRIBE request <bcp14>MUST</bcp14> contain | |||
TYPE, and CLASS. | exactly one NAME, TYPE, and CLASS. | |||
Since SUBSCRIBE requests are sent over TCP, multiple SUBSCRIBE DSO requ | Since SUBSCRIBE requests are sent over TCP, multiple SUBSCRIBE DSO | |||
est messages | request messages | |||
can be concatenated in a single TCP stream and packed efficiently into | can be concatenated in a single TCP stream and packed efficiently | |||
TCP segments.</t> | into TCP segments.</t> | |||
<t>If accepted, the subscription will stay in effect until the | ||||
<t>If accepted, the subscription will stay in effect until the client c | client cancels the subscription using UNSUBSCRIBE or until the DSO | |||
ancels the subscription using UNSUBSCRIBE or until the DSO session between the c | session between the client and the server is closed.</t> | |||
lient and the server is closed.</t> | <t>SUBSCRIBE requests on a given session <bcp14>MUST</bcp14> be | |||
unique. A client <bcp14>MUST NOT</bcp14> send a SUBSCRIBE message | ||||
<t>SUBSCRIBE requests on a given session MUST be unique. | that duplicates the name, type and class of an existing active | |||
A client MUST NOT send a SUBSCRIBE message that duplicates the | subscription on that DSO session. For the purpose of this matching, | |||
NAME, TYPE and CLASS of an existing active subscription on that DSO ses | the established DNS case insensitivity for US-ASCII letters <xref | |||
sion. | target="RFC0020" format="default"/> applies (e.g., "example.com" and | |||
For the purpose of this matching, the established DNS case-insensitivit | "Example.com" are the same). If a server receives such a duplicate | |||
y | SUBSCRIBE message, this is a fatal error and the server | |||
for US-ASCII letters <xref target="RFC0020" /> applies (e.g., "example. | <bcp14>MUST</bcp14> forcibly abort the connection immediately.</t> | |||
com" and "Example.com" are the same). | <t>DNS wildcarding is not supported. | |||
If a server receives such a duplicate SUBSCRIBE message, | That is, an asterisk character ("*") in a SUBSCRIBE message matches | |||
this is a fatal error and the server MUST forcibly abort the connection | only a literal asterisk character ("*") in a name and nothing else. | |||
immediately.</t> | Similarly, a CNAME in a SUBSCRIBE message matches only a CNAME | |||
record | ||||
<t>DNS wildcarding is not supported. That is, a wildcard ("*") in a SUB | with that name in the zone and no other records with that name.</t> | |||
SCRIBE message matches only a literal wildcard character ("*") in the zone, and | <t>A client may SUBSCRIBE to records that are unknown to the server | |||
nothing else.</t> | at 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 | ||||
<t>Aliasing is not supported. That is, a CNAME in a SUBSCRIBE message m | error. The server <bcp14>MUST NOT</bcp14> return NXDOMAIN in this | |||
atches only a literal CNAME record in the zone, and no other records with the sa | case. The server <bcp14>MUST</bcp14> accept these requests and send | |||
me owner name.</t> | Push Notifications if and when matching records are found in the | |||
future.</t> | ||||
<t>A client may SUBSCRIBE to records that are unknown to the server at | <t>If neither TYPE nor CLASS are ANY (255), then this is a specific | |||
the time of the request (providing that the name falls within one of the zone(s) | subscription to changes for the given name, type, and class. If one | |||
the server is responsible for) and this is not an error. The server MUST NOT re | or both of TYPE or CLASS are ANY (255), then this subscription | |||
turn NXDOMAIN in this case. The server MUST accept these requests and send Push | matches all types and/or all classes as appropriate.</t> | |||
Notifications if and when matching records are found in the future.</t> | <t>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 | ||||
<t>If neither TYPE nor CLASS are ANY (255) then this is a specific subs | server should respond with ANY matching records of its choosing, not | |||
cription to changes for the given NAME, TYPE and CLASS. If one or both of TYPE o | necessarily ALL matching records. This can lead to some surprising | |||
r CLASS are ANY (255) then this subscription matches any type and/or any class, | and unexpected results, where a query returns some valid answers, | |||
as appropriate.</t> | but | |||
not all of them, and makes QTYPE = 255 (ANY) queries less useful | ||||
<?rfc needLines="14" ?> | than people sometimes imagine.</t> | |||
<t>NOTE: A little-known quirk of DNS is that in DNS QUERY requests, QTY | <t>When used in conjunction with SUBSCRIBE, TYPE 255 and CLASS 255 | |||
PE and QCLASS 255 mean "ANY" not "ALL". They indicate that the server should res | should be interpreted to mean "ALL", not "ANY". After accepting a | |||
pond with ANY matching records of its choosing, not necessarily ALL matching rec | subscription where one or both of TYPE or CLASS are 255, the server | |||
ords. This can lead to some surprising and unexpected results, where a query ret | <bcp14>MUST</bcp14> send Push Notification Updates for ALL record | |||
urns some valid answers but not all of them, and makes QTYPE = 255 (ANY) queries | changes that match the subscription, not just some of them.</t> | |||
less useful than people sometimes imagine.</t> | </section> | |||
<t>When used in conjunction with SUBSCRIBE, TYPE and CLASS 255 should b | ||||
e interpreted to mean "ALL", not "ANY". After accepting a subscription where one | ||||
or both of TYPE or CLASS are 255, the server MUST send Push Notification Update | ||||
s for ALL record changes that match the subscription, not just some of them.</t> | ||||
<?rfc needLines="48" ?> | ||||
</section> | ||||
<section title="SUBSCRIBE Response" anchor="subresp"> | ||||
<t>A SUBSCRIBE response begins with the standard | <section anchor="subresp" numbered="true" toc="default"> | |||
<xref target="RFC8490">DSO 12-byte header</xref>. | <name>SUBSCRIBE Response</name> | |||
<t>A SUBSCRIBE response begins with the standard | ||||
DSO 12-byte header <xref target="RFC8490" format="default"></xref>. | ||||
The QR bit in the header is set indicating it is a response. | The QR bit in the header is set indicating it is a response. | |||
The header MAY be followed by one or more optional TLVs, such as a Retr | The header <bcp14>MAY</bcp14> be followed by one or more | |||
y Delay TLV. | optional Additional TLVs such as a Retry Delay Additional TLV. | |||
A SUBSCRIBE response is illustrated in <xref target="subscribe_resp"/>. | A SUBSCRIBE response is illustrated in <xref target="subscribe_resp" | |||
</t> | format="default"/>.</t> | |||
<t>The MESSAGE ID field <bcp14>MUST</bcp14> echo the value given in | ||||
<t>The MESSAGE ID field MUST echo the value given in the MESSAGE ID fie | the MESSAGE ID field of the SUBSCRIBE request. This is how the | |||
ld of the SUBSCRIBE request. | client knows which request is being responded to.</t> | |||
This is how the client knows which request is being responded to.</t> | <t>The other header fields <bcp14>MUST</bcp14> be set as described | |||
in the <xref target="RFC8490" | ||||
<t>The other header fields MUST be set as described in the | format="default">DSO specification</xref>. The DNS OPCODE field | |||
<xref target="RFC8490">DSO spec-ification</xref>. | contains the OPCODE | |||
The DNS OPCODE field contains the OPCODE value for DNS Stateful Operati | value for DNS Stateful Operations (6). The four count fields must | |||
ons (6). | be zero, and the corresponding four sections must be empty (i.e., | |||
The four count fields must be zero, and the corresponding four sections | absent).</t> | |||
must be empty (i.e., absent).</t> | <t>A SUBSCRIBE response message <bcp14>MUST NOT</bcp14> include a | |||
SUBSCRIBE TLV. | ||||
<t>A SUBSCRIBE response message MUST NOT include a SUBSCRIBE TLV. | If a client receives a SUBSCRIBE response message containing a | |||
If a client receives a SUBSCRIBE response message containing a SUBSCRIB | SUBSCRIBE TLV, | |||
E TLV | then the response message is processed but the SUBSCRIBE TLV | |||
then the response message is processed but the SUBSCRIBE TLV MUST be si | <bcp14>MUST</bcp14> be silently ignored.</t> | |||
lently ignored.</t> | <figure anchor="subscribe_resp"> | |||
<name>SUBSCRIBE Response</name> | ||||
<figure align="left" anchor="subscribe_resp" title="SUBSCRIBE Response" | <artwork align="left" name="" type="" alt=""><![CDATA[ | |||
><artwork align="left"><![CDATA[ | ||||
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) | / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ / | |||
]]> | ||||
</artwork></figure> | ||||
<?rfc needLines="20" ?> | ||||
<t>In the SUBSCRIBE response the RCODE indicates whether or not the sub | ||||
scription was accepted. Supported RCODEs are as follows:</t> | ||||
<texttable title="SUBSCRIBE Response codes" anchor="subscribe_rcodes"> | ||||
<ttcol align="left">Mnemonic</ttcol> | ||||
<ttcol align="center">Value</ttcol> | ||||
<ttcol align="left">Description</ttcol> | ||||
<c>NOERROR</c><c>0</c><c>SUBSCRIBE successful.</c> | ||||
<c>FORMERR</c><c>1</c><c>Server failed to process request due to a malf | ||||
ormed request.</c> | ||||
<c>SERVFAIL</c><c>2</c><c>Server failed to process request due to a pro | ||||
blem with the server.</c> | ||||
<c>NOTIMP</c><c>4</c><c>Server does not implement DSO.</c> | ||||
<c>REFUSED</c><c>5</c><c>Server refuses to process request for policy o | ||||
r security reasons.</c> | ||||
<c>NOTAUTH</c><c>9</c><c>Server is not authoritative for the requested | ||||
name.</c> | ||||
<c>DSOTYPENI</c><c>11</c><c>SUBSCRIBE operation not supported.</c> | ||||
</texttable> | ||||
<t>This document specifies only these RCODE values for SUBSCRIBE Respon | ]]></artwork> | |||
ses. Servers sending SUBSCRIBE Responses SHOULD use one of these values. Note th | </figure> | |||
at NXDOMAIN is not a valid RCODE in response to a SUBSCRIBE Request. However, fu | <t>In the SUBSCRIBE response, the RCODE indicates whether or not the | |||
ture circumstances may create situations where other RCODE values are appropriat | subscription was accepted. Supported RCODEs are as follows:</t> | |||
e in SUBSCRIBE Responses, so clients MUST be prepared to accept SUBSCRIBE Respon | <table anchor="subscribe_rcodes" align="center"> | |||
ses with any other RCODE value.</t> | <name>SUBSCRIBE Response Codes</name> | |||
<thead> | ||||
<t>If the server sends a nonzero RCODE in the SUBSCRIBE response, that | <tr> | |||
means: | <th align="left">Mnemonic</th> | |||
<?rfc subcompact="yes" ?> | <th align="center">Value</th> | |||
<list style="letters"> | <th align="left">Description</th> | |||
<t>the client is (at least partially) misconfigured, or</t> | </tr> | |||
<t>the server resources are exhausted, or</t> | </thead> | |||
<t>there is some other unknown failure on the server.</t> | <tbody> | |||
</list> | <tr> | |||
<?rfc subcompact="no" ?> | <td align="left">NOERROR</td> | |||
In any case, the client shouldn't retry the subscription to this server | <td align="center">0</td> | |||
right away. If multiple SRV records were returned as described in <xref target= | <td align="left">SUBSCRIBE successful.</td> | |||
"discovery"/>, <xref target="SRV"/>, a subsequent server MAY be tried immediatel | </tr> | |||
y.</t> | <tr> | |||
<t>If the client has other successful subscriptions to this server, the | <td align="left">FORMERR</td> | |||
se subscriptions remain even though additional subscriptions may be refused. Nei | <td align="center">1</td> | |||
ther the client nor the server are required to close the connection, although, e | <td align="left">Server failed to process request due to a | |||
ither end may choose to do so.</t> | malformed request.</td> | |||
<t>If the server sends a nonzero RCODE then it SHOULD append a Retry De | </tr> | |||
lay TLV <xref target="RFC8490"/> to the response specifying a delay before the c | <tr> | |||
lient attempts this operation again. Recommended values for the delay for differ | <td align="left">SERVFAIL</td> | |||
ent RCODE values are given below. These recommended values apply both to the def | <td align="center">2</td> | |||
ault values a server should place in the Retry Delay TLV, and the default values | <td align="left">Server failed to process request due to a | |||
a client should assume if the server provides no Retry Delay TLV. | problem with the server.</td> | |||
<list style="bullets"> | </tr> | |||
<t>For RCODE = 1 (FORMERR) the delay may be any value selected by t | <tr> | |||
he implementer. A value of five minutes is RECOMMENDED, to reduce the risk of hi | <td align="left">NOTIMP</td> | |||
gh load from defective clients.</t> | <td align="center">4</td> | |||
<td align="left">Server does not implement DSO.</td> | ||||
<t>For RCODE = 2 (SERVFAIL) the delay should be chosen according to | </tr> | |||
the level of server overload and the anticipated duration of that overload. By | <tr> | |||
default, a value of one minute is RECOMMENDED. If a more serious server failure | <td align="left">REFUSED</td> | |||
occurs, the delay may be longer in accordance with the specific problem encounte | <td align="center">5</td> | |||
red.</t> | <td align="left">Server refuses to process request for policy | |||
or security reasons.</td> | ||||
<t>For RCODE = 4 (NOTIMP), which occurs on a server that doesn't im | </tr> | |||
plement | <tr> | |||
<xref target="RFC8490">DNS Stateful Operations</xref>, | <td align="left">NOTAUTH</td> | |||
<td align="center">9</td> | ||||
<td align="left">Server is not authoritative for the requested | ||||
name.</td> | ||||
</tr> | ||||
<tr> | ||||
<td align="left">DSOTYPENI</td> | ||||
<td align="center">11</td> | ||||
<td align="left">SUBSCRIBE operation not supported.</td> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>This document specifies only these RCODE values for SUBSCRIBE | ||||
Responses. Servers sending SUBSCRIBE Responses <bcp14>SHOULD</bcp14> | ||||
use one of these values. Note that NXDOMAIN is not a valid RCODE in | ||||
response to a SUBSCRIBE Request. However, future circumstances may | ||||
create situations where other RCODE values are appropriate in | ||||
SUBSCRIBE Responses, so clients <bcp14>MUST</bcp14> be prepared to | ||||
accept and handle SUBSCRIBE Responses with any other nonzero RCODE | ||||
error values.</t> | ||||
<t>If the server sends a nonzero RCODE in the SUBSCRIBE response, | ||||
that means: | ||||
</t> | ||||
<ol spacing="compact" type="a"> | ||||
<li>the client is (at least partially) misconfigured, or</li> | ||||
<li>the server resources are exhausted, or</li> | ||||
<li>there is some other unknown failure on the server.</li> | ||||
</ol> | ||||
<t> | ||||
In any case, the client shouldn't retry the subscription to this | ||||
server right away. If multiple SRV records were returned as | ||||
described in <xref | ||||
target="SRV" format="default"/>, a subsequent server | ||||
<bcp14>MAY</bcp14> be tried immediately.</t> | ||||
<t>If the client has other successful subscriptions to this server, | ||||
these subscriptions remain even though additional subscriptions may | ||||
be refused. Neither the client nor the server is required to close | ||||
the connection, although either end may choose to do so.</t> | ||||
<t>If the server sends a nonzero RCODE, then it | ||||
<bcp14>SHOULD</bcp14> | ||||
append a Retry Delay Additional TLV <xref target="RFC8490" | ||||
format="default"/> | ||||
to the response specifying a delay before the client attempts this | ||||
operation again. Recommended values for the delay for different | ||||
RCODE values are given below. These recommended values apply both to | ||||
the default values a server should place in the Retry Delay | ||||
Additional TLV and | ||||
the default values a client should assume if the server provides no | ||||
Retry Delay Additional TLV. | ||||
</t> | ||||
<ul spacing="normal" empty="true"> | ||||
<li>For RCODE = 1 (FORMERR), the delay may be any value selected | ||||
by | ||||
the implementer. A value of five minutes is | ||||
<bcp14>RECOMMENDED</bcp14> to reduce the risk of high load from | ||||
defective clients.</li> | ||||
<li>For RCODE = 2 (SERVFAIL), the delay should be chosen according | ||||
to the level of server overload and the anticipated duration of | ||||
that overload. By default, a value of one minute is | ||||
<bcp14>RECOMMENDED</bcp14>. If a more serious server failure | ||||
occurs, the delay may be longer in accordance with the specific | ||||
problem encountered.</li> | ||||
<li>For RCODE = 4 (NOTIMP), which occurs on a server that doesn't | ||||
implement | ||||
DNS Stateful Operations <xref target="RFC8490" | ||||
format="default"></xref>, | ||||
it is unlikely that the server will begin supporting DSO | it is unlikely that the server will begin supporting DSO | |||
in the next few minutes, so the retry delay SHOULD be one hour. | in the next few minutes, so the retry delay <bcp14>SHOULD</bcp14> | |||
be one hour. | ||||
Note that in such a case, a server that doesn't implement DSO | Note that in such a case, a server that doesn't implement DSO | |||
is unlikely to place a Retry Delay TLV in its response, so this | is unlikely to place a Retry Delay Additional TLV in its | |||
recommended value in particular applies to what a client should ass | response, so this | |||
ume by default.</t> | recommended value in particular applies to what a client should | |||
assume by default.</li> | ||||
<t>For RCODE = 5 (REFUSED), which occurs on a server that implement | <li>For RCODE = 5 (REFUSED), which occurs on a server that | |||
s DNS Push Notifications, but is currently configured to disallow DNS Push Notif | implements DNS Push Notifications but is currently configured to | |||
ications, the retry delay may be any value selected by the implementer and/or co | disallow DNS Push Notifications, the retry delay may be any value | |||
nfigured by the operator.</t> | selected by the implementer and/or configured by the | |||
<t>If the server being queried is listed in a | operator.</li> | |||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></span | <li>If the server being queried is listed in a | |||
x> | <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> | |||
SRV record for the zone, then this is a misconfiguration, | SRV record for the zone, then this is a misconfiguration, | |||
since this server is being advertised as supporting DNS Push Notifi | since this server is being advertised as supporting DNS Push | |||
cations for this zone, | Notifications for this zone, | |||
but the server itself is not currently configured to perform that t | but the server itself is not currently configured to perform that | |||
ask. | task. | |||
Since it is possible that the misconfiguration may be repaired | Since it is possible that the misconfiguration may be repaired | |||
at any time, the retry delay should not be set too high. By defaul | at any time, the retry delay should not be set too high. By | |||
t, | default, | |||
a value of 5 minutes is RECOMMENDED.</t> | a value of 5 minutes is <bcp14>RECOMMENDED</bcp14>.</li> | |||
<li>For RCODE = 9 (NOTAUTH), which occurs on a server that | ||||
<t>For RCODE = 9 (NOTAUTH), which occurs on a server that implement | implements DNS Push Notifications but is not configured to be | |||
s DNS Push Notifications, but is not configured to be authoritative for the requ | authoritative for the requested name, the retry delay may be any | |||
ested name, the retry delay may be any value selected by the implementer and/or | value selected by the implementer and/or configured by the | |||
configured by the operator.</t> | operator.</li> | |||
<t>If the server being queried is listed in a | <li>If the server being queried is listed in a | |||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></span | <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> | |||
x> | ||||
SRV record for the zone, then this is a misconfiguration, | SRV record for the zone, then this is a misconfiguration, | |||
since this server is being advertised as supporting DNS Push Notifi | since this server is being advertised as supporting DNS Push | |||
cations for this zone, | Notifications for this zone, | |||
but the server itself is not currently configured to perform that t | but the server itself is not currently configured to perform that | |||
ask. | task. | |||
Since it is possible that the misconfiguration may be repaired | Since it is possible that the misconfiguration may be repaired | |||
at any time, the retry delay should not be set too high. By defaul | at any time, the retry delay should not be set too high. By | |||
t, | default, | |||
a value of 5 minutes is RECOMMENDED.</t> | a value of 5 minutes is <bcp14>RECOMMENDED</bcp14>.</li> | |||
<li>For RCODE = 11 (DSOTYPENI), | ||||
<t>For RCODE = 11 (DSOTYPENI), | which occurs on a server that implements DSO but doesn't | |||
which occurs on a server that implements DSO but doesn't implement | implement DNS Push Notifications, | |||
DNS Push Notifications, | it is unlikely that the server will begin supporting DNS Push | |||
it is unlikely that the server will begin supporting DNS Push Notif | Notifications | |||
ications | in the next few minutes, so the retry delay <bcp14>SHOULD</bcp14> | |||
in the next few minutes, so the retry delay SHOULD be one hour.</t> | be one hour.</li> | |||
<li>For other RCODE values, the retry delay should be | ||||
<t>For other RCODE values, the retry delay should be set by the ser | set by the server as appropriate for that error condition. | |||
ver as appropriate for that error condition. By default, a value of 5 minutes is | By default, a value of 5 minutes is | |||
RECOMMENDED.</t> | <bcp14>RECOMMENDED</bcp14>.</li> | |||
</list> | </ul> | |||
</t> | <t>For RCODE = 9 (NOTAUTH), the time delay applies to requests for | |||
<t>For RCODE = 9 (NOTAUTH), the time delay applies to requests for othe | other names falling within the same zone. Requests for names falling | |||
r names falling within the same zone. Requests for names falling within other zo | within other zones are not subject to the delay. For all other | |||
nes are not subject to the delay. For all other RCODEs the time delay applies to | RCODEs, the time delay applies to all subsequent requests to this | |||
all subsequent requests to this server.</t> | server.</t> | |||
<t>After sending an error response, the server <bcp14>MAY</bcp14> | ||||
<t>After sending an error response the server MAY allow the session to | allow the session to remain open, or <bcp14>MAY</bcp14> follow it | |||
remain open, | with | |||
or MAY send a DNS Push Notification Retry Delay Operation TLV instructi | a DSO Retry Delay operation (using the Retry Delay Primary TLV) | |||
ng the client to close the session, | instructing the client to close the session as described in the | |||
as described in the <xref target="RFC8490">DSO specification</xref>. | <xref target="RFC8490" format="default">DSO specification</xref>. | |||
Clients MUST correctly handle both cases.</t> | Clients <bcp14>MUST</bcp14> correctly handle both cases. | |||
Note that the | ||||
<?rfc needLines="48" ?> | DSO Retry Delay operation (using the Retry Delay Primary TLV) | |||
</section> | is different to the Retry Delay Additional TLV mentioned above. | |||
</section> | </t> | |||
</section> | ||||
<section title="DNS Push Notification Updates" anchor="push"> | </section> | |||
<t>Once a subscription has been successfully established, the server gene | <section anchor="push" numbered="true" toc="default"> | |||
rates PUSH messages to send to the client as appropriate. In the case that the a | <name>DNS Push Notification Updates</name> | |||
nswer set was already non-empty at the moment the subscription was established, | <t>Once a subscription has been successfully established, | |||
an initial PUSH message will be sent immediately following the SUBSCRIBE Respons | the server generates PUSH messages to send to the client as | |||
e. Subsequent changes to the answer set are then communicated to the client in s | appropriate. | |||
ubsequent PUSH messages.</t> | In the case that the answer set was already non-empty at the moment | |||
the subscription was established, an initial PUSH message will be sent | ||||
<t>A client MUST NOT send a PUSH message. | immediately following the SUBSCRIBE Response. Subsequent changes to | |||
the | ||||
answer set are then communicated to the client in subsequent PUSH | ||||
messages.</t> | ||||
<t>A client <bcp14>MUST NOT</bcp14> send a PUSH message. | ||||
If a client does 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 res | or a PUSH message is sent with the QR bit set indicating that it is a | |||
ponse, | response, | |||
this is a fatal error and the receiver MUST forcibly abort the connection | this is a fatal error and the receiver <bcp14>MUST</bcp14> forcibly | |||
immediately.</t> | abort the connection immediately.</t> | |||
<section numbered="true" toc="default"> | ||||
<section title="PUSH Message"> | <name>PUSH Message</name> | |||
<t>A PUSH unidirectional message begins with the standard | ||||
<t>A PUSH unidirectional message begins with the standard | DSO 12-byte header <xref target="RFC8490" format="default"></xref>, | |||
<xref target="RFC8490">DSO 12-byte header</xref>, followed by the PUSH | followed by the PUSH Primary TLV. | |||
primary TLV. | A PUSH message is illustrated in <xref target="push_msg" | |||
A PUSH message is illustrated in <xref target="push_msg"/>.</t> | format="default"/>.</t> | |||
<t>In accordance with the definition of DSO unidirectional messages, | ||||
<t>In accordance with the definition of DSO unidirectional messages, | the MESSAGE ID field <bcp14>MUST</bcp14> be zero. | |||
the MESSAGE ID field MUST be zero. | ||||
There is no client response to a PUSH message.</t> | There is no client response to a PUSH message.</t> | |||
<t>The other header fields <bcp14>MUST</bcp14> be set as described | ||||
<t>The other header fields MUST be set as described in the | in the | |||
<xref target="RFC8490">DSO spec-ification</xref>. | DSO specification <xref target="RFC8490" format="default"></xref>. | |||
The DNS OPCODE field contains the OPCODE value for DNS Stateful Operati | The DNS OPCODE field contains the OPCODE value for DNS Stateful | |||
ons (6). | Operations (6). | |||
The four count fields must be zero, and the corresponding four sections | The four count fields must be zero, and the corresponding four | |||
must be empty (i.e., absent).</t> | sections must be empty (i.e., absent).</t> | |||
<t>The DSO-TYPE is PUSH (0x0041).</t> | ||||
<t>The DSO-TYPE is PUSH (tentatively 0x41).</t> | <t>The DSO-LENGTH is the length of the DSO-DATA that follows, which | |||
specifies | ||||
<t>The DSO-LENGTH is the length of the DSO-DATA that follows, which spe | ||||
cifies | ||||
the changes being communicated.</t> | the changes being communicated.</t> | |||
<t>The DSO-DATA contains one or more change notifications. | ||||
<t>The DSO-DATA contains one or more change notifications. | A PUSH Message <bcp14>MUST</bcp14> contain at least one change | |||
A PUSH Message MUST contain at least one change notification. | notification. | |||
If a PUSH Message is received that contains no change notifications, | If a PUSH Message is received that contains no change notifications, | |||
this is a fatal error, and the client MUST forcibly abort the connectio | this is a fatal error and the client <bcp14>MUST</bcp14> forcibly | |||
n immediately.</t> | abort the connection immediately.</t> | |||
<t>The change notification records are formatted similarly to how | ||||
<t>The change notification records are formatted similarly to how | ||||
DNS Resource Records are conventionally expressed in DNS messages, | DNS Resource Records are conventionally expressed in DNS messages, | |||
as illustrated in <xref target="push_msg"/>, | as illustrated in <xref target="push_msg" format="default"/>, | |||
and are interpreted as described below.</t> | and are interpreted as described below.</t> | |||
<t>The TTL field holds an unsigned 32-bit integer <xref | ||||
target="RFC2181" format="default"/>. | ||||
If the TTL is in the range 0 to 2,147,483,647 seconds (0 to | ||||
2<sup>31</sup> - 1, or 0x7FFFFFFF), | ||||
then a new DNS Resource Record with the given name, type, class, and | ||||
RDATA is added. | ||||
Type and class <bcp14>MUST NOT</bcp14> be 255 (ANY). If either type | ||||
or class are 255 (ANY), | ||||
this is a fatal error and the client <bcp14>MUST</bcp14> forcibly | ||||
abort the connection immediately. | ||||
A TTL of 0 means that this record should be retained for as long as | ||||
the subscription is active | ||||
and should be discarded immediately the moment the subscription is | ||||
canceled.</t> | ||||
<t>If the TTL has the value 0xFFFFFFFF, then the DNS Resource Record | ||||
with the given name, type, class, and RDATA is removed. Type and | ||||
class <bcp14>MUST NOT</bcp14> be 255 (ANY). If either type or class | ||||
are 255 (ANY), this is a fatal error and the client | ||||
<bcp14>MUST</bcp14> forcibly abort the connection immediately.</t> | ||||
<t>If the TTL has the value 0xFFFFFFFE, then this is a 'collective' | ||||
remove notification. For collective remove notifications, RDLEN | ||||
<bcp14>MUST</bcp14> be zero, and consequently, the RDATA | ||||
<bcp14>MUST</bcp14> be empty. If a change notification is received | ||||
where TTL = 0xFFFFFFFE and RDLEN is not zero, this is a fatal error | ||||
and the client <bcp14>MUST</bcp14> forcibly abort the connection | ||||
immediately.</t> | ||||
<?rfc needLines="6" ?> | <t>There are three types of collective remove notification. | |||
<t>The TTL field holds an unsigned 32-bit integer <xref target="RFC2181 | For collective remove notifications:</t> | |||
"/>. | ||||
If the TTL is in the range 0 to 2,147,483,647 seconds (0 to 2^31 - 1, o | ||||
r 0x7FFFFFFF), | ||||
then a new DNS Resource Record with the given name, type, class and RDA | ||||
TA is added. | ||||
Type and 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 connectio | ||||
n immediately. | ||||
A TTL of 0 means that this record should be retained for as long as the | ||||
subscription is active, | ||||
and should be discarded immediately the moment the subscription is canc | ||||
elled.</t> | ||||
<t>If the TTL has the value 0xFFFFFFFF, then the | ||||
DNS Resource Record with the given name, type, class and RDATA is remov | ||||
ed. | ||||
Type and 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 connectio | ||||
n immediately.</t> | ||||
<t>If the TTL has the value 0xFFFFFFFE, then this is a 'collective' rem | ||||
ove notification. | ||||
For collective remove notifications RDLEN MUST be zero and consequently | ||||
the RDATA MUST be empty. | ||||
If a change notification is received where TTL = 0xFFFFFFFE and RDLEN i | ||||
s not zero, | ||||
this is a fatal error, and the client MUST forcibly abort the connectio | ||||
n immediately.</t> | ||||
<t>There are three types of collective remove notification:</t> | ||||
<t>For collective remove notifications, | ||||
if CLASS is not 255 (ANY) and TYPE is not 255 (ANY) | ||||
then for the given name this removes all records of the specified type | ||||
in the specified class.</t> | ||||
<t>For collective remove notifications, | ||||
if CLASS is not 255 (ANY) and TYPE is 255 (ANY) | ||||
then for the given name this removes all records of all types in the sp | ||||
ecified class.</t> | ||||
<t>For collective remove notifications, | ||||
if CLASS is 255 (ANY), | ||||
then for the given name this removes all records of all types in all cl | ||||
asses. | ||||
In this case TYPE MUST be set to zero on transmission, and MUST be sile | ||||
ntly ignored on reception.</t> | ||||
<?rfc needLines="19" ?> | ||||
<t>Summary of change notification types: | ||||
<list style="bullets"> | ||||
<t>Remove all RRsets from a name, in all classes<vspace /> | ||||
TTL = 0xFFFFFFFE, RDLEN = 0, CLASS = 255 (ANY)</t> | ||||
<t>Remove all RRsets from a name, in given class:<vspace /> | <ul> | |||
TTL = 0xFFFFFFFE, RDLEN = 0, CLASS gives class, TYPE = 255 (ANY)</t | ||||
> | ||||
<t>Remove specified RRset from a name, in given class:<vspace /> | <li>If CLASS is not 255 (ANY) and TYPE is not 255 (ANY), then for the given | |||
TTL = 0xFFFFFFFE, RDLEN = 0<vspace /> | name, this removes all records of the specified type in the specified class. | |||
CLASS and TYPE specify the RRset being removed</t> | </li> | |||
<t>Remove an individual RR from a name:<vspace /> | <li>If CLASS is not 255 (ANY) and TYPE is 255 (ANY), then for the given name, | |||
TTL = 0xFFFFFFFF<vspace /> | this removes all records of all types in the specified class. | |||
CLASS, TYPE, RDLEN and RDATA specify the RR being removed</t> | </li> | |||
<t>Add individual RR to a name<vspace /> | <li>If CLASS is 255 (ANY), then for the given name, this removes all records | |||
TTL >= 0 and TTL <= 0x7FFFFFFF<vspace /> | of all types in all classes. In this case, TYPE <bcp14>MUST</bcp14> be set to | |||
CLASS, TYPE, RDLEN, RDATA and TTL specify the RR being added</t> | zero on | |||
</list> | transmission and <bcp14>MUST</bcp14> be silently ignored on reception. | |||
</t> | </li> | |||
<t>Note that it is valid for the RDATA of an added or removed DNS Resou | </ul> | |||
rce Record to be empty (zero length). | ||||
For example, an <xref target="RFC3123">Address Prefix List Resource Rec | ||||
ord</xref> may have empty RDATA. | ||||
Therefore, a change notification with RDLEN = 0 does not automatically | ||||
indicate a remove notification. | ||||
If RDLEN = 0 and TTL is the in the range 0 - 0x7FFFFFFF, this change no | ||||
tification signals the addition of a | ||||
record with the given name, type, class, and empty RDATA. | ||||
If RDLEN = 0 and TTL = 0xFFFFFFFF, this change notification signals the | ||||
removal specifically of that single | ||||
record with the given name, type, class, and empty RDATA.</t> | ||||
<t>If the TTL is any value other than 0xFFFFFFFF, 0xFFFFFFFE, or a valu | <t>Summary of change notification types: | |||
e in the range 0 - 0x7FFFFFFF, | </t> | |||
then the receiver SHOULD silently ignore this particular change notific | <ul spacing="normal"> | |||
ation record. | <li> | |||
The connection is not terminated and other valid change notification re | <t>Remove all RRsets from a name in all classes:<br/> | |||
cords | TTL = 0xFFFFFFFE, RDLEN = 0, CLASS = 255 (ANY).</t> | |||
</li> | ||||
<li> | ||||
<t>Remove all RRsets from a name in given class:<br/> | ||||
TTL = 0xFFFFFFFE, RDLEN = 0, CLASS gives class, TYPE = 255 | ||||
(ANY).</t> | ||||
</li> | ||||
<li> | ||||
<t>Remove specified RRset from a name in given class:<br/> | ||||
TTL = 0xFFFFFFFE, RDLEN = 0,<br/> | ||||
CLASS and TYPE specify the RRset being removed.</t> | ||||
</li> | ||||
<li> | ||||
<t>Remove an individual RR from a name:<br/> | ||||
TTL = 0xFFFFFFFF,<br/> | ||||
CLASS, TYPE, RDLEN, and RDATA specify the RR being removed.</t> | ||||
</li> | ||||
<li> | ||||
<t>Add individual RR to a name:<br/> | ||||
TTL >= 0 and TTL <= 0x7FFFFFFF,<br/> | ||||
CLASS, TYPE, RDLEN, RDATA, and TTL specify the RR being | ||||
added.</t> | ||||
</li> | ||||
</ul> | ||||
<t>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 | ||||
Prefix List Resource Record <xref target="RFC3123" | ||||
format="default"></xref> may have empty RDATA. Therefore, a change | ||||
notification with RDLEN = 0 does not automatically indicate a remove | ||||
notification. If RDLEN = 0 and TTL is in the range 0 to | ||||
0x7FFFFFFF, this change notification signals the addition of a | ||||
record with the given name, type, class, and empty RDATA. If RDLEN | ||||
= 0 and TTL = 0xFFFFFFFF, this change notification signals the | ||||
removal specifically of that single record with the given name, | ||||
type, class, and empty RDATA.</t> | ||||
<t>If the TTL is any value other than 0xFFFFFFFF, 0xFFFFFFFE, or a | ||||
value in the range 0 to 0x7FFFFFFF, | ||||
then the receiver <bcp14>SHOULD</bcp14> silently ignore this | ||||
particular change notification record. | ||||
The connection is not terminated and other valid change notification | ||||
records | ||||
within this PUSH message are processed as usual.</t> | within this PUSH message are processed as usual.</t> | |||
<t>For efficiency, when generating a PUSH message, a server SHOULD | <t>In the case where a single change affects more than one active | |||
include as many change notifications as it has immediately available to | subscription, only one PUSH message is sent. For example, a PUSH | |||
send, | message adding a given record may match both a SUBSCRIBE request | |||
rather than sending each change notification as a separate DSO message. | with the same TYPE and a different SUBSCRIBE request with TYPE = 255 | |||
Once it has exhausted the list of change notifications immediately avai | (ANY). It is not the case that two PUSH messages are sent because | |||
lable to send, | the new record matches two active subscriptions.</t> | |||
a server SHOULD then send the PUSH message immediately, | ||||
rather than waiting to see if additional change notifications become av | ||||
ailable.</t> | ||||
<?rfc needLines="6" ?> | <t>The server <bcp14>SHOULD</bcp14> encode change notifications in | |||
<t>For efficiency, when generating a PUSH message, a server SHOULD | the most efficient manner possible. | |||
use standard DNS name compression, | For example, when three AAAA records are removed from a given name, | |||
with offsets relative to the beginning of the DNS message <xref target= | and no other AAAA | |||
"RFC1035"/>. | records exist for that name, the server <bcp14>SHOULD</bcp14> send a | |||
When multiple change notifications in a single PUSH message have the sa | "Remove specified RRset from a name in given class" PUSH message, | |||
me owner name, | not three separate | |||
this name compression can yield significant savings. | "Remove an individual RR from a name" PUSH messages. | |||
Name compression should be performed as specified in Section 18.14 of t | Similarly, when both an SRV and a TXT record are removed from a | |||
he | given name, and no other | |||
<xref target="RFC6762">Multicast DNS specification</xref>, namely, | records of any kind exist for that name in that class, the server | |||
owner names should always be compressed, | <bcp14>SHOULD</bcp14> send a | |||
and names appearing within RDATA should be compressed for only the RR t | "Remove all RRsets from a name in given class" PUSH message, not two | |||
ypes listed below: | separate | |||
<list style="hanging"> | "Remove specified RRset from a name in given class" PUSH | |||
<t>NS, CNAME, PTR, DNAME, SOA, MX, AFSDB, RT, KX, RP, PX, SRV, NSEC</ | messages.</t> | |||
t> | ||||
</list></t> | ||||
<t>Servers may generate PUSH messages up to a maximum DNS message lengt | <t>For efficiency, when generating a PUSH message, rather than | |||
h of 16,382 bytes, | sending | |||
each change notification as a separate DSO message, a server | ||||
<bcp14>SHOULD</bcp14> include as many change notifications as it has | ||||
immediately available to send to that client, even if those change | ||||
notifications apply to different subscriptions from that | ||||
client. Conceptually, a PUSH | ||||
message is a session-level mechanism, not a subscription-level | ||||
mechanism. | ||||
Once it has exhausted the list of change notifications immediately | ||||
available to send to that client, | ||||
a server <bcp14>SHOULD</bcp14> then send the PUSH message | ||||
immediately | ||||
rather than waiting speculatively to see if additional change | ||||
notifications become available.</t> | ||||
<t>For efficiency, when generating a PUSH message a server | ||||
<bcp14>SHOULD</bcp14> use standard DNS name compression, with | ||||
offsets | ||||
relative to the beginning of the DNS message <xref target="RFC1035" | ||||
format="default"/>. When multiple change notifications in a single | ||||
PUSH message have the same owner name, this name compression can | ||||
yield significant savings. Name compression should be performed as | ||||
specified in <xref target="RFC6762" sectionFormat="of" | ||||
section="18.14">the Multicast DNS specification</xref>; namely, | ||||
owner names | ||||
should always be compressed, and names appearing within RDATA should | ||||
be compressed for only the RR types listed below: | ||||
</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt/> | ||||
<dd>NS, CNAME, PTR, DNAME, SOA, MX, AFSDB, RT, KX, RP, PX, SRV, | ||||
NSEC</dd> | ||||
</dl> | ||||
<t>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. | counting from the start of the DSO 12-byte header. | |||
Including the two-byte length prefix that is used to frame DNS over a b | Including the two-byte length prefix that is used to frame DNS over a | |||
yte stream | byte stream | |||
like TLS, this makes a total of 16,384 bytes. | like TLS, this makes a total of 16,384 bytes. | |||
Servers MUST NOT generate PUSH messages larger than this. | Servers <bcp14>MUST NOT</bcp14> generate PUSH messages larger than | |||
this. | ||||
Where the immediately available change notifications | Where the immediately available change notifications | |||
are sufficient to exceed a DNS message length of 16,382 bytes, | are sufficient to exceed a DNS message length of 16,382 bytes, | |||
the change notifications MUST be communicated in separate PUSH messages | the change notifications <bcp14>MUST</bcp14> be communicated in | |||
separate PUSH messages | ||||
of up to 16,382 bytes each. | of up to 16,382 bytes each. | |||
DNS name compression becomes less effective for messages larger than 16 | DNS name compression becomes less effective for messages larger than | |||
,384 bytes, | 16,384 bytes, | |||
so little efficiency benefit is gained by sending messages larger than | so little efficiency benefit is gained by sending messages larger | |||
this.</t> | than this.</t> | |||
<t>If a client receives a PUSH message with a DNS message length | ||||
<t>If a client receives a PUSH message with a DNS message length larger | larger than 16,382 bytes, | |||
than 16,382 bytes, | this is a fatal error and the client <bcp14>MUST</bcp14> forcibly | |||
this is a fatal error, and the client MUST forcibly abort the connectio | abort the connection immediately.</t> | |||
n immediately.</t> | <figure anchor="push_msg"> | |||
<name>PUSH Message</name> | ||||
<figure align="left" anchor="push_msg" title="PUSH Message"><artwork al | <artwork align="left" name="" type="" alt=""><![CDATA[ | |||
ign="left"><![CDATA[ | ||||
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 : / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork></figure> | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork> | |||
</figure> | ||||
<t>When processing the records received in a PUSH Message, the receivin | <t>When processing the records received in a PUSH Message, the | |||
g client MUST validate | receiving client <bcp14>MUST</bcp14> validate | |||
that the records being added or removed correspond with at least one cu | that the records being added or removed correspond with at least one | |||
rrently active | currently active | |||
subscription on that session. Specifically, the record name MUST match | subscription on that session. Specifically, the record name | |||
the name given in the | <bcp14>MUST</bcp14> match the name given in the | |||
SUBSCRIBE request, subject to the usual established DNS case-insensitiv | SUBSCRIBE request, subject to the usual established DNS | |||
ity for US-ASCII letters. | case-insensitivity for US-ASCII letters. | |||
For individual additions and removals, | For individual additions and removals, | |||
if the TYPE in the SUBSCRIBE request was not ANY (255) | if the TYPE in the SUBSCRIBE request was not ANY (255), | |||
then 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 | given in the SUBSCRIBE request, and | |||
if the CLASS in the SUBSCRIBE request was not ANY (255) | if the CLASS in the SUBSCRIBE request was not ANY (255), | |||
then the CLASS of the record must match the CLASS given in the SUBSCRIB | then the CLASS of the record must match the CLASS given in the | |||
E request. | SUBSCRIBE request. | |||
For collective removals, at least one of the records being removed must | For collective removals, at least one of the records being removed | |||
match an active subscription. | must match an active subscription. | |||
If a matching active subscription on that session is not found, then th | If a matching active subscription on that session is not found, then | |||
at particular | that particular | |||
addition/removal record is silently ignored. Processing of other additi | addition/removal record is silently ignored. The processing of other | |||
ons and removal records | additions and removal records | |||
in this message is not affected. The DSO session is not closed. This is | in this message is not affected. The DSO session is not closed. This | |||
to allow for | is to allow for | |||
the unavoidable race condition where a client sends an outbound UNSUBSC | the unavoidable race condition where a client sends an outbound | |||
RIBE while | UNSUBSCRIBE while | |||
inbound PUSH messages for that subscription from the server are still i | inbound PUSH messages for that subscription from the server are still | |||
n flight.</t> | in flight.</t> | |||
<t>The TTL of an added record is stored by the client. While the | ||||
<t>In the case where a single change affects more than one active subsc | subscription | |||
ription, only one PUSH message is sent. For example, a PUSH message adding a giv | is active the TTL is not decremented, because a change to the TTL | |||
en record may match both a SUBSCRIBE request with the same TYPE and a different | would | |||
SUBSCRIBE request with TYPE = 255 (ANY). It is not the case that two PUSH messag | ||||
es are sent because the new record matches two active subscriptions.</t> | ||||
<t>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 n | ||||
ame, and no other | ||||
records of any kind exist for that name, the server SHOULD send a "remo | ||||
ve all RRsets | ||||
from a name" PUSH message, not two separate "remove an RRset from a nam | ||||
e" PUSH messages.</t> | ||||
<t>A server SHOULD combine multiple change notifications in a single PU | ||||
SH 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.</t> | ||||
<t>The TTL of an added record is stored by the client. While the subsc | ||||
ription | ||||
is active, the TTL is not decremented, because a change to the TTL wo | ||||
uld | ||||
produce a new update. | produce a new update. | |||
For as long as a relevant subscription remains active, the client | For as long as a relevant subscription remains active, the client | |||
SHOULD assume that when a record goes away the server will notify it | <bcp14>SHOULD</bcp14> assume that when a record goes away, the | |||
of that fact. Consequently, a client does not have to poll to verify | server will notify it | |||
that the record is still there. Once a subscription is cancelled | of that fact. Consequently, a client does not have to poll to | |||
(individually, or as a result of the DSO session being closed) record | verify | |||
aging for records covered by the subscription resumes and records are | that the record is still there. Once a subscription is canceled | |||
(individually, or as a result of the DSO session being closed), | ||||
record | ||||
aging for records covered by the subscription resumes and records | ||||
are | ||||
removed from the local cache when their TTL reaches zero.</t> | removed from the local cache when their TTL reaches zero.</t> | |||
<?rfc needLines="48" ?> | </section> | |||
</section> | </section> | |||
</section> | ||||
<section title="DNS Push Notification UNSUBSCRIBE" anchor="unsubscribe"> | ||||
<t>To cancel an individual subscription without closing the entire DSO se | ||||
ssion, the client sends an UNSUBSCRIBE message over the established DSO session | ||||
to the server.</t> | ||||
<t>The entity that initiates an UNSUBSCRIBE message is by definition the | <section anchor="unsubscribe" numbered="true" toc="default"> | |||
client. | <name>DNS Push Notification UNSUBSCRIBE</name> | |||
A server MUST NOT send an UNSUBSCRIBE message over an existing session fr | <t>To cancel an individual subscription without closing the entire DSO | |||
om a client. | session, the client sends an UNSUBSCRIBE message over the established | |||
If a server does send an UNSUBSCRIBE message over a DSO session initiated | DSO session to the server.</t> | |||
by a client, | <t>The entity that initiates an UNSUBSCRIBE message is by definition | |||
or an UNSUBSCRIBE message is sent with the QR bit set indicating that it | the client. | |||
is a response, | A server <bcp14>MUST NOT</bcp14> send an UNSUBSCRIBE message over an | |||
this is a fatal error and the receiver MUST forcibly abort the connection | existing session from a client. | |||
immediately.</t> | If a server does send an UNSUBSCRIBE message over a DSO session | |||
initiated by a client, | ||||
<section title="UNSUBSCRIBE Message"> | or an UNSUBSCRIBE message is sent with the QR bit set indicating that | |||
it is a response, | ||||
<t>An UNSUBSCRIBE unidirectional message begins with the standard | this is a fatal error and the receiver <bcp14>MUST</bcp14> forcibly | |||
<xref target="RFC8490">DSO 12-byte header</xref>, followed by the UNSUB | abort the connection immediately.</t> | |||
SCRIBE primary TLV. | <section numbered="true" toc="default"> | |||
An UNSUBSCRIBE message is illustrated in <xref target="unsubscribe_msg" | <name>UNSUBSCRIBE Message</name> | |||
/>.</t> | <t>An UNSUBSCRIBE unidirectional message begins with the standard | |||
DSO 12-byte header <xref target="RFC8490" format="default"></xref>, | ||||
<t>In accordance with the definition of DSO unidirectional messages, | followed by the UNSUBSCRIBE Primary TLV. | |||
the MESSAGE ID field MUST be zero. | An UNSUBSCRIBE message is illustrated in <xref | |||
target="unsubscribe_msg" format="default"/>.</t> | ||||
<t>In accordance with the definition of DSO unidirectional messages, | ||||
the MESSAGE ID field <bcp14>MUST</bcp14> be zero. | ||||
There is no server response to an UNSUBSCRIBE message.</t> | There is no server response to an UNSUBSCRIBE message.</t> | |||
<t>The other header fields <bcp14>MUST</bcp14> be set as described | ||||
<t>The other header fields MUST be set as described in the | in the | |||
<xref target="RFC8490">DSO spec-ification</xref>. | <xref target="RFC8490" format="default">DSO specification</xref>. | |||
The DNS OPCODE field contains the OPCODE value for DNS Stateful Operati | The DNS OPCODE field contains the OPCODE value for DNS Stateful | |||
ons (6). | Operations (6). | |||
The four count fields must be zero, and the corresponding four sections | The four count fields must be zero, and the corresponding four | |||
must be empty (i.e., absent).</t> | sections must be empty (i.e., absent).</t> | |||
<t>The DSO-TYPE is UNSUBSCRIBE (0x0042).</t> | ||||
<t>The DSO-TYPE is UNSUBSCRIBE (tentatively 0x42).</t> | <t>The DSO-LENGTH field contains the value 2, the length of the | |||
2-octet MESSAGE ID contained in the DSO-DATA.</t> | ||||
<t>The DSO-LENGTH field contains the value 2, the length of the 2-octet | <t>The DSO-DATA contains the value previously given in the MESSAGE | |||
MESSAGE ID contained in the DSO-DATA.</t> | ID field of an active SUBSCRIBE request. | |||
This is how the server knows which SUBSCRIBE request is being | ||||
<t>The DSO-DATA contains the value previously given in the MESSAGE ID f | canceled. | |||
ield of an active SUBSCRIBE request. | After receipt of the UNSUBSCRIBE message, the SUBSCRIBE request is no | |||
This is how the server knows which SUBSCRIBE request is being cancelled | longer active.</t> | |||
. | <t>It is allowable for the client to issue an UNSUBSCRIBE message | |||
After receipt of the UNSUBSCRIBE message, the SUBSCRIBE request is no l | for a previous SUBSCRIBE request | |||
onger active.</t> | ||||
<t>It is allowable for the client to issue an UNSUBSCRIBE message for a | ||||
previous SUBSCRIBE request | ||||
for which the client has not yet received a SUBSCRIBE response. | for which the client has not yet received a SUBSCRIBE response. | |||
This is to allow for the case where a client starts and stops a subscri | This is to allow for the case where a client starts and stops a | |||
ption in less than the | subscription in less than the | |||
round-trip time to the server. | round-trip time to the server. | |||
The client is NOT required to wait for the SUBSCRIBE response before is | The client is NOT required to wait for the SUBSCRIBE response before | |||
suing the UNSUBSCRIBE message.</t> | issuing the UNSUBSCRIBE message.</t> | |||
<t>Consequently, it is possible for a server to receive an | ||||
<?rfc needLines="6" ?> | UNSUBSCRIBE message | |||
<t>Consequently, it is possible for a server to receive an UNSUBSCRIBE | ||||
message | ||||
that does not match any currently active subscription. | that does not match any currently active subscription. | |||
This can occur when a client sends a SUBSCRIBE request, | This can occur when a client sends a SUBSCRIBE request, | |||
which subsequently fails and returns an error code, | which subsequently fails and returns an error code, | |||
but the client sent an UNSUBSCRIBE message before it | but the client sent an UNSUBSCRIBE message before it | |||
became aware that the SUBSCRIBE request had failed. | became aware that the SUBSCRIBE request had failed. | |||
Because of this, servers MUST silently ignore | Because of this, servers <bcp14>MUST</bcp14> silently ignore | |||
UNSUBSCRIBE messages that do not match any currently active subscriptio | UNSUBSCRIBE messages that do not match any currently active | |||
n.</t> | subscription.</t> | |||
<figure anchor="unsubscribe_msg"> | ||||
<figure align="left" anchor="unsubscribe_msg" title="UNSUBSCRIBE Messag | <name>UNSUBSCRIBE Message</name> | |||
e"><artwork align="left"><![CDATA[ | <artwork align="left" name="" type="" alt=""><![CDATA[ | |||
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 = UNSUBSCRIBE (tentatively 0x42) | | | DSO-TYPE = UNSUBSCRIBE (0x0042) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | |||
| DSO-LENGTH (2) | | | DSO-LENGTH (2) | | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ \ | |||
| SUBSCRIBE MESSAGE ID | > DSO-DATA | | SUBSCRIBE MESSAGE ID | > DSO-DATA | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork></figure> | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork> | |||
</figure> | ||||
<?rfc needLines="48" ?> | </section> | |||
</section> | </section> | |||
</section> | <section anchor="reconfirm" numbered="true" toc="default"> | |||
<name>DNS Push Notification RECONFIRM</name> | ||||
<section title="DNS Push Notification RECONFIRM" anchor="reconfirm"> | <t>Sometimes, particularly when used with a Discovery Proxy <xref | |||
<t>Sometimes, particularly when used with a <xref target="DisProx">Discov | target="RFC8766" format="default"></xref>, a DNS Zone may contain | |||
ery Proxy</xref>, a DNS Zone may contain stale data. When a client encounters da | stale data. When a client encounters data that it believes may be | |||
ta that it believes may be stale (e.g., an SRV record referencing a target host+ | stale (e.g., an SRV record referencing a target host+port that is not | |||
port that is not responding to connection requests) the client can send a RECONF | responding to connection requests), the client can send a RECONFIRM | |||
IRM message to ask the server to re-verify that the data is still valid. For a D | message to ask the server to re-verify that the data is still | |||
iscovery Proxy, this causes it to issue new Multicast DNS queries to ascertain w | valid. For a Discovery Proxy, this causes it to issue new Multicast | |||
hether the target device is still present. How the Discovery Proxy causes these | DNS queries to ascertain whether the target device is still | |||
new Multicast DNS queries to be issued depends on the details of the underlying | present. How the Discovery Proxy causes these new Multicast DNS | |||
Multicast DNS implementation being used. | queries to be issued depends on the details of the underlying | |||
For example, a Discovery Proxy built on Apple's dns_sd.h API <xref target | Multicast DNS implementation being used. For example, a Discovery | |||
="SD-API"/> | Proxy built on Apple's dns_sd.h API <xref target="SD-API" | |||
responds to a DNS Push Notification RECONFIRM message by calling | format="default"/> responds to a DNS Push Notification RECONFIRM | |||
the underlying API's DNSServiceReconfirmRecord() routine.</t> | message by calling the underlying API's DNSServiceReconfirmRecord() | |||
routine.</t> | ||||
<t>For other types of DNS server, the RECONFIRM operation is currently un | <t>For other types of DNS server, the RECONFIRM operation is currently | |||
defined, and SHOULD result in a NOERROR response, but otherwise need not cause a | undefined and <bcp14>SHOULD</bcp14> result in a NOERROR response, but | |||
ny action to occur.</t> | it need not cause any other action to occur.</t> | |||
<t>Frequent use of RECONFIRM operations may be a sign of network | ||||
<t>Frequent use of RECONFIRM operations may be a sign of network unreliab | unreliability, or some kind of misconfiguration, so RECONFIRM | |||
ility, or some kind of misconfiguration, so RECONFIRM operations MAY be logged o | operations <bcp14>MAY</bcp14> be logged or otherwise communicated to a | |||
r otherwise communicated to a human administrator to assist in detecting and rem | human administrator to assist in detecting and remedying such network | |||
edying such network problems.</t> | problems.</t> | |||
<t>If, after receiving a valid RECONFIRM message, the server | ||||
<t>If, after receiving a valid RECONFIRM message, the server determines t | determines that the disputed records are in fact no longer valid, then | |||
hat the disputed records are in fact no longer valid, then subsequent DNS PUSH M | subsequent DNS PUSH Messages will be generated to inform interested | |||
essages will be generated to inform interested clients. Thus, one client discove | clients. Thus, one client discovering that a previously advertised | |||
ring that a previously-advertised device (like a network printer) is no longer p | device (like a network printer) is no longer present has the side | |||
resent has the side effect of informing all other interested clients that the de | effect of informing all other interested clients that the device in | |||
vice in question is now gone.</t> | question is now gone.</t> | |||
<t>The entity that initiates a RECONFIRM message is by definition the | ||||
<t>The entity that initiates a RECONFIRM message is by definition the cli | client. | |||
ent. | A server <bcp14>MUST NOT</bcp14> send a RECONFIRM message over an | |||
A server MUST NOT send a RECONFIRM message over an existing session from | existing session from a client. | |||
a client. | If a server does send a RECONFIRM message over a DSO session initiated | |||
If a server does send a RECONFIRM message over a DSO session initiated by | by a client, | |||
a client, | or a RECONFIRM message is sent with the QR bit set indicating that it | |||
or a RECONFIRM message is sent with the QR bit set indicating that it is | is a response, | |||
a response, | this is a fatal error and the receiver <bcp14>MUST</bcp14> forcibly | |||
this is a fatal error and the receiver MUST forcibly abort the connection | abort the connection immediately.</t> | |||
immediately.</t> | <section numbered="true" toc="default"> | |||
<name>RECONFIRM Message</name> | ||||
<?rfc needLines="20" ?> | <t>A RECONFIRM unidirectional message begins with the standard DSO | |||
<section title="RECONFIRM Message"> | 12-byte header <xref target="RFC8490" format="default"></xref>, | |||
followed by the RECONFIRM Primary TLV. | ||||
<t>A RECONFIRM unidirectional message begins with the standard | A RECONFIRM message is illustrated in <xref target="reconfirm_msg" | |||
<xref target="RFC8490">DSO 12-byte header</xref>, followed by the RECON | format="default"/>.</t> | |||
FIRM primary TLV.<vspace /> | <t>In accordance with the definition of DSO unidirectional messages, | |||
A RECONFIRM message is illustrated in <xref target="reconfirm_msg"/>.</ | the MESSAGE ID field <bcp14>MUST</bcp14> be zero. | |||
t> | ||||
<t>In accordance with the definition of DSO unidirectional messages, | ||||
the MESSAGE ID field MUST be zero. | ||||
There is no server response to a RECONFIRM message.</t> | There is no server response to a RECONFIRM message.</t> | |||
<t>The other header fields <bcp14>MUST</bcp14> be set as described | ||||
<t>The other header fields MUST be set as described in the | in the | |||
<xref target="RFC8490">DSO spec-ification</xref>. | <xref target="RFC8490" format="default">DSO specification</xref>. | |||
The DNS OPCODE field contains the OPCODE value for DNS Stateful Operati | The DNS OPCODE field contains the OPCODE value for DNS Stateful | |||
ons (6). | Operations (6). | |||
The four count fields must be zero, and the corresponding four sections | The four count fields must be zero, and the corresponding four | |||
must be empty (i.e., absent).</t> | sections must be empty (i.e., absent).</t> | |||
<t>The DSO-TYPE is RECONFIRM (0x0043).</t> | ||||
<t>The DSO-TYPE is RECONFIRM (tentatively 0x43).</t> | <t>The DSO-LENGTH is the length of the data that follows, which | |||
specifies | ||||
<t>The DSO-LENGTH is the length of the data that follows, which specifi | ||||
es | ||||
the name, type, class, and content of the record being disputed.</t> | the name, type, class, and content of the record being disputed.</t> | |||
<t>A DNS Push Notifications RECONFIRM message contains exactly one | ||||
<t>The DSO-DATA for a RECONFIRM message MUST contain exactly one record | RECONFIRM Primary TLV. | |||
. | The DSO-DATA in a RECONFIRM Primary TLV <bcp14>MUST</bcp14> contain | |||
The DSO-DATA for a RECONFIRM message has no count field to specify more | exactly one record. | |||
than one record. | The DSO-DATA in a RECONFIRM Primary TLV has no count field to | |||
Since RECONFIRM messages are sent over TCP, multiple RECONFIRM messages | specify more than one record. | |||
can be concatenated in a single TCP stream and packed efficiently into | Since RECONFIRM messages are sent over TCP, multiple RECONFIRM | |||
TCP segments.</t> | messages | |||
can be concatenated in a single TCP stream and packed efficiently | ||||
<t>TYPE MUST NOT be the value ANY (255) and CLASS MUST NOT be the value | into TCP segments. | |||
ANY (255).</t> | Note that this means that DNS name compression cannot be used | |||
between different RECONFIRM messages. | ||||
<t>DNS wildcarding is not supported. That is, a wildcard ("*") in a REC | However, when a client is sending multiple RECONFIRM messages this | |||
ONFIRM message matches only a literal wildcard character ("*") in the zone, and | indicates | |||
nothing else.</t> | a situation with serious network problems, and this is not expected | |||
to occur | ||||
<t>Aliasing is not supported. That is, a CNAME in a RECONFIRM message m | frequently enough that optimizing efficiency in this case is | |||
atches only a literal CNAME record in the zone, and no other records with the sa | important. | |||
me owner name.</t> | </t> | |||
<t>TYPE <bcp14>MUST NOT</bcp14> be the value ANY (255) and CLASS | ||||
<t>Note that there is no RDLEN field, since the length of the RDATA can | <bcp14>MUST NOT</bcp14> be the value ANY (255).</t> | |||
be inferred from DSO-LENGTH, so an additional RDLEN field would be redundant.</ | <t>DNS wildcarding is not supported. | |||
t> | That is, an asterisk character ("*") in a RECONFIRM message matches | |||
only a literal asterisk character ("*") in a name and nothing else. | ||||
<figure align="left" anchor="reconfirm_msg" title="RECONFIRM Message">< | Similarly, a CNAME in a RECONFIRM message matches only a CNAME | |||
artwork align="left"><![CDATA[ | record | |||
with that name in the zone and no other records with that name.</t> | ||||
<t>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.</t> | ||||
<t>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 <xref target="RFC1035" | ||||
format="default"/>.</t> | ||||
<figure anchor="reconfirm_msg"> | ||||
<name>RECONFIRM Message</name> | ||||
<artwork align="left" name="" type="" alt=""><![CDATA[ | ||||
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 \ / | |||
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork></figure> | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ /]]></artwork> | |||
</figure> | ||||
<?rfc needLines="48" ?> | </section> | |||
</section> | </section> | |||
<section numbered="true" toc="default"> | ||||
</section> | <name>DNS Stateful Operations TLV Context Summary</name> | |||
<section title="DNS Stateful Operations TLV Context Summary"> | <t>This document defines four new DSO TLVs. As recommended in <xref | |||
<t>This document defines four new DSO TLVs. As recommended in Section 8.2 | target="RFC8490" sectionFormat="of" section="8.2">the DNS Stateful | |||
of the <xref target="RFC8490">DNS Stateful Operations specification</xref>, the | Operations specification</xref>, the valid contexts of these | |||
valid contexts of these new TLV types are summarized below.</t> | new TLV types are summarized below.</t> | |||
<t>The client TLV contexts are: | <t>The client TLV contexts are: | |||
<?rfc subcompact="yes" ?> | ||||
<list style="hanging"> | ||||
<t hangText="C-P:">Client request message, primary TLV</t> | ||||
<t hangText="C-U:">Client unidirectional message, primary TLV</t> | ||||
<t hangText="C-A:">Client request or unidirectional message, addition | ||||
al TLV</t> | ||||
<t hangText="CRP:">Response back to client, primary TLV</t> | ||||
<t hangText="CRA:">Response back to client, additional TLV</t> | ||||
</list> | ||||
<?rfc subcompact="no" ?> | ||||
</t> | ||||
<texttable title="DSO TLV Client Context Summary" anchor="tlv_client_cont | ||||
exts"> | ||||
<ttcol align="right">TLV Type</ttcol> | ||||
<ttcol align="center">C-P</ttcol> | ||||
<ttcol align="center">C-U</ttcol> | ||||
<ttcol align="center">C-A</ttcol> | ||||
<ttcol align="center">CRP</ttcol> | ||||
<ttcol align="center">CRA</ttcol> | ||||
<c>SUBSCRIBE</c><c>X</c><c></c><c></c><c></c><c></c> | ||||
<c>PUSH</c><c></c><c></c><c></c><c></c><c></c> | ||||
<c>UNSUBSCRIBE</c><c></c><c>X</c><c></c><c></c><c></c> | ||||
<c>RECONFIRM</c><c></c><c>X</c><c></c><c></c><c></c> | ||||
</texttable> | ||||
<t>The server TLV contexts are: | ||||
<?rfc subcompact="yes" ?> | ||||
<list style="hanging"> | ||||
<t hangText="S-P:">Server request message, primary TLV</t> | ||||
<t hangText="S-U:">Server unidirectional message, primary TLV</t> | ||||
<t hangText="S-A:">Server request or unidirectional message, additional | ||||
TLV</t> | ||||
<t hangText="SRP:">Response back to server, primary TLV</t> | ||||
<t hangText="SRA:">Response back to server, additional TLV</t> | ||||
</list> | ||||
<?rfc subcompact="no" ?> | ||||
</t> | ||||
<texttable title="DSO TLV Server Context Summary" anchor="tlv_server_contex | ||||
ts"> | ||||
<ttcol align="right">TLV Type</ttcol> | ||||
<ttcol align="center">S-P</ttcol> | ||||
<ttcol align="center">S-U</ttcol> | ||||
<ttcol align="center">S-A</ttcol> | ||||
<ttcol align="center">SRP</ttcol> | ||||
<ttcol align="center">SRA</ttcol> | ||||
<c>SUBSCRIBE</c><c></c><c></c><c></c><c></c><c></c> | ||||
<c>PUSH</c><c></c><c>X</c><c></c><c></c><c></c> | ||||
<c>UNSUBSCRIBE</c><c></c><c></c><c></c><c></c><c></c> | ||||
<c>RECONFIRM</c><c></c><c></c><c></c><c></c><c></c> | ||||
</texttable> | ||||
</section> | ||||
<section title="Client-Initiated Termination"> | ||||
<t>An individual subscription is terminated by sending an UNSUBSCRIBE TLV | ||||
for that specific subscription, or all subscriptions can be cancelled at once b | ||||
y the client closing the DSO session. When a client terminates an individual sub | ||||
scription (via UNSUBSCRIBE) or all subscriptions on that DSO session (by ending | ||||
the session) it is signaling to the server that it is no longer interested in re | ||||
ceiving those particular updates. It is informing the server that the server may | ||||
release any state information it has been keeping with regards to these particu | ||||
lar subscriptions.</t> | ||||
<t>After terminating its last subscription on a session via UNSUBSCRIBE, | ||||
a client MAY close the session immediately, or it may keep it open if it anticip | ||||
ates performing further operations on that session in the future. If a client wi | ||||
shes to keep an idle session open, it MUST respect the maximum idle time require | ||||
d by the server <xref target="RFC8490"/>.</t> | ||||
<t>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 optimization | ||||
it MAY instead choose to simply close the session, which implicitly terminates | ||||
all subscriptions on that session. This may occur because the client computer is | ||||
being shut down, is going to sleep, the application requiring the subscriptions | ||||
has terminated, or simply because the last active subscription on that session | ||||
has been cancelled.</t> | ||||
<t>When closing a session, a client should perform an orderly close of | </t> | |||
the TLS session. | <dl newline="false" spacing="compact"> | |||
Typical APIs will provide a session | <dt>C-P:</dt> | |||
close method that will send a TLS close_notify alert | <dd>Client request message, Primary TLV</dd> | |||
(see Section 6.1 of the TLS 1.3 specification <xref target="RFC8446"/>). | <dt>C-U:</dt> | |||
This instructs the recipient that the sender will not send any more data | <dd>Client Unidirectional message, primary TLV</dd> | |||
over the session. | <dt>C-A:</dt> | |||
After sending the TLS close_notify alert | <dd>Client request or unidirectional message, Additional TLV</dd> | |||
the client MUST gracefully close the underlying connection using a TCP FI | <dt>CRP:</dt> | |||
N, | <dd>Response back to client, Primary TLV</dd> | |||
so that the TLS close_notify is reliably delivered. | <dt>CRA:</dt> | |||
The mechanisms for gracefully closing a TCP connection with a TCP FIN var | <dd>Response back to client, Additional TLV</dd> | |||
y depending on the networking API. | </dl> | |||
For example, in the BSD Sockets API, sending a TCP FIN is achieved by cal | <table anchor="tlv_client_contexts" align="center"> | |||
ling "shutdown(s,SHUT_WR)" | <name>DSO TLV Client Context Summary</name> | |||
and keeping the socket open until all remaining data has been read from i | <thead> | |||
t.</t> | <tr> | |||
<th align="right">TLV Type</th> | ||||
<th align="center">C-P</th> | ||||
<th align="center">C-U</th> | ||||
<th align="center">C-A</th> | ||||
<th align="center">CRP</th> | ||||
<th align="center">CRA</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="right">SUBSCRIBE</td> | ||||
<td align="center">X</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">PUSH</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">UNSUBSCRIBE</td> | ||||
<td align="center"/> | ||||
<td align="center">X</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">RECONFIRM</td> | ||||
<td align="center"/> | ||||
<td align="center">X</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
<t>The server TLV contexts are: | ||||
<t>If the session is forcibly closed at the TCP level by sending a | </t> | |||
<dl newline="false" spacing="compact"> | ||||
<dt>S-P:</dt> | ||||
<dd>Server request message, Primary TLV</dd> | ||||
<dt>S-U:</dt> | ||||
<dd>Server Unidirectional message, primary TLV</dd> | ||||
<dt>S-A:</dt> | ||||
<dd>Server request or unidirectional message, Additional TLV</dd> | ||||
<dt>SRP:</dt> | ||||
<dd>Response back to server, Primary TLV</dd> | ||||
<dt>SRA:</dt> | ||||
<dd>Response back to server, Additional TLV</dd> | ||||
</dl> | ||||
<table anchor="tlv_server_contexts" align="center"> | ||||
<name>DSO TLV Server Context Summary</name> | ||||
<thead> | ||||
<tr> | ||||
<th align="right">TLV Type</th> | ||||
<th align="center">S-P</th> | ||||
<th align="center">S-U</th> | ||||
<th align="center">S-A</th> | ||||
<th align="center">SRP</th> | ||||
<th align="center">SRA</th> | ||||
</tr> | ||||
</thead> | ||||
<tbody> | ||||
<tr> | ||||
<td align="right">SUBSCRIBE</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">PUSH</td> | ||||
<td align="center"/> | ||||
<td align="center">X</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">UNSUBSCRIBE</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
<tr> | ||||
<td align="right">RECONFIRM</td> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
<td align="center"/> | ||||
</tr> | ||||
</tbody> | ||||
</table> | ||||
</section> | ||||
<section numbered="true" toc="default"> | ||||
<name>Client-Initiated Termination</name> | ||||
<t>An individual subscription is terminated by sending an UNSUBSCRIBE | ||||
TLV for that specific subscription, or all subscriptions can be | ||||
canceled at once by the client closing the DSO session. When a client | ||||
terminates an individual subscription (via UNSUBSCRIBE) or all | ||||
subscriptions on that DSO session (by ending the session), it is | ||||
signaling to the server that it is no longer interested in receiving | ||||
those particular updates. It is informing the server that the server | ||||
may release any state information it has been keeping with regards to | ||||
these particular subscriptions.</t> | ||||
<t>After terminating its last subscription on a session via | ||||
UNSUBSCRIBE, a client <bcp14>MAY</bcp14> close the session immediately | ||||
or it may keep it open if it anticipates performing further operations | ||||
on that session in the future. If a client wishes to keep an idle | ||||
session open, it <bcp14>MUST</bcp14> respect the maximum idle time | ||||
required by the server <xref target="RFC8490" format="default"/>.</t> | ||||
<t>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 optimization, it <bcp14>MAY</bcp14> instead choose to | ||||
simply | ||||
close the session, which implicitly terminates all subscriptions on | ||||
that session. This may occur because the client computer is being shut | ||||
down, is going to sleep, the application requiring the subscriptions | ||||
has terminated, or simply because the last active subscription on that | ||||
session has been canceled.</t> | ||||
<t>When closing a session, a client should perform an orderly close of | ||||
the TLS session. Typical APIs will provide a session close method | ||||
that will send a TLS close_notify alert as described in <xref | ||||
target="RFC8446" | ||||
sectionFormat="of" section="6.1">the TLS 1.3 specification</xref>. | ||||
This instructs the | ||||
recipient that the sender will not send any more data over the | ||||
session. After sending the TLS close_notify alert, the client | ||||
<bcp14>MUST</bcp14> 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.</t> | ||||
<t>If the session is forcibly closed at the TCP level by sending a | ||||
RST from either end of the connection, data may be lost.</t> | RST from either end of the connection, data may be lost.</t> | |||
<?rfc needLines="10" ?> | </section> | |||
</section> | ||||
<section title="Client Fallback to Polling" anchor="polling"> | <section anchor="polling" numbered="true" toc="default"> | |||
<name>Client Fallback to Polling</name> | ||||
<t>There are cases where a client may exhaust all avenues for | <t>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 | This can happen if the client's configured recursive resolver does not | |||
does not support DNS over TLS, or | support DNS over TLS, or supports DNS over TLS but is not listening on | |||
supports DNS over TLS but is not listening on TCP port 853, or | TCP port 853, or supports DNS over TLS on TCP port 853 but does not | |||
supports DNS over TLS on TCP port 853 but does not support DSO on that p | support DSO on that port, or for some other reason is unable to | |||
ort, | provide a DNS Push Notification subscription. In this case, the | |||
or for some other reason is unable to provide a DNS Push Notification su | client | |||
bscription. | will attempt to communicate directly with an appropriate server, and | |||
In this case the client will attempt to communicate directly with an app | it may be that the zone apex discovery fails, or there is no | |||
ropriate server, | <tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt> SRV record, or | |||
and it may be that the zone apex discovery fails, or there is no | the server indicated in the SRV record is misconfigured, overloaded, | |||
<spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx> SR | or is | |||
V record, | unresponsive for some other reason.</t> | |||
or server indicated in the SRV record is misconfigured, | <t>Regardless of the reason for the failure, after being unable to | |||
or is unresponsive for some other reason.</t> | establish the desired DNS Push Notification subscription, it is likely | |||
that the client will still wish to know the answer it seeks, even if | ||||
<t>Regardless of the reason for the failure, | that answer cannot be obtained with the timely change notifications | |||
after being unable to establish the desired DNS Push Notification subscr | provided by DNS Push Notifications. In such cases, it is likely that | |||
iption, | the client will obtain the answer it seeks via a conventional DNS | |||
it is likely that the client will still wish to know the answer it seeks | query instead, repeated at some interval to detect when the answer | |||
, | RRset changes.</t> | |||
even if that answer cannot be obtained with the timely | <t>In the case where a client responds to its failure to establish a | |||
change notifications provided by DNS Push Notifications. | DNS Push Notification subscription by falling back to polling with | |||
In such cases it is likely that the client will obtain | conventional DNS queries instead, the polling rate should be | |||
the answer it seeks via a conventional DNS query instead, | controlled to avoid placing excessive burden on the server. The | |||
repeated at some interval to detect when the answer RRset changes.</t> | interval between successive DNS queries for the same name, type, and | |||
class <bcp14>SHOULD</bcp14> be at least the minimum of 900 seconds (15 | ||||
<t>In the case where a client responds to its | minutes) or two seconds more than the TTL of the answer RRset.</t> | |||
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.</t> | ||||
<t>The reason that for TTLs shorter than 898 seconds the query should | ||||
not be reissued until two seconds *after* the answer RRset has expired i | ||||
s | ||||
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. | ||||
</t> | ||||
<t>The reason that for TTLs up to 898 seconds the query should | ||||
not be reissued until two seconds <em>after</em> 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 receive a reply telling it | ||||
that the answer RRset has one second remaining; the client | ||||
would then requery the recursive resolver again one second later. | ||||
If by this time the answer RRset has actually expired from the | ||||
recursive resolver's cache, the recursive resolver would then | ||||
issue a new query to fetch fresh data from the | ||||
authoritative server. Waiting until the answer RRset has definitely | ||||
expired from the cache on the client's configured recursive resolver | ||||
avoids this race condition and any unnecessary additional queries it | ||||
causes.</t> | ||||
<t>Each time a client is about to reissue its query to discover | <t>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 | changes to the answer RRset, it should first make a new attempt to | |||
establish a DNS Push Notification subscription, using previously | establish a DNS Push Notification subscription using previously | |||
cached DNS answers as appropriate. | cached DNS answers as appropriate. After a temporary misconfiguration | |||
After a temporary misconfiguration has been remedied, | has been remedied, this allows a client that is polling to return to | |||
this allows a client that is polling to return to using | using DNS Push Notifications for asynchronous notification of | |||
DNS Push Notifications for asynchronous notification of changes.</t> | changes.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section title="Security Considerations" anchor="Security"> | ||||
<t>The Strict Privacy Usage Profile for DNS over TLS is REQUIRED for DNS Pu | ||||
sh Notifications <xref target="RFC8310"/>. Cleartext connections for DNS Push No | ||||
tifications are not permissible. Since this is a new protocol, transition mechan | ||||
isms from the Opportunistic Privacy profile are unnecessary.</t> | ||||
<t>Also, see Section 9 of the DNS over (D)TLS Usage Profiles document <xref | ||||
target="RFC8310"/> for additional recommendations for various versions of TLS u | ||||
sage.</t> | ||||
<t>As a consequence of requiring TLS, client certificate authentication and | ||||
verification may also be enforced by the server for stronger client-server secu | ||||
rity or end-to-end security. However, recommendations for security in particular | ||||
deployment scenarios are outside the scope of this document.</t> | ||||
<t>DNSSEC is RECOMMENDED for the authentication of DNS Push Notification se | ||||
rvers. | ||||
TLS alone does not provide complete security. | ||||
TLS certificate verification can provide reasonable assurance that the clie | ||||
nt is really talking to the | ||||
server associated with the desired host name, but since the desired host na | ||||
me is learned via a DNS SRV query, | ||||
if the SRV query is subverted then the client may have a secure connection | ||||
to a rogue server. | ||||
DNSSEC can provide added confidence that the SRV query has not been subvert | ||||
ed.</t> | ||||
<?rfc needLines="14" ?> | ||||
<section title="Security Services"> | ||||
<t>It is the goal of using TLS to provide the following security services | ||||
: | ||||
<list style="hanging"> | ||||
<t hangText="Confidentiality:">All application-layer communication is | ||||
encrypted with the goal that no party should be able to decrypt it except the i | ||||
ntended receiver.</t> | ||||
<t hangText="Data integrity protection:">Any changes made to the comm | ||||
unication in transit are detectable by the receiver.</t> | ||||
<t hangText="Authentication:">An end-point of the TLS communication i | ||||
s authenticated as the intended entity to communicate with.</t> | ||||
<t hangText="Anti-replay protection:">TLS provides for the detection | ||||
of and prevention | ||||
against messages sent previously over a TLS connection (such as DNS P | ||||
ush Notifications). | ||||
If prior messages are re-sent at a later time as a form of a man-in-t | ||||
he-middle attack | ||||
then the receiver will detect this and reject the replayed messages.< | ||||
/t> | ||||
</list> | ||||
</t> | ||||
<t>Deployment recommendations on the appropriate key lengths and cypher s | ||||
uites are beyond the scope of this document. Please refer to <xref target="BCP19 | ||||
5">TLS Recommendations</xref> for the best current practices. Keep in mind that | ||||
best practices only exist for a snapshot in time and recommendations will contin | ||||
ue to change. Updated versions or errata may exist for these recommendations.</t | ||||
> | ||||
</section> | ||||
<section title="TLS Name Authentication" anchor="tls_name_auth"> | ||||
<t>As described in <xref target="discovery"/>, the client discovers the D | ||||
NS Push Notification server using an SRV lookup for the record name <spanx style | ||||
="verb">_dns&nbhy;push&nbhy;tls._tcp.<zone></spanx>. The server connection | ||||
endpoint SHOULD then be authenticated using DANE TLSA records for the associate | ||||
d SRV record. This associates the target's name and port number with a trusted T | ||||
LS certificate <xref target="RFC7673"/>. This procedure uses the TLS Server Name | ||||
Indication (SNI) extension <xref target="RFC6066"/> to inform the server of the | ||||
name the client has authenticated through the use of TLSA records. Therefore, i | ||||
f the SRV record passes DNSSEC validation and a TLSA record matching the target | ||||
name is useable, an SNI extension must be used for the target name to ensure the | ||||
client is connecting to the server it has authenticated. If the target name doe | ||||
s not have a usable TLSA record, then the use of the SNI extension is optional. | ||||
See <xref target="RFC8310">Usage Profiles for DNS over TLS and DNS over DTLS</xr | ||||
ef> for more information on authenticating domain names.</t> | ||||
</section> | ||||
<section title="TLS Early Data" anchor="early_data"> | ||||
<t>DSO messages with the SUBSCRIBE TLV as the Primary TLV are permitted i | ||||
n TLS early data. | ||||
Using TLS early data can save one network round trip, and can result in t | ||||
he client obtaining results faster.</t> | ||||
<t>However, there are some factors to consider before using TLS early dat | <section anchor="Security" numbered="true" toc="default"> | |||
a.</t> | <name>Security Considerations</name> | |||
<t>The Strict Privacy profile for DNS over TLS is | ||||
<bcp14>REQUIRED</bcp14> for DNS Push Notifications <xref | ||||
target="RFC8310" format="default"/>. Cleartext connections for DNS Push | ||||
Notifications are not permissible. Since this is a new protocol, | ||||
transition mechanisms from the Opportunistic Privacy profile are | ||||
unnecessary.</t> | ||||
<t>TLS Early Data is not forward secret. | <t>Also, see | |||
In cases where forward secrecy of DNS Push Notification subscriptions is | <xref target="RFC8310" sectionFormat="of" section="9">the document Usage | |||
required, | Profiles for DNS over (D)TLS</xref> | |||
the client should not use TLS Early Data.</t> | for additional | |||
recommendations for various versions of TLS usage.</t> | ||||
<t>As a consequence of requiring TLS, client certificate authentication | ||||
and verification may also be enforced by the server for stronger | ||||
client-server security or end-to-end security. However, recommendations | ||||
for security in particular deployment scenarios are outside the scope of | ||||
this document.</t> | ||||
<t>DNSSEC is <bcp14>RECOMMENDED</bcp14> for the authentication of DNS | ||||
Push Notification servers. TLS alone does not provide complete | ||||
security. TLS certificate verification can provide reasonable assurance | ||||
that the 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 query, if the SRV query is subverted, then the client may have a | ||||
secure connection to a rogue server. DNSSEC can provide added | ||||
confidence that the SRV query has not been subverted.</t> | ||||
<section numbered="true" toc="default"> | ||||
<name>Security Services</name> | ||||
<t>It is the goal of using TLS to provide the following security | ||||
services: | ||||
</t> | ||||
<dl newline="false" spacing="normal"> | ||||
<dt>Confidentiality:</dt> | ||||
<dd>All application-layer communication is encrypted with the goal | ||||
that no party should be able to decrypt it except the intended | ||||
receiver.</dd> | ||||
<dt>Data integrity protection:</dt> | ||||
<dd>Any changes made to the communication in transit are detectable | ||||
by the receiver.</dd> | ||||
<dt>Authentication:</dt> | ||||
<dd>An endpoint of the TLS communication is authenticated as the | ||||
intended entity to communicate with.</dd> | ||||
<dt>Anti-replay protection:</dt> | ||||
<dd>TLS provides for the detection of and prevention | ||||
against messages sent previously over a TLS connection (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 receiver will detect this and reject the replayed | ||||
messages.</dd> | ||||
</dl> | ||||
<t>With TLS early data there are no guarantees of non-replay between conn | <t>Deployment recommendations on the appropriate key lengths and | |||
ections. | cipher suites are beyond the scope of this document. Please refer to | |||
the current | ||||
TLS Recommendations <xref target="BCP195" format="default"></xref> | ||||
for the best current practices. | ||||
Keep in mind that best practices only exist for a snapshot in time, | ||||
and recommendations will continue to change. | ||||
Updated versions or errata may exist for these recommendations.</t> | ||||
</section> | ||||
<section anchor="tls_name_auth" numbered="true" toc="default"> | ||||
<name>TLS Name Authentication</name> | ||||
<t>As described in <xref target="discovery" format="default"/>, the | ||||
client discovers the DNS Push Notification server using an SRV lookup | ||||
for the record name | ||||
<tt>_dns&nbhy;push&nbhy;tls._tcp.<zone></tt>. The server | ||||
connection endpoint <bcp14>SHOULD</bcp14> then be authenticated using | ||||
DANE TLSA records for the associated SRV record. This associates the | ||||
target's name and port number with a trusted TLS certificate <xref | ||||
target="RFC7673" format="default"/>. This procedure uses the TLS | ||||
Server Name Indication (SNI) extension <xref target="RFC6066" | ||||
format="default"/> to inform the server of the name the client has | ||||
authenticated through the use of TLSA records. Therefore, if the SRV | ||||
record passes DNSSEC validation and a TLSA record matching the target | ||||
name is usable, an SNI extension 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 a usable TLSA record, then the use of | ||||
the SNI extension is optional. See Usage Profiles for DNS over TLS and | ||||
DNS over DTLS <xref target="RFC8310" format="default"></xref> for more | ||||
information on authenticating domain names.</t> | ||||
</section> | ||||
<section anchor="early_data" numbered="true" toc="default"> | ||||
<name>TLS Early Data</name> | ||||
<t>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 trip and can result in | ||||
the client obtaining results faster.</t> | ||||
<t>However, there are some factors to consider before using TLS early | ||||
data.</t> | ||||
<t>TLS early data is not forward secret. | ||||
In cases where forward secrecy of DNS Push Notification subscriptions | ||||
is required, | ||||
the client should not use TLS early data.</t> | ||||
<t>With TLS early data, there are no guarantees of non-replay between | ||||
connections. | ||||
If packets are duplicated and delayed in the network, | 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, | Generally, this is not a major concern | |||
since the amount of state generated on the server for | since the amount of state generated on the server for | |||
these spurious subscriptions is small and short-lived, | these spurious subscriptions is small and short lived | |||
since the TCP connection will not complete the three-way handshake. | since the TCP connection will not complete the three-way handshake. | |||
Servers MAY choose to implement rate-limiting measures that are activated | Servers <bcp14>MAY</bcp14> choose to implement rate-limiting measures | |||
when | that are activated when | |||
the server detects an excessive number of spurious subscription requests. | the server detects an excessive number of spurious subscription | |||
</t> | requests.</t> | |||
<t>For further guidance on use of TLS early data, please see | ||||
<t>For further guidance please see discussion of zero round-trip data | discussion of zero round-trip data | |||
(Section 2.3, Section 8, and Appendix E.5) | in Sections <xref target="RFC8446" sectionFormat="bare" section="2.3"/> | |||
in the TLS 1.3 specification, <xref target="RFC8446"/>.</t> | and | |||
</section> | <xref target="RFC8446" sectionFormat="bare" section="8"/>, and Appendix | |||
<xref | ||||
<section title="TLS Session Resumption" anchor="resumption"> | target="RFC8446" sectionFormat="bare" section="E.5"/>, of <xref | |||
<t>TLS Session Resumption <xref target="RFC8446"/> | target="RFC8446">the TLS 1.3 specification</xref>.</t> | |||
</section> | ||||
<section anchor="resumption" numbered="true" toc="default"> | ||||
<name>TLS Session Resumption</name> | ||||
<t>TLS session resumption <xref target="RFC8446" format="default"/> | ||||
is permissible on DNS Push Notification servers. | is permissible on DNS Push Notification servers. | |||
However, closing the TLS connection terminates the DSO session. | However, closing the TLS connection terminates the DSO session. | |||
When the TLS session is resumed, the DNS Push Notification server will no | When the TLS session is resumed, the DNS Push Notification server will | |||
t | not | |||
have any subscription state and will proceed as with any other new DSO se | have any subscription state and will proceed as with any other new DSO | |||
ssion. | session. | |||
Use of TLS Session Resumption may allow a TLS connection to be set up mor | Use of TLS session resumption may allow a TLS connection to be set up | |||
e quickly, | more quickly, | |||
but the client will still have to recreate any desired subscriptions.</t> | but the client will still have to recreate any desired | |||
<?rfc needLines="30" ?> | subscriptions.</t> | |||
</section> | </section> | |||
</section> | </section> | |||
<section anchor="IANA" numbered="true" toc="default"> | ||||
<section title="IANA Considerations" anchor="IANA"> | <name>IANA Considerations</name> | |||
<t>This document defines a new service name, only applicable for the TCP | ||||
<t>This document defines a new service name, only applicable for the TCP pr | protocol, | |||
otocol, | which has been recorded in the IANA "Service Name and Transport Protocol | |||
to be recorded in the IANA Service Type Registry <xref target="RFC6335"/><x | Port Number Registry" <xref target="RFC6335" format="default"/> <xref | |||
ref target="SRVTYPE"/>.</t> | target="SRVTYPE" format="default"/>.</t> | |||
<texttable title="IANA Service Type Assignments" anchor="iana_service_table | <table anchor="iana_service_table" align="center"> | |||
"> | <name>IANA Service Type Assignments</name> | |||
<ttcol width="25%" align="left">Name</ttcol> | <thead> | |||
<ttcol align="center">Port</ttcol> | <tr> | |||
<ttcol align="center">Value</ttcol> | <th align="left">Name</th> | |||
<ttcol align="left">Definition</ttcol> | <th align="center">Port</th> | |||
<c>DNS Push Notification Service Type</c> | <th align="center">Value</th> | |||
<c>None</c> | <th align="center">Section</th> | |||
<c><spanx style="verb">_dns&nbhy;push&nbhy;tls._tcp</spanx></c> | </tr> | |||
<c><xref target="discovery"/></c> | </thead> | |||
</texttable> | <tbody> | |||
<tr> | ||||
<t>This document defines four new DNS Stateful Operation TLV types | <td align="left">DNS Push Notification Service Type</td> | |||
to be recorded in the IANA DSO Type Code Registry <xref target="RFC8490"/>< | <td align="center">None</td> | |||
xref target="DSOTYPE"/>.</t> | <td align="center"> | |||
<texttable title="IANA DSO TLV Type Code Assignments" anchor="iana_tlv_tabl | <tt>_dns&nbhy;push&nbhy;tls._tcp</tt></td> | |||
e"> | <td align="center"> | |||
<ttcol align="left" >Name</ttcol> | <xref target="discovery" format="counter"/></td> | |||
<ttcol align="center" width="18%">Value</ttcol> | </tr> | |||
<ttcol align="center" >Early Data</ttcol> | </tbody> | |||
<ttcol align="center" width="28%">Status</ttcol> | </table> | |||
<ttcol align="left" width="20%">Definition</ttcol> | <t>This document defines four new DNS Stateful Operation TLV types, | |||
<c>SUBSCRIBE</c> | which have been recorded in the IANA "DSO Type Codes" registry <xref | |||
<c>TBA (0x40)</c> | target="RFC8490" format="default"/> <xref target="DSOTYPE" | |||
<c>OK</c> | format="default"/>.</t> | |||
<c>Standards Track</c> | <table anchor="iana_tlv_table" align="center"> | |||
<c><xref target="subscribe"/></c> | <name>IANA DSO TLV Type Code Assignments</name> | |||
<c>PUSH</c> | <thead> | |||
<c>TBA (0x41)</c> | <tr> | |||
<c>NO</c> | <th align="left">Name</th> | |||
<c>Standards Track</c> | <th align="center">Value</th> | |||
<c><xref target="push"/></c> | <th align="center">Early Data</th> | |||
<c>UNSUBSCRIBE</c> | <th align="center">Status</th> | |||
<c>TBA (0x42)</c> | <th align="center">Section</th> | |||
<c>NO</c> | </tr> | |||
<c>Standards Track</c> | </thead> | |||
<c><xref target="unsubscribe"/></c> | <tbody> | |||
<c>RECONFIRM</c> | <tr> | |||
<c>TBA (0x43)</c> | <td align="left">SUBSCRIBE</td> | |||
<c>NO</c> | <td align="center">0x0040</td> | |||
<c>Standards Track</c> | <td align="center">OK</td> | |||
<c><xref target="reconfirm"/></c> | <td align="center">Standards Track</td> | |||
</texttable> | <td align="center"> | |||
<xref target="subscribe" format="counter"/></td> | ||||
<t>This document defines no new DNS OPCODEs or RCODEs.</t> | </tr> | |||
<tr> | ||||
<?rfc needLines="12" ?> | <td align="left">PUSH</td> | |||
</section> | <td align="center">0x0041</td> | |||
<td align="center">NO</td> | ||||
<section title="Acknowledgements" anchor="Acknowledgements"> | <td align="center">Standards Track</td> | |||
<t>The authors would like to thank Kiren Sekar and Marc Krochmal for previo | <td align="center"> | |||
us work completed in this field.</t> | <xref target="push" format="counter"/></td> | |||
</tr> | ||||
<t>This draft has been improved due to comments from | <tr> | |||
Ran Atkinson, | <td align="left">UNSUBSCRIBE</td> | |||
Tim Chown, | <td align="center">0x0042</td> | |||
Sara Dickinson, | <td align="center">NO</td> | |||
Mark Delany, | <td align="center">Standards Track</td> | |||
Ralph Droms, | <td align="center"> | |||
Jan Komissar, | <xref target="unsubscribe" format="counter"/></td> | |||
Eric Rescorla, | </tr> | |||
Michael Richardson, | <tr> | |||
David Schinazi, | <td align="left">RECONFIRM</td> | |||
Manju Shankar Rao, | <td align="center">0x0043</td> | |||
Robert Sparks, | <td align="center">NO</td> | |||
Markus Stenberg, | <td align="center">Standards Track</td> | |||
Andrew Sullivan, | <td align="center"> | |||
Michael Sweet, | <xref target="reconfirm" format="counter"/></td> | |||
Dave Thaler, | </tr> | |||
Brian Trammell, | </tbody> | |||
Bernie Volz, | </table> | |||
Eric Vyncke, | <t>This document defines no new DNS OPCODEs or RCODEs.</t> | |||
Christopher Wood, | </section> | |||
Liang Xia, | ||||
and | ||||
Soraia Zlatkovic. | ||||
Ted Lemon provided clarifying text that was greatly appreciated.</t> | ||||
<?rfc needLines="15" ?> | ||||
</section> | ||||
</middle> | ||||
<!-- *****BACK MATTER ***** --> | </middle> | |||
<back> | <back> | |||
<!-- References split into informative and normative --> | ||||
<!-- There are 2 ways to insert reference entries from the citation libraries | <displayreference target="I-D.ietf-tcpm-rack" to="TCPRACK"/> | |||
: | ||||
1. define an ENTITY at the top, and use "ampersand character"RFC2629; here ( | ||||
as shown) | ||||
2. simply use a PI "less than character"?rfc include="reference.RFC.2119.xml | ||||
"?> here | ||||
(for I-Ds: include="reference.I-D.narten-iana-considerations-rfc2434bis.x | ||||
ml") | ||||
Both are cited textually in the same manner: by using xref elements. | <references> | |||
If you use the PI option, xml2rfc will, by default, try to find included fil | <name>References</name> | |||
es in the same | <references> | |||
directory as the including file. You can also define the XML_LIBRARY environ | <name>Normative References</name> | |||
ment variable | <xi:include | |||
with a value containing a set of directories to search. These can be either | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.00 | |||
in the local | 20.xml"/> | |||
filing system or remote ones accessed by http (http://domain/dir/... ).--> | <xi:include | |||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.07 | ||||
68.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.07 | ||||
93.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.10 | ||||
34.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.10 | ||||
35.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.11 | ||||
23.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
19.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
36.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.21 | ||||
81.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.27 | ||||
82.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.60 | ||||
66.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.63 | ||||
35.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.68 | ||||
95.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.76 | ||||
73.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.77 | ||||
66.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.78 | ||||
58.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.81 | ||||
74.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.83 | ||||
10.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.84 | ||||
46.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.84 | ||||
90.xml"/> | ||||
<references title="Normative References"> | <reference anchor="SRVTYPE" | |||
&RFC0020; | target="https://www.iana.org/assignments/service-names-port | |||
&RFC0768; | -numbers/"> | |||
&RFC0793; | <front> | |||
&RFC1034; | <title>Service Name and Transport Protocol Port Number | |||
&RFC1035; | Registry</title> | |||
&RFC1123; | <author><organization>IANA</organization></author> | |||
&RFC2119; | </front> | |||
&RFC2136; | </reference> | |||
&RFC2181; | ||||
&RFC2782; | ||||
&RFC6066; | ||||
<?rfc include="reference.RFC.6335" ?> | ||||
&RFC6895; | ||||
&RFC7673; | ||||
&RFC7766; | ||||
&RFC7858; | ||||
&RFC8174; | ||||
&RFC8310; | ||||
&RFC8446; | ||||
&RFC8490; | ||||
<reference anchor="SRVTYPE" | <reference anchor="DSOTYPE" | |||
target="http://www.iana.org/assignments/service-names-port-numbers/"> | target="https://www.iana.org/assignments/dns-parameters/"> | |||
<front> | <front> | |||
<title>Service Name and Transport Protocol Port Number Registry</title> | <title>Domain Name System (DNS) Parameters</title> | |||
<author/> | <author><organization>IANA</organization></author> | |||
<date/> | </front> | |||
</front> | </reference> | |||
</reference> | ||||
<reference anchor="DSOTYPE" | </references> | |||
target="https://www.iana.org/assignments/dns-parameters/"> | ||||
<front> | ||||
<title>DSO Type Code Registry</title> | ||||
<author/> | ||||
<date/> | ||||
</front> | ||||
</reference> | ||||
</references> | <references> | |||
<name>Informative References</name> | ||||
<!-- Use needLines to make sure "Authors' Addresses" line doesn't appear as the | <reference anchor='BCP195' target='https://www.rfc-editor.org/info/bcp195'> | |||
last line on the page --> | <front> | |||
<?rfc needLines="9" ?> | <title>Recommendations for Secure Use of Transport Layer Security (TLS) and Data | |||
gram Transport Layer Security (DTLS)</title> | ||||
<author initials='Y.' surname='Sheffer' fullname='Y. Sheffer'><organization /></ | ||||
author> | ||||
<author initials='R.' surname='Holz' fullname='R. Holz'><organization /></author | ||||
> | ||||
<author initials='P.' surname='Saint-Andre' fullname='P. Saint-Andre'><organizat | ||||
ion /></author> | ||||
<date year='2015' month='May' /> | ||||
</front> | ||||
<seriesInfo name='BCP' value='195'/> | ||||
<seriesInfo name='RFC' value='7525'/> | ||||
</reference> | ||||
<references title="Informative References"> | <xi:include | |||
<reference anchor="BCP195" target="http://www.rfc-editor.org/info/bcp195">< | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.23 | |||
front> | 08.xml"/> | |||
<title>Recommendations for Secure Use of Transport Layer Security (TL | <xi:include | |||
S) and Datagram Transport Layer Security (DTLS)</title> | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.31 | |||
<author initials="Y." surname="Sheffer" fullname="Yaron Sheffer"/> | 23.xml"/> | |||
<author initials="R." surname="Holz" fullname="Ralph Holz"/> | <xi:include | |||
<author initials="P." surname="Saint-Andre" fullname="Peter Saint-And | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.42 | |||
re"/> | 87.xml"/> | |||
<date year="2015" month="May"/> | <xi:include | |||
</front><seriesInfo name="BCP" value="195"/><seriesInfo name="RFC" valu | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.49 | |||
e="7525"/></reference> | 53.xml"/> | |||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.62 | ||||
81.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.67 | ||||
62.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.67 | ||||
63.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.68 | ||||
86.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.68 | ||||
87.xml"/> | ||||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.74 | ||||
13.xml"/> | ||||
&RFC2308; | <xi:include | |||
&RFC3123; | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.84 | |||
&RFC4287; | 99.xml"/> | |||
&RFC4953; | ||||
&RFC6281; | ||||
&RFC6762; | ||||
&RFC6763; | ||||
&RFC6824; | ||||
&RFC6886; | ||||
&RFC6887; | ||||
&RFC7413; | ||||
&RFC7719; | ||||
&RFC8010; | ||||
&RFC8011; | ||||
&RFC8499; | ||||
&I-D.ietf-tcpm-rack; | <xi:include | |||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.86 | ||||
84.xml"/> | ||||
<reference anchor='LLQ'> | <xi:include | |||
<front> | href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.80 | |||
<title>DNS Long-Lived Queries</title> | 10.xml"/> | |||
<xi:include | ||||
href="https://xml2rfc.ietf.org/public/rfc/bibxml/reference.RFC.80 | ||||
11.xml"/> | ||||
<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | <xi:include | |||
<organization /> | href="https://xml2rfc.tools.ietf.org/public/rfc/bibxml3/reference | |||
</author> | .I-D.ietf-tcpm-rack.xml"/> | |||
<author initials='M' surname='Krochmal' fullname='Marc Krochmal'> | <reference anchor='RFC8764' target="https://www.rfc-editor.org/info/rfc8764"> | |||
<organization /> | <front> | |||
</author> | <title>Apple's DNS Long-Lived Queries Protocol</title> | |||
<date month='March' day='4' year='2019' /> | <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | |||
<organization /> | ||||
</author> | ||||
<abstract><t>DNS Long-Lived Queries (LLQ) is a protocol for extending the DNS pr | <author initials='M' surname='Krochmal' fullname='Marc Krochmal'> | |||
otocol to support change notification, thus allowing clients to learn about chan | <organization /> | |||
ges to DNS data without polling the server. From 2007 onwards, LLQ was implemen | </author> | |||
ted in Apple products including Mac OS X, Bonjour for Windows, and AirPort wirel | ||||
ess base stations. In 2019, the LLQ protocol was superseded by the IETF Standar | ||||
ds Track RFC "DNS Push Notifications", which builds on experience gained with th | ||||
e LLQ protocol to create a superior replacement.</t></abstract> | ||||
</front> | <date month='June' year='2020' /> | |||
</front> | ||||
<seriesInfo name='Internet-Draft' value='draft-sekar-dns-llq-03' /> | <seriesInfo name='RFC' value='8764' /> | |||
<format type='TXT' | <seriesInfo name="DOI" value="10.17487/RFC8764"/> | |||
target='http://www.ietf.org/internet-drafts/draft-sekar-dns-llq-03.txt' | ||||
/> | ||||
</reference> | </reference> | |||
<reference anchor='DisProx'> | <reference anchor='RFC8766' target="https://www.rfc-editor.org/info/rfc8766"> | |||
<front> | <front> | |||
<title>Discovery Proxy for Multicast DNS-Based Service Discovery</title> | <title>Discovery Proxy for Multicast DNS-Based Service Discovery</title> | |||
<author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | <author initials='S' surname='Cheshire' fullname='Stuart Cheshire'> | |||
<organization /> | <organization /> | |||
</author> | </author> | |||
<date month='March' day='24' year='2019' /> | <date month='June' year='2020' /> | |||
<abstract><t>This document specifies a network proxy that uses Multicast DNS to | ||||
automatically populate the wide-area unicast Domain Name System namespace with r | ||||
ecords describing devices and services found on the local link.</t></abstract> | ||||
</front> | </front> | |||
<seriesInfo name='Internet-Draft' value='draft-ietf-dnssd-hybrid-10' /> | <seriesInfo name="RFC" value="8766"/> | |||
<format type='TXT' | <seriesInfo name="DOI" value="10.17487/RFC8766"/> | |||
target='http://www.ietf.org/internet-drafts/draft-ietf-dnssd-hybrid-10.t | ||||
xt' /> | ||||
</reference> | </reference> | |||
<reference anchor='SYN'> | <reference anchor="SYN" | |||
<front> | target="https://www.cisco.com/web/about/ac123/ac147/archive | |||
<title>Defenses Against TCP SYN Flooding Attacks</title> | d_issues/ipj_9-4/ipj_9-4.pdf"> | |||
<author initials='W.' surname='Eddy' fullname='Wesley Eddy'> | <front> | |||
<organization>Verizon Federal Network Systems</organization> | <title>Defenses Against TCP SYN Flooding Attacks</title> | |||
<address> | ||||
<email>weddy@grc.nasa.gov</email> | ||||
</address> | ||||
</author> | ||||
<date year='2006' month='December' /> | ||||
<keyword>TCP</keyword> | ||||
</front> | ||||
<seriesInfo name="The Internet Protocol Journal," value='Cisco Systems' / | ||||
> | ||||
<seriesInfo name='Volume' value='9' /> | ||||
<seriesInfo name='Number' value='4' /> | ||||
<format type='PDF' octets='882020' target="http://www.cisco.com/web/about | ||||
/ac123/ac147/archived_issues/ipj_9-4/ipj_9-4.pdf" /> | ||||
<format type='HTML' octets='65566' target="http://www.cisco.com/web/about | ||||
/ac123/ac147/archived_issues/ipj_9-4/syn_flooding_attacks.html" /> | ||||
</reference> | ||||
<reference anchor='obs' target="https://en.wikipedia.org/wiki/Observer_patt | <author initials="W." surname="Eddy" fullname="Wesley Eddy"> | |||
ern"> | <organization>Verizon Federal Network Systems</organization> | |||
<front> | <address> | |||
<title>Observer Pattern</title> | <email>weddy@grc.nasa.gov</email> | |||
<author/> | </address> | |||
<date/> | </author> | |||
</front> | <date year="2006" month="December"/> | |||
</reference> | <keyword>TCP</keyword> | |||
</front> | ||||
<refcontent>The Internet Protocol Journal</refcontent> | ||||
<refcontent>Cisco Systems</refcontent> | ||||
<refcontent>Volume 9</refcontent> | ||||
<refcontent>Number 4</refcontent> | ||||
</reference> | ||||
<reference anchor='SD-API' target="https://opensource.apple.com/source/mDNS | <reference anchor="OBS" | |||
Responder/mDNSResponder-878.70.2/mDNSShared/dns_sd.h.auto.html"> | target="https://en.wikipedia.org/w/index.php?title=Obser | |||
<front> | ver_pattern&oldid=939702131"> | |||
<title>dns_sd.h API</title> | <front> | |||
<author/> | <title>Observer pattern</title> | |||
<date/> | <author> | |||
</front> | <organization>Wikipedia | |||
</reference> | </organization> | |||
</author> | ||||
<date month="February" year="2020"/> | ||||
</front> | ||||
</reference> | ||||
<reference anchor="XEP0060"> | <reference anchor="SD-API" | |||
<front> | target="https://opensource.apple.com/source/mDNSResponder/m | |||
<title>Publish-Subscribe</title> | DNSResponder-878.70.2/mDNSShared/dns_sd.h.auto.html"> | |||
<author initials="P." surname="Millard" fullname="Peter Millard"> | <front> | |||
<organization/> | <title>dns_sd.h</title> | |||
<address> | <author> | |||
<email/> | <organization>Apple Inc. | |||
</address> | </organization> | |||
</author> | </author> | |||
<author initials="P." surname="Saint-Andre" fullname="Peter Saint-Andre | ||||
"> | ||||
<organization/> | ||||
<address> | ||||
<email>peter@andyet.net</email> | ||||
</address> | ||||
</author> | ||||
<author initials="R." surname="Meijer" fullname="Ralph Meijer"> | ||||
<organization/> | ||||
<address> | ||||
<email>ralphm@ik.nu</email> | ||||
</address> | ||||
</author> | ||||
<date day="01" month="July" year="2010"/> | ||||
</front> | ||||
<seriesInfo name="XSF XEP" value="0060"/> | ||||
<format type="HTML" target="http://xmpp.org/extensions/xep-0060.html"/> | ||||
</reference> | ||||
</references> | </front> | |||
</back> | </reference> | |||
<reference anchor="XEP0060" | ||||
target="https://xmpp.org/extensions/xep-0060.html"> | ||||
<front> | ||||
<title>Publish-Subscribe</title> | ||||
<author initials="P." surname="Millard" fullname="Peter Millard"> | ||||
<organization/> | ||||
<address> | ||||
<email/> | ||||
</address> | ||||
</author> | ||||
<author initials="P." surname="Saint-Andre" fullname="Peter | ||||
Saint-Andre"> | ||||
<organization/> | ||||
<address> | ||||
<email>peter@andyet.net</email> | ||||
</address> | ||||
</author> | ||||
<author initials="R." surname="Meijer" fullname="Ralph Meijer"> | ||||
<organization/> | ||||
<address> | ||||
<email>ralphm@ik.nu</email> | ||||
</address> | ||||
</author> | ||||
<date month="October" year="2019"/> | ||||
</front> | ||||
<refcontent>XSF XEP 0060 | ||||
</refcontent> | ||||
</reference> | ||||
</references> | ||||
</references> | ||||
<section anchor="Acknowledgments" numbered="false" toc="default"> | ||||
<name>Acknowledgments</name> | ||||
<t>The authors would like to thank <contact fullname="Kiren Sekar"/> and | ||||
<contact fullname="Marc Krochmal"/> for previous work completed in this | ||||
field.</t> | ||||
<t>This document has been improved due to comments from | ||||
<contact fullname="Ran Atkinson"/>, | ||||
<contact fullname="Tim Chown"/>, | ||||
<contact fullname="Sara Dickinson"/>, | ||||
<contact fullname="Mark Delany"/>, | ||||
<contact fullname="Ralph Droms"/>, | ||||
<contact fullname="Jan Komissar"/>, | ||||
<contact fullname="Eric Rescorla"/>, | ||||
<contact fullname="Michael Richardson"/>, | ||||
<contact fullname="David Schinazi"/>, | ||||
<contact fullname="Manju Shankar Rao"/>, | ||||
<contact fullname="Robert Sparks"/>, | ||||
<contact fullname="Markus Stenberg"/>, | ||||
<contact fullname="Andrew Sullivan"/>, | ||||
<contact fullname="Michael Sweet"/>, | ||||
<contact fullname="Dave Thaler"/>, | ||||
<contact fullname="Brian Trammell"/>, | ||||
<contact fullname="Bernie Volz"/>, | ||||
<contact fullname="Éric Vyncke"/>, | ||||
<contact fullname="Christopher Wood"/>, | ||||
<contact fullname="Liang Xia"/>, | ||||
and | ||||
<contact fullname="Soraia Zlatkovic"/>. | ||||
<contact fullname="Ted Lemon"/> provided clarifying text that was greatly | ||||
appreciated.</t> | ||||
</section> | ||||
</back> | ||||
</rfc> | </rfc> | |||
End of changes. 140 change blocks. | ||||
1842 lines changed or deleted | 1889 lines changed or added | |||
This html diff was produced by rfcdiff 1.45. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |