RFC 1996 PROPOSED STANDARD DNS · ZONE TRANSFER · REPLICATION

A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)

How a DNS primary server taps its secondaries on the shoulder the moment a zone changes.

On rfc-editor.org ↗
PUBLISHED
August 1996
AUTHORS
P. Vixie
STREAM
IETF
BUILDS ON
RFC 1035 — DNS Implementation
OPCODE
NOTIFY (4)
DEFAULT TRANSPORT
UDP, TCP if needed
SUGGESTED RETRY INTERVAL
60 seconds
SUGGESTED MAX RETRANSMISSIONS
5 (UDP)
ONLY DEFINED EVENT
SOA record changed
DOI
10.17487/RFC1996

RFC text

Contents
Original text · RFC Editor View on rfc-editor.org ↗
Network Working Group                                           P. Vixie
Request for Comments: 1996                                           ISC
Updates: 1035                                                August 1996
Category: Standards Track


    A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)

Status of this Memo

   This document specifies an Internet standards track protocol for the
   Internet community, and requests discussion and suggestions for
   improvements.  Please refer to the current edition of the "Internet
   Official Protocol Standards" (STD 1) for the standardization state
   and status of this protocol.  Distribution of this memo is unlimited.

Abstract

   This memo describes the NOTIFY opcode for DNS, by which a master
   server advises a set of slave servers that the master's data has been
   changed and that a query should be initiated to discover the new
   data.

1. Rationale and Scope

   1.1. Slow propagation of new and changed data in a DNS zone can be
   due to a zone's relatively long refresh times.  Longer refresh times
   are beneficial in that they reduce load on the master servers, but
   that benefit comes at the cost of long intervals of incoherence among
   authority servers whenever the zone is updated.

   1.2. The DNS NOTIFY transaction allows master servers to inform slave
   servers when the zone has changed -- an interrupt as opposed to poll
   model -- which it is hoped will reduce propagation delay while not
   unduly increasing the masters' load.  This specification only allows
   slaves to be notified of SOA RR changes, but the architechture of
   NOTIFY is intended to be extensible to other RR types.

   1.3. This document intentionally gives more definition to the roles
   of "Master," "Slave" and "Stealth" servers, their enumeration in NS
   RRs, and the SOA MNAME field.  In that sense, this document can be
   considered an addendum to [RFC1035].

2. Definitions and Invariants

   2.1. The following definitions are used in this document:

   Slave           an authoritative server which uses zone transfer to
                   retrieve the zone.  All slave servers are named in
                   the NS RRs for the zone.

   Master          any authoritative server configured to be the source
                   of zone transfer for one or more slave servers.

   Primary Master  master server at the root of the zone transfer
                   dependency graph.  The primary master is named in the
                   zone's SOA MNAME field and optionally by an NS RR.
                   There is by definition only one primary master server
                   per zone.

   Stealth         like a slave server except not listed in an NS RR for
                   the zone.  A stealth server, unless explicitly
                   configured to do otherwise, will set the AA bit in
                   responses and be capable of acting as a master.  A
                   stealth server will only be known by other servers if
                   they are given static configuration data indicating
                   its existence.

   Notify Set      set of servers to be notified of changes to some
                   zone.  Default is all servers named in the NS RRset,
                   except for any server also named in the SOA MNAME.
                   Some implementations will permit the name server
                   administrator to override this set or add elements to
                   it (such as, for example, stealth servers).

   2.2. The zone's servers must be organized into a dependency graph
   such that there is a primary master, and all other servers must use
   AXFR or IXFR either from the primary master or from some slave which
   is also a master.  No loops are permitted in the AXFR dependency
   graph.

