Skip to main content
What Is DNS? How It Works and What Every Record Type Does
On this page

What Is DNS? How It Works and What Every Record Type Does

31 August 2026

Almost everyone knows the one sentence about DNS: it turns names into IP addresses. That sentence is true and it explains about a third of what your domain is actually doing. The other two thirds are records that say where your mail goes, which certificate authorities may issue for you, which servers may send on your behalf, which protocol versions your site speaks, and whether any of the answers can be trusted at all. There are 99 record types in the official register. You will use nine of them, meet six more, and want to recognise the rest when a provider's control panel puts them in a dropdown.

This article explains what DNS is and how a lookup really works, then walks through every record type: the ones every domain has, the ones that solve a specific problem, the DNSSEC set, the ones you query with rather than store, and the fossils. It ends with the complete register of every type IANA has assigned, so you never have to guess what a name in a dropdown means.

The Domain Name System, from the first lookup to the last record type.

Goal: after reading this you can look at any zone, name every record in it, and say what breaks if it is wrong.

1. The Basics

The Domain Name System (DNS) is the internet's directory. It is usually described as a phone book, which is comforting and slightly wrong, because a phone book is one document that somebody prints. DNS is a distributed database with delegated authority: no single machine holds it, no single organisation publishes it, and every part of it is answered by whoever was handed responsibility for that part.

That delegation is the whole design. The root delegates .nl to the Dutch registry. The Dutch registry delegates petermartin.nl to whichever name servers the owner nominated. Those name servers answer for everything below it. Each level knows only enough to point at the next one.

The right mental model: DNS is not a lookup table, it is a chain of referrals. Nobody has the whole answer; everybody knows who to ask next. Almost every confusing DNS problem is a broken link in that chain, or a cached copy of a link that has since changed.

1.1 What a Record Actually Is

Everything DNS publishes is a resource record, and every resource record has the same five fields. Once you can read those five fields, every record type in this article is the same shape with different data in the last slot.

$ dig +noall +answer petermartin.nl A
petermartin.nl.         265     IN      A       23.88.98.40
      |                  |      |       |            |
      |                  |      |       |            └─ RDATA: the answer itself
      |                  |      |       └────────── TYPE: what kind of answer this is
      |                  |      └───────────────── CLASS: always IN, in practice
      |                  └─────────────────────── TTL: seconds a resolver may cache it
      └───────────────────────────── NAME: the name this record belongs to
FieldWhat it meansWorth knowing
Name The name the record hangs off The trailing dot is the root. A name written with it is fully qualified
TTL How many seconds a resolver may keep the answer Your only control over how fast a change reaches the world
Class Which network family the record is for Always IN (Internet). CH and HS exist and you will never publish one
Type What kind of information this is The subject of most of this article
RDATA The record's actual content Its format is defined per type, and that is the only thing that differs

The class field is a fossil from a time when the designers expected DNS to serve several separate networks. In practice you will type IN or leave it out for the rest of your career. The one place CH still shows up is a diagnostic trick: name servers answer hostname.bind CH TXT with the identity of the physical machine you reached.

1.2 Records Travel in Sets

A name plus a type is not one record, it is a resource record set (RRset): every record at that name with that type, treated as one unit. Ask for the NS records of a domain and you get all of them, in one answer, in no meaningful order:

$ dig +noall +answer petermartin.nl NS
petermartin.nl.         21600   IN      NS      chelsea.ns.cloudflare.com.
petermartin.nl.         21600   IN      NS      finley.ns.cloudflare.com.

This is not a display detail, it has three consequences you will meet in practice. A resolver caches the whole set or none of it. DNSSEC signs the whole set, not the individual records. And every record in a set must carry the same TTL: RFC 2181 (July 1997) deprecated differing TTLs within an RRset and told clients to treat a mismatch as an error. If a control panel appears to let you give two A records different TTLs, it is lying to you politely.

1.3 The Four Roles

Four different kinds of software are involved in every lookup, and mixing them up is the single most common source of confusion. They are not interchangeable.

RoleWhat it doesExample
Stub resolver The tiny client inside your machine. Knows nothing, asks one server, believes the answer. The resolver library in your operating system
Recursive resolver Does the actual chasing, from the root downwards, and caches what it learns. Your ISP, 1.1.1.1, 8.8.8.8
Authoritative server Holds the real records for a zone and never caches anything. The source of truth. chelsea.ns.cloudflare.com
Registry Runs a top-level domain and publishes the delegation that points at your name servers. SIDN for .nl, Verisign for .com

The practical consequence: "the DNS is wrong" is never a complete sentence. A record can be correct on the authoritative server, stale in a recursive resolver, and absent from your own machine's cache, all at the same moment, and all three are behaving properly.

1.4 One Lookup, Start to Finish

When a browser needs www.petermartin.nl and nothing is cached anywhere, this is the journey:

your browser
    ↓  "where is www.petermartin.nl?"
stub resolver (in the operating system)
    ↓
recursive resolver (your ISP, or 1.1.1.1)
    ↓  asks a root server:    "who handles .nl?"
    ↓  asks the .nl registry: "who handles petermartin.nl?"
    ↓  asks Cloudflare:       "what is www.petermartin.nl?"
    ↓
back up the chain, cached at every step that allows it

Three questions to three different organisations, for one name. This sounds slow, and the first lookup is. Every step after that is answered from cache until the TTL runs out, which is why the second visit to a site feels instant.

Those two behaviours have names worth knowing, because documentation uses them without explanation. Your machine asks a recursive query: "give me the final answer, do the work". The resolver then makes iterative queries: "I do not need the answer, just tell me who to ask next". Almost nothing on the internet answers a recursive query for a stranger, and section 7.12 covers what happens to the ones that do.

The important part is what gets cached and where. The recursive resolver caches the answer and the referrals, so the next visitor asking for a different name under .nl skips the root entirely. This is also why a change you make is invisible to some people and not others: their resolvers cached at different moments. Nothing is being pushed anywhere. There is no propagation.

1.5 How the Question Travels

One layer below the chain of referrals is the transport, and it explains a family of failures that look like nothing else. Classic DNS runs on port 53, over both UDP and TCP. The old shorthand "DNS uses UDP" was never the whole story.

The reason both exist is a size limit set in 1987. RFC 1035 caps a plain UDP DNS message at 512 octets. A larger answer does not fail: the server sends back what fits, sets the truncation flag (tc) in the header, and the client is expected to ask again over TCP. RFC 7766 (March 2016) made supporting TCP a requirement rather than an option.

EDNS(0) (RFC 6891, April 2013) is the escape hatch. A client attaches an OPT pseudo-record advertising how large a UDP answer it can accept, and modern servers reply within that. You can see the negotiated value in any dig output:

$ dig petermartin.nl CAA | grep -E 'EDNS|MSG SIZE'
; EDNS: version: 0, flags:; udp: 1232
;; MSG SIZE  rcvd: 465

That answer is 465 bytes, comfortably inside the 1232 the two ends agreed on and comfortably outside the 512 that plain DNS allows. This matters in practice because DNSSEC and long TXT records make answers big. A firewall that permits UDP port 53 and blocks TCP port 53, which was once common advice, breaks exactly the large answers a signed zone produces, and it breaks them intermittently.

Three encrypted transports now sit alongside port 53. None of them changes a single record you publish, so as a domain owner there is nothing to configure:

TransportPortStandardWhere you meet it
DoT, DNS over TLS 853 RFC 7858, May 2016 Operating system resolvers, mobile "private DNS"
DoH, DNS over HTTPS 443 RFC 8484, October 2018 Browsers, which is why one can disagree with the machine it runs on
DoQ, DNS over QUIC 853 (UDP) RFC 9250, May 2022 Newer resolvers; the least deployed of the three

All three encrypt the conversation between a client and its resolver. Not one of them encrypts anything between that resolver and your authoritative servers, and none of them proves an answer is genuine. That is DNSSEC's job, and the two are constantly confused: encryption hides the question, DNSSEC signs the answer.

1.6 Who Publishes These Records

Before the record types, one piece of vocabulary that costs people days. A domain feels like one thing you bought. It is really three separate arrangements with three different companies, and knowing which one to log into is most of the battle.

PartyWho they areWhat they control
Registry The operator of a whole top-level domain. One per TLD. The authoritative list of which name servers serve your domain
Registrar The company you buy from, accredited to write into the registry. Your registration, renewals, and the name servers submitted on your behalf
Registrant You. Every record inside the zone, once the delegation points at your servers

You never talk to the registry. You talk to a registrar, and the registrar talks to the registry on your behalf. On top of that split, the company answering DNS queries and the company running the website are frequently two more unrelated businesses. Here is one domain taken apart:

$ whois petermartin.nl | grep -A3 '^Registrar'
Registrar:
   Registrar.eu
   Hofplein 20
   3032AC Rotterdam

$ dig +short petermartin.nl NS
finley.ns.cloudflare.com.
chelsea.ns.cloudflare.com.

$ dig +short petermartin.nl
23.88.98.40

$ whois 23.88.98.40 | grep -iE '^(netname|org-name|country):'
netname:        CLOUD-NBG1
org-name:       Hetzner Online GmbH
country:        DE

Three companies for one domain name, which is a perfectly normal and well-run setup. It is also why "my hosting company should fix my DNS" so often goes nowhere: the hosting company may have nothing to do with it. Keep this table, because it answers the question that actually blocks people.

You want toLog in to
Point the site at a new server The DNS host (edit the A record)
Move to a different DNS provider The registrar (change the name servers)
Change where mail is delivered The DNS host (edit the MX records)
Renew the domain, or stop it expiring The registrar
Turn on DNSSEC Both: the DNS host signs, the registrar publishes the DS record
Fix a slow site or a certificate error Probably nobody in this table. It is the web host

Rows two and five are the ones people get wrong. Changing name servers is a registrar action, not a DNS action, and no amount of editing records at either provider will do it. Turning on DNSSEC needs both ends to agree, which is why it is the change most likely to be left half-finished.

1.7 What This Article Covers

Sections 4 to 6 are the record types, which is most of the article: what each one is for, what its data means, and what happens when it is wrong. Section 6 ends with the complete register of every type IANA has assigned.

Two neighbouring subjects are covered elsewhere so this article does not repeat them. For the tooling side, reading dig output block by block, tracing a delegation and comparing a cache with the source, see the companion article on the dig command. For how a name resolves on a machine you administer, including /etc/resolv.conf, nsswitch.conf and container DNS, see DNS on Linux. And for where the DNS lookup sits in the whole page load, see what actually happens when you enter a URL.

Back to top

2. Where the Name Comes From

DNS stands for Domain Name System, and the word carrying the meaning is domain.

DNS  =  Domain Name System

