<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE rfc [
  <!ENTITY nbsp    "&#160;">
  <!ENTITY zwsp   "&#8203;">
  <!ENTITY nbhy   "&#8209;">
  <!ENTITY wj     "&#8288;">
]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc version 1.7.43 (Ruby 3.4.9) -->
<rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" docName="draft-gakiwate-dnsop-optimistic-dns-01" category="std" consensus="true" submissionType="IETF" tocInclude="true" sortRefs="true" symRefs="true" version="3">
  <!-- xml2rfc v2v3 conversion 3.34.1 -->
  <front>
    <title abbrev="Optimistic DNS">Optimistic DNS</title>
    <seriesInfo name="Internet-Draft" value="draft-gakiwate-dnsop-optimistic-dns-01"/>
    <author initials="G." surname="Akiwate" fullname="Gautam Akiwate">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino</city>
          <region>CA</region>
          <code>95014</code>
          <country>USA</country>
        </postal>
        <email>gakiwate@apple.com</email>
      </address>
    </author>
    <author initials="P." surname="Flack" fullname="Phil Flack">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino</city>
          <region>CA</region>
          <code>95014</code>
          <country>USA</country>
        </postal>
        <email>pf-ietf@flacko.com</email>
      </address>
    </author>
    <author initials="S." surname="Cheshire" fullname="Stuart Cheshire">
      <organization>Apple Inc.</organization>
      <address>
        <postal>
          <street>One Apple Park Way</street>
          <city>Cupertino</city>
          <region>CA</region>
          <code>95014</code>
          <country>USA</country>
        </postal>
        <email>cheshire@apple.com</email>
      </address>
    </author>
    <date year="2026" month="November" day="02"/>
    <area>Operations and Management</area>
    <workgroup>Domain Name System Operations</workgroup>
    <keyword>DNS, caching, stub resolver, latency, delay</keyword>
    <abstract>
      <?line 124?>

<t>DNS lookups introduce user-visible delay, particularly when cached records
have expired and must be refreshed from the network.  This document describes
Optimistic DNS, a client-side stub resolver mechanism that immediately returns
expired cached DNS records to applications while simultaneously refreshing them
with a network query.  The application receives an answer in microseconds rather
than milliseconds, and if the data has changed receives an updated answer
shortly thereafter.  Optimistic DNS is complementary to RFC 8767, which
addresses serving stale data at recursive resolvers.  This document focuses
exclusively on client-side stub resolver behavior, including explicit signaling
from the application to inform the stub resolver that the application
is able to handle old and possibly incorrect information.</t>
    </abstract>
    <note removeInRFC="true">
      <name>About This Document</name>
      <t>
        The latest revision of this draft can be found at <eref target="https://gakiwate.github.io/draft-gakiwate-dnsop-optimistic-dns/draft-gakiwate-dnsop-optimistic-dns.html"/>.
        Status information for this document may be found at <eref target="https://datatracker.ietf.org/doc/draft-gakiwate-dnsop-optimistic-dns/"/>.
      </t>
      <t>
        Discussion of this document takes place on the
        Domain Name System Operations Working Group mailing list (<eref target="mailto:dnsop@ietf.org"/>),
        which is archived at <eref target="https://mailarchive.ietf.org/arch/browse/dnsop/"/>.
        Subscribe at <eref target="https://www.ietf.org/mailman/listinfo/dnsop/"/>.
      </t>
      <t>Source for this draft and an issue tracker can be found at
        <eref target="https://github.com/gakiwate/draft-gakiwate-dnsop-optimistic-dns"/>.</t>
    </note>
  </front>
  <middle>
    <?line 138?>

<section anchor="introduction">
      <name>Introduction</name>
      <t>In the early days of the Internet, computers and network connections
were much slower than they are now.
Delays of a few tens or hundreds of milliseconds used to be
insignificant compared to the overall time taken to load a web page.
Today, increases in computing power and network throughput
have dramatically reduced previous major causes of slowness.
To continue progress on improving user experience,
we need to identify and reduce the remaining sources of delay, which
-- as other aspects of computer and network performance improve --
now constitute a larger proportion of the overall web page load time.
Computer processing speed and network throughput continue to increase,
but the speed of light isn’t changing.</t>
      <t>When a user views a website, the first step
is typically a DNS lookup to translate the hostname into an IP address.  If
the device's DNS cache contains a record for that hostname, the answer is
returned almost instantly and the user perceives no delay.  But if the
record's TTL has expired by even a single second, the device must perform
a fresh DNS lookup.  On a wired connection this might take 50 to 200
milliseconds.  On a cellular connection, particularly at the edge of
coverage, it can take several seconds.</t>
      <t>The user experiences this as a brief but noticeable pause.  The website
appears to hang.  The user wonders if something is wrong.  And in most
cases, the expired record still contained the correct IP address and the
website has not moved to a different server.  The user waited for
confirmation of something the device already knew.</t>
      <t>Consider a record for www.example.com with a TTL of 60 seconds.  At time
T=0 the record is fetched and cached.  For the next 60 seconds, any
application that asks for www.example.com gets an instant answer.  At time T=61,
the record has expired.  The very next lookup must go to the network.  From the
user's perspective, the transition from "instant" to "slow" is a sudden large spike.
The record was valid for 60 seconds, giving cached results in microseconds,
then invalid for the fraction of a second it took to refresh it,
resulting in a delay of tens or hundreds of milliseconds,
then valid again, with the delay returning to microseconds.
Yet that intermittent slowness will be the experience that the user notices
when the rest of their web browsing is usually consistently fast.</t>
      <t>This document describes Optimistic DNS, a stub resolver mechanism that addresses
this problem.  When the stub resolver has expired cached records that match a
query, it returns those expired records to the application immediately while
simultaneously issuing a fresh network query in the background.
The application first receives the expired (but likely still correct) records,
and then shortly afterwards, the authoritative fresh records, if different.
Using the (expired, but probably correct) address from the cache,
the networking library code that the application is using will start connecting.
While connecting, the networking library code <bcp14>MUST</bcp14> continue to pay attention
to asynchronous notifications of new addresses as they are learned,
and the networking library code <bcp14>MUST</bcp14> react gracefully if,
occasionally, some of the candidate addresses do, in fact,
prove to be stale and incorrect (<xref target="enabling-technologies"/>).</t>
      <t>The following diagram illustrates the timing difference between
conventional DNS resolution and Optimistic DNS:</t>
      <t><strong>Conventional DNS (after cache expiry):</strong></t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="304" width="456" viewBox="0 0 456 304" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,288" fill="none" stroke="black"/>
            <path d="M 72,80 L 72,256" fill="none" stroke="black"/>
            <path d="M 240,80 L 240,144" fill="none" stroke="black"/>
            <path d="M 240,176 L 240,256" fill="none" stroke="black"/>
            <path d="M 408,80 L 408,256" fill="none" stroke="black"/>
            <path d="M 448,32 L 448,288" fill="none" stroke="black"/>
            <path d="M 8,32 L 448,32" fill="none" stroke="black"/>
            <path d="M 80,96 L 96,96" fill="none" stroke="black"/>
            <path d="M 160,96 L 232,96" fill="none" stroke="black"/>
            <path d="M 248,128 L 264,128" fill="none" stroke="black"/>
            <path d="M 328,128 L 400,128" fill="none" stroke="black"/>
            <path d="M 248,192 L 264,192" fill="none" stroke="black"/>
            <path d="M 352,192 L 400,192" fill="none" stroke="black"/>
            <path d="M 80,224 L 96,224" fill="none" stroke="black"/>
            <path d="M 216,224 L 232,224" fill="none" stroke="black"/>
            <path d="M 8,288 L 448,288" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
            <polygon class="arrowhead" points="256,192 244,186.4 244,197.6" fill="black" transform="rotate(180,248,192)"/>
            <polygon class="arrowhead" points="240,96 228,90.4 228,101.6" fill="black" transform="rotate(0,232,96)"/>
            <polygon class="arrowhead" points="88,224 76,218.4 76,229.6" fill="black" transform="rotate(180,80,224)"/>
            <g class="text">
              <text x="80" y="68">Application</text>
              <text x="204" y="68">Stub</text>
              <text x="260" y="68">Resolver</text>
              <text x="368" y="68">DNS</text>
              <text x="412" y="68">Server</text>
              <text x="128" y="100">Query</text>
              <text x="296" y="132">Query</text>
              <text x="188" y="164">(waiting</text>
              <text x="240" y="164">for</text>
              <text x="292" y="164">network)</text>
              <text x="308" y="196">Response</text>
              <text x="128" y="228">Fresh</text>
              <text x="180" y="228">Answer</text>
              <text x="128" y="244">(150ms+</text>
              <text x="188" y="244">delay)</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------+
|                                                      |
|   Application        Stub Resolver        DNS Server |
|       |                    |                    |    |
|       |--- Query --------->|                    |    |
|       |                    |                    |    |
|       |                    |--- Query --------->|    |
|       |                    |                    |    |
|       |          (waiting for network)          |    |
|       |                    |                    |    |
|       |                    |<-- Response -------|    |
|       |                    |                    |    |
|       |<-- Fresh Answer ---|                    |    |
|       |   (150ms+ delay)   |                    |    |
|       |                    |                    |    |
|                                                      |
+------------------------------------------------------+
]]></artwork>
      </artset>
      <t><strong>Optimistic DNS (after cache expiry):</strong></t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="320" width="456" viewBox="0 0 456 320" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,304" fill="none" stroke="black"/>
            <path d="M 72,80 L 72,272" fill="none" stroke="black"/>
            <path d="M 240,80 L 240,272" fill="none" stroke="black"/>
            <path d="M 408,80 L 408,272" fill="none" stroke="black"/>
            <path d="M 448,32 L 448,304" fill="none" stroke="black"/>
            <path d="M 8,32 L 448,32" fill="none" stroke="black"/>
            <path d="M 80,96 L 96,96" fill="none" stroke="black"/>
            <path d="M 160,96 L 232,96" fill="none" stroke="black"/>
            <path d="M 80,128 L 96,128" fill="none" stroke="black"/>
            <path d="M 216,128 L 232,128" fill="none" stroke="black"/>
            <path d="M 248,128 L 264,128" fill="none" stroke="black"/>
            <path d="M 328,128 L 400,128" fill="none" stroke="black"/>
            <path d="M 248,208 L 264,208" fill="none" stroke="black"/>
            <path d="M 352,208 L 400,208" fill="none" stroke="black"/>
            <path d="M 80,240 L 96,240" fill="none" stroke="black"/>
            <path d="M 216,240 L 232,240" fill="none" stroke="black"/>
            <path d="M 8,304 L 448,304" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="408,128 396,122.4 396,133.6" fill="black" transform="rotate(0,400,128)"/>
            <polygon class="arrowhead" points="256,208 244,202.4 244,213.6" fill="black" transform="rotate(180,248,208)"/>
            <polygon class="arrowhead" points="240,96 228,90.4 228,101.6" fill="black" transform="rotate(0,232,96)"/>
            <polygon class="arrowhead" points="88,240 76,234.4 76,245.6" fill="black" transform="rotate(180,80,240)"/>
            <polygon class="arrowhead" points="88,128 76,122.4 76,133.6" fill="black" transform="rotate(180,80,128)"/>
            <g class="text">
              <text x="80" y="68">Application</text>
              <text x="204" y="68">Stub</text>
              <text x="260" y="68">Resolver</text>
              <text x="368" y="68">DNS</text>
              <text x="412" y="68">Server</text>
              <text x="128" y="100">Query</text>
              <text x="128" y="132">Expired</text>
              <text x="188" y="132">Answer</text>
              <text x="296" y="132">Query</text>
              <text x="120" y="148">(~0ms</text>
              <text x="172" y="148">delay)</text>
              <text x="108" y="180">(app</text>
              <text x="144" y="180">can</text>
              <text x="184" y="180">start</text>
              <text x="132" y="196">connecting</text>
              <text x="196" y="196">now)</text>
              <text x="308" y="212">Response</text>
              <text x="128" y="244">Fresh</text>
              <text x="180" y="244">Answer</text>
              <text x="120" y="260">(if</text>
              <text x="172" y="260">changed)</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+------------------------------------------------------+