3. NOTIFY Message

   3.1. When a master has updated one or more RRs in which slave servers
   may be interested, the master may send the changed RR's name, class,
   type, and optionally, new RDATA(s), to each known slave server using
   a best efforts protocol based on the NOTIFY opcode.

   3.2. NOTIFY uses the DNS Message Format, although it uses only a
   subset of the available fields.  Fields not otherwise described
   herein are to be filled with binary zero (0), and implementations
   must ignore all messages for which this is not the case.

   3.3. NOTIFY is similar to QUERY in that it has a request message with
   the header QR flag "clear" and a response message with QR "set".  The
   response message contains no useful information, but its reception by
   the master is an indication that the slave has received the NOTIFY
   and that the master can remove the slave from any retry queue for
   this NOTIFY event.

   3.4. The transport protocol used for a NOTIFY transaction will be UDP
   unless the master has reason to believe that TCP is necessary; for
   example, if a firewall has been installed between master and slave,
   and only TCP has been allowed; or, if the changed RR is too large to
   fit in a UDP/DNS datagram.

   3.5. If TCP is used, both master and slave must continue to offer
   name service during the transaction, even when the TCP transaction is
   not making progress.  The NOTIFY request is sent once, and a
   "timeout" is said to have occurred if no NOTIFY response is received
   within a reasonable interval.

   3.6. If UDP is used, a master periodically sends a NOTIFY request to
   a slave until either too many copies have been sent (a "timeout"), an
   ICMP message indicating that the port is unreachable, or until a
   NOTIFY response is received from the slave with a matching query ID,
   QNAME, IP source address, and UDP source port number.

   Note:
      The interval between transmissions, and the total number of
      retransmissions, should be operational parameters specifiable by
      the name server administrator, perhaps on a per-zone basis.
      Reasonable defaults are a 60 second interval (or timeout if
      using TCP), and a maximum of 5 retransmissions (for UDP).  It is
      considered reasonable to use additive or exponential backoff for
      the retry interval.

   3.7. A NOTIFY request has QDCOUNT>0, ANCOUNT>=0, AUCOUNT>=0,
   ADCOUNT>=0.  If ANCOUNT>0, then the answer section represents an
   unsecure hint at the new RRset for this <QNAME,QCLASS,QTYPE>.  A
   slave receiving such a hint is free to treat equivilence of this
   answer section with its local data as a "no further work needs to be
   done" indication.  If ANCOUNT=0, or ANCOUNT>0 and the answer section
   differs from the slave's local data, then the slave should query its
   known masters to retrieve the new data.

   3.8. In no case shall the answer section of a NOTIFY request be used
   to update a slave's local data, or to indicate that a zone transfer
   needs to be undertaken, or to change the slave's zone refresh timers.

   Only a "data present; data same" condition can lead a slave to act
   differently if ANCOUNT>0 than it would if ANCOUNT=0.

   3.9. This version of the NOTIFY specification makes no use of the
   authority or additional data sections, and so conforming
   implementations should set AUCOUNT=0 and ADCOUNT=0 when transmitting
   requests.  Since a future revision of this specification may define a
   backwards compatible use for either or both of these sections,
   current implementations must ignore these sections, but not the
   entire message, if AUCOUNT>0 and/or ADCOUNT>0.

   3.10. If a slave receives a NOTIFY request from a host that is not a
   known master for the zone containing the QNAME, it should ignore the
   request and produce an error message in its operations log.

   Note:
      This implies that slaves of a multihomed master must either know
      their master by the "closest" of the master's interface
      addresses, or must know all of the master's interface addresses.
      Otherwise, a valid NOTIFY request might come from an address
      that is not on the slave's state list of masters for the zone,
      which would be an error.

   3.11. The only defined NOTIFY event at this time is that the SOA RR
   has changed.  Upon completion of a NOTIFY transaction for QTYPE=SOA,
   the slave should behave as though the zone given in the QNAME had
   reached its REFRESH interval (see [RFC1035]), i.e., it should query
   its masters for the SOA of the zone given in the NOTIFY QNAME, and
   check the answer to see if the SOA SERIAL has been incremented since
   the last time the zone was fetched.  If so, a zone transfer (either
   AXFR or IXFR) should be initiated.

   Note:
      Because a deep server dependency graph may have multiple paths
      from the primary master to any given slave, it is possible that
      a slave will receive a NOTIFY from one of its known masters even
      though the rest of its known masters have not yet updated their
      copies of the zone.  Therefore, when issuing a QUERY for the
      zone's SOA, the query should be directed at the known master who
      was the source of the NOTIFY event, and not at any of the other
      known masters.  This represents a departure from [RFC1035],
      which specifies that upon expiry of the SOA REFRESH interval,
      all known masters should be queried in turn.

   3.12. If a NOTIFY request is received by a slave who does not
   implement the NOTIFY opcode, it will respond with a NOTIMP
   (unimplemented feature error) message.  A master server who receives
   such a NOTIMP should consider the NOTIFY transaction complete for
   that slave.