A domain is a region of authority. It is the same sense as in "the domain of a king": a bounded area where one party decides. In DNS, owning a domain means you decide what every name inside it resolves to, and nobody above you in the tree can tell you otherwise. They can only decide whether to keep pointing at you.

Names are read right to left, from the most general to the most specific, and each dot-separated piece is called a label:

www . petermartin . nl .
 |        |          |  |
 |        |          |  └─ the root, written as an empty label
 |        |          └─── top-level domain, run by a registry
 |        └─────────── the domain you registered
 └─────────────────── a name inside your zone, your choice

That trailing dot is not decoration. It is the root of the tree, and a name written with it is fully qualified: it means exactly this name and nothing else. Most software lets you leave it off and adds it silently, which is why it looks unfamiliar even to people who have used DNS for years. In a zone file the difference is expensive: example.com without the dot becomes example.com.example.com, and that mistake has taken sites down.

Two more terms are worth pinning down, because they are used loosely everywhere.

  • A zone is the part of the tree that one set of name servers actually answers for. A domain is what you registered; a zone is what a server serves. They are usually the same thing, and stop being the same the moment you delegate a subdomain to somebody else.
  • The apex is the bare domain at the top of a zone: example.com with nothing in front of it. It is not a subdomain of anything you control, and it behaves differently from every other name in the zone. Section 4.2 explains why.

The vocabulary is not just pedantry: RFC 9499 (March 2024) exists purely to define these terms, because a generation of arguments turned out to be two people using "domain" to mean different things.

Back to top

3. A Short History

DNS was not designed as a grand architecture. It was written to solve an administrative crisis: one text file that had stopped scaling.

Before DNS, every machine on the ARPANET kept a local copy of a single file called HOSTS.TXT, maintained by the Network Information Center at the Stanford Research Institute. Every new host meant editing that file, and every machine on the network downloading it again. As the network grew, the file grew, the downloads grew, and the delay between "a host exists" and "everyone knows about it" grew with them.

In November 1983 Paul Mockapetris published the replacement as two documents: RFC 882, "Domain Names Concepts and Facilities", which described the idea, and RFC 883, which defined how it worked on the wire. The insight was to stop distributing a file and start distributing authority.

The record types tell the rest of the story. The original specification defined sixteen of them, and everything added since has been a response to something the internet turned out to need.

YearMilestoneRecord types it brought
Until 1983 One HOSTS.TXT file, edited by hand and copied to every machine none: there were no records
1983 RFC 882 and RFC 883 replace the file with a delegated tree the first set
1987 RFC 1034 and RFC 1035 supersede them, and still define DNS today A NS CNAME SOA PTR MX TXT HINFO and eight more
1996 Somebody puts latitude and longitude in DNS, because it was possible LOC
2000 Service discovery: find the port, not just the host SRV
2003 IPv6 gets an address record, after an earlier attempt is abandoned AAAA (replacing A6)
2005 DNSSEC is specified: answers become provable DS DNSKEY RRSIG NSEC
2010 The root zone is signed on 15 July, giving the chain of trust a starting point -
2012 DANE lets a domain pin its own certificate TLSA
2014 SPF's own record type is deprecated after eight years; certificate issuance gets a control SPF retired, CAA arrives
2016-2018 DNS over TLS and DNS over HTTPS make the question private -
2023 RFC 9460 gives DNS its first genuinely new idea in years SVCB and HTTPS
Today 99 named code points in the register, and it is still growing two more added in August 2026

Two things are worth taking from that table. The core specification is from 1987 and has never been replaced, only extended: the wire format you are using today was designed for a network of a few thousand machines. And the additions cluster around three themes, which is the whole history of the internet in miniature - finding services rather than hosts, proving an answer is genuine, and keeping the question private.

Back to top

4. The Records Every Domain Has

Nine record types cover almost every zone you will ever edit. If you learn only this section you can read and fix most DNS problems, because most DNS problems live here.

4.1 A and AAAA: Names to Addresses

These are the two everyone means when they say "DNS". A holds an IPv4 address, AAAA holds an IPv6 address. They are separate types, separate RRsets, and separate questions: a client that wants both asks twice.

$ dig +noall +answer petermartin.nl A
petermartin.nl.         265     IN      A       23.88.98.40

$ dig +noall +answer petermartin.nl AAAA
petermartin.nl.         300     IN      AAAA    2a01:4f8:c0c:6848::1

The name AAAA is not an acronym. An IPv4 address is 32 bits; an IPv6 address is 128 bits, which is four times as long, so the record got four times as many letters. It is pronounced "quad A", and it was standardised in RFC 3596 in October 2003 after an earlier and more clever design, A6, was abandoned for being too clever.

Two practical points. First, publishing several A records for one name spreads clients across them, which is round robin load distribution and is older than every load balancer product on the market. It is not failover: DNS has no idea whether a server is alive, so a dead address keeps being handed out until you edit the zone. Second, publishing an AAAA record commits you to actually serving on it. A stale AAAA pointing at an address you no longer answer on produces the worst class of bug there is, where the site works for most people and hangs for the ones with working IPv6.

4.2 CNAME: One Name Is Another Name

A CNAME (canonical name) says "this name is really that name, go and ask again". It is an alias at the DNS level, not a redirect: the browser's address bar never changes, because the browser never sees it.

$ dig +noall +answer www.petermartin.nl CNAME
www.petermartin.nl.     300     IN      CNAME   petermartin.nl.

The rule that catches everybody exactly once: a CNAME cannot sit next to any other record at the same name. That is not a provider restriction, it is in RFC 1034. If www is a CNAME, then www can have nothing else - no MX, no TXT, no A.

Which is why you cannot put a CNAME on the apex. The apex always carries SOA and NS records, because that is what makes it a zone. A CNAME there is not merely discouraged; it is unrepresentable. This collides directly with modern hosting, where providers hand you a name rather than an address precisely so they can change the address behind it. The workarounds, in order of preference:

OptionHow it worksTrade-off
ALIAS / ANAME / CNAME flattening The DNS provider resolves the target for you and publishes the result as a plain A record Not a standard, so it is a provider feature. Works well; ties you to that provider
Redirect the apex Point the apex at a small server that sends visitors to www Clean and portable, but needs something to run the redirect
A plain A record Hard-code the address Simple, until the provider changes the address without telling you

One more cost worth knowing: a CNAME is a second lookup. Chaining them - a to b to c to an address - works, and every hop is another round trip on a cold cache. Two is already more than you need.

4.3 NS: Who Answers for This Zone

NS records name the authoritative servers for a zone. They are the only record type that exists in two places at once, and that duplication is the source of a whole family of hard-to-see problems.

$ dig +noall +answer petermartin.nl NS
petermartin.nl.         21600   IN      NS      chelsea.ns.cloudflare.com.
petermartin.nl.         21600   IN      NS      finley.ns.cloudflare.com.

The copy above lives inside the zone itself. A second copy lives in the parent zone, published by the registry, and that is the one resolvers actually follow. You do not edit the parent's copy at your DNS provider; you edit it at your registrar, which submits it to the registry. This is why "I changed my name servers at my DNS host and nothing happened" is such a common sentence: nothing was going to happen.

NS records are also how you hand a subdomain to somebody else. Publish NS records for shop.example.com pointing at another provider's servers and that whole branch leaves your zone. Do this only when a different team genuinely needs to run its own records: it creates a second place for things to break and a second chain of trust to keep intact.

4.4 Glue Records: Solving the Chicken and Egg

Section 4.3 has a hole in it. If example.com says its name servers are ns1.example.com and ns2.example.com, then finding example.com requires finding ns1.example.com, which requires asking the name servers for example.com. A resolver following that chain never starts.

The parent zone breaks the loop by publishing the addresses itself, alongside the delegation. Those addresses are glue records. Ask a root server about .nl and you can watch it happen:

$ dig +noall +authority +additional nl. NS @a.root-servers.net
nl.                     172800  IN  NS      ns1.dns.nl.
nl.                     172800  IN  NS      ns3.dns.nl.
nl.                     172800  IN  NS      ns4.dns.nl.
ns1.dns.nl.             172800  IN  A       194.0.28.53
ns1.dns.nl.             172800  IN  AAAA    2001:678:2c:0:194:0:28:53
ns3.dns.nl.             172800  IN  A       194.0.25.24
ns3.dns.nl.             172800  IN  AAAA    2001:678:20::24
ns4.dns.nl.             172800  IN  A       185.159.199.200

The NS records are the referral; the address records under them are the glue. The root is not authoritative for dns.nl and publishes those addresses anyway, purely so the next query is possible.

Two consequences. First, glue lives at your registrar or registry, not in your zone, so it is a separate thing to keep correct: a name server that changes address needs the glue updated too, and a stale glue record points the world at an address you no longer control. Second, resolvers do not trust address records that arrive unasked from just anywhere. They apply bailiwick rules, accepting only additional data a server could plausibly be authoritative for. That is why glue works for a name server inside the delegated domain and why an unrelated address in the same packet is discarded.

If your name servers are somebody else's, such as chelsea.ns.cloudflare.com, you have no glue to maintain. The delegation points at a name in their zone, and their zone answers for it. That is one more quiet argument for using a DNS provider rather than naming your servers inside your own domain.

4.5 SOA: The Zone's Own Record

Every zone has exactly one SOA (start of authority) record at its apex. It is the record that declares "a zone starts here", and it packs seven values into one line:

$ dig +noall +answer nl. SOA @ns1.dns.nl
nl.  3600  IN  SOA  ns1.dns.nl. dns.sidn.nl. 2026083114 3600 600 1209600 600
                    |            |           |          |    |   |       |
                    |            |           |          |    |   |       └─ minimum: negative cache TTL
                    |            |           |          |    |   └─────── expire: give up after
                    |            |           |          |    └────────── retry: after a failed check
                    |            |           |          └─────────────── refresh: how often to check
                    |            |           └───────────────────────── serial: the version number
                    |            └───────────────────────────────── the responsible mailbox
                    └──────────────────────────────────────── the primary name server

Two fields are worth actually reading. The serial, 2026083114, is in the near-universal YYYYMMDDnn convention: the zone was last changed on 31 August 2026, and it was the fourteenth change that day. Secondary servers compare serials to decide whether to pull a fresh copy, so a serial that goes backwards freezes your secondaries on old data.

The refresh, retry and expire fields exist for a second server. A zone normally runs on one primary, where you make changes, and one or more secondaries that copy it. A secondary checks the primary's serial every refresh seconds, retries after retry if that check fails, and stops answering altogether after expire seconds of never reaching it. With a 3600 second refresh, a change could take an hour to reach a secondary, which is why RFC 1996 (August 1996) added NOTIFY: the primary tells its secondaries that the serial moved, and they transfer immediately instead of waiting. On a managed DNS provider all of this is invisible and the refresh timer is nearly irrelevant. On your own pair of servers it decides how stale a secondary can get.