|                                                      |
|   Application        Stub Resolver        DNS Server |
|       |                    |                    |    |
|       |--- Query --------->|                    |    |
|       |                    |                    |    |
|       |<--Expired Answer---|--- Query --------->|    |
|       |   (~0ms delay)     |                    |    |
|       |                    |                    |    |
|       |  (app can start    |                    |    |
|       |  connecting now)   |                    |    |
|       |                    |<-- Response -------|    |
|       |                    |                    |    |
|       |<-- Fresh Answer ---|                    |    |
|       |    (if changed)    |                    |    |
|       |                    |                    |    |
|                                                      |
+------------------------------------------------------+
]]></artwork>
      </artset>
      <t>Optimistic DNS is complementary to Serving Stale Data to Improve DNS
Resiliency <xref target="RFC8767"/>, which allows recursive resolvers to serve stale data
during upstream failures. The two mechanisms differ in their focus.
As reflected in the document title, the specification for serving stale
data from recursive resolvers was focused on improving resiliency
in situations where the authoritative servers are down or unreachable.
Optimistic DNS is focused on enhancements to the stub resolver
on the end-user's device, to reduce delays even in cases
where the authoritative servers are functioning perfectly well.
Both can be deployed simultaneously for layered staleness tolerance.</t>
      <t>This document describes only the client-side behavior.  Optimistic DNS does
not define any new DNS wire-protocol messages, opcodes, or EDNS options.
The signaling between the stub resolver and the application is purely a
local API matter.</t>
    </section>
    <section anchor="conventions-and-definitions">
      <name>Conventions and Definitions</name>
      <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUIRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL
NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>",
"<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
      <?line -18?>

<dl>
        <dt><em>Stub Resolver.</em></dt>
        <dd>
          <t>A DNS resolver that operates on the end-user device.  It maintains a
local cache of DNS records and forwards queries to configured recursive
resolvers when cached answers are unavailable or expired.  This is the
component that implements Optimistic DNS.</t>
        </dd>
        <dt><em>Expired Record.</em></dt>
        <dd>
          <t>A cached DNS record whose TTL has reached zero.  Under conventional DNS
caching rules, such a record would be purged from the cache or ignored
when answering queries.</t>
        </dd>
        <dt><em>Optimistic Answer.</em></dt>
        <dd>
          <t>An expired cached record that is returned to an application in response
to a query, before the stub resolver has confirmed whether the record's
data is still current.</t>
        </dd>
        <dt><em>Fresh Answer.</em></dt>
        <dd>
          <t>A DNS record received from the network in response to a query, as
opposed to a record served from the local cache.
Fresh answers reflect the data known by the upstream recursive
resolver, which may be more recent than the data in the local cache.</t>
        </dd>
        <dt><em>Asynchronous DNS Resolution.</em></dt>
        <dd>
          <t>A DNS resolution model where the application initiates a query and
receives results through callbacks or event notifications as they
become available, rather than blocking until a single atomic set
of answers is returned all at once (<xref target="async"/>).</t>
        </dd>
        <dt><em>Happy Eyeballs.</em></dt>
        <dd>
          <t>A client-side connection establishment algorithm
<xref target="IETF72"/> <xref target="RFC6555"/> <xref target="RFC8305"/> <xref target="HEv3"/>
that races connection attempts across multiple addresses and
address families, using whichever connection succeeds first
(<xref target="happy-eyeballs"/>).</t>
        </dd>
      </dl>
    </section>
    <section anchor="problem-statement">
      <name>Problem Statement</name>
      <t>The DNS TTL mechanism creates an inherent tension between freshness and
performance.  When a record is cached and its TTL has not expired, lookups
are essentially free and the answer is returned from local memory in
microseconds.  The moment the TTL expires, the cost jumps to a full
network round trip. This is not a graceful degradation.  It is a dramatic spike.</t>
      <t>This problem is compounded by several factors:</t>
      <dl>
        <dt><em>Short TTLs.</em></dt>
        <dd>
          <t>Many content delivery networks and cloud services use TTLs of 60 seconds
or less to facilitate rapid failover and load balancing.  Short TTLs mean
more frequent cache expiration events, which means users hit the delay
spike more often.</t>
        </dd>
        <dt><em>High-latency networks.</em></dt>
        <dd>
          <t>On cellular networks, satellite links, or congested Wi-Fi, a DNS round
trip can take one to five seconds.  The penalty for a cache miss is
severe.</t>
        </dd>
        <dt><em>Multiple queries per page load.</em></dt>
        <dd>
          <t>A typical web page load involves DNS queries for dozens of hostnames (the
page itself, stylesheets, scripts, images, analytics, ads).
Often these DNS queries cannot be issued concurrently because
some of the hostnames are not known until earlier transactions complete.
For example, the hostnames for stylesheets and images are not known
until after the base HTML document is fetched.
If multiple hostnames have expired address records,
the cumulative delay can be substantial.</t>
        </dd>
        <dt><em>First query after sleep.</em></dt>
        <dd>
          <t>While a computer or smartphone is sleeping,
normal wall-clock time continues to elapse,
and by the time the device awakes,
many cached records may have expired.
Optimistic DNS avoids the delay penalty when a device is
used after sleep or any other extended period of inactivity.</t>
        </dd>
      </dl>
      <t>The fundamental observation behind Optimistic DNS is that in most cases, a
DNS record that expired a little while ago usually still contains the correct data.
Servers do not typically change IP addresses the instant a TTL expires.
The TTL is a freshness hint, not a correctness deadline.  It marks when
the resolver decides to refresh, not when the data becomes incorrect.</t>
      <t>The "stale" state is also relative.  A user querying the same record at
two different resolvers can see entirely different views of staleness.
The diagram below illustrates this: both Recursive A and Recursive B
cached A1 before the authoritative server replaced it with A2 at T=90.
But because each resolver started its TTL clock at a different moment,
they present a different view to their clients.
A client querying Recursive A at time T=80 will cause a DNS
request to the authoritative DNS server to retrieve fresh data.
A client querying Recursive B twenty seconds later at time T=100
will receive cached data because Recursive B considers it still valid.</t>
      <artset>
        <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="624" width="536" viewBox="0 0 536 624" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
            <path d="M 8,32 L 8,608" fill="none" stroke="black"/>
            <path d="M 96,240 L 96,272" fill="none" stroke="black"/>
            <path d="M 208,416 L 208,448" fill="none" stroke="black"/>
            <path d="M 312,240 L 312,272" fill="none" stroke="black"/>
            <path d="M 344,288 L 344,320" fill="none" stroke="black"/>
            <path d="M 376,144 L 376,160" fill="none" stroke="black"/>
            <path d="M 400,472 L 400,512" fill="none" stroke="black"/>
            <path d="M 424,416 L 424,448" fill="none" stroke="black"/>
            <path d="M 528,32 L 528,608" fill="none" stroke="black"/>
            <path d="M 8,32 L 528,32" fill="none" stroke="black"/>
            <path d="M 56,80 L 72,80" fill="none" stroke="black"/>
            <path d="M 112,80 L 128,80" fill="none" stroke="black"/>
            <path d="M 168,80 L 184,80" fill="none" stroke="black"/>
            <path d="M 224,80 L 240,80" fill="none" stroke="black"/>
            <path d="M 280,80 L 296,80" fill="none" stroke="black"/>
            <path d="M 336,80 L 352,80" fill="none" stroke="black"/>
            <path d="M 392,80 L 408,80" fill="none" stroke="black"/>
            <path d="M 456,80 L 472,80" fill="none" stroke="black"/>
            <path d="M 32,128 L 184,128" fill="none" stroke="black"/>
            <path d="M 224,128 L 368,128" fill="none" stroke="black"/>
            <path d="M 384,128 L 416,128" fill="none" stroke="black"/>
            <path d="M 456,128 L 488,128" fill="none" stroke="black"/>
            <path d="M 96,240 L 312,240" fill="none" stroke="black"/>
            <path d="M 96,272 L 312,272" fill="none" stroke="black"/>
            <path d="M 112,288 L 128,288" fill="none" stroke="black"/>
            <path d="M 168,288 L 184,288" fill="none" stroke="black"/>
            <path d="M 224,288 L 240,288" fill="none" stroke="black"/>
            <path d="M 280,288 L 296,288" fill="none" stroke="black"/>
            <path d="M 208,416 L 424,416" fill="none" stroke="black"/>
            <path d="M 208,448 L 424,448" fill="none" stroke="black"/>
            <path d="M 224,464 L 240,464" fill="none" stroke="black"/>
            <path d="M 280,464 L 296,464" fill="none" stroke="black"/>
            <path d="M 336,464 L 352,464" fill="none" stroke="black"/>
            <path d="M 392,464 L 408,464" fill="none" stroke="black"/>
            <path d="M 8,608 L 528,608" fill="none" stroke="black"/>
            <polygon class="arrowhead" points="408,512 396,506.4 396,517.6" fill="black" transform="rotate(90,400,512)"/>
            <polygon class="arrowhead" points="384,144 372,138.4 372,149.6" fill="black" transform="rotate(270,376,144)"/>
            <polygon class="arrowhead" points="352,320 340,314.4 340,325.6" fill="black" transform="rotate(90,344,320)"/>
            <g class="text">
              <text x="48" y="68">Time:</text>
              <text x="40" y="84">0</text>
              <text x="92" y="84">15</text>
              <text x="148" y="84">30</text>
              <text x="204" y="84">45</text>
              <text x="260" y="84">60</text>
              <text x="316" y="84">75</text>
              <text x="372" y="84">90</text>
              <text x="432" y="84">105</text>
              <text x="496" y="84">120</text>
              <text x="80" y="116">Authoritative</text>
              <text x="184" y="116">Nameserver:</text>
              <text x="204" y="132">A1</text>
              <text x="376" y="132">|</text>
              <text x="436" y="132">A2</text>
              <text x="320" y="180">Authoritative</text>
              <text x="404" y="180">Answer</text>
              <text x="464" y="180">Changes</text>
              <text x="276" y="196">At</text>
              <text x="308" y="196">T=90</text>
              <text x="340" y="196">A1</text>
              <text x="364" y="196">is</text>
              <text x="412" y="196">replaced</text>
              <text x="460" y="196">by</text>
              <text x="484" y="196">A2</text>
              <text x="64" y="228">Recursive</text>
              <text x="112" y="228">A</text>
              <text x="152" y="228">queries</text>
              <text x="196" y="228">at</text>
              <text x="232" y="228">T=15:</text>
              <text x="156" y="260">Cached</text>
              <text x="196" y="260">A1</text>
              <text x="244" y="260">(TTL=60)</text>
              <text x="92" y="292">15</text>
              <text x="148" y="292">30</text>
              <text x="204" y="292">45</text>
              <text x="260" y="292">60</text>
              <text x="316" y="292">75</text>
              <text x="276" y="340">Client</text>
              <text x="312" y="340">1</text>
              <text x="352" y="340">queries</text>
              <text x="396" y="340">at</text>
              <text x="428" y="340">T=80</text>
              <text x="300" y="356">A1</text>
              <text x="328" y="356">TTL</text>
              <text x="376" y="356">expired</text>
              <text x="320" y="372">New</text>
              <text x="360" y="372">Query</text>
              <text x="64" y="404">Recursive</text>
              <text x="112" y="404">B</text>
              <text x="152" y="404">queries</text>
              <text x="196" y="404">at</text>
              <text x="232" y="404">T=45:</text>
              <text x="268" y="436">Cached</text>
              <text x="308" y="436">A1</text>
              <text x="356" y="436">(TTL=60)</text>
              <text x="204" y="468">45</text>
              <text x="260" y="468">60</text>
              <text x="316" y="468">75</text>
              <text x="372" y="468">90</text>
              <text x="432" y="468">105</text>
              <text x="332" y="532">Client</text>
              <text x="368" y="532">2</text>
              <text x="408" y="532">queries</text>
              <text x="452" y="532">at</text>
              <text x="488" y="532">T=100</text>
              <text x="348" y="548">A1</text>
              <text x="376" y="548">TTL</text>
              <text x="416" y="548">still</text>
              <text x="464" y="548">valid</text>
              <text x="368" y="564">Returns</text>
              <text x="428" y="564">cached</text>
              <text x="468" y="564">A1</text>
              <text x="364" y="580">(now</text>
              <text x="432" y="580">incorrect).</text>
            </g>
          </svg>
        </artwork>
        <artwork type="ascii-art"><![CDATA[
+----------------------------------------------------------------+
|                                                                |
|  Time:                                                         |
|   0 --- 15 --- 30 --- 45 --- 60 --- 75 --- 90 --- 105 --- 120  |
|                                                                |
|  Authoritative Nameserver:                                     |
|  -------------------- A1 -------------------|----- A2 -----    |
|                                             ^                  |
|                                             |                  |
|                                Authoritative Answer Changes    |
|                                At T=90 A1 is replaced by A2    |
|                                                                |
|  Recursive A queries at T=15:                                  |
|          +--------------------------+                          |
|          |    Cached A1 (TTL=60)    |                          |
|          +--------------------------+                          |
|         15 --- 30 --- 45 --- 60 --- 75  |                      |
|                                         |                      |
|                                         v                      |
|                              Client 1 queries at T=80          |
|                                   A1 TTL expired               |
|                                     New Query                  |
|                                                                |
|  Recursive B queries at T=45:                                  |
|                        +--------------------------+            |
|                        |    Cached A1 (TTL=60)    |            |
|                        +--------------------------+            |
|                       45 --- 60 --- 75 --- 90 --- 105          |
|                                                |               |
|                                                |               |
|                                                v               |
|                                     Client 2 queries at T=100  |
|                                         A1 TTL still valid     |
|                                         Returns cached A1      |
|                                          (now incorrect).      |
|                                                                |
+----------------------------------------------------------------+
]]></artwork>
      </artset>
      <t>Client 1 issued a query at time T=80 and suffered a delay waiting
