Why four resolvers can give four answers
A recursive resolver answers from its cache when it has a valid entry and only asks your authoritative servers when it does not. Each resolver caches independently, on its own schedule, from its own location. Four resolvers therefore represent four separate snapshots of your zone, taken at four different times.
There are three distinct reasons the answers can differ, and telling them apart is the whole point of this tool:
- Caching. You changed a record; some resolvers still hold the previous value until its TTL expires. Time fixes this — nothing else does.
- Geographic or load-based steering. The authoritative server deliberately answers differently depending on where the query came from. CDNs do this constantly, which is why
google.comlegitimately returns different addresses to each of these four resolvers. This is not a fault and will never converge. - A genuinely inconsistent zone. Your authoritative nameservers do not all hold the same data — a failed zone transfer, a half-finished migration, or a lame delegation. This is the case worth panicking about, because it is invisible from any single vantage point.
How the comparison is made
Each resolver is queried through its own resolver instance bound to a single upstream IP address, so no answer can leak in from the host's own configured DNS. Every record set is normalised — sorted, lower-cased, and rendered in the same textual form — before comparison, so that a difference in record *order* (which resolvers rotate deliberately) is never reported as a difference in record *content*.
Read the full explanation of dns compare results ↓Show less ↑
Only resolvers that returned a definite answer count towards the verdict: records, an authoritative empty answer, or NXDOMAIN. A timeout or a refused query is shown in the table but excluded from the consistency check, because a dropped packet is evidence about the network, not about your zone.
| Status | Meaning |
|---|---|
| n records | NOERROR with an answer. The records are listed in full. |
| no records | The name exists but publishes nothing of this type (NODATA). |
| NXDOMAIN | This resolver was told the name does not exist. |
| timeout | No reply within the query timeout. Excluded from the verdict. |
| refused | The resolver declined to answer — usually a network-level block between this server and that IP. |
Response times include the round trip from this server to each resolver, so they say more about network distance than about resolver speed. Do not read them as a benchmark of which public DNS is fastest for you — that depends entirely on your own location.
What to do with a mismatch
- Check the TTL of the record with the full DNS lookup. If the TTL is 3600 and you changed the record 20 minutes ago, a mismatch is expected and requires nothing but patience.
- Query your authoritative servers directly. Find them with an NS lookup, then ask each one — that removes caching from the picture entirely and tells you what is actually published.
- Compare SOA serials across all your nameservers with the SOA lookup. Different serials mean the zone did not replicate, which is the one failure mode that produces genuinely inconsistent authoritative answers.
- If a single resolver returns SERVFAIL while the others answer, run the DNSSEC checker. Validating resolvers SERVFAIL on a broken chain while non-validating ones answer normally, producing exactly this split.
- For a wider view than four resolvers, run the DNS propagation checker across all 85 resolvers — four data points can miss a regional problem.
The same comparison from the command line
# The four resolvers this tool uses
for r in 8.8.8.8 1.1.1.1 9.9.9.9 208.67.222.222; do
printf '%-16s ' "$r"
dig +short @"$r" example.com A | sort | tr '\n' ' '
echo
done
8.8.8.8 104.20.23.154 172.66.147.243
1.1.1.1 104.20.23.154 172.66.147.243
9.9.9.9 104.20.23.154 172.66.147.243
208.67.222.222 104.20.23.154 172.66.147.243
# Remove caching from the equation — ask the authoritative servers
for ns in $(dig +short example.com NS); do
printf '%-28s ' "$ns"; dig +short @"$ns" example.com A | tr '\n' ' '; echo
doneThe sort matters. Without it, the same three addresses returned in three different rotations look like three different answers, and you will chase a problem that does not exist. This tool sorts for the same reason.