The last field is the one people misread. It is not a default TTL; it is the negative caching time. It says how long a resolver may remember that a name does not exist. Set it to a day and a typo you fix in thirty seconds keeps returning NXDOMAIN for the rest of the afternoon.

4.6 MX: Where Mail Goes

An MX (mail exchange) record says which servers accept mail for your domain. Each one carries a preference number, and lower wins:

$ dig +noall +answer db8.nl MX
db8.nl.                 3600    IN      MX      10 mx.mailprotect.be.
db8.nl.                 3600    IN      MX      50 mx.backup.mailprotect.be.

The number is a preference, not a weight or a percentage. A sender tries the lowest available and falls back upward, so everything goes to mx.mailprotect.be and the backup only ever sees mail when the first one is unreachable. Equal numbers mean "either, at random", which is the correct way to express two servers of equal standing.

Three rules that are less obvious. An MX must point at a name that has an address record, never at an IP address and never at a name that is itself a CNAME. A domain with no MX at all falls back to its A record, which is almost never what you want, so a web server with no mail software quietly starts refusing connections on port 25. And MX is only about receiving: nothing in it authorises anyone to send as you. That is the next record.

The rule about a missing MX has a companion failure that is worse and much harder to see: an MX that points at a host which no longer answers. Nothing rejects the mail. The sending server connects, gets nothing, and queues the message, retrying for the four or five days most mail systems allow before giving up. Only then does the sender receive a bounce. From your side there is no signal at all, and from theirs the answer arrives most of a week late. A dead MX is quieter than no MX, which is why it survives for years.

Testing it takes one command, and it does not send anything:

$ dig +short MX example.com
10 mail.example.com.

$ nc -vz mail.example.com 25          # or: telnet mail.example.com 25
Connection to mail.example.com 25 port [tcp/smtp] succeeded!

A live mail server answers immediately with a 220 banner. A connection that hangs and times out means every message sent to your domain is currently sitting in somebody's queue.

When the domain receives no mail at all. Plenty of domains are a website and nothing else, or exist only to redirect to another name. Leaving them with no MX is the option everybody picks by default, and it is the wrong one: senders fall back to the A record and try to deliver to your web server.

RFC 7505 (June 2015) defines the way to say it explicitly. A null MX is a single record with preference 0 and a target of ., the root:

example.com.   3600   IN   MX   0 .

That target can never be a mail server, so a sender that understands the record stops immediately and returns a permanent failure. The person who mistyped an address finds out in seconds instead of five days, and your web server stops being offered mail it was never meant to accept.

There is a practical obstacle worth knowing about in advance, because it produces a confident and wrong conclusion. Several DNS providers will not let you type this record into their control panel. The field for the mail server is validated as a hostname, and . is not one, so the form rejects it. Checked on 31 August 2026, Cloudflare's add-record form answers a target of . with "Change the content of your MX record to be a hostname (and not an IP address)", and its documentation does not mention null MX at all.

I hit this on my own domain and went looking for the provider limitation behind it. There is not one. The record itself is fine. Getting the same zone in through that provider's zone file import was accepted without complaint and served correctly by both of its name servers within seconds:

$ dig +short MX petermartin.nl @chelsea.ns.cloudflare.com
0 .

So the platform serves RFC 7505 and only one input form refuses to accept it. That distinction is worth carrying beyond this one record: a validation message in a control panel describes the form, not the DNS. When a provider appears not to support a standard record, try the zone file importer or the API before believing it, and confirm with a query against the authoritative servers rather than against the screen you typed into.

A domain that receives no mail usually sends none either, and the two halves are separate records. Saying both is four lines of DNS and no maintenance:

example.com.          3600  IN  MX   0 .
example.com.          3600  IN  TXT  "v=spf1 -all"
_dmarc.example.com.   3600  IN  TXT  "v=DMARC1; p=reject; rua=mailto:This email address is being protected from spambots. You need JavaScript enabled to view it."

Read together: nothing accepts mail here, no server may send as this name, and reject anything that claims otherwise. This is one of the few places where p=reject is safe on the first day, because the staged rollout in section 4.7 exists to discover forgotten senders and a non-sending domain has none to discover. Point rua at a mailbox on a different domain, since this one cannot receive the reports.

One thing to check before publishing -all: a contact form on the website counts as sending. If the form mails you with a From address at this domain, that is exactly what v=spf1 -all forbids, and p=reject will then have it thrown away. Either authorise the sending host in the SPF record or make the form send from a domain that already has one.

4.7 TXT: The Record Everything Borrows

TXT was designed in 1987 as a place to put a comment. It is now the busiest record type on the internet, because it is the only one where anybody can invent a new format without asking IANA for a number. Almost everything modern that lives in DNS is a TXT record with a convention layered on top.

ConventionPublished atAnswers the question
SPF the domain itself Which servers may send mail as this domain?
DKIM selector._domainkey What public key verifies this message's signature?
DMARC _dmarc What should a receiver do when SPF and DKIM disagree with the From address?
ACME DNS-01 _acme-challenge Does this person control the domain, for certificate issuance?
Site verification the domain itself Does this person control the domain, for a service's dashboard?

Every convention in that table is a workaround for the same missing feature: there is no way to publish arbitrary signed metadata about a name except by agreeing on a prefix and a text format. TXT is the internet's shared scratchpad, and the underscore prefix is how everyone agrees not to write on each other's part of it.

Here is a real SPF record, from a Dutch hosting company's domain:

$ dig +short TXT db8.nl
"v=spf1 include:_spf.relay.mailprotect.be include:spf.eprov.eu ip4:185.182.56.9
 ip4:116.203.194.8 ip6:2a01:4f8:c0c:f660::1 -all"

Read it left to right: version 1, then trust whatever these two other domains publish, then these three specific addresses, then -all, meaning "and nobody else, hard fail". The include: mechanism is what makes SPF maintainable and also what makes it fragile, because each one costs a DNS lookup and the specification caps you at ten.

DMARC is the record that turns SPF and DKIM into a decision:

$ dig +short TXT _dmarc.google.com
"v=DMARC1; p=reject; rua=mailto:This email address is being protected from spambots. You need JavaScript enabled to view it."

Deploy these in order. Publish SPF and DKIM first and let them run. Then add DMARC at p=none, which changes nothing but asks receivers to send you reports. Read those reports for a few weeks, find the legitimate senders you had forgotten - the invoicing system, the newsletter platform, the contact form on the old site - and only then tighten to p=quarantine and p=reject. Going straight to p=reject is the classic self-inflicted outage: it works perfectly for the mail you remembered and silently destroys the mail you did not.

TXT records are also where zones accumulate junk. Every service you ever trialled left a verification record behind. They are harmless individually and collectively they make a zone unreadable, so a yearly pass to delete the ones whose services you no longer use is worth the half hour.

4.8 PTR: Addresses Back to Names

A PTR record is the reverse lookup: given an address, what name admits to it? It lives in a special branch of the tree, in-addr.arpa for IPv4 and ip6.arpa for IPv6, with the address written backwards:

$ dig +noall +answer 1.1.1.1.in-addr.arpa PTR
1.1.1.1.in-addr.arpa.   1153    IN      PTR     one.one.one.one.

The reversal exists because DNS delegates right to left, and addresses are allocated left to right. Writing 23.88.98.40 as 40.98.88.23.in-addr.arpa lets a registry delegate 88.23.in-addr.arpa to whoever holds that address block, exactly as it delegates nl.

The consequence people trip over: you cannot set your own PTR record. It lives in the reverse zone for the address, which belongs to whoever owns the address space - your hosting provider. If you send mail from your own server, a missing or generic PTR is a common reason for delivery problems that look inexplicable from your side, and the fix is a support ticket, not a zone edit.

A forward record and a reverse record are also completely independent. Nothing enforces that they agree, and a mismatch is normal on shared hosting. Mail servers are the main software that cares.

4.9 CAA: Who May Issue Your Certificates

A CAA record lists the certificate authorities allowed to issue for your domain. Authorities are required to check it before issuing, which makes it a genuine control rather than a suggestion. It was standardised in RFC 8659 (November 2019).

$ dig +noall +answer petermartin.nl CAA
petermartin.nl.  3600  IN  CAA  0 issue "letsencrypt.org"
petermartin.nl.  3600  IN  CAA  0 issuewild "letsencrypt.org"
petermartin.nl.  3600  IN  CAA  0 issue "comodoca.com"
petermartin.nl.  3600  IN  CAA  0 issuewild "comodoca.com"
petermartin.nl.  3600  IN  CAA  0 issue "ssl.com"
petermartin.nl.  3600  IN  CAA  0 issuewild "ssl.com"
petermartin.nl.  3600  IN  CAA  0 issue "digicert.com; cansignhttpexchanges=yes"
petermartin.nl.  3600  IN  CAA  0 issuewild "digicert.com; cansignhttpexchanges=yes"
petermartin.nl.  3600  IN  CAA  0 issue "pki.goog; cansignhttpexchanges=yes"
petermartin.nl.  3600  IN  CAA  0 issuewild "pki.goog; cansignhttpexchanges=yes"

Ten records, covering five authorities for both ordinary and wildcard issuance. Your own dig will list them in a different order; as section 1.2 explained, an RRset has none. Each record has three fields: a flags byte (0 in practice), a tag, and a value. The tags that matter are issue for ordinary certificates, issuewild for wildcard certificates, and iodef for an address to notify when somebody tries an issuance you did not authorise.

Not all of those were my decision, and this is the part worth knowing. Cloudflare adds its own CAA records automatically once Universal SSL is on and you add any CAA record of your own, and the ones it adds are invisible in the dashboard - dig is the only place they show up. Its documented set is letsencrypt.org, pki.goog, ssl.com and sectigo.com for backup certificates, and the documentation warns the list is not exhaustive and may change for operational reasons. So a zone can gain an authority without anyone touching it: this set grew by two records on the day this article was written. The lesson generalises past one provider. Read your CAA set from the authoritative servers, not from the control panel, and if you tighten it by hand, tighten it to what your provider actually issues from rather than to the one authority you remember choosing.

It is a small, high-value record: it limits the damage if someone tricks a different authority into issuing for your name. It is also a reliable cause of certificate renewals failing years later, when a company changes provider and nobody remembers a record set in a previous job. If a renewal fails for no visible reason, check CAA early.

Back to top

5. The Records for Specific Jobs

Past the nine everyday types, the register splits into four groups: records that find a service, records that publish a key or a fingerprint, the DNSSEC machinery, and things you query with rather than store. Then there are the fossils, which are worth two minutes because you will meet their names in a dropdown.

5.1 SRV: Finding a Service, Not a Host