for “fresh” data, even though, at that time,
the data on the authoritative nameserver had not yet changed.
In this case, using the expired cached data would have been fine,
because it was still correct.</t>
      <t>Client 2 issued a query twenty seconds later at time T=100,
yet Recursive B happily sent it cached data that was no longer correct.</t>
      <t>If the data was already considered “expired” at time T=80, it might be
natural to think that 20 seconds later it should be even more expired,
yet Client 2 received the opposite behavior.
Statistically, averaged over a large set of queries, records
that are older relative to their published TTL are more
likely to be considered expired, but for a specific
individual query the results are much less deterministic.</t>
      <t>Thus, clients should not attach too much importance to the
absolute value of a record’s age relative to its declared TTL.
The age of a record is a valuable hint as to whether it should
be assumed to be still valid, but it is not a guarantee.
Data being younger than its TTL is not a guarantee that it is still correct,
and data being older than its TTL is not a guarantee that it is wrong.</t>
      <t>The asynchronous connection-racing mechanism known as Happy Eyeballs
<xref target="IETF72"/> <xref target="RFC6555"/> <xref target="RFC8305"/> <xref target="HEv3"/>
is a key technology that makes Optimistic DNS useful,
because it makes applications more robust in occasional
situations where they may briefly receive incorrect information
(<xref target="happy-eyeballs"/>).</t>
    </section>
    <section anchor="zeno">
      <name>The Preemptive Refresh Problem - Zeno’s Paradox</name>
      <t>One seemingly attractive approach to avoiding the delay spike
might be to take inspiration from DHCP <xref target="RFC2131"/> <xref target="RFC2132"/>,
and renew a record before it expires, instead of waiting until
after it is already expired before requesting an update.
DHCP typically renews an address lease when half of the lease
lifetime has elapsed, rather than waiting for the lease
to expire and then briefly losing the right to use that
IP address while a new request is processed.</t>
      <t>Unfortunately, because of the way DNS operates, the DHCP-inspired approach
of refreshing records in advance of their expiration does not work.</t>
      <t>Suppose a DNS stub resolver makes a request for a name
that is not currently in the recursive resolver’s cache.
Suppose that when the recursive resolver fetches the authoritative
record it has a TTL of 24 hours, which it returns to the stub resolver.</t>
      <t>If the stub resolver were to request the same record 12 hours later,
the recursive resolver will tell the stub resolver that the record
has a remaining TTL of 12 hours.</t>
      <t>If the stub resolver were to request the same record 6 hours after that,
the recursive resolver will tell the stub resolver that the record now
has a remaining TTL of 6 hours.</t>
      <t>Using this algorithm would result in an ever-accelerating query rate
as the remaining TTL continues to count down towards zero,
without the stub resolver learning anything new.</t>
      <t>Eventually, the record finally expires from the recursive resolver’s
cache, and the stub resolver then suffers a delay spike waiting
for the recursive resolver to fetch the authoritative record.</t>
      <t>Currently, recursive resolvers will continue to return a cached record
down to the last second of its lifetime. Even for a record that is the
subject of a large volume of queries, recursive resolvers will not take
the initiative of refreshing that record prior to its inevitable and
entirely predictable expiration. Instead, recursive resolvers will let
the record expire, and then suffer a delay spike on the very next query.</t>
      <t>With the current behavior of recursive resolvers, strictly
respecting a record’s TTL and avoiding predictable delay
spikes are incompatible goals. It is impossible to do both.</t>
    </section>
    <section anchor="enabling-technologies">
      <name>Enabling Technologies</name>
      <t>When an application receives an expired address and immediately begins
connecting to it, two things need to happen:</t>
      <ul spacing="normal">
        <li>
          <t>When the fresh answer arrives moments later, the application
needs a way to receive it -- which means the DNS API has to
support delivering asynchronous results as they arrive.</t>
        </li>
        <li>
          <t>If the expired address is found to be wrong,
the application needs to continue gracefully.</t>
        </li>
      </ul>
      <section anchor="async">
        <name>Asynchronous DNS Resolution</name>
        <t>Traditional synchronous DNS APIs typically block until the complete set of answers
is available.  The caller issues a query, waits, receives one set of results, and
the call is complete.  Optimistic DNS cannot function with this model since
there is no mechanism to deliver an expired answer now and
update it with newer answers shortly afterwards.</t>
        <t>Asynchronous DNS APIs support receiving multiple answers over time,
including updated answers that supersede earlier ones.
The operational model of asynchronous DNS resolution is
that it is a performance optimization over rapid polling.
If an application were to call an API like getaddrinfo()
as fast as it can in a tight loop, then the application
would always have the latest information available from the local
stub resolver, but it would be inefficient and wasteful of CPU time.
Most consecutive calls to getaddrinfo() would return unchanged information.
The guiding principle of an asynchronous DNS resolution API is
that it gives the application the exact same information as repeated
calls to the equivalent synchronous API, but more efficiently.
If a fresh new query would yield different results,
then the client’s asynchronous DNS operation <bcp14>MUST</bcp14> be given
asynchronous notifications to deliver the new set of results.
This avoids the temptation for clients to resort to polling,
in the belief that polling gives them better results
than trusting the asynchronous notification mechanism.
For efficiency, the application is notified via an asynchronous
notification only when the set of answers changes.
This is similar to the efficiency trade-offs present in other APIs,
where asynchronous notification is more efficient than polling.
For example, an application can repeatedly poll to find if
the content of a directory has changed, but using asynchronous
filesystem notifications gives the same effect more efficiently.</t>
        <t>This is the resolution model defined by Multicast DNS <xref target="RFC6762"/>
and is valuable for unicast DNS too.
Asynchronous DNS resolution is supported in
Apple’s networking APIs <xref target="ZC"/>,
and in other DNS stub resolver implementations like getdns <xref target="getdns"/>.</t>
        <t>This model naturally supports the incremental delivery that Optimistic DNS
requires.  Expired records arrive in the first callback, within
microseconds.  Fresh records from the network arrive in subsequent
callbacks, within milliseconds.  The application can act on the expired
answer immediately by opening a connection.  If the address has
changed, the application can start a new connection to the updated
address.  If the address is the same, the connection is already
established and the fresh answer serves as confirmation.</t>
      </section>
      <section anchor="happy-eyeballs">
        <name>Happy Eyeballs</name>
        <t>Optimistic DNS delivers DNS answers quickly, with the caveat that, on rare
occasions, some of those answers might be stale and incorrect, in which case
updated answers will be delivered as soon as they are available.  To make this
optimistic approach viable, it <bcp14>MUST</bcp14> be coupled with networking code that is
designed to embrace this uncertainty, and account for the fact that all data
received from a network is necessarily at least a little stale by the time it
arrives, and may subsequently be found to be incorrect.  Without Happy Eyeballs,
a wrong expired address would mean a failed connection and user frustration.</t>
        <t>Happy Eyeballs <xref target="IETF72"/> <xref target="RFC6555"/> <xref target="RFC8305"/> <xref target="HEv3"/>
defines algorithms for racing connection attempts across multiple
addresses and address families. When a client has several
candidate addresses for a destination, Happy Eyeballs staggers
connection attempts, in order of expected likelihood of success,
with short delays, and uses whichever connection succeeds first.</t>
        <t>The Happy Eyeballs mechanism pairs naturally with Optimistic DNS.
When using Happy Eyeballs, the networking code takes the set of
answers immediately available in the local cache and selects
the address it predicts is most likely to succeed.  If the prediction
is correct, which is the common case, the connection succeeds and
no additional traffic is generated.  The connection may succeed
before the fresh DNS answer from the network even arrives.</t>
        <t>In the rare cases where the first connection attempt does not
succeed within the expected network round-trip time, the TCP SYN
(or equivalent connection request packet) is retransmitted, and a
second connection attempt is immediately initiated to the next
address in order of preference.  The first connection attempt is
not abandoned when the second one starts -- its usual schedule of
retransmissions is still followed -- and the two attempts proceed
in parallel.  If the second connection attempt does not succeed
within the expected time, a third attempt is initiated, and so on.</t>
        <t>Running connection attempts in parallel rather than sequentially
prevents long stalls waiting for a connection to time out and fail
before the next attempt is started.  Staggering the start times by
the expected response time means that in the majority of cases only
the first connection attempt is needed, which avoids generating
unnecessary network traffic or extra load on servers.</t>
        <t>If new DNS results are received during this procedure, the list of
candidate addresses is updated accordingly for use in subsequent
connection requests.</t>
        <t>Using Optimistic DNS in conjunction with Happy Eyeballs means that, in
the common case, a connection to the correct server is made faster,
with no additional network traffic.  In the rare case when a server
address has actually changed, the cost is a small amount of wasted
network traffic while waiting for the DNS reply.  Once the reply
arrives, Happy Eyeballs can immediately connect to the correct server,
with no additional delay beyond what would have been experienced had
the application just waited for the DNS reply in the first place.
The cost of waiting for a fresh answer that simply confirms what the
cache already had is a guaranteed delay of the full network round-trip
time on every cache expiry.  For most applications, the expected value
of the optimistic approach is clearly positive.</t>
        <t>After the Happy Eyeballs algorithm has succeeded in
establishing a connection to an acceptable destination
(determined by verifying the TLS certificate, or otherwise,
as appropriate) the asynchronous DNS operation <bcp14>MUST</bcp14> be stopped.
Once an application has established a successful connection, it
should make its future decisions based on the viability of that
connection, rather than any subsequent information to the contrary
received from asynchronous DNS.
Cancelling the asynchronous DNS operation prematurely, before a successful
connection has been established, would prevent the reception of future updated
answers, which would defeat the purpose of Optimistic DNS, which is to deliver
available answers quickly while still ensuring eventual correctness. Failure to cancel
after an acceptable connection has been made would be a waste of resources, and
in the extreme case would constitute a resource leak on the client device.</t>
        <t>Applications using Optimistic DNS and Happy Eyeballs <bcp14>SHOULD</bcp14> follow
appropriate security practices (<xref target="security-considerations"/>) to ensure
that they are connecting to the intended host or service on the network.</t>
      </section>
      <section anchor="combined-effect">
        <name>Combined Effect</name>
        <t>Asynchronous DNS resolution makes Optimistic DNS <em>possible</em>.  It provides the
delivery mechanism for multiple waves of results.  Happy Eyeballs makes Optimistic
DNS <em>safe</em>.  It ensures that acting on a wrong expired address is not fatal to
the overall connection attempt.  Together, the application starts connecting
instantly with provisional cached addresses, the connection race handles any
staleness gracefully, and the fresh DNS answer arrives as an update confirming
or correcting the initial result.</t>
      </section>
    </section>
    <section anchor="optimistic-dns-overview">
      <name>Optimistic DNS Overview</name>
      <t>Building on the asynchronous resolution model and connection racing described
above, Optimistic DNS introduces a specific modification to stub resolver
behavior.  When an application that has opted in issues a DNS query and the
stub resolver's cache contains expired records matching that query, the resolver
performs two actions in parallel:</t>
      <ol spacing="normal" type="1"><li>
          <t>It immediately returns the expired cached records to the application.</t>
        </li>
        <li>
          <t>It issues a standard DNS query on the network to obtain fresh records.</t>
        </li>
      </ol>
      <t>As fresh answers arrive from the network, the resolver delivers them to