4. Details and Examples

   4.1. Retaining query state information across host reboots is
   optional, but it is reasonable to simply execute an SOA NOTIFY
   transaction on each authority zone when a server first starts.

   4.2. Each slave is likely to receive several copies of the same
   NOTIFY request:  One from the primary master, and one from each other
   slave as that slave transfers the new zone and notifies its potential
   peers.  The NOTIFY protocol supports this multiplicity by requiring
   that NOTIFY be sent by a slave/master only AFTER it has updated the
   SOA RR or has determined that no update is necessary, which in
   practice means after a successful zone transfer.  Thus, barring
   delivery reordering, the last NOTIFY any slave receives will be the
   one indicating the latest change.  Since a slave always requests SOAs
   and AXFR/IXFRs only from its known masters, it will have an
   opportunity to retry its QUERY for the SOA after each of its masters
   have completed each zone update.

   4.3. If a master server seeks to avoid causing a large number of
   simultaneous outbound zone transfers, it may delay for an arbitrary
   length of time before sending a NOTIFY message to any given slave.
   It is expected that the time will be chosen at random, so that each
   slave will begin its transfer at a unique time.  The delay shall not
   in any case be longer than the SOA REFRESH time.

   Note:
      This delay should be a parameter that each primary master name
      server can specify, perhaps on a per-zone basis.  Random delays
      of between 30 and 60 seconds would seem adequate if the servers
      share a LAN and the zones are of moderate size.

   4.4. A slave which receives a valid NOTIFY should defer action on any
   subsequent NOTIFY with the same <QNAME,QCLASS,QTYPE> until it has
   completed the transaction begun by the first NOTIFY.  This duplicate
   rejection is necessary to avoid having multiple notifications lead to
   pummeling the master server.

   4.5 Zone has Updated on Primary Master

   Primary master sends a NOTIFY request to all servers named in Notify
   Set.  The NOTIFY request has the following characteristics:

      query ID:   (new)
      op:         NOTIFY (4)
      resp:       NOERROR
      flags:      AA
      qcount:     1
      qname:      (zone name)
      qclass:     (zone class)
      qtype:      T_SOA

   4.6 Zone has Updated on a Slave that is also a Master

   As above in 4.5, except that this server's Notify Set may be
   different from the Primary Master's due to optional static
   specification of local stealth servers.

   4.7 Slave Receives a NOTIFY Request from a Master

   When a slave server receives a NOTIFY request from one of its locally
   designated masters for the zone enclosing the given QNAME, with
   QTYPE=SOA and QR=0, it should enter the state it would if the zone's
   refresh timer had expired.  It will also send a NOTIFY response back
   to the NOTIFY request's source, with the following characteristics:

      query ID:   (same)
      op:         NOTIFY (4)
      resp:       NOERROR
      flags:      QR AA
      qcount:     1
      qname:      (zone name)
      qclass:     (zone class)
      qtype:      T_SOA

   This is intended to be identical to the NOTIFY request, except that
   the QR bit is also set.  The query ID of the response must be the
   same as was received in the request.

   4.8 Master Receives a NOTIFY Response from Slave

   When a master server receives a NOTIFY response, it deletes this
   query from the retry queue, thus completing the "notification
   process" of "this" RRset change to "that" server.