An A record tells a client where a machine is. It says nothing about which port to talk to, and nothing about what to do if there are three of them with different capacities. SRV, from RFC 2782 (February 2000), answers all three questions at once.

The name is structured: an underscore-prefixed service, an underscore-prefixed protocol, then the domain.

$ dig +noall +answer _sip._udp.sip.voice.google.com SRV
_sip._udp.sip.voice.google.com. 300 IN SRV 20 1 5060 sip-anycast-2.voice.google.com.
_sip._udp.sip.voice.google.com. 300 IN SRV 10 1 5060 sip-anycast-1.voice.google.com.
                                           |  |  |    |
                                           |  |  |    └─ target host
                                           |  |  └────── port
                                           |  └───────── weight, within the same priority
                                           └──────────── priority, lower wins

Priority works like MX: try the lowest, fall back upward. Weight is the part MX never had - among targets with equal priority, a client picks in proportion to the weights, so you can send twice the traffic to the bigger machine. A target of . means "this service is explicitly not offered here", which is a useful thing to be able to say.

The underscore in the name is deliberate. Underscores are not legal in host names, so a name beginning with one can never collide with a real machine. Everything that uses DNS as a metadata store adopted the convention: _dmarc, _domainkey, _acme-challenge are all the same idea.

SRV is heavily used by XMPP, SIP, LDAP, Kerberos, Minecraft and Microsoft Active Directory. It is not used by the web, and that is not an oversight - by the time SRV existed, every browser and every URL already assumed port 80. Fixing that took another twenty-three years.

5.2 SVCB and HTTPS: The First New Idea in Years

RFC 9460 (November 2023) defines two closely related types. SVCB (service binding) is the general mechanism; HTTPS is the same record specialised for web traffic so that browsers can look it up without a structured name.

What makes them different from everything before is that the data is a list of key-value parameters, extensible without a new record type ever again:

$ dig +noall +answer cloudflare.com HTTPS
cloudflare.com. 300 IN HTTPS 1 . alpn="h3,h2"
    ipv4hint=104.16.132.229,104.16.133.229
    ipv6hint=2606:4700::6810:84e5,2606:4700::6810:85e5

Read that as a set of promises made before the client connects. alpn="h3,h2" says this server speaks HTTP/3 and HTTP/2, so a browser can open a QUIC connection immediately instead of connecting over HTTP/1.1 and being told to upgrade. The ipv4hint and ipv6hint parameters carry addresses in the same answer, saving a round trip. The 1 is the priority and the . means "the target is this same name".

Google's answer is deliberately smaller, which is also worth seeing:

$ dig +noall +answer www.google.com HTTPS
www.google.com.         6393    IN      HTTPS   1 . alpn="h2,h3"

Every record type before SVCB answered one fixed question with one fixed shape. SVCB answers "what should I know before I connect to you?" with a list of parameters that can grow. It is the first type designed on the assumption that nobody knows yet what will need to go in it.

SVCB also carries ech, the parameter that publishes the key for Encrypted Client Hello. Without it, the hostname you are visiting travels in clear text at the start of every TLS handshake even though everything after it is encrypted. That is the single biggest privacy gap left in HTTPS, and the fix is delivered by a DNS record.

The other thing SVCB quietly fixes is the apex problem from section 4.2: a priority of 0 makes it an AliasMode record, which is a standardised alias that is allowed at the apex. After thirty years of provider-specific ALIAS workarounds, the standard grew the feature. Support is still arriving, so this is a "watch it land" item rather than a "deploy it today" item, but it is the direction.

5.3 ALIAS and ANAME Are Not Record Types

You will find ALIAS, ANAME or "CNAME flattening" in provider control panels. None of them is in the IANA register, none of them travels on the wire, and no resolver has ever seen one.

What actually happens is that your DNS provider resolves the target itself, on its own schedule, and publishes the result to the world as an ordinary A or AAAA record. The record type in the control panel is a user interface convenience over a background job. It works well, it is the right answer for an apex today, and the thing to remember is that it is a provider feature: moving to another provider means finding out whether they have one too.

5.4 DNAME: A CNAME for a Whole Branch

Where a CNAME redirects one name, a DNAME (RFC 6672, June 2012) redirects everything below a name:

old.example.com.    3600   IN   DNAME   new.example.com.

# a query for shop.old.example.com is answered as if it asked
# shop.new.example.com, without any record for it existing

Note what it does not do: DNAME does not redirect the name it sits on. old.example.com itself still needs its own records. That asymmetry is the reason most people who try DNAME once go back to writing the records out.

It is genuinely useful for renaming a company's entire internal subtree, and for reverse zones when an address block is re-delegated. For a normal website it is a tool you will read about and never need.

5.5 NAPTR and URI

NAPTR (naming authority pointer, RFC 3403, October 2002) is SRV with a regular expression engine bolted on. It maps a name to a service by rewriting it, and it exists mostly so that a telephone number can be turned into a SIP address:

$ dig +noall +answer sip2sip.info NAPTR
sip2sip.info.  3600  IN  NAPTR  25 100 "s" "SIPS+D2T" "" _sips._tcp.sip2sip.info.
sip2sip.info.   300  IN  NAPTR  20 100 "s" "SIP+D2U"  "" _sip._udp.sip2sip.info.
sip2sip.info.  3600  IN  NAPTR  10 100 "s" "SIP+D2T"  "" _sip._tcp.sip2sip.info.

The "s" flag means "the result is an SRV name, go and look that up next", which is why these three point straight at _sip._tcp and friends. If you are not building telephony infrastructure you will never write one.

URI (RFC 7553, June 2015) is the simpler idea that mostly did not catch on: publish a full URI, with priority and weight, at an underscore-prefixed name. It is the obvious way to say "the API for this domain is over there" and almost nobody does it.

5.6 Publishing Keys and Fingerprints

A family of record types exists for one reason: DNS is a directory every party already trusts to find you, so it is a natural place to publish "and here is what my key looks like, so you can tell a real one from a fake". They are only as trustworthy as the DNSSEC underneath them, which is why they cluster around it.

TypePublishesStandardIn practice
TLSA A TLS certificate or key, pinned by the domain itself (DANE) RFC 6698, Aug 2012 Real use in mail between servers; browsers never adopted it
SSHFP SSH host key fingerprints RFC 4255, Jan 2006 Removes the "are you sure?" prompt on first connection
OPENPGPKEY An OpenPGP public key for an address RFC 7929, Aug 2016 Rare
SMIMEA An S/MIME certificate association RFC 8162, May 2017 Experimental, rare
CERT A certificate of an unspecified kind RFC 4398, Mar 2006 The generic version nobody uses
IPSECKEY An IPsec public key for a gateway RFC 4025, Feb 2005 Niche

TLSA is the one with real deployment, because mail between servers had no other way to insist on encryption. Here is FreeBSD's mail server publishing its own certificate association:

$ dig +noall +answer _25._tcp.mx1.freebsd.org TLSA
_25._tcp.mx1.freebsd.org. 3600 IN TLSA 3 1 1
    0A7E2F469913EA64CA98AF1F31BBBCAF51920D8DF90D2972A9DC02BF7C37F404

The name encodes the port and protocol, the same underscore convention as SRV. The three numbers say which kind of certificate this is, what part of it was hashed, and which hash. A sending server that finds this record and validates it knows it is talking to the real FreeBSD mail server, not a machine that intercepted the connection. That guarantee is only worth anything if the record itself is signed, which is exactly why DANE and DNSSEC are always mentioned together.

SSHFP solves the small daily annoyance of SSH's first-connection prompt, where the honest answer to "are you sure you want to continue connecting?" is that you have no way to be sure. Publish the fingerprint and the client can check:

$ dig +short SSHFP anonscm.debian.org
cgi-grnet-01.debian.org.
4 1 4A6C5668982EE0601D8AA97D2DCA32C3BF148116

5.7 The DNSSEC Set

DNSSEC signs the records in a zone so a validating resolver can prove an answer came from you and was not modified on the way. It uses eight record types, and you will rarely create any of them by hand - a competent DNS provider generates them - but you will see them and you need to know which one lives where.

TypeJobLives in
DNSKEY The public keys the zone signs with your zone
RRSIG The signature over one RRset your zone, one per signed set
DS A hash of your key, published by the parent to vouch for you the parent zone
NSEC Proof that a name does not exist, by naming its neighbours your zone
NSEC3 The same proof with the names hashed, so the zone cannot be walked your zone
NSEC3PARAM The hashing settings NSEC3 uses your zone apex
CDS / CDNSKEY "Parent, please update my DS to this" - automates key rollover your zone, read by the parent
ZONEMD A checksum over the whole zone, for verifying a copy of it your zone apex

The chain in one command. The root vouches for .nl with a DS record:

$ dig +noall +answer nl. DS @a.root-servers.net
nl.  86400  IN  DS  17153 13 2
    C5DFDDC91E7532562A35F3C2CD30823894BE08F20101F1ABF45C8AB9739F3F49

And .nl publishes the key that hash refers to. Note the 257 on the third line: that flag marks the key-signing key, the one the DS above is a hash of. The 256 keys are zone-signing keys, rotated far more often.

$ dig +noall +answer nl. DNSKEY @ns1.dns.nl
nl.  3600  IN  DNSKEY  256 3 13 ArhUNmeRU9NE4fAbORd6DjntZ0vDP3PoQotzRxGg/...
nl.  3600  IN  DNSKEY  256 3 13 ObMZD0WbONw5/xzfY63W7kn4yVhtYwgu7pjE9L4T...
nl.  3600  IN  DNSKEY  257 3 13 aeDdFmc/JLPyva7Y4bS2SFbfWmxaiSrnqwgs+D1P...

Every signed answer carries its signature alongside it, with a validity window you can read:

$ dig +noall +answer +dnssec nl. SOA @ns1.dns.nl
nl.  3600  IN  SOA    ns1.dns.nl. dns.sidn.nl. 2026083114 3600 600 1209600 600
nl.  3600  IN  RRSIG  SOA 13 1 3600 20260928000023 20260831050721 467 nl. 4Lkw...
                                    |              |
                                    |              └─ signed on 31 Aug 2026
                                    └─────────────── expires 28 Sep 2026

That expiry date is the whole risk of DNSSEC in one field. Signatures are not permanent. If the machine that re-signs the zone stops running and nobody notices, your domain does not degrade gracefully - it vanishes for every validating resolver on the date in that field, and it looks perfectly healthy when you query the authoritative server directly.

The last piece is the strangest. DNSSEC has to prove that a name does not exist, without signing an infinite number of non-existent names in advance. The answer is to sign the gaps. Ask .nl for a name that is not there and it returns NSEC3 records saying "between these two hashed names there is nothing":