the application through the asynchronous callback mechanism.
<xref target="unchanged-flow"/> shows both waves for a query where www.example.com
has an expired A record (203.0.113.34) in the cache, and the fresh answer
returns the same address:</t>
      <table anchor="unchanged-flow">
        <name>Optimistic DNS when data is unchanged</name>
        <thead>
          <tr>
            <th align="left">Time</th>
            <th align="left">Event</th>
            <th align="left">Notes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">T+0us</td>
            <td align="left">App queries www.example.com</td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">T+5us</td>
            <td align="left">Callback: 203.0.113.34</td>
            <td align="left">Expired</td>
          </tr>
          <tr>
            <td align="left">T+120ms</td>
            <td align="left">(data unchanged, no callback)</td>
            <td align="left">Fresh Answer Same</td>
          </tr>
        </tbody>
      </table>
      <t>When a fresh positive answer matches the previous
Optimistic Positive Answer, no second callback is delivered.
The application that began connecting at T+5us saved 120
milliseconds compared to waiting for the fresh answer.</t>
      <t>When the data has changed (for example, if the server moved to a new address),
or a fresh negative answer confirms a previous Optimistic Negative Answer,
the application is notified.
Sending confirmations of Optimistic Negative Answers is
necessary because the client may be waiting for that negative
answer confirmation before proceeding with its next steps.</t>
      <table anchor="changed-flow">
        <name>Optimistic DNS when data has changed</name>
        <thead>
          <tr>
            <th align="left">Time</th>
            <th align="left">Event</th>
            <th align="left">Notes</th>
          </tr>
        </thead>
        <tbody>
          <tr>
            <td align="left">T+0us</td>
            <td align="left">App queries www.example.com</td>
            <td align="left"> </td>
          </tr>
          <tr>
            <td align="left">T+5us</td>
            <td align="left">Callback: 203.0.113.34</td>
            <td align="left">Expired</td>
          </tr>
          <tr>
            <td align="left">T+120ms</td>
            <td align="left">Callback: 198.51.100.42</td>
            <td align="left">Fresh Answer Different</td>
          </tr>
        </tbody>
      </table>
      <t>In <xref target="changed-flow"/> the expired answer contained a stale and incorrect address.
An application that connected to 203.0.113.34 may find that
the connection fails with an ICMP Host Unreachable error,
a TCP RST, a TLS failure, or other unexpected content.
But the fresh answer arrives 120 milliseconds later,
and the application can retry with the correct address.
The total time to a successful connection is still only about 120 milliseconds
-- roughly the same as it would have been without Optimistic DNS.</t>
      <t>Optimistic DNS never makes things substantially worse for the application.  In the common
case where the data has not changed, it makes things dramatically faster.  In
the uncommon case where the data has changed and the server is no longer
available at the previous address, the cost is a small amount of wasted traffic
attempting to reach the previous address.</t>
      <t>Optimistic DNS is an opt-in mechanism.  Applications that do not request it
receive conventional stub resolver behavior: expired records are ignored,
and only fresh network answers are returned.  This ensures backward
compatibility and allows applications to choose the tradeoff that suits
their needs.
Applications that do not support both Happy Eyeballs
and appropriate application-layer security
<bcp14>SHOULD NOT</bcp14> use Optimistic DNS.
These applications are very dependent on always getting
the right answers from DNS every time, and do not recover
gracefully when delivered stale data by Optimistic DNS.</t>
    </section>
    <section anchor="implementation-details">
      <name>Implementation Details</name>
      <section anchor="query-initiation">
        <name>Query Initiation</name>
        <t>To use Optimistic DNS, an application signals its willingness to receive
expired answers when it issues a DNS query.  This signaling is a local
matter between the application and the stub resolver.</t>
        <t>One possible mechanism is for the stub resolver API to provide a flag that the
application includes with its query.  Setting this flag indicates that the
application is prepared to handle expired answers and will treat them
appropriately.</t>
      </section>
      <section anchor="cache-lookup-with-expired-records">
        <name>Cache Lookup with Expired Records</name>
        <t>When the stub resolver processes a query, it iterates through its cache looking
for records that match the query's name, type, and class.  For each matching
record, it determines whether the record has expired by comparing the time
elapsed since the record was received against the record's original TTL.</t>
        <t>If unexpired records are found in the cache, they are returned to the
application as a normal cache hit and no network query is needed.</t>
        <t>If a matching cache entry (positive or negative) has expired, then
this Optimistic Answer is delivered to the Optimistic DNS client.</t>
        <t>Optimistic Answers are subject to
concurrent verification (<xref target="parallel-network-query"/>)
and may subsequently result in an asynchronous update to
the client if newer information is discovered from the network.</t>
        <t>Optimistic Positive Answers indicate the stub resolver’s
optimistic best guess of the answer.</t>
        <t>Optimistic Negative Answers
(resulting from a previous NXDOMAIN or NODATA response)
indicate the stub resolver’s best guess that the
requested record probably still doesn’t exist.
Optimistic Negative Answers <bcp14>SHOULD NOT</bcp14> be used to generate
error messages to the user.
Such error messages <bcp14>SHOULD</bcp14> only be generated after a network
query has confirmed that the named record still does not exist.
Optimistic Negative Answers can be useful in certain
search scenarios (like applying DNS domain name search lists)
where the nonexistence of a certain record is a prerequisite
for using some other record, and the tentatively presumed
nonexistence of a certain record can serve as a useful hint that
the client should begin work speculatively looking up other names
that may be required by the search algorithm (<xref target="search"/>).</t>
      </section>
      <section anchor="parallel-network-query">
        <name>Parallel Network Query</name>
        <t>If no unexpired records are found, the stub resolver <bcp14>MUST</bcp14> issue a standard DNS
query on the network.  This query proceeds through the normal resolution path:
contacting configured recursive resolvers, following CNAME chains, and so on.</t>
        <t>Fresh answers from the network are delivered to the application through
an asynchronous callback mechanism.  The application’s networking code <bcp14>MUST</bcp14>
use these fresh answers to update the list of answers it received earlier.</t>
      </section>
      <section anchor="cache-management">
        <name>Cache Management</name>
        <t>Storing expired records forever could consume an unbounded amount of memory,
and return egregiously old records.</t>
        <t>For this reason, stub resolvers <bcp14>SHOULD NOT</bcp14> store records
for more than one week after the TTL has expired.</t>
        <t>The time limit of one week is selected so that a user could
go home from work on a Thursday night, take a four-day
long-weekend break, return to work the next Tuesday, and still
benefit from using expired cached records for faster performance.
Storing expired records for less time
risks eliminating the benefit of Optimistic DNS in many cases;
storing expired records for more time
is currently considered to offer little additional benefit, and using
excessively old data could lead to unexpected undesirable consequences.</t>
      </section>
      <section anchor="cname-handling">
        <name>CNAME Handling</name>
        <t>CNAME records introduce a complication for Optimistic DNS.
When a DNS query encounters a CNAME record, the resolver must follow
one or more records in a CNAME chain to find the ultimate answer.
If a CNAME record itself is expired, it may no longer be correct.</t>
        <t>Consider the following example.  An application queries for
www.example.com, which has a CNAME record pointing to cdn.example.net.
Both records are in the cache but expired:</t>
        <artwork><![CDATA[
  www.example.com.   CNAME  cdn.example.net.  (expired)
  cdn.example.net.   A      198.51.100.42     (expired)
]]></artwork>
        <t>If the resolver follows the expired CNAME to cdn.example.net and returns
the expired A record, the application receives a result.  But if the CNAME
has changed (www.example.com now points to cdn2.example.net instead), the
resolver has followed a stale chain and returned a record for the wrong
name.</t>
        <t>To handle this correctly, when the stub resolver encounters CNAME
records during optimistic resolution, it takes the following steps:</t>
        <ol spacing="normal" type="1"><li>
            <t>If the record is expired, and a background query is not already in
progress for this record name, then a background query is initiated,
as for any other expired record.</t>
          </li>
          <li>
            <t>The CNAME referral is followed.
(If the target of the CNAME referral is another CNAME record,
then this process repeats until a non-CNAME answer is found.)</t>
          </li>
          <li>
            <t>If, at any time while an asynchronous DNS query is active,
the record data for any of the names in the CNAME chain changes,
then the query is re-evaluated starting from the original query name,
as if it were a fresh query.
This maintains the operational model of asynchronous DNS resolution,
that it is simply a more efficient equivalent to repeated polling.
If a fresh new query would yield different results, then the client’s
asynchronous DNS operation receives asynchronous notifications
to deliver the new set of results, giving it the exact same
information that a fresh query at that time would yield.</t>
          </li>
        </ol>
        <t>This rewind-and-restart approach ensures that the application continues
to receive a complete, consistent answer for its query, even as DNS record
changes may mean that the CNAME chain for a given name changes over time.</t>
      </section>
    </section>
    <section anchor="interaction-with-other-dns-features">
      <name>Interaction with Other DNS Features</name>
      <section anchor="uncacheable-records">
        <name>Uncacheable Records</name>
        <t>The DNS specification states that DNS records
with a TTL of zero "can only be used for the transaction in progress,
and should not be cached" (<xref section="3.2.1" sectionFormat="of" target="RFC1035"/>).
This document does not change that guidance;
subsequent queries for these records always result in a new network request.</t>
      </section>
      <section anchor="dnssec">
        <name>DNSSEC</name>
        <t>Optimistic DNS extends the cache lifetime for DNS records,
as signaled by the TTL values.</t>
        <t>Optimistic DNS does not extend the validity periods of cryptographic signatures.</t>
        <t>Optimistic DNS does not interpret the content of any records,
including cryptographic records like RRSIG,
and will deliver DNS records after their cache lifetime has expired.
Clients are responsible for checking and respecting
the validity periods of cryptographic signatures.</t>
      </section>
      <section anchor="search">
        <name>DNS Domain Name Search Lists</name>
        <t>Most DNS stub resolvers support domain name search lists <xref target="RFC1034"/>.
Domain name search lists can be configured manually, or learned
automatically from the network using DHCP <xref target="RFC3397"/> <xref target="RFC3646"/>
or IPv6 Router Advertisements <xref target="RFC8106"/>.</t>
        <t>Applying domain name search lists can be thought
of as an iterative search algorithm that operates
at a layer above the stub resolver’s query mechanism.
Each query made in the course of executing the domain
name search algorithm is a normal query for a fully
qualified domain name, and is subject to all the
usual procedures like following CNAME referrals.
Optimistic DNS can be used to speed up the
process of handling domain name search lists.</t>
        <t>When a client issues a query for a name that is not
considered fully qualified, the stub resolver applies each
of the names from the domain name search list, in order,
and uses the first name that returns a positive answer.
The user expectation is that the order of the
domain name search list will be respected strictly.
This means that results from a later name in the search list
cannot be used until negative answers have been confirmed
for all the earlier entries in the search list.
The network queries do not need to be performed sequentially,
one at a time (intelligently performing queries in parallel
can result in a faster result for the user),
but the final determination of which name to use
cannot be made until all the necessary
Optimistic Negative Answers have been confirmed.</t>
        <t>For this reason, Optimistic DNS can use
Optimistic Negative Answers as a performance
hint to tell it that it should start a parallel query
for the next name in the search list, but the decision
to use a particular answer needs to wait until all
earlier Optimistic Negative Answers have been confirmed.</t>
        <t>If a stub resolver were to issue parallel queries
for all names in the domain name search list,
this could result in a lot of unnecessary network traffic,
particularly for users with many names in their search lists.
If a stub resolver were to issue its queries sequentially,
this could result in poor performance for the user.
Optimistic DNS provides a good balance between these two extremes.
Optimistic DNS allows the stub resolver to issue parallel
queries for all the names it reasonably expects it will
need to check, without generating wasteful traffic for
names near the end of the domain name search list that
come after a name that is believed to have a positive answer.
Optimistic DNS rapidly performs all the queries it needs
to do to confirm record nonexistence, and then returns
the first positive answer, whether fresh or expired.
If an expired positive answer turns out to be wrong when
confirmed with a query on the network, then the newly
updated answer is delivered asynchronously to the client.
If the newly updated answer is negative, then the
domain name search algorithm resumes, continuing with
the next untried name in the list, and continues until
some positive answer, if any, is returned.</t>
      </section>
      <section anchor="encrypted-dns-transports">
        <name>Encrypted DNS Transports</name>
        <t>Optimistic DNS is transport-agnostic.  It operates entirely within the stub
resolver's cache layer, which sits above the transport layer.  Whether the
stub resolver communicates with recursive resolvers using classic DNS over
UDP/TCP <xref target="RFC1035"/>, DNS over TLS (DoT) <xref target="RFC7858"/>, DNS over HTTPS (DoH)
<xref target="RFC8484"/>, or DNS over QUIC (DoQ) <xref target="RFC9250"/>, the Optimistic DNS
mechanism functions identically.</t>
      </section>
      <section anchor="serving-stale-data-at-recursive-resolvers">
        <name>Serving Stale Data at Recursive Resolvers</name>
        <t>Serving Stale Data to Improve DNS Resiliency <xref target="RFC8767"/> describes a
mechanism for recursive resolvers to serve stale cached data when they are
unable to refresh it from authoritative servers.  Optimistic DNS and
RFC 8767 address different levels of the DNS resolution chain:</t>
        <dl>
          <dt><em>Optimistic DNS.</em></dt>
          <dd>
            <t>Operates at the stub resolver on the end-user's device.  Serves expired
cached data proactively, while simultaneously initiating a network query.
The primary goal is delay reduction -- eliminating the TTL expiry spike.</t>
          </dd>
          <dt><em>RFC 8767.</em></dt>
          <dd>
            <t>Operates at the recursive resolver.
Serves stale data when upstream authoritative servers are unreachable.
The primary goal is resiliency -- maintaining DNS service during outages.</t>
          </dd>
        </dl>
        <t>The two mechanisms are complementary and can be deployed simultaneously.
When both are active, the resolution chain has two layers of staleness
tolerance:</t>
        <ol spacing="normal" type="1"><li>
            <t>The stub resolver returns expired records optimistically, eliminating
client-perceived delay.</t>
          </li>
          <li>
            <t>If the recursive resolver's cache has also expired and the authoritative
server is unreachable, the recursive resolver can serve its own stale
data rather than returning SERVFAIL.</t>
          </li>
        </ol>
        <t>Optimistic DNS delivers the data it has immediately, while
also delivering updated data the moment it becomes available. It gives
the application the benefit of timely data, which could occasionally be
wrong, without depriving the application of also receiving the exact
data it would have received with a traditional non-optimistic DNS query,
at the time it would have received it.</t>
        <t>In contrast, RFC 8767 serves stale data without any provision for a
future asynchronous notification when the desired data becomes available.</t>
        <t>Optimistic DNS is not applicable to recursive resolvers because
Optimistic DNS relies on the ability to deliver its best available
information immediately, and then asynchronously update that
information promptly if newer information becomes available.
Stub resolvers that provide Asynchronous DNS resolution APIs to client
applications are able to deliver these essential asynchronous updates.
Recursive resolvers do not currently have any good way
to issue asynchronous updates to correct an earlier
answer that is subsequently discovered to be wrong.
In principle, stub resolvers could use DNS Push Notifications <xref target="RFC8765"/>
to receive asynchronous updates from a recursive resolver, but
in practice this might place too much load on recursive resolvers.
The current recommended solution for recursive resolvers returning
stale data is that the TTL is reported as being 30 seconds <xref target="RFC8767"/>.
This has the effect of instructing stub resolvers to poll
the recursive resolver once every 30 seconds
to ascertain if newer data has become available.</t>
      </section>
    </section>
    <section anchor="operational-considerations">
      <name>Operational Considerations</name>
      <t>A consequence of Optimistic DNS is that clients may continue
to use an old IP address longer than expected.
There are other reasons that stale addresses may persist and
cause clients to use an old IP address longer than expected,
but Optimistic DNS adds a new way that this can happen.</t>
      <t>Suppose a server operator has a DNS address record for
website.example.com with a TTL of 24 hours, and the operator
updates that address record to point to a new IP address.
Depending on when that address record was cached at various recursive
resolvers around the world, the operator may expect to see a roughly
linear decrease in new incoming connection requests to the old
IP address in the 24 hours after the address record was updated, ending
with no new connection requests being received after 24 hours have passed.
In reality there are various reasons that some clients may still attempt
to use a stale address, but in practice there should be very few
incoming connection requests to the old IP address after 24 hours.
The server operator has to keep the website available at the old address
for at least 24 hours, to accommodate clients using the old address.</t>
      <t>Optimistic DNS changes this assumption.
Using the same 24-hour TTL, the decline in the incoming connection
rate will not be quite as rapid, and incoming connection requests
to the old IP address may continue to be received for a week
after the TTL has expired (<xref target="cache-management"/>).</t>
      <t>However, Optimistic DNS does not mean that the server operator
is forced to maintain the availability of their website
at the old IP address for a week after the address change.
Because clients using the expired IP address are using Optimistic DNS,
they have the benefit of asynchronous DNS and Happy Eyeballs,
which means that they will promptly switch to the new IP address,
and the brief failed attempt to use the old IP address is inconsequential.</t>
      <t>If a new IP address is established for the server but existing connections to
the old IP address continue to work, then there is no reason for clients to
abandon their working connections.  The decision about if and when to migrate
existing clients to the new IP address is in the hands of the server operator.
The server operator might choose to allow those connections to remain.  If the
server operator wishes to have clients reconnect using the new IP address, then
that could be achieved using an in-band message on the existing connection, or
by simply shutting down the server at the old IP address, so that clients
re-establish their connections using the new IP address.</t>
      <t>Moreover, Optimistic DNS gives server operators
the freedom to use shorter DNS TTLs safely.
One of the reasons why server operators may choose
to use long TTLs is to avoid their users experiencing
the periodic delay spikes caused by short TTLs.
When Optimistic DNS eliminates the concerns about periodic delay spikes,
it becomes reasonable to use shorter DNS TTLs.
With widespread use of Optimistic DNS, server operators
are free to use much shorter DNS TTLs, like five minutes.
Optimistic DNS clients will suffer no periodic delay spikes
because of the short DNS TTLs, and when the time comes
that it is necessary to update the server address for
website.example.com, the transition to the new server
can be completed in minutes, rather than hours.</t>
    </section>
    <section anchor="security-considerations">
      <name>Security Considerations</name>
      <t>Optimistic DNS introduces a tradeoff between speed and freshness.
Applications that use expired answers must be prepared for those answers to be
occasionally incorrect.
Applications using Optimistic DNS <bcp14>SHOULD</bcp14> employ application-layer
security (e.g., using TLS or QUIC) when connecting to addresses obtained from expired answers,
to detect cases where the address has been reassigned.</t>
      <t>Networking always entails a degree of uncertainty
-- for example, packets may be intercepted in transit and
not reach their intended destination -- and for correct
operation, secure applications have to guard against this.
Optimistic DNS adds a new way that packets may not reach their
intended destination, but does not fundamentally alter the
importance of application-layer security.</t>
      <dl>
        <dt><em>IP Address Reuse.</em></dt>
        <dd>
          <t>When a DNS record expires, the IP address it contained may no longer be
associated with the previous host or service.
For HTTPS connections, TLS certificate
validation will detect this mismatch and prevent data from being sent to
the wrong party.  For unencrypted protocols, there is a risk of
connecting to an unintended server.
Even with the use of encrypted protocols, detecting the mismatch does
not prevent privacy exposure, since the unintended server learns that a
user was interested in a specific name (for example through the Server
Name Indication).</t>
        </dd>
        <dt><em>Poisoning Amplification.</em></dt>
        <dd>
          <t>If an attacker successfully poisons a cache entry, Optimistic DNS could
extend the lifetime of the poisoned record beyond its original TTL.
However, the record will be purged after the retention period expires.
Moreover, the parallel network query will obtain and deliver the correct
answer, giving the application an opportunity to detect the discrepancy.</t>
        </dd>
        <dt><em>Expired Records Retention Period.</em></dt>
        <dd>
          <t>The recommended maximum retention period of one week (<xref target="cache-management"/>)
bounds the maximum time an expired record can be served.
Implementations <bcp14>MAY</bcp14> allow this period to be configured.
Shorter periods reduce the window of exposure to stale data but also
reduce the effectiveness of Optimistic DNS for infrequently-accessed names.</t>
        </dd>
      </dl>
    </section>
    <section anchor="iana-considerations">
      <name>IANA Considerations</name>
      <t>This document has no IANA actions.</t>
    </section>
  </middle>
  <back>
    <references anchor="sec-combined-references">
      <name>References</name>
      <references anchor="sec-normative-references">
        <name>Normative References</name>
        <reference anchor="HEv3">
          <front>
            <title>Happy Eyeballs Version 3: Better Connectivity Using Concurrency</title>
            <author fullname="Tommy Pauly" initials="T." surname="Pauly">
              <organization>Apple Inc</organization>
            </author>
            <author fullname="David Schinazi" initials="D." surname="Schinazi">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Nidhi Jaju" initials="N." surname="Jaju">
              <organization>Google LLC</organization>
            </author>
            <author fullname="Kenichi Ishibashi" initials="K." surname="Ishibashi">
              <organization>Google LLC</organization>
            </author>
            <date day="1" month="July" year="2026"/>
            <abstract>
              <t>   Many communication protocols operating over the modern Internet use
   hostnames.  These often resolve to multiple IP addresses, each of
   which may have different performance and connectivity
   characteristics.  Since specific addresses or address families (IPv4
   or IPv6) may be blocked, broken, or sub-optimal on a network, clients
   that attempt multiple connections in parallel have a chance of
   establishing a connection more quickly.  This document defines the
   algorithm for "Happy Eyeballs", a technique for reducing user-visible
   delays on dual-stack hosts.  This document updates the algorithm in
   RFC 8305.

              </t>
            </abstract>
          </front>
          <seriesInfo name="Internet-Draft" value="draft-ietf-happy-happyeyeballs-v3-04"/>
        </reference>
        <reference anchor="RFC2119">
          <front>
            <title>Key words for use in RFCs to Indicate Requirement Levels</title>
            <author fullname="S. Bradner" initials="S." surname="Bradner"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>In many standards track documents several words are used to signify the requirements in the specification. These words are often capitalized. This document defines these words as they should be interpreted in IETF documents. This document specifies an Internet Best Current Practices for the Internet Community, and requests discussion and suggestions for improvements.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="2119"/>
          <seriesInfo name="DOI" value="10.17487/RFC2119"/>
        </reference>
        <reference anchor="RFC8174">
          <front>
            <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title>
            <author fullname="B. Leiba" initials="B." surname="Leiba"/>
            <date month="May" year="2017"/>
            <abstract>
              <t>RFC 2119 specifies common key words that may be used in protocol specifications. This document aims to reduce the ambiguity by clarifying that only UPPERCASE usage of the key words have the defined special meanings.</t>
            </abstract>
          </front>
          <seriesInfo name="BCP" value="14"/>
          <seriesInfo name="RFC" value="8174"/>
          <seriesInfo name="DOI" value="10.17487/RFC8174"/>
        </reference>
        <reference anchor="RFC1035">
          <front>
            <title>Domain names - implementation and specification</title>
            <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
            <date month="November" year="1987"/>
            <abstract>
              <t>This RFC is the revised specification of the protocol and format used in the implementation of the Domain Name System. It obsoletes RFC-883. This memo documents the details of the domain name client - server communication.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1035"/>
          <seriesInfo name="DOI" value="10.17487/RFC1035"/>
        </reference>
        <reference anchor="RFC1034">
          <front>
            <title>Domain names - concepts and facilities</title>
            <author fullname="P. Mockapetris" initials="P." surname="Mockapetris"/>
            <date month="November" year="1987"/>
            <abstract>
              <t>This RFC is the revised basic definition of The Domain Name System. It obsoletes RFC-882. This memo describes the domain style names and their used for host address look up and electronic mail forwarding. It discusses the clients and servers in the domain name system and the protocol used between them.</t>
            </abstract>
          </front>
          <seriesInfo name="STD" value="13"/>
          <seriesInfo name="RFC" value="1034"/>
          <seriesInfo name="DOI" value="10.17487/RFC1034"/>
        </reference>
      </references>
      <references anchor="sec-informative-references">
        <name>Informative References</name>
        <reference anchor="IETF72" target="https://www.stuartcheshire.org/IETF72/">
          <front>
            <title>Stuart Cheshire on IPv6 Adoption</title>
            <author initials="S." surname="Cheshire">
              <organization/>
            </author>
            <date year="2008"/>
          </front>
          <annotation>This presentation introduced the concept of asynchronous concurrent connection racing, later known as Happy Eyeballs.</annotation>
        </reference>
        <reference anchor="WWDC18" target="https://developer.apple.com/videos/play/wwdc2018/714/">
          <front>
            <title>Optimizing Your App for Today’s Internet</title>
            <author initials="S." surname="Cheshire">
              <organization/>
            </author>
            <author initials="J." surname="Mehta">
              <organization/>
            </author>
            <date year="2018" month="June"/>
          </front>
          <seriesInfo name="Apple Worldwide Developer Conference" value=""/>
        </reference>
        <reference anchor="getdns" target="https://getdnsapi.net/">
          <front>
            <title>Welcome to getdns!</title>
            <author>
              <organization>NLnet Labs, Sinodun and No Mountain Software</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="Firefox" target="https://searchfox.org/firefox-main/rev/b0625683b9b8cd108f6b3fa9eedbcd4aa0066d6e/netwerk/dns/nsHostResolver.cpp">
          <front>
            <title>Firefox stub resolver: nsHostResolver</title>
            <author>
              <organization>Mozilla</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="ZC">
          <front>
            <title>Zero Configuration Networking: The Definitive Guide</title>
            <author initials="S." surname="Cheshire" fullname="Stuart Cheshire">
              <organization/>
            </author>
            <author initials="D. H." surname="Steinberg" fullname="Daniel H. Steinberg">
              <organization/>
            </author>
            <date year="2005" month="December"/>
          </front>
          <seriesInfo name="ISBN" value="978-0-596-10100-5"/>
          <refcontent>O'Reilly Media</refcontent>
        </reference>
        <reference anchor="HttpEngine" target="https://developer.android.com/reference/android/net/http/HttpEngine">
          <front>
            <title>android.net.http.HttpEngine API reference</title>
            <author>
              <organization>Google</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="StaleDnsOptions" target="https://developer.android.com/reference/android/net/http/DnsOptions.StaleDnsOptions">
          <front>
            <title>android.net.http.DnsOptions.StaleDnsOptions API reference</title>
            <author>
              <organization>Google</organization>
            </author>
            <date>n.d.</date>
          </front>
        </reference>
        <reference anchor="dnsttlviolations" target="https://labs.ripe.net/author/giovane_moura/dns-ttl-violations-in-the-wild-measured-with-ripe-atlas/">
          <front>
            <title>DNS TTL Violations in the Wild - Measured with RIPE Atlas</title>
            <author initials="G." surname="Moura" fullname="Giovane Moura">
              <organization/>
            </author>
            <date year="2017" month="December"/>
          </front>
        </reference>
        <reference anchor="RFC8767">
          <front>
            <title>Serving Stale Data to Improve DNS Resiliency</title>
            <author fullname="D. Lawrence" initials="D." surname="Lawrence"/>
            <author fullname="W. Kumari" initials="W." surname="Kumari"/>
            <author fullname="P. Sood" initials="P." surname="Sood"/>
            <date month="March" year="2020"/>
            <abstract>
              <t>This document defines a method (serve-stale) for recursive resolvers to use stale DNS data to avoid outages when authoritative nameservers cannot be reached to refresh expired data. One of the motivations for serve-stale is to make the DNS more resilient to DoS attacks and thereby make them less attractive as an attack vector. This document updates the definitions of TTL from RFCs 1034 and 1035 so that data can be kept in the cache beyond the TTL expiry; it also updates RFC 2181 by interpreting values with the high-order bit set as being positive, rather than 0, and suggests a cap of 7 days.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8767"/>
          <seriesInfo name="DOI" value="10.17487/RFC8767"/>
        </reference>
        <reference anchor="RFC6555">
          <front>
            <title>Happy Eyeballs: Success with Dual-Stack Hosts</title>
            <author fullname="D. Wing" initials="D." surname="Wing"/>
            <author fullname="A. Yourtchenko" initials="A." surname="Yourtchenko"/>
            <date month="April" year="2012"/>
            <abstract>
              <t>When a server's IPv4 path and protocol are working, but the server's IPv6 path and protocol are not working, a dual-stack client application experiences significant connection delay compared to an IPv4-only client. This is undesirable because it causes the dual- stack client to have a worse user experience. This document specifies requirements for algorithms that reduce this user-visible delay and provides an algorithm. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6555"/>
          <seriesInfo name="DOI" value="10.17487/RFC6555"/>
        </reference>
        <reference anchor="RFC8305">
          <front>
            <title>Happy Eyeballs Version 2: Better Connectivity Using Concurrency</title>
            <author fullname="D. Schinazi" initials="D." surname="Schinazi"/>
            <author fullname="T. Pauly" initials="T." surname="Pauly"/>
            <date month="December" year="2017"/>
            <abstract>
              <t>Many communication protocols operating over the modern Internet use hostnames. These often resolve to multiple IP addresses, each of which may have different performance and connectivity characteristics. Since specific addresses or address families (IPv4 or IPv6) may be blocked, broken, or sub-optimal on a network, clients that attempt multiple connections in parallel have a chance of establishing a connection more quickly. This document specifies requirements for algorithms that reduce this user-visible delay and provides an example algorithm, referred to as "Happy Eyeballs". This document obsoletes the original algorithm description in RFC 6555.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8305"/>
          <seriesInfo name="DOI" value="10.17487/RFC8305"/>
        </reference>
        <reference anchor="RFC2131">
          <front>
            <title>Dynamic Host Configuration Protocol</title>
            <author fullname="R. Droms" initials="R." surname="Droms"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>The Dynamic Host Configuration Protocol (DHCP) provides a framework for passing configuration information to hosts on a TCPIP network. DHCP is based on the Bootstrap Protocol (BOOTP), adding the capability of automatic allocation of reusable network addresses and additional configuration options. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2131"/>
          <seriesInfo name="DOI" value="10.17487/RFC2131"/>
        </reference>
        <reference anchor="RFC2132">
          <front>
            <title>DHCP Options and BOOTP Vendor Extensions</title>
            <author fullname="S. Alexander" initials="S." surname="Alexander"/>
            <author fullname="R. Droms" initials="R." surname="Droms"/>
            <date month="March" year="1997"/>
            <abstract>
              <t>This document specifies the current set of DHCP options. Future options will be specified in separate RFCs. The current list of valid options is also available in ftp://ftp.isi.edu/in-notes/iana/assignments. [STANDARDS-TRACK]</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="2132"/>
          <seriesInfo name="DOI" value="10.17487/RFC2132"/>
        </reference>
        <reference anchor="RFC6762">
          <front>
            <title>Multicast DNS</title>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <author fullname="M. Krochmal" initials="M." surname="Krochmal"/>
            <date month="February" year="2013"/>
            <abstract>
              <t>As networked devices become smaller, more portable, and more ubiquitous, the ability to operate with less configured infrastructure is increasingly important. In particular, the ability to look up DNS resource record data types (including, but not limited to, host names) in the absence of a conventional managed DNS server is useful.</t>
              <t>Multicast DNS (mDNS) provides the ability to perform DNS-like operations on the local link in the absence of any conventional Unicast DNS server. In addition, Multicast DNS designates a portion of the DNS namespace to be free for local use, without the need to pay any annual fee, and without the need to set up delegations or otherwise configure a conventional DNS server to answer for those names.</t>
              <t>The primary benefits of Multicast DNS names are that (i) they require little or no administration or configuration to set them up, (ii) they work when no infrastructure is present, and (iii) they work during infrastructure failures.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="6762"/>
          <seriesInfo name="DOI" value="10.17487/RFC6762"/>
        </reference>
        <reference anchor="RFC3397">
          <front>
            <title>Dynamic Host Configuration Protocol (DHCP) Domain Search Option</title>
            <author fullname="B. Aboba" initials="B." surname="Aboba"/>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <date month="November" year="2002"/>
            <abstract>
              <t>This document defines a new DHCP option which is passed from the DHCP
Server to the DHCP Client to specify the domain search list used when
resolving hostnames using DNS.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3397"/>
          <seriesInfo name="DOI" value="10.17487/RFC3397"/>
        </reference>
        <reference anchor="RFC3646">
          <front>
            <title>DNS Configuration options for Dynamic Host Configuration Protocol for IPv6 (DHCPv6)</title>
            <author fullname="R. Droms" initials="R." role="editor" surname="Droms"/>
            <date month="December" year="2003"/>
            <abstract>
              <t>This document describes Dynamic Host Configuration Protocol for IPv6 (DHCPv6) options for passing a list of available DNS recursive name servers and a domain search list to a client.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="3646"/>
          <seriesInfo name="DOI" value="10.17487/RFC3646"/>
        </reference>
        <reference anchor="RFC8106">
          <front>
            <title>IPv6 Router Advertisement Options for DNS Configuration</title>
            <author fullname="J. Jeong" initials="J." surname="Jeong"/>
            <author fullname="S. Park" initials="S." surname="Park"/>
            <author fullname="L. Beloeil" initials="L." surname="Beloeil"/>
            <author fullname="S. Madanapalli" initials="S." surname="Madanapalli"/>
            <date month="March" year="2017"/>
            <abstract>
              <t>This document specifies IPv6 Router Advertisement (RA) options (called "DNS RA options") to allow IPv6 routers to advertise a list of DNS Recursive Server Addresses and a DNS Search List to IPv6 hosts.</t>
              <t>This document, which obsoletes RFC 6106, defines a higher default value of the lifetime of the DNS RA options to reduce the likelihood of expiry of the options on links with a relatively high rate of packet loss.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8106"/>
          <seriesInfo name="DOI" value="10.17487/RFC8106"/>
        </reference>
        <reference anchor="RFC7858">
          <front>
            <title>Specification for DNS over Transport Layer Security (TLS)</title>
            <author fullname="Z. Hu" initials="Z." surname="Hu"/>
            <author fullname="L. Zhu" initials="L." surname="Zhu"/>
            <author fullname="J. Heidemann" initials="J." surname="Heidemann"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <author fullname="D. Wessels" initials="D." surname="Wessels"/>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <date month="May" year="2016"/>
            <abstract>
              <t>This document describes the use of Transport Layer Security (TLS) to provide privacy for DNS. Encryption provided by TLS eliminates opportunities for eavesdropping and on-path tampering with DNS queries in the network, such as discussed in RFC 7626. In addition, this document specifies two usage profiles for DNS over TLS and provides advice on performance considerations to minimize overhead from using TCP and TLS with DNS.</t>
              <t>This document focuses on securing stub-to-recursive traffic, as per the charter of the DPRIVE Working Group. It does not prevent future applications of the protocol to recursive-to-authoritative traffic.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="7858"/>
          <seriesInfo name="DOI" value="10.17487/RFC7858"/>
        </reference>
        <reference anchor="RFC8484">
          <front>
            <title>DNS Queries over HTTPS (DoH)</title>
            <author fullname="P. Hoffman" initials="P." surname="Hoffman"/>
            <author fullname="P. McManus" initials="P." surname="McManus"/>
            <date month="October" year="2018"/>
            <abstract>
              <t>This document defines a protocol for sending DNS queries and getting DNS responses over HTTPS. Each DNS query-response pair is mapped into an HTTP exchange.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8484"/>
          <seriesInfo name="DOI" value="10.17487/RFC8484"/>
        </reference>
        <reference anchor="RFC9250">
          <front>
            <title>DNS over Dedicated QUIC Connections</title>
            <author fullname="C. Huitema" initials="C." surname="Huitema"/>
            <author fullname="S. Dickinson" initials="S." surname="Dickinson"/>
            <author fullname="A. Mankin" initials="A." surname="Mankin"/>
            <date month="May" year="2022"/>
            <abstract>
              <t>This document describes the use of QUIC to provide transport confidentiality for DNS. The encryption provided by QUIC has similar properties to those provided by TLS, while QUIC transport eliminates the head-of-line blocking issues inherent with TCP and provides more efficient packet-loss recovery than UDP. DNS over QUIC (DoQ) has privacy properties similar to DNS over TLS (DoT) specified in RFC 7858, and latency characteristics similar to classic DNS over UDP. This specification describes the use of DoQ as a general-purpose transport for DNS and includes the use of DoQ for stub to recursive, recursive to authoritative, and zone transfer scenarios.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="9250"/>
          <seriesInfo name="DOI" value="10.17487/RFC9250"/>
        </reference>
        <reference anchor="RFC8765">
          <front>
            <title>DNS Push Notifications</title>
            <author fullname="T. Pusateri" initials="T." surname="Pusateri"/>
            <author fullname="S. Cheshire" initials="S." surname="Cheshire"/>
            <date month="June" year="2020"/>
            <abstract>
              <t>The Domain Name System (DNS) was designed to return matching records efficiently for queries for data that are relatively static. When those records change frequently, DNS is still efficient at returning the updated results when polled, as long as the polling rate is not too high. But, there exists no mechanism for a client to be asynchronously notified when these changes occur. This document defines a mechanism for a client to be notified of such changes to DNS records, called DNS Push Notifications.</t>
            </abstract>
          </front>
          <seriesInfo name="RFC" value="8765"/>
          <seriesInfo name="DOI" value="10.17487/RFC8765"/>
        </reference>
      </references>
    </references>
    <?line 1096?>