5. Security Considerations

   We believe that the NOTIFY operation's only security considerations
   are:

   1. That a NOTIFY request with a forged IP/UDP source address can
      cause a slave to send spurious SOA queries to its masters,
      leading to a benign denial of service attack if the forged
      requests are sent very often.

   2. That TCP spoofing could be used against a slave server given
      NOTIFY as a means of synchronizing an SOA query and UDP/DNS
      spoofing as a means of forcing a zone transfer.

6. References

   [RFC1035]
      Mockapetris, P., "Domain Names - Implementation and
      Specification", STD 13, RFC 1035, November 1987.

   [IXFR]
      Ohta, M., "Incremental Zone Transfer", RFC 1995, August 1996.

7. Author's Address

   Paul Vixie
   Internet Software Consortium
   Star Route Box 159A
   Woodside, CA 94062

   Phone: +1 415 747 0204
   EMail: paul@vix.com

AI ELI5

On this page
PROBLEMSecondary DNS servers only learn about zone changes when their refresh timer expires, so long refresh times leave authority servers out of step for a long while after an update.
MECHANISMThe master sends a NOTIFY message (DNS opcode 4) for the zone's SOA record to each server in its notify set. A slave that receives it acts as if its refresh timer had just expired and asks its master for the SOA.
WHY IT MATTERSChanges propagate quickly without shortening refresh times. NOTIFY is a best-effort hint: it never carries data a slave is allowed to trust, and it is checked by an ordinary SOA query.

§1Rationale and Scope

A DNS zone is normally copied from a master server to slave servers by zone transfer. A slave decides when to check for changes using the refresh time in the zone's SOA record. Long refresh times reduce load on masters, but they also mean a changed zone can be out of step across its authority servers for a long interval.

RFC 1996 adds a NOTIFY transaction: an interrupt instead of a poll. The master tells the slaves that the zone has changed, which is hoped to cut propagation delay without unduly increasing the masters' load.

The scope is deliberately narrow. This specification only lets slaves be notified of SOA record changes, though the architecture is meant to be extensible to other record types. It also gives sharper definitions to the roles of master, slave and stealth server, and is described as an addendum to RFC 1035.

Checking for news on a slow timer is like looking at the mailbox once a day. NOTIFY is a doorbell that rings the moment something new arrives.

§2Server Roles and the Notify Set

The RFC defines a few roles. A slave is an authoritative server that uses zone transfer to get the zone, and every slave is named in the zone's NS records. A master is any authoritative server configured as the source of zone transfer for one or more slaves. The primary master sits at the root of the transfer dependency graph and is named in the SOA MNAME field; by definition there is only one per zone.

A stealth server is like a slave but is not listed in an NS record, so other servers know of it only through static configuration. The notify set is the group of servers to be told about a change. By default it is every server in the NS record set except any server also named in the SOA MNAME, and some implementations let an administrator override it or add servers such as stealth ones.

The servers must form a dependency graph with one primary master. Every other server transfers the zone by AXFR or IXFR from the primary master or from a slave that is also a master, and loops are not permitted.

One server holds the original copy of a recipe book and others keep photocopies. The notify set is the list of people who get a call when a new page is added.

§3The NOTIFY Message

NOTIFY reuses the standard DNS message format but uses only a subset of its fields. Fields not described are filled with binary zero, and implementations must ignore messages where they are not. Like a QUERY, a NOTIFY request has the QR flag clear and its response has QR set. The response carries no useful information; it only tells the master that the slave got the NOTIFY, so the master can drop the slave from its retry queue.