$ dig +noall +authority +dnssec zzzznotexist.nl @ns1.dns.nl
nl.  600  IN  SOA  ns1.dns.nl. dns.sidn.nl. 2026083114 3600 600 1209600 600
k36vo59bkum4osckkrd8tvibdgr0njbc.nl. 600 IN NSEC3 1 0 0 -
    K36VONMLM2T8IF3G8P5AV864OHLTB7K7 NS SOA TXT RRSIG DNSKEY NSEC3PARAM
7nch1gp6se37vhes4101tma9pdr0cm05.nl. 600 IN NSEC3 1 0 0 -
    7NCHAQDNOK5JC77VF6M30VKE5K771FH5 NS

The names are hashed for a reason. The original NSEC design named the real neighbours in plain text, which meant anyone could walk a zone from one denial to the next and enumerate every name in it. NSEC3 hashes them so the walk yields hashes instead. The trailing list - NS SOA TXT RRSIG DNSKEY NSEC3PARAM - is the set of types that do exist at that name, which is how a resolver proves "this name exists but has no MX" as distinct from "this name does not exist".

Should you sign? If your DNS provider handles the whole lifecycle including key rollovers, and pushing the DS record to your registrar is a button rather than a support ticket, turn it on. If signing would be a manual job you perform once and never revisit, the risk is real. The common middle state - zone signed, DS record never published at the registrar - achieves nothing and nobody notices, because everything keeps working.

5.8 The Ones You Query With, Not Store

Several entries in the register are not records at all. They are QTYPEs or pseudo-records: things that appear in a question or in the transport, never in a zone file. Confusing the two categories is why people go looking for a "record type OPT" in a control panel.

NameWhat it really is
OPT The EDNS(0) pseudo-record. Carries the client's maximum UDP size and the DNSSEC-OK flag, and exists only inside a packet. RFC 6891, April 2013
AXFR A request for the entire zone. Only for your own secondaries; an open AXFR hands your whole zone to anyone
IXFR The incremental version: send me only what changed since serial N
ANY (*) "Give me everything you have." See section 7.3 for why this stopped working
TSIG A shared-secret signature on a single transaction, used to authorise transfers and dynamic updates. RFC 8945, November 2020
TKEY Negotiates the key that TSIG then uses
MAILA, MAILB Obsolete query types for the experimental mailbox records

5.9 Curiosities and Fossils

The rest of the register is a museum, and it is a genuinely interesting one because each entry is a snapshot of what somebody thought the internet was going to be.

LOC (RFC 1876, January 1996) puts latitude, longitude and altitude in DNS. A handful of organisations still publish one:

$ dig +short LOC caida.org
32 53 1.000 N 117 14 25.000 W 107.00m 30m 10m 10m

That reads as 32 degrees 53 minutes north, 117 degrees 14 minutes west, 107 metres above sea level, with a 30 metre accuracy claim. It is San Diego, and it has been sitting in that zone for years doing nothing at all.

TypeWhat it was forStatus
HINFO The host's CPU and operating system, in plain text Alive in the register, a security disclosure in practice
RP Responsible person: a mailbox and a pointer to a TXT record about them Rare
WKS Well known services: which ports a host listens on Superseded by SRV, effectively dead
APL A list of address prefixes Experimental, unused
DHCID Lets a DHCP server prove it owns a name it registered Used inside managed networks
EUI48, EUI64 Hardware MAC addresses in DNS The RFC itself warns against publishing them
NID, L32, L64, LP Identifier-Locator Network Protocol, a proposal to split "who" from "where" Experimental
KX, PX, X25, ISDN, RT, ATMA, NSAP Interoperating with X.400 mail, X.25 packet networks, ISDN and ATM The networks are gone; the types remain
MD, MF, MB, MG, MR, MINFO The 1987 mail design, before MX replaced it Obsolete or experimental since the beginning
A6 A clever chained way to store IPv6 addresses Obsolete: AAAA won by being boring
NXT, SIG, KEY The first DNSSEC attempt Replaced by NSEC, RRSIG and DNSKEY
DLV DNSSEC Lookaside Validation, a bridge for the years before the root was signed Moved to historic by RFC 8749, March 2020
SPF SPF's own record type Deprecated in 2014. See section 7.1

Nothing is ever removed from the register, only marked. A code point that was handed out in 1987 stays handed out, because somewhere there is still an implementation that would misread a reused number.

Back to top

6. The Complete Register

Record types are not something a provider invents. Every one of them is a number in a single register kept by IANA, and a resolver only ever sees the number - the names in this article are for humans.

6.1 How a Record Type Gets a Number

The type field in a DNS packet is 16 bits, so there are 65,536 possible types. IANA hands them out from the DNS Parameters registry, and getting one requires either an RFC or a completed specification template reviewed by an expert. The range 65280-65534 is set aside for private use, so you can experiment inside your own network without asking anyone.

As of 31 August 2026 the register has names for 99 code points. That count includes four placeholders that were never actually defined, eight marked obsolete or deprecated, and eight that are query types rather than records. The number of types you would sensibly publish in a zone is closer to twenty-five.

6.2 What Happens When a Server Meets a Type It Does Not Know

This is the quiet design decision that lets the register keep growing. Before 2003, a name server that met an unfamiliar type had no defined behaviour, so new types could not be deployed until every server on the path understood them.

RFC 3597 (September 2003) fixed that by defining a generic representation. Any type can be written as TYPE plus its number, with the data as a length and a hex blob:

example.com.   3600   IN   TYPE65280   \# 4 0A000001

A server that does not recognise the type stores it, serves it and signs it correctly without understanding a byte of it. That is why HTTPS records could be deployed across the internet in a few years rather than a few decades: the middle of the network did not have to be upgraded first, only the two ends.

6.3 Every Assigned Type

The whole register, in order, with what each type is for and where it stands. The Everyday rows are section 4. Everything else you can look up when a control panel puts it in front of you.

TypeNo.What it is forStatus
A 1 IPv4 address Everyday
NS 2 Name servers for a zone Everyday
MD 3 Mail destination Obsolete: use MX
MF 4 Mail forwarder Obsolete: use MX
CNAME 5 This name is another name Everyday
SOA 6 Start of a zone, plus its timers Everyday
MB 7 Mailbox host Experimental, never used
MG 8 Mail group member Experimental, never used
MR 9 Mail rename Experimental, never used
NULL 10 A placeholder holding arbitrary bytes Experimental
WKS 11 Which ports a host listens on Dead: superseded by SRV
PTR 12 Address back to a name Everyday
HINFO 13 Host CPU and operating system Rare, and a disclosure risk
MINFO 14 Mailing list administration mailboxes Experimental, never used
MX 15 Where mail for this domain is accepted Everyday
TXT 16 Free text; the host for SPF, DKIM, DMARC and verification Everyday
RP 17 Responsible person for a name Rare
AFSDB 18 AFS cell database server Rare
X25 19 X.25 network address Dead
ISDN 20 ISDN number Dead
RT 21 Route-through host Dead
NSAP 22 OSI NSAP address Deprecated
NSAP-PTR 23 Reverse lookup, NSAP style Deprecated
SIG 24 Signature, first DNSSEC design Obsolete: use RRSIG
KEY 25 Key, first DNSSEC design Obsolete: use DNSKEY
PX 26 X.400 to RFC 822 mail mapping Dead
GPOS 27 Geographical position, first attempt Obsolete: use LOC
AAAA 28 IPv6 address Everyday
LOC 29 Latitude, longitude and altitude Curiosity
NXT 30 Denial of existence, first DNSSEC design Obsolete: use NSEC
EID 31 Endpoint identifier (Nimrod) Never standardised
NIMLOC 32 Nimrod locator Never standardised
SRV 33 Host and port for a named service In use
ATMA 34 ATM network address Dead
NAPTR 35 Rewrite a name into a service, with regex Specialist: telephony
KX 36 Key exchanger for a domain Rare
CERT 37 A certificate of an unspecified kind Rare
A6 38 IPv6 address, chained design Obsolete: use AAAA
DNAME 39 Redirect an entire subtree Specialist
SINK 40 Kitchen-sink experiment Never standardised
OPT 41 EDNS(0) pseudo-record, lives only in a packet Protocol, not stored
APL 42 A list of address prefixes Experimental
DS 43 Hash of a child zone's key, published by the parent DNSSEC
SSHFP 44 SSH host key fingerprint In use
IPSECKEY 45 IPsec public key for a gateway Rare
RRSIG 46 Signature over one record set DNSSEC
NSEC 47 Proof a name does not exist, in plain text DNSSEC
DNSKEY 48 A zone's public signing key DNSSEC
DHCID 49 Ties a DHCP client to a name it registered Managed networks
NSEC3 50 Proof a name does not exist, hashed DNSSEC
NSEC3PARAM 51 The hashing parameters NSEC3 uses DNSSEC
TLSA 52 A TLS certificate association (DANE) In use for mail
SMIMEA 53 An S/MIME certificate association Experimental
HIP 55 Host Identity Protocol identifier Experimental
NINFO 56 Zone status information Never standardised
RKEY 57 Key for encrypted zone data Never standardised
TALINK 58 Trust anchor link Never standardised
CDS 59 The DS record a child wants its parent to publish DNSSEC automation
CDNSKEY 60 The DNSKEY a child wants reflected in its parent's DS DNSSEC automation
OPENPGPKEY 61 An OpenPGP public key for an address Rare
CSYNC 62 Which records the parent should copy from the child Rare
ZONEMD 63 A checksum over the whole zone Specialist
SVCB 64 Service parameters, extensible without new types Arriving
HTTPS 65 Service parameters for web traffic (ALPN, ECH, IP hints) Arriving fast
DSYNC 66 Where to send delegation-synchronisation notifications New, 2025
HHIT 67 Hierarchical host identity tag for drones New, 2025
BRID 68 Broadcast remote identification for drones New, 2025
UNECE 69 A value coded per a UNECE recommendation Registered Aug 2026
ISO 70 A value coded per an ISO standard Registered Aug 2026
SPF 99 SPF's own record type Deprecated 2014: publish SPF as TXT
UINFO 100 Never defined IANA placeholder
UID 101 Never defined IANA placeholder
GID 102 Never defined IANA placeholder
UNSPEC 103 Never defined IANA placeholder
NID 104 ILNP node identifier Experimental
L32 105 ILNP 32-bit locator Experimental
L64 106 ILNP 64-bit locator Experimental
LP 107 ILNP locator pointer Experimental
EUI48 108 A 48-bit hardware address Discouraged: privacy
EUI64 109 A 64-bit hardware address Discouraged: privacy
NXNAME 128 Marker for compact denial of existence DNSSEC, 2025
TKEY 249 Negotiates the key TSIG will use Protocol, not stored
TSIG 250 Shared-secret signature on one transaction Protocol, not stored
IXFR 251 Send me only what changed Query type
AXFR 252 Send me the entire zone Query type
MAILB 253 Query for the experimental mailbox records Obsolete query type
MAILA 254 Query for the 1987 mail records Obsolete query type
* 255 Give me everything you have Query type; answered minimally since 2019
URI 256 A full URI, with priority and weight Rare
CAA 257 Which authorities may issue certificates for you Everyday
AVC 258 Application visibility and control Vendor-specific
DOA 259 Digital object architecture Never standardised
AMTRELAY 260 Automatic multicast tunnelling relay Specialist
RESINFO 261 A resolver describing its own capabilities New, 2024
WALLET 262 A public cryptocurrency wallet address Registered 2024
CLA 263 Bundle Protocol convergence layer adapter Draft, space networking
IPN 264 Bundle Protocol node number Draft, space networking
TA 32768 DNSSEC trust anchor, outside the root chain Never standardised
DLV 32769 DNSSEC lookaside validation Obsolete since 2020

Read down the Status column and the shape of the internet's last forty years is visible. Nine types carry almost all the traffic. A dozen more solve a real problem for a real community. The rest are proposals that lost, protocols that died, and one entry, SINK, that was explicitly a kitchen sink. Nothing is ever deleted, because a number handed out in 1987 can never be safely reused.

The authoritative version of this table, which is updated whenever a new type is assigned, is the IANA DNS Parameters registry. If you are reading this a year from now, check there before assuming the list above is complete.

Back to top

7. Something Most Users Do Not Know

7.1 SPF Had Its Own Record Type, and Lost It

In 2006 SPF was given type number 99, entirely to itself. Publishing your sender policy as a TXT record was supposed to be the temporary arrangement while the world caught up.

The world did not catch up. Eight years later, RFC 7208 (April 2014) deprecated the dedicated type and made TXT the only correct place. The reason is worth sitting with, because it is the strongest argument in this whole article about how infrastructure actually changes: control panels did not offer the new type, libraries did not query for it, and a sender that had to check both types was doing twice the work for zero benefit. The purpose-built record lost to the general-purpose one on deployment alone.

That is why DKIM, DMARC, MTA-STS, BIMI and every site-verification scheme since have all been built on TXT without even asking for a number. The lesson stuck.

7.2 A TXT Record Cannot Hold More Than 255 Characters at a Time

RFC 1035 stores text as a character-string: one length byte followed by that many characters. One byte, so 255 characters maximum. Anything longer has to be split into several strings inside the same record, and the reader is expected to glue them back together.

You can see it happen with any 2048-bit DKIM key, which does not fit:

$ dig +short TXT google._domainkey.nlnetlabs.nl
"v=DKIM1; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAhfvuanQm2k...
 ...UiaUufabV/EMRD7xp5GhE6arl3inx7B65gOifz" "Mg241EQM6bliIlt6Q8wTanhA8kbz...
 ...ryGX9X7msJ+v9xYEybiPZyGwnhnI6LMewcHzxtK4LFoYTrb0NOSK+tueth4Vhdz1TBbFw...

Look for the " " in the middle. That is not a typo and it is not a space in the key - it is the boundary between two 255-character strings inside one record, and a verifier concatenates them with nothing in between.

This is the source of a specific and maddening bug. Some control panels split a long key for you correctly. Some refuse it. Some accept it and silently insert a space at the join, which produces a key that is one character wrong and a DKIM check that fails with no useful message. If a long TXT record does not validate, look at the join before you look at anything else.

7.3 ANY Is Answered With a Shrug

Every DNS tutorial older than about 2019 suggests dig example.com ANY to see everything at once. Try it on a large domain today and you will get one record, or a truncation, or a polite refusal.

RFC 8482 (January 2019) is titled "Providing Minimal-Sized Responses to DNS Queries That Have QTYPE=ANY", and it exists because ANY was the perfect amplification weapon. A tiny question produced an enormous answer, and UDP does not verify who asked, so an attacker could forge a victim's address as the source and have name servers all over the world flood them with large responses.

Servers are now free to answer ANY with whatever they feel like. The practical consequence is that you must ask for the types you want, one at a time. It is more typing and it never lies to you.

7.4 A Wildcard Is a Name, Not a Type, and It Matches Less Than You Think

People talk about "a wildcard record" as though * were a type. It is not: it is a label in the name, and any type can sit on it.

*.example.com.      300   IN   A       203.0.113.10

Two surprises follow from RFC 4592 (July 2006). First, a wildcard does not match the name it sits under: the record above answers for anything.example.com and not for example.com. Second, and much less known, it stops matching as soon as any name exists below it. If a.b.example.com is defined, then b.example.com now exists as a node in the tree, and a query for other.b.example.com returns NXDOMAIN rather than falling through to the wildcard. One unrelated record can silently switch the wildcard off for a whole branch.

Third, the type matters. A wildcard A record does not cover an MX query. The answer to "does anything.example.com have an MX record" is a clean no, even with the wildcard above in place.

Wildcards also change the meaning of your zone in ways people do not intend. Every typo resolves. Every subdomain an attacker invents resolves. Monitoring that checks "does this name exist" always says yes. Use one when you genuinely serve unlimited names, such as customer subdomains on a platform. Otherwise list the names you actually have.

7.5 The Apex Problem Is Finally Being Fixed by a Record Type

For thirty years the answer to "why can I not put a CNAME on my bare domain" has been an explanation followed by a workaround. ALIAS, ANAME and flattening are all one provider's private solution to a problem the standard created.

SVCB in AliasMode is the first standardised fix. It carries an alias, it is allowed at the apex because it is not a CNAME and does not exclude its neighbours, and every resolver can be taught it because RFC 3597 already lets them carry types they do not understand. It is not deployed everywhere yet. But this is the first time in three decades that the answer is a standard rather than a provider feature, and it is worth knowing which way the wind is blowing before you pick a DNS host on the strength of its ALIAS support.

7.6 The Serial Number Can Take Your Zone Offline Without Changing a Record

The SOA serial is how secondary servers decide whether to pull a fresh copy: higher means newer. It is a 32-bit number that wraps around, compared using serial number arithmetic, and the practical rule is that it must only ever go up.

Set it backwards - by restoring an old zone file, by switching from a date-based scheme to a counter, by importing a zone into a new provider that starts at 1 - and every secondary concludes it already has something newer and stops transferring. The primary is correct, the secondaries are stale, nothing reports an error, and the two answer differently depending on which one a resolver happens to ask. It is the purest example of a DNS failure that is invisible from the place you would naturally look.

7.7 Two New Record Types Were Registered This Month

DNS is forty-two years old and the register is still moving. On 20 August 2026 two entries appeared, UNECE (69) and ISO (70), for carrying values coded according to an external standards body's registry rather than one invented for DNS.

Look at the recent additions together and the direction is clear. RESINFO (2024) lets a resolver describe its own capabilities. WALLET (2024) publishes a cryptocurrency address. DSYNC (2025) tells a child zone where to send notifications about its own delegation. HHIT and BRID (2025) identify drones. CLA and IPN are drafts for the Bundle Protocol, which is the networking used for space communication where round trips are measured in minutes.

DNS stopped being only a directory of web servers a long time ago. It is now the internet's general-purpose place to publish a small, signed, globally readable fact about a name you control - and that, rather than address lookup, is what the last twenty years of new record types have all been about.

7.8 The 13 Root Servers Are 13 Addresses, Not 13 Machines

Everyone learns that DNS has thirteen root servers, named a through m. That is true, and it leads to two wrong conclusions: that thirteen computers hold up the internet, and that they are mostly in the United States. Both are decades out of date, and you can disprove them from your own terminal.

Every root server answers a special query in the CH class that reveals which physical instance you actually reached. Ask all thirteen:

$ for L in a b c d e f g h i j k l m; do
      printf '%-22s ' "$L.root-servers.net"
      dig @$L.root-servers.net hostname.bind CH TXT +short
  done

Run from a machine in the Netherlands on 31 August 2026, that gives:

ServerInstance reachedWhereTime
a nnn1-ams5 Amsterdam 10 ms
b b1-sin Singapore 219 ms
c fra1b.c.root-servers.org Frankfurt 11 ms
d amnl7.droot.maxgigapop.net Amsterdam 5 ms
e p05.ams.eroot Amsterdam 8 ms
f AMS.cf.f.root-servers.org Amsterdam 9 ms
g groot-eur1-1 Europe 18 ms
h 001.fra.h.root-servers.org Frankfurt 10 ms
i s1.jak Jakarta 183 ms
j rootns-ams5 Amsterdam 5 ms
k ns1.it-pmo.k.ripe.net Palermo 43 ms
l cz-xuy-aa Czechia 20 ms
m M-CDG-2 Paris 12 ms

Not one of them is in the United States. Eleven answered from Europe, most within 20 milliseconds. The thirteen names are not thirteen machines; they are thirteen addresses, and each address is announced from many locations at once using anycast. The network routes you to whichever copy is nearest along its own paths, without you or your resolver knowing it happened.

The two outliers are the interesting part. From Amsterdam, b answered from Singapore and i from Jakarta, roughly twenty times slower than their neighbours. Anycast follows routing, not geography, and those two identities simply have no European instance that this network's path prefers. It is a useful reminder that "the nearest server" is a claim about BGP rather than about maps.

According to IANA's own list, the thirteen identities are run by twelve organisations, and between them they operate well over a thousand instances worldwide; root-servers.org publishes the current count. The number thirteen is a limit from 1987 on how many name servers fit in a single UDP packet, not a count of computers.

The same trick is what any competent DNS provider sells you, and it is the main reason to use one rather than running your own name server on a single machine. Your two NS records look like two servers and are really two addresses announced from dozens of sites, so a visitor in Sydney and a visitor in Rotterdam both get a nearby answer, and losing a data centre changes nothing.

7.9 You Do Not Own Your Domain

You rent it, in fixed terms, and the lease is the single point of failure most people never think about. Every record type in this article assumes the delegation still exists.

What actually goes wrong is unglamorous: the card on file expires, the renewal notice goes to a colleague who left, the domain was registered in a personal account belonging to a freelancer three agencies ago. The recovery, once a domain has lapsed and been picked up by somebody else, ranges from expensive to impossible.

Three habits remove most of that risk:

  • Registrar lock switched on, so a transfer cannot be initiated quietly.
  • Auto-renew on, with a payment method that outlives individual employees, and the registrant email pointed at a role address rather than a person.
  • Expiry monitoring that is not the registrar's own email. If the account details are wrong, the reminders go to the wrong place, which is precisely the case you are trying to catch.

7.10 NXDOMAIN Does Not Mean What Your Monitoring Thinks

Every answer carries a response code, and four of them account for almost everything you will see. They are in the header, not the records, and dig prints them on the status: line.

CodeMeansUsually caused by
NOERROR The query was answered successfully Note: this does not promise the answer section has anything in it
NXDOMAIN The name does not exist at all A typo, or a record you have not created yet
SERVFAIL The resolver could not get a valid answer Broken DNSSEC, unreachable name servers, a delegation pointing nowhere
REFUSED The server declines to answer Policy: asking a recursive resolver that does not serve you, or an AXFR you are not allowed

The distinction that catches people is between NXDOMAIN and NODATA. NODATA is not a response code; it is NOERROR with an empty answer section, and RFC 2308 (March 1998) defines it that way. It means the name exists, but not with the type you asked for:

$ dig +noall +comments petermartin.nl TLSA @chelsea.ns.cloudflare.com
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 56610
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
                                # the name is fine; it has no TLSA record

Now the part almost nobody knows, measured on 31 August 2026. Ask the authoritative server for a name that genuinely does not exist and you get NXDOMAIN. Ask any of the three big public resolvers the same question and you get NOERROR:

$ for R in chelsea.ns.cloudflare.com 1.1.1.1 8.8.8.8 9.9.9.9; do
      printf '%-26s ' "$R"
      dig +noall +comments zzznotexist.petermartin.nl A @$R | grep -oE 'status: [A-Z]+'
  done
chelsea.ns.cloudflare.com  status: NXDOMAIN
1.1.1.1                    status: NOERROR
8.8.8.8                    status: NOERROR
9.9.9.9                    status: NOERROR

The resolvers are not broken and the zone is not misconfigured. The proof of non-existence explains it:

$ dig +noall +authority +dnssec zzznotexist.petermartin.nl A @1.1.1.1
zzznotexist.petermartin.nl. 1800 IN NSEC \000.zzznotexist.petermartin.nl. RRSIG NSEC TYPE128

That TYPE128 is NXNAME, number 128 in the register in section 6.3, defined by RFC 9824 (September 2025) for compact denial of existence. Instead of maintaining a real chain of NSEC records, the server synthesises one for the exact name asked about and puts NXNAME in its type list to mean "and this name is not really here". It is cheaper to sign on the fly, and it stops a zone being walked.

The side effect is that the answer looks like NODATA to anything that does not understand NXNAME, and the resolver passes that on. Note also that dig prints TYPE128 rather than the mnemonic: this build does not know the name yet, and it is carrying the record correctly anyway. That is RFC 3597 from section 6.2, working exactly as designed, in live output.

Testing the same five zones showed the split cleanly: the four using compact denial returned NOERROR from every resolver, and nlnetlabs.nl, which still publishes a classic NSEC chain, returned NXDOMAIN from all of them. The practical warning: a monitoring check that alerts on NXDOMAIN will stay silent for a name that does not exist. Check the answer count, not the response code. I keep a self-hosted Uptime Kuma watching uptime and certificate expiry across my own and client domains, and this is the section that sent me back through its DNS checks. If yours alerts on the response code, it will stay quiet through exactly the failure it was added to catch.

7.11 Split Horizon: The Same Name, Two Answers

Some organisations answer differently for the same name depending on who is asking: a private address on the office network, a public one from outside. This is split horizon, also called split DNS or split view, and it is a legitimate design rather than a misconfiguration.

inside the office     app.example.com  →  10.10.0.20
from the internet     app.example.com  →  203.0.113.20

It is also a trap for whoever debugs it later, because two people running the same command in good faith get different answers and each concludes the other is confused. If you run split horizon, document it where the person on call will find it, and expect every external DNS checking tool to disagree with what you see at your desk.

7.12 Your Resolver Probably Does Not Tell the Root What You Asked

In the original design, a resolver looking up secret-project.internal.example.com sent that whole name to a root server, then to the registry, then to the authoritative server. Only the last one needed it. The other two learned a name they had no business knowing, and the root sees a large share of the world's queries.

QNAME minimisation, standardised in RFC 9156 (November 2021), fixes it: the resolver asks each level only the part it needs to return a referral. The root is asked about com., the registry about example.com., and only your own name servers ever see the full name.

Two things follow. As a domain owner, your authoritative servers are the only place a complete query name appears, which makes their query logs more sensitive than people assume. And as someone reading a +trace, the queries you see are deliberately shorter than the name you asked for, which is a feature and not a bug in the tool.

7.13 Knowing Where the Record Types Stop

Part of expertise is knowing which layer a problem belongs to. DNS answers exactly one question: what does this name map to? Everything a visitor experiences after that belongs to something else.

SymptomIs it DNS?Which record, or where to look instead
Site unreachable for some people, fine for others Often yes A cached record, or a delegation mismatch between parent and zone
Site loads but shows the old server Yes A cached A or AAAA; wait out the TTL
Certificate warning in the browser Almost never The web server's certificate, unless CAA blocked issuance
Certificate renewal fails for no reason Sometimes CAA, or a stale _acme-challenge TXT record
Site slow to load Almost never DNS is consulted once and cached. Look at the application or the network path
Mail arrives but lands in spam Partly SPF, DKIM and DMARC in TXT, PTR at your host; reputation is not in DNS
Mail is not delivered at all Yes MX, or an MX pointing at a CNAME or a bare IP address
"Server not found" everywhere, suddenly Yes Expired domain, expired DNSSEC signatures, or a delegation pointing nowhere
It works on your laptop and nowhere else Usually not An entry in the machine's own hosts file, or a browser using its own resolver

The fifth row is the one worth internalising. When a page takes four seconds to load, the name was resolved in the first few milliseconds and everything after that was somebody else's problem.

Back to top

8. Best Practices

  • Know your three suppliers before you need them. Write down who the registrar, the DNS host and the web host are, and who holds each login. The middle of an outage is the wrong time to discover the domain sits in a former colleague's personal account.
  • Protect the registration first. Registrar lock on, auto-renew on, a payment method that outlives employees, a role address as the registrant contact, and expiry monitoring somewhere other than the registrar's own email. Every record in this article assumes the domain still exists.
  • Set TTLs deliberately, and lower them a day before a planned move. 300 seconds for addresses, a day for NS, an hour for mail and text records. A resolver that already cached the old long TTL keeps it for the full term, so lowering it on the morning of a migration is too late.
  • Keep the apex on a flattened ALIAS or a plain A record, never a CNAME. Pick either www or the bare domain as canonical and redirect the other at the web server, rather than serving both as equals.
  • Point MX records at real names with address records. Never at an IP address, never at a CNAME. Remember that no MX at all means mail falls back to your A record.
  • Deploy mail authentication in order. SPF and DKIM first, then DMARC at p=none, read the reports for a few weeks, and only then tighten. Going straight to p=reject silently destroys the mail you forgot about.
  • Say so explicitly when a domain handles no mail. A null MX (0 .), v=spf1 -all and DMARC p=reject. Three records, no maintenance, and they close the easiest spoofing route there is. Send the DMARC reports to a mailbox on another domain.
  • Check that your MX hosts still answer. A dead MX produces no error on your side and a five-day delay on the sender's, so nothing tells you but a complaint.
  • Publish a CAA record naming the authorities you actually use. Two minutes of work, and it limits what a mis-issued certificate can do.
  • List the subdomains you have instead of reaching for a wildcard. A wildcard answers for names you never created, and it stops answering for a whole branch the moment one unrelated name appears below it.
  • Let the SOA serial only ever increase. The YYYYMMDDnn convention exists because it is hard to accidentally go backwards with it.
  • Read the last SOA field as negative caching, not as a default TTL. A long value means a typo you fixed in seconds keeps returning NXDOMAIN for hours.
  • Turn on DNSSEC if your provider manages the whole lifecycle, including key rollovers and pushing the DS record to the registrar. If it would be a manual job you do once and never revisit, think harder: a signed zone with expired signatures does not degrade, it disappears.
  • If you sign, monitor the signature expiry, not just whether the name resolves. The authoritative server will answer perfectly right up to the moment every validating resolver stops believing it.
  • Do not use round robin as failover. Several A records distribute load; DNS never checks whether a server is alive. Use health-checked records or a load balancer.
  • Clean the zone once a year. Delete verification TXT records for services you stopped using and A records for servers that no longer exist. A stale record pointing at an address somebody else was later allocated is how subdomain takeovers start.
  • Migrate a zone in a fixed order. Inventory every record, check whether DNSSEC is on, rebuild the zone at the new provider, query the new name servers directly and compare against the old ones, lower TTLs a day ahead, only then change the delegation at the registrar, and leave the old service running until the last cache has expired. Clean up after it is proven, not before.
  • Allow TCP on port 53 as well as UDP. Signed zones and long TXT records produce answers that do not fit in a UDP packet, and the retry over TCP is part of the protocol rather than an edge case.
  • Ask for one type at a time. ANY has not given a complete answer since 2019, and building a check on it means building on a shrug.
  • Check changes from outside your own network. Your resolver, your router and your browser all cache, and all three can show you something the rest of the world is not seeing.
  • When a type is unfamiliar, look it up rather than guessing. The IANA DNS Parameters registry is the authoritative list and names the RFC for every entry; RFC 9499 defines the terminology when two documents seem to disagree.
Back to top

9. Common Mistakes

9.1 Myth versus Reality

MythReality
"DNS propagation takes 24 to 48 hours." Nothing propagates. Each cache holds its copy until the TTL you published runs out. A 300 second TTL means five minutes.
"A CNAME is a redirect." It is an alias resolved before the request is made. The browser never sees it and the address bar never changes. A redirect is an HTTP status code from a web server.
"My provider does not support CNAME at the apex." Nobody does. RFC 1034 forbids a CNAME alongside the SOA and NS records that make a zone a zone.
"ALIAS is a record type." It is a provider feature. Your provider resolves the target and publishes an ordinary A record; nothing called ALIAS ever travels on the wire.
"There is an SPF record type." There was, number 99, and it was deprecated in 2014. SPF is a TXT record and always has been in practice.
"The last number in the SOA is the default TTL." It is the negative caching time: how long resolvers remember that a name does not exist.
"The MX number is a percentage of traffic." It is a preference, and lower wins. Equal values mean "either, at random". Nothing is split by proportion.
"Two A records give me failover." They give you load distribution. DNS never checks whether a server is alive, so a share of your visitors keeps reaching the dead one.
"I can set my own PTR record." It lives in the reverse zone for the IP address, which belongs to whoever owns the address space. It is a support ticket, not a zone edit.
"A wildcard is a catch-all." It only answers for names that do not exist, only for the type you created it as, and it stops answering for a branch as soon as any name appears below it.
"DNSSEC makes my site more secure." It proves answers are genuine. It does nothing for the web server, the application or the certificate, and a broken signature takes the domain off the internet.
"dig ANY shows me all my records." Not since RFC 8482 in 2019. Servers may answer with a single record, and most do.
"My hosting company controls my DNS." Often it does not. The registrar, the DNS host and the web host are frequently three different companies.
"There are 13 root servers." There are 13 addresses, announced by anycast from well over a thousand instances run by twelve organisations.
"I own my domain." You rent it. Miss a renewal and the delegation disappears along with your mail.
"DNS uses UDP." Port 53 over UDP and TCP. A plain UDP answer is capped at 512 octets; anything bigger is truncated and retried over TCP.
"NXDOMAIN means the name does not exist." It did. With compact denial of existence, all three big public resolvers now return NOERROR for a name that is genuinely absent.
"NOERROR means I got an answer." It means the query was processed. An empty answer section with NOERROR is NODATA: the name exists, your record type does not.
"DNS over HTTPS makes my DNS secure." It hides the question from the network between you and your resolver. Proving the answer is genuine is DNSSEC, and the two solve different problems.
"My domain has no mail, so it needs no mail records." It needs three: a null MX so senders fail fast, v=spf1 -all and p=reject so nobody can send as you. A silent domain is the easiest one to spoof.
"Glue records are just A records in my zone." They are addresses published by the parent alongside the delegation, maintained at your registrar, and they can go stale independently of your zone.
"The site is slow, it must be DNS." DNS is consulted once and then cached. A slow page is almost always the application or the network path.