<section anchor="deployment-history">
      <name>Deployment History</name>
      <section anchor="mdnsresponder">
        <name>Optimistic DNS in mDNSResponder</name>
        <t>The mDNSResponder project is an open-source system stub resolver, and runs on
macOS, iOS, tvOS, watchOS, Microsoft Windows, Android, Linux, and other
platforms.  This section describes its concrete implementation of the Optimistic
DNS mechanism described in this document.</t>
        <t>Optimistic DNS in Apple’s mDNSResponder code was first shipped
enabled by default in macOS 10.14 (Mojave) and iOS 12
in September 2018 <xref target="WWDC18"/>.
It has been active on all Apple platforms since that release,
serving as the default stub resolver behavior for all
applications that use Apple’s recommended networking APIs.</t>
        <t>Prior to implementing Optimistic DNS, the mDNSResponder code addressed the
Zeno’s paradox problem (<xref target="zeno"/>) by implementing a modest form of DNS TTL
stretching.  The mDNSResponder code stretches TTLs by 25%, plus two seconds to
account for minor clock variations.  This results in the situation where, when
the age of the record as viewed by the stub resolver reaches 80% of its
stretched TTL, the actual TTL of the record as viewed by the recursive resolver
has expired.</t>
        <t>If a client performs a new DNS query for a record within the time window
of 80-100% of the stretched TTL, then the mDNSResponder stub resolver
code will return the available answer to the client immediately,
while in parallel sending a query to the recursive resolver.</t>
        <t>In addition, if an asynchronous query is active on the client
at the time the record age passes 80% of its stretched TTL,
then the mDNSResponder stub resolver code will send a DNS query
to the recursive resolver to fetch fresh data, and will update
the client with fresh information if new data is received.</t>
        <t>This DNS query to the recursive resolver happens after the
recursive resolver’s copy of the record has expired, causing the
recursive resolver to fetch a new fresh copy of the authoritative record,
but because available answers are delivered to DNS clients immediately,
DNS clients do not experience a delay spike while
waiting for the recursive resolver to refresh the record.
Thus, traditional DNS queries using the mDNSResponder stub resolver
may receive answers that are up to 25% beyond their original lifetime.</t>
        <t>The development of Happy Eyeballs in 2008 <xref target="IETF72"/> <xref target="RFC6555"/> <xref target="RFC8305"/>
          <xref target="HEv3"/> made it feasible to increase effective record lifetimes beyond a modest
extension of just 25%, and this new capability is what made Optimistic DNS
possible.</t>
        <section anchor="signaling">
          <name>Signaling</name>
          <t>This document describes query initiation as a local signaling matter
between the application and the stub resolver. The mDNSResponder code implements
this through the following API flags:</t>
          <dl>
            <dt><em>kDNSServiceFlagsAllowExpiredAnswers.</em></dt>
            <dd>
              <t>Set by the application when issuing a query to request delivery
of expired cached records.</t>
            </dd>
            <dt><em>kDNSServiceFlagsExpiredAnswer.</em></dt>
            <dd>
              <t>Set by the resolver on individual answer callbacks to indicate that the
record being returned is expired.
In the case of Optimistic Negative Answers, the flag is a useful
hint to the client about how much trust it should place in this answer.
An expired Optimistic Negative Answer should be quickly updated with
a fresh confirmation of the negative answer, or a new positive answer.
In the case of Optimistic Positive Answers, the flag has little
significance, since the application verifies the validity of
positive answers by attempting communication with those addresses.
Developers should take care in how they interpret this answer property
because, as mentioned earlier, the notion of record expiry is subjective,
and this flag is easily misunderstood and misused by developers who
think it carries more significance than it really does.</t>
            </dd>
            <dt><em>kDNSServiceFlagsAnsweredFromCache.</em></dt>
            <dd>
              <t>Set by the resolver to indicate that the record was served from the
local cache rather than from a network response.  Set regardless of
whether the record is expired, allowing the application to distinguish
cached answers (immediate) from network answers (delayed).
Providing an equivalent indication in other implementations is not recommended,
because this flag is easily misunderstood and misused by developers who
think it carries more significance than it really does.
If two clients happen to query for the same domain name at almost
exactly the same time then one will be told that the answer
came from the cache and the other will be told that it did not.
Which client gets told which is effectively a coin toss,
and usually has little significance.
Revealing whether an answer was served from the cache
also has privacy implications.
A rogue application could issue queries for a large
number of popular domain names, and from the replies
indicating which domain names were already in the local
cache and which were not, the rogue application could infer
a list of which services this user has recently accessed.</t>
            </dd>
          </dl>
        </section>
        <section anchor="record-immortalization">
          <name>Record Lifecycle</name>
          <t>The main cache lookup operation requires that expired records remain
in the cache so that they are available to serve optimistically.
Conceptually, the stub resolver code saves all records for up to seven days.
Practically, the stub resolver code may want to limit its memory usage.
The mDNSResponder code approaches this with a three-state
record lifecycle:</t>
          <dl>
            <dt><em>Mortal (default).</em></dt>
            <dd>
              <t>The normal cache state for a record retrieved to
answer a traditional (not Optimistic DNS) query.
If subsequently queried by an Optimistic DNS
operation, this record gets promoted to immortal.
Mortal records may be refreshed in the course
of normal operation,
though because of Zeno’s paradox (<xref target="zeno"/>)
such refreshes are likely to be successful only for
records in the final 20% of their stretched TTL lifetime.
When the (stretched) TTL of a mortal record expires
the record is eligible for immediate removal.</t>
            </dd>
            <dt><em>Immortal.</em></dt>
            <dd>
              <t>A record marked to survive past its (stretched) TTL expiry.
This is the initial cache state for a record retrieved to
answer an Optimistic DNS query.
In addition, promotion from mortal to immortal occurs when a cached
record is used to answer a query from an application that has opted
in to Optimistic DNS.
(The logic is that if an application has made an Optimistic DNS
query for this DNS name, that is a hint that there may be
more such Optimistic DNS queries in the future.
If there has not been even one single Optimistic DNS query
for this DNS name, then that is a sign that whatever applications
are resolving this DNS name do not yet use Optimistic DNS,
so saving these records for a long time would be a waste of memory.)
Successful subsequent queries for immortal records
will refresh their lifetime, as it is with mortal records.
When the (stretched) TTL of an immortal record expires
the record becomes a ghost record.</t>
            </dd>
            <dt><em>Ghost.</em></dt>
            <dd>
              <t>An immortal record whose (stretched) TTL has expired.
Ghost records linger in the cache, available to serve future
Optimistic DNS queries.
If an Optimistic DNS query is issued that matches a ghost record,
then the ghost record data is delivered immediately to the
application, and the simultaneous DNS query over the network,
if successful, will refresh the ghost record and
restore it to immortal state.
If not refreshed for the ghost retention period (maximum of
one week), ghost records are purged.</t>
            </dd>
          </dl>
          <t>The complete lifecycle:</t>
          <artset>
            <artwork type="svg"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" height="400" width="520" viewBox="0 0 520 400" class="diagram" text-anchor="middle" font-family="monospace" font-size="13px" stroke-linecap="round">
                <path d="M 8,32 L 8,384" fill="none" stroke="black"/>
                <path d="M 24,112 L 24,224" fill="none" stroke="black"/>
                <path d="M 56,160 L 56,192" fill="none" stroke="black"/>
                <path d="M 72,112 L 72,152" fill="none" stroke="black"/>
                <path d="M 72,200 L 72,224" fill="none" stroke="black"/>
                <path d="M 88,200 L 88,304" fill="none" stroke="black"/>
                <path d="M 96,64 L 96,152" fill="none" stroke="black"/>
                <path d="M 128,160 L 128,192" fill="none" stroke="black"/>
                <path d="M 336,160 L 336,192" fill="none" stroke="black"/>
                <path d="M 344,304 L 344,336" fill="none" stroke="black"/>
                <path d="M 368,64 L 368,152" fill="none" stroke="black"/>
                <path d="M 384,200 L 384,296" fill="none" stroke="black"/>
                <path d="M 392,80 L 392,152" fill="none" stroke="black"/>
                <path d="M 416,112 L 416,152" fill="none" stroke="black"/>
                <path d="M 416,200 L 416,224" fill="none" stroke="black"/>
                <path d="M 424,304 L 424,336" fill="none" stroke="black"/>
                <path d="M 432,160 L 432,192" fill="none" stroke="black"/>
                <path d="M 464,112 L 464,224" fill="none" stroke="black"/>
                <path d="M 488,80 L 488,320" fill="none" stroke="black"/>
                <path d="M 512,32 L 512,384" fill="none" stroke="black"/>
                <path d="M 8,32 L 512,32" fill="none" stroke="black"/>
                <path d="M 392,80 L 424,80" fill="none" stroke="black"/>
                <path d="M 440,80 L 488,80" fill="none" stroke="black"/>
                <path d="M 24,112 L 40,112" fill="none" stroke="black"/>
                <path d="M 56,112 L 72,112" fill="none" stroke="black"/>
                <path d="M 416,112 L 432,112" fill="none" stroke="black"/>
                <path d="M 448,112 L 464,112" fill="none" stroke="black"/>
                <path d="M 56,160 L 128,160" fill="none" stroke="black"/>
                <path d="M 336,160 L 432,160" fill="none" stroke="black"/>
                <path d="M 144,176 L 320,176" fill="none" stroke="black"/>
                <path d="M 56,192 L 128,192" fill="none" stroke="black"/>
                <path d="M 336,192 L 432,192" fill="none" stroke="black"/>
                <path d="M 24,224 L 72,224" fill="none" stroke="black"/>
                <path d="M 416,224 L 464,224" fill="none" stroke="black"/>
                <path d="M 344,304 L 424,304" fill="none" stroke="black"/>
                <path d="M 136,320 L 320,320" fill="none" stroke="black"/>
                <path d="M 432,320 L 488,320" fill="none" stroke="black"/>
                <path d="M 344,336 L 424,336" fill="none" stroke="black"/>
                <path d="M 8,384 L 512,384" fill="none" stroke="black"/>
                <polygon class="arrowhead" points="424,152 412,146.4 412,157.6" fill="black" transform="rotate(90,416,152)"/>
                <polygon class="arrowhead" points="400,152 388,146.4 388,157.6" fill="black" transform="rotate(90,392,152)"/>
                <polygon class="arrowhead" points="392,296 380,290.4 380,301.6" fill="black" transform="rotate(90,384,296)"/>
                <polygon class="arrowhead" points="376,152 364,146.4 364,157.6" fill="black" transform="rotate(90,368,152)"/>
                <polygon class="arrowhead" points="328,176 316,170.4 316,181.6" fill="black" transform="rotate(0,320,176)"/>
                <polygon class="arrowhead" points="144,320 132,314.4 132,325.6" fill="black" transform="rotate(180,136,320)"/>
                <polygon class="arrowhead" points="104,152 92,146.4 92,157.6" fill="black" transform="rotate(90,96,152)"/>
                <polygon class="arrowhead" points="96,304 84,298.4 84,309.6" fill="black" transform="rotate(90,88,304)"/>
                <polygon class="arrowhead" points="80,152 68,146.4 68,157.6" fill="black" transform="rotate(90,72,152)"/>
                <g class="text">
                  <text x="152" y="68">Traditional</text>
                  <text x="284" y="68">Optimistic</text>
                  <text x="344" y="68">DNS</text>
                  <text x="128" y="84">Query</text>
                  <text x="336" y="84">Query</text>
                  <text x="432" y="84">R</text>
                  <text x="120" y="100">for</text>
                  <text x="164" y="100">record</text>
                  <text x="288" y="100">for</text>
                  <text x="332" y="100">record</text>
                  <text x="48" y="116">R</text>
                  <text x="120" y="116">not</text>
                  <text x="148" y="116">in</text>
                  <text x="184" y="116">cache</text>
                  <text x="272" y="116">not</text>
                  <text x="300" y="116">in</text>
                  <text x="336" y="116">cache</text>
                  <text x="440" y="116">R</text>
                  <text x="188" y="164">Optimistic</text>
                  <text x="248" y="164">DNS</text>
                  <text x="288" y="164">Query</text>
                  <text x="92" y="180">Mortal</text>
                  <text x="380" y="180">Immortal</text>
                  <text x="196" y="196">during</text>
                  <text x="260" y="196">lifetime</text>
                  <text x="112" y="244">TTL</text>
                  <text x="160" y="244">expires</text>
                  <text x="296" y="244">TTL</text>
                  <text x="344" y="244">expires</text>
                  <text x="92" y="324">[Purged]</text>
                  <text x="384" y="324">Ghost</text>
                  <text x="208" y="340">ghost</text>
                  <text x="272" y="340">retention</text>
                  <text x="220" y="356">period</text>
                  <text x="280" y="356">expires</text>
                </g>
              </svg>
            </artwork>
            <artwork type="ascii-art"><![CDATA[
+--------------------------------------------------------------+
|                                                              |
|          | Traditional      Optimistic DNS |                 |
|          | Query                     Query |  +----R------+  |
|          | for record           for record |  |           |  |
| +--R--+  | not in cache       not in cache |  |  +--R--+  |  |
| |     |  |                                 |  |  |     |  |  |
| |     v  v                                 v  v  v     |  |  |
| |   +--------+  Optimistic DNS Query   +-----------+   |  |  |
| |   | Mortal | ----------------------> | Immortal  |   |  |  |
| |   +--------+     during lifetime     +-----------+   |  |  |
| |     | |                                    |   |     |  |  |
| +-----+ |                                    |   +-----+  |  |
|         | TTL expires            TTL expires |            |  |
|         |                                    |            |  |
|         |                                    |            |  |
|         |                                    v            |  |
|         v                               +---------+       |  |
|      [Purged] <-----------------------  |  Ghost  |-------+  |
|                      ghost retention    +---------+          |
|                       period expires                         |
|                                                              |
+--------------------------------------------------------------+
]]></artwork>
          </artset>
          <t>This creates a virtuous cycle: the more frequently a name is queried with