For the one defined event, an SOA change, the primary master sends a request with opcode NOTIFY (4), response code NOERROR, the AA flag, one question, and the zone name, class and type SOA in the question. The slave's response is identical except that the QR bit is also set, and the query ID must match the request.

A request has QDCOUNT greater than zero. The answer section may carry an unsecure hint of the new record set. A slave may treat a hint that equals its local data as meaning no more work is needed, but the answer section must never be used to update local data, to decide a transfer is needed, or to change refresh timers. This version makes no use of the authority and additional sections, so senders set their counts to 0 and receivers ignore those sections without discarding the whole message.

The note is just a short card saying which book changed. The person who gets it sends back a copy of the card to say it arrived, and they never just trust what is written on it.

§4How Masters and Slaves Behave

The transport is UDP unless the master has reason to believe TCP is needed, for example because a firewall allows only TCP or because the changed record is too large for a UDP datagram. Over UDP the master repeats the NOTIFY periodically until it gets a matching response, sees an ICMP port-unreachable, or sends too many copies. The response must match on query ID, QNAME, IP source address and UDP source port. The RFC suggests defaults of a 60 second interval and at most 5 retransmissions for UDP, and says additive or exponential backoff is reasonable. With TCP the request is sent once.

A slave ignores a NOTIFY from a host that is not a known master for the zone and logs an error. When it accepts one for QTYPE=SOA, it behaves as though the zone had reached its REFRESH interval: it queries the master that sent the NOTIFY for the SOA, checks whether the SOA SERIAL has increased, and starts a zone transfer (AXFR or IXFR) if so. It queries only the NOTIFY's source, because other masters may not have updated yet. A slave that does not implement NOTIFY replies NOTIMP, and the master then treats the transaction as complete for that slave.

Because a slave only notifies others after it has updated its own copy, a slave in a deep server graph may receive several NOTIFYs for the same change. It should defer a repeat NOTIFY for the same name, class and type until the first transaction finishes, so duplicates do not pummel the master.

When the doorbell rings, you go ask the person who rang whether the number on the newest page is bigger than the one you have. If it is, you copy the new pages.

A NOTIFY TRANSACTION OVER UDP (SECTIONS 3 AND 4)
MasterSlave
  1. NOTIFY request (SOA)Opcode 4, QR clear, AA set.
  2. NOTIFY responseSame ID, QR set; master stops retrying.
  3. Query for SOAChecks whether the SOA SERIAL has increased.
  4. AXFR or IXFRZone transfer if the serial is higher.

§5Details and Examples

Retaining query state across reboots is optional, but it is reasonable to run an SOA NOTIFY transaction for each authority zone when a server starts. Each slave is likely to get several copies of a NOTIFY: one from the primary master and one from each other slave that transfers the zone and then notifies its own peers. Since NOTIFY is sent only after a successful transfer or after finding no update is needed, the last NOTIFY a slave receives is, barring reordering, the one that reflects the latest change.

A master that wants to avoid many simultaneous outbound transfers may delay before notifying each slave, by a random time that must never exceed the SOA REFRESH time. The RFC suggests random delays of between 30 and 60 seconds as adequate for servers sharing a LAN with moderate-sized zones.

If everyone gets the doorbell at the same instant, they all rush the photocopier. So the owner sometimes waits a random few seconds before ringing each person.

§6Security Considerations

The authors list two security concerns. First, a NOTIFY with a forged IP and UDP source address can make a slave send spurious SOA queries to its masters, which is a benign denial of service if the forged requests are sent very often.

Second, TCP spoofing could be used against a slave given NOTIFY as a way of synchronizing an SOA query, combined with UDP/DNS spoofing to force a zone transfer. Separately, a slave ignores a NOTIFY from a host that is not a known master for the zone, and the answer section of a NOTIFY is never used to update local data.

Someone could ring your doorbell with a fake name, and you would waste time checking. That is why you only trust the real newest page, never the note itself.

§7References