9.2 Other Traps to Avoid

  • Forgetting the trailing dot in a zone file. example.com without it becomes example.com.example.com. Control panels usually add it for you; zone files never do.
  • Putting a CNAME next to another record. It is not allowed at any name, not only the apex. If www is a CNAME, it can have no TXT, no MX and no A.
  • Pointing an MX at a CNAME or at an IP address. Both are forbidden, both appear to work with some senders, and both fail with the strict ones you cannot afford to lose.
  • Publishing an AAAA record you do not actually serve on. The site works for most people and hangs for everyone with working IPv6, which is the hardest class of bug to be told about.
  • Chaining CNAME records three deep. Every hop is another lookup on a cold cache. It works and it is slow.
  • Letting a long TXT record be split with a space inserted at the join. The key is then one character wrong, and DKIM fails with no useful error.
  • More than ten include: lookups in an SPF record. The specification caps it, and over the limit the result is a permanent error rather than a pass.
  • Setting DMARC to p=reject on day one. Start at p=none and read the reports, or find out which systems send as you by watching their mail disappear.
  • Leaving an A record pointing at a server you released. When somebody else is allocated that address, your subdomain is serving their content.
  • Letting the SOA serial go backwards. Secondaries stop transferring, nothing reports an error, and two servers answer differently for the same name.
  • Assuming the TTL you set is the TTL in use. A resolver was handed the previous value and keeps it for the full term. Your new short TTL only applies after the old one expires.
  • Signing with DNSSEC and never publishing the DS record at the registrar. Everything keeps working and you have gained nothing, which is why this half-finished state can persist for years.
  • Leaving an AXFR open to the world. A zone transfer hands over every name you have, which is a free map of your infrastructure.
  • Keeping every record at a 60 second TTL permanently. Low TTLs are a migration tool, not a virtue. Held forever they multiply your query volume, remove the cache that keeps you reachable during a name server outage, and buy nothing on the days you change nothing.
  • Moving DNS provider with DNSSEC still enabled. The old DS record stays at the registrar, the new provider signs with different keys, and every validating resolver returns SERVFAIL. The domain does not resolve at all, and the authoritative server looks perfectly healthy. Remove the DS, wait out its TTL, migrate, then sign again.
  • Migrating only the A record. Inventory the whole zone first. The records people forget are MX, DKIM selectors, DMARC, CAA and the service verification TXT records, and each of them breaks something that is not the website.
  • Alerting on NXDOMAIN to detect a missing name. With compact denial of existence, a name that does not exist now returns NOERROR through every major resolver. Check that the answer section is empty instead.
  • Blocking TCP on port 53. Once a zone is signed or carries long TXT records, answers exceed what UDP can deliver and the retry over TCP is not optional. The failures are intermittent, which makes them expensive to diagnose.
  • An MX pointing at a host that stopped answering. Worse than having no MX, because nothing rejects anything: senders queue for four or five days and only then bounce. Connect to port 25 and look for a 220 banner; a hang means every message to your domain is stuck in a queue somewhere.
  • Leaving a domain that receives no mail with no MX record. Senders fall back to the A record and offer mail to your web server. Publish a null MX (0 .) instead and they fail immediately.
  • Concluding a provider does not support a record because its form rejected it. Control panel fields are validated more narrowly than the DNS. If the form refuses a legal record, try the zone file importer or the API, then confirm against the authoritative servers rather than against the screen.
  • Publishing v=spf1 -all on a domain whose website still sends. A contact form mailing you from an address at that domain is sending, and -all plus p=reject is an instruction to throw it away.
  • Letting glue records go stale. If your name servers live inside your own domain, their addresses are also published by the registry. Change the address in your zone only and the world keeps using the old one.
  • Believing your own browser. Browser caches, operating system caches and browser-level encrypted DNS all sit between you and reality. Check from another network before you conclude anything.
Back to top

10. Summary

DNS looks like a lookup table and behaves like an organisation chart. Almost everything that confuses people about it comes from that gap.

  • DNS is a distributed database with delegated authority. The root delegates to registries, registries delegate to your name servers, and each level knows only who to ask next. Nothing propagates; caches expire.
  • Every record has the same five fields: name, TTL, class, type, data. Only the last one differs between types, and the class has been IN for forty years.
  • A name plus a type is an RRset, not a record. It is cached as a unit, signed as a unit, and every member must carry the same TTL.
  • A domain is three arrangements with three companies: the registrar you rent it from, the DNS host that answers queries, and the web host that runs the site. Name server changes happen at the registrar; record changes happen at the DNS host. Confusing the two costs a day.
  • Nine types cover almost every zone: A and AAAA for addresses, CNAME for aliases, NS for delegation, SOA for the zone's own timers, MX for incoming mail, TXT for everything modern, PTR for reverse lookups, and CAA for certificate control.
  • The apex cannot hold a CNAME, because a CNAME may not sit beside the SOA and NS records that define a zone. ALIAS and flattening are provider workarounds; SVCB in AliasMode is the standardised fix now arriving.
  • A domain that handles no mail still needs mail records: a null MX (RFC 7505) so senders fail in seconds rather than five days, plus v=spf1 -all and p=reject so nobody can send as it. An MX pointing at a host that no longer answers is worse than none at all.
  • TXT is the busiest type on the internet because it is the only one anybody can extend without asking IANA. SPF, DKIM, DMARC, ACME challenges and every verification scheme live there.
  • SRV finds a service and a port; SVCB and HTTPS do the same for the web and carry protocol versions, IP hints and the Encrypted Client Hello key as extensible parameters.
  • DNSSEC uses eight types. DNSKEY and RRSIG in your zone, DS in the parent, NSEC or NSEC3 to prove absence, CDS and CDNSKEY to automate rollovers, ZONEMD to checksum the zone. Signatures expire, and an expired zone vanishes rather than degrades.
  • Classic DNS is port 53 over UDP and TCP. A plain UDP answer is capped at 512 octets; EDNS(0) negotiates something larger and truncation falls back to TCP. DoT, DoH and DoQ encrypt the question; only DNSSEC signs the answer.
  • Glue records break the chicken-and-egg when a zone's name servers live inside it. They are published by the parent, maintained at your registrar, and can go stale on their own.
  • Four response codes carry almost everything: NOERROR, NXDOMAIN, SERVFAIL, REFUSED. NODATA is not a code - it is NOERROR with an empty answer, meaning the name exists but not with that type. And since compact denial of existence, a name that truly does not exist returns NOERROR through the major resolvers anyway.
  • Some register entries are not records at all: OPT, TSIG, TKEY, AXFR, IXFR and ANY live in packets and questions, never in a zone.
  • IANA has named 99 code points as of 31 August 2026. Eight are obsolete, four were never defined, and RFC 3597 is why new ones can be deployed without upgrading the middle of the internet.
  • The 13 root servers are 13 addresses, not 13 machines: twelve organisations running well over a thousand anycast instances. Anycast is also what a good DNS provider sells you.
  • You rent your domain. Registrar lock, auto-renew, a role email, and expiry monitoring that does not depend on the registrar's own reminders.
  • A wildcard is a name, not a type. It answers only for names that do not exist, only for the type you created, and not at all below a branch where any other name appears.
  • The last SOA field is negative caching, and the serial must only ever go up. Both mistakes are invisible from the server you would naturally check.

The quick reference worth keeping when you open a zone you did not write:

THE NINE YOU WILL ACTUALLY EDIT
  A        IPv4 address                    AAAA   IPv6 address
  CNAME    this name is that name          MX     where mail is received
  NS       who answers for this zone       SOA    zone timers and serial
  TXT      SPF, DKIM, DMARC, verification  CAA    who may issue certificates
  PTR      address back to a name (at your hosting provider, not you)

THE RULES THAT CATCH PEOPLE
  CNAME    never beside another record, so never at the apex
  MX       must point at a name with an address, never a CNAME or an IP
  SOA      last field = negative caching; serial must only increase
  RRset    every record at one name+type shares one TTL
  wildcard only unclaimed names, only that type, and off below any child

READING A ZONE
  dig +noall +answer NAME TYPE      one type, cleanly
  dig +noall +answer +dnssec ...    with the signature and its expiry
  dig +trace NAME                   follow the delegation from the root
  dig @ns1.example.com NAME TYPE    ask the source, bypassing every cache

READING THE HEADER
  NOERROR + answers      you got what you asked for
  NOERROR + no answers   NODATA: name exists, that type does not
  NXDOMAIN               name absent - but see compact denial of existence
  SERVFAIL               DNSSEC, unreachable servers, or a dead delegation
  REFUSED                policy: wrong server, or AXFR not permitted

WHEN SOMETHING IS WRONG
  wrong server        cached A record; wait out the TTL
  mail not arriving   MX, or an MX pointing at a CNAME or a dead host
  no mail on a domain MX 0 .   +   "v=spf1 -all"   +   DMARC p=reject
  mail in spam        SPF, DKIM, DMARC in TXT; PTR at your host
  cert will not renew CAA, or a stale _acme-challenge TXT
  gone everywhere     expired domain, expired signatures, dead delegation

Most zones are small, and almost all the trouble in them comes from four or five choices made without much thought and painful to reverse. When a domain stops working for half its visitors while the control panel shows exactly what you expect, the answer is nearly always a record that is correct in one place and cached somewhere else - which is why the first question is never "what does the record say", but "who did I ask".

Back to top
What Is DNS? How It Works and What Every Record Type Does
Peter Martin
Peter Martin
Joomla Specialist

Peter is a Joomla specialist and a Linux admin for fast, secure and scalable websites.