Optimistic DNS, the more likely the cache will contain a ghost record for
it the next time the TTL expires.</t>
        </section>
      </section>
      <section anchor="firefox">
        <name>Optimistic DNS in Firefox</name>
        <t>Firefox implements client-side optimistic DNS in two layers.  Its stub resolver,
nsHostResolver <xref target="Firefox"/>, serves expired cached records while it revalidates
them.  Its Happy Eyeballs v3 <xref target="HEv3"/> connection state machine asks for stale
answers, acts on them at once, and drives the refresh.</t>
        <section anchor="stub-resolver-grace-period">
          <name>Stub Resolver Grace Period</name>
          <t>Firefox's stub resolver has served expired cached records by default since
Firefox 18, released in January 2013.  Each record has a valid lifetime, taken
from its TTL or, when the platform hides the TTL, from a default of 60 seconds.
A grace period follows.  Each record thus passes through three states: valid,
grace, and expired.</t>
          <t>In the grace period, after the TTL has elapsed but before the grace period ends,
the stub resolver returns the expired record to the caller at once and sends a
revalidation query in the background.</t>
          <t>The grace period is configurable.  Its default has changed over Firefox's
history and is currently ten minutes, well inside the recommended maximum
retention period of one week (<xref target="cache-management"/>).  When the grace period
ends, the record expires for good and the resolver stops serving it.</t>
          <t>Firefox flushes the host cache on a network change, since names resolved on the
old network may resolve differently on the new one.  The flush discards expired
records with the rest, so the resolver never serves an address learned on a
different network.</t>
        </section>
        <section anchor="happy-eyeballs-v3-integration">
          <name>Happy Eyeballs v3 Integration</name>
          <t>Since Firefox 155, released in September 2026, Firefox has driven connection
setup from a Happy Eyeballs v3 <xref target="HEv3"/> state machine that joins the
grace-period cache to connection racing, and so applies the asynchronous
resolution model (<xref target="async"/>).  To resolve a name, the state machine emits a
DNS query that allows a stale answer.  If the stub resolver answers from an
expired record, the state machine at once races connection attempts across
the returned addresses and address families, and in parallel emits a second
query that bypasses the cache, which forces a fresh network lookup.  When
the fresh answer arrives, the state machine updates its candidate addresses.</t>
          <t>This per-query signaling, a stale answer allowed for the first query and a fresh
one required for the refresh, mirrors the application-to-resolver signaling
(<xref target="query-initiation"/>), here between Firefox's connection layer and its own stub
resolver.  Most of the time the expired addresses are still right and the
connection stands before the fresh answer returns.  When an address has changed,
the race adds the fresh addresses and the user sees no failure.</t>
        </section>
      </section>
      <section anchor="android">
        <name>Optimistic DNS in Android</name>
        <t>In Android, Optimistic DNS is implemented by the system-provided HTTP client
<xref target="HttpEngine"/> rather than by the stub resolver, so that the client can retry a
request when an optimistic answer turns out to be wrong.  An application needs
to opt in by supplying stale DNS options <xref target="StaleDnsOptions"/> when it configures
the client.  These options have been available since API level 34, released
in June 2023, and on earlier releases through SDK extensions.</t>
        <section anchor="http-client-optimistic-dns-configurations">
          <name>HTTP Client Optimistic DNS Configurations</name>
          <t>Two of the options HttpEngine provides configure the behavior described in
this document.</t>
          <ul spacing="normal">
            <li>
              <t>setFreshLookupTimeout sets how long to wait for a fresh answer before
an expired one is used instead.  Setting it to zero returns the expired
record immediately and continues the query in the background to update
the cache, which is the model described in this document (<xref target="async"/>).
Larger values trade part of the latency benefit for a greater chance of
answering from fresh data.  Values of 0, 500 ms and 1500 ms are commonly
used.</t>
            </li>
            <li>
              <t>setMaxExpiredDelay sets how long past expiration an expired record may
still be used.  Setting it to zero means expired records may be used
indefinitely, so a deployment that wants the retention bound recommended
in this document (<xref target="cache-management"/>) has to set this option
explicitly.  Values of 3, 7 and 21 days are commonly used.</t>
            </li>
          </ul>
        </section>
        <section anchor="observed-impact-on-server-side-traffic">
          <name>Observed Impact on Server-Side Traffic</name>
          <t>Rollout of stale DNS support has improved user-perceived latency, without
observed breakage.  Servers already had to serve services on obsolete IP
addresses past their originally intended TTL because of the recursive
resolvers unilaterally increasing records TTL.  This practice, known as TTL
clamping, has been investigated in the wild <xref target="dnsttlviolations"/> and was
estimated to be employed by 4.17% of resolvers.</t>
        </section>
      </section>
    </section>
    <section numbered="false" anchor="acknowledgments">
      <name>Acknowledgments</name>
      <t>TODO: Acknowledgments.</t>
    </section>
  </back>
  <!-- ##markdown-source:
H4sIAAAAAAAAA+1965Ibx5Xm/3yKGiocblIA2M2bKI49My1epJ4VL2a3RmtP
zG4UgAK6TKAKU1XoFkTSMa+xEbsR+yz7KPMke75zyUuhutmU7fD+WIbDIgFU
VubJkyfP9Tvj8dh1ZbcqnmS3Xm+6cl22XTnLnr06veXy6bQpLga+mOVdsayb
3ZOs7eZuXs+qfE0DzJt80Y2X+bvykn4wnldtvRnX/ll8MD48cu12Sh+0ZV11
uw09dvL87EWWfZHlq7aml5XVvNgU9H9Vd2uU3SrmZVc3Zb7CP06Ov6H/1A39
7e3Zi1uu2q6nRfPEzel9T9ysrtqiarftk6xrtoWjqd93eVPkvISiyTt6Z5vl
1Tx7mVf5sljjHe6ybt4tm3q7oZ89q9d5WWWvaD3Z6a7tinUWnrzl3hU7+vX8
Ccgwymb57LysliOiwnaaNUVbry6KZpStaDbVbDfK5sUq37mLotrS7LLshi/J
MqHLrR9pYjR+9i2ew+f02Io+Z8L+U1l0i0ndLPFF3szO6Yvzrtu0T+7exe/w
UXlRTOxnd/HB3WlTX7bFXR7hLp5clt35dkrP2rbdvcEu4kEssu2il9oTExly
UtY3Geomv5mcd+vVLefybXde025nY3p/lpUVbfS3k+xYHuXPhBG/pV/m6+QL
osCT7HizWRXZSTWb8Gdt1xQFLeF1VehXb/LmXfYj7Rm+npUdcfjTLW1NV1Y1
f9YUS9ok+vRYflLPsVFfPzw8enBLP9lWHU7GD6fyk0I2zRb4TzleNJnVa5es
480ke7HKZ++iVbw5L1fRh3/rFWwWY/DSPy0wo3p/BaeT7Ol50Z6XTbwVp902
b7r0m7/1SmY6mXgvqrpZ0wG8oINKP/3u+cV9EkzjZ3x8xuf0w538f7Erpvlq
1Y4v7jtXVovkMUiyr+494XeZUO0RIKur7OTNxaPseA4mryuZqmdt/BkPE5SF
XHbv8PCxvCBvlqCYnb/Ly8tJyy+z9fGxlzndlbdUVd2xmKGJnZ2XbbYhqUVC
kD+jt3ZNPd/OinnWnRdEvmpWbLqsXmR5u6tm501d1dtWSVvNtk1Dj+KvVTHj
AZp8xvIQsqHJ3lX1ZUWPZt+BcNlzpdzkFkj144/Pnh49fnLjxdvn/zzJXhbn
XZ7QWO6nnyErf19vGzBQRjuTndXzfPef//E/WuIzmlFVdLcSSh49Hh8+EvYr
mrJosZ80nPAfSd/V/LKcF9mz4qJY1cR62dO6WhS06llxa3AP5vbLiWetuxc0
RN3e3dBVQHs0n+G1d786enAXZKCnScClHPNjsaLniqyr9eu/G+QRPkWvvqdF
Zd/n03aUndLBmG8rvt9e1dlLcD/umdN60V3mSsf+jOUN+aac0EA8pRdE8kX9
Uzon/TC96Z5kVftd3XZv9d9XT/Nl/XO5WuWDM2gL3Ew0OLPrQl40xg15l7SP
u9PDR/cePnp8f/r19PFsfnT4ePFoen+Rf10U8+ls/iDPDw8fPZo/Ku7S/C+L
5h3utrvpvCazzQYr+8PTdFF/KJqat7RcbuX2zV7RIHLrPsnOzrH1i7IqccCz
b7e0kQNLvJJjr5WB/rFnk+y7Cf2kKCtSZZa9R5/lVVms9n/hZcHD8dG9Pgfr
GCen37x6kn39FTH5+OHXj8ZHh0eH9DeVnQs6t6Sm4AZ//eu3BW3Pjk7WvMz5
eH5Hm/O8WpZVkZKMeKupyzmYZYINnIQfZsdvTjBufD6GeOHbul6uUma8NXB+
9EU4QX7Qu/op9vounrkbXs/TPu3yVfGsal+zaG0/Mffww0nvwb/JWq6eDq+N
+LrrVhdlvcoHFkcKaXZ29n32L/57Yi8W4z+WqznN92WRt9uGRPslqWfZ25M3
z7PjbpW313A06VYkRJq8x5PflvVFTvsdvvPy9Cvjxj1qrEhETZpyU7Cckdfd
XcpI/32NkXBwx7TCcVjiuKzGtITxJS1hvNYFjLGAMYYa51gAqbFuPB5n9IKO
LqDOOdBiVdfvtps23GnZlk4Ijd2WUxLurJmPsg2dy3K2JWWZuP/yvKhYpyci
NcWM9PzWned08oufNiUoB8G63rZdNi3AHCQG8dNFU6+Z0JXIjkmW8dVKZtEW
Bga9q5015bRoXWpHjbI8m61K+sm4xTWTyNZsXczO6fC3GDvvsnK9xuHsCppo
U3TbpmqdzUvnjGXrvHF34AYqZ8oLl6RL0hvK9XbVEcXpGudxeA24Nmn+a8ec
kds6sn/fFs2OV1PEg+EdBQlEGFL0v5aELlhtXc6auqXXV/R6kqbnReNo5vhi
tSr1ixHTsFwwvYhr8uyc9AMsdClE9wNvN2Cqub7AtcQuHU0ZwxZkMNCpyrKU
nBnRnE4YXbuget7sQIS3L55mj7969NUIFJidu3w+pyW39A7ihgusvMVRk7kQ
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
b28t8lVb3EJux+tnr5/0fzpx/xfbJx+z7AABAA==

-->

</rfc>
