What happens when you go to this site? Part 1: DNS


The first thing that happens when you type atommiccommits.io into the browser and hit enter is that it resolves the domain name.

How does that happen?

The infrastructure involved in a DNS query

Your computer makes a DNS query, over UDP, to its resolver. That’s the server responsible for resolving the DNS query.

There are 4 types of servers involved in a DNS query.

  • DNS recursive resolver: receives queries from client machines. Goes and makes additional queries.
  • Root nameserver: contains all top level domains (TLDs) of the internet.
  • TLD nameserver: the nameservers for top level domains, e.g. .com.
  • Authoritative nameserver: the last stop in the query. The one that finally answers it.

My computer uses Cloudflare’s 1.1.1.1 recursive resolver. Typically, your computer will use the one provided by your ISP. You can override it, like I did (you will not track my DNS queries AT&T!).

Let’s see this in action.

$ dig +trace atomiccommits.io

This will return the root nameservers, from the recursive resolver (1.1.1.1).

.			512518	IN	NS	a.root-servers.net.
.			512518	IN	NS	b.root-servers.net.
.			512518	IN	NS	c.root-servers.net.
.			512518	IN	NS	d.root-servers.net.
.			512518	IN	NS	e.root-servers.net.
.			512518	IN	NS	f.root-servers.net.
.			512518	IN	NS	g.root-servers.net.
.			512518	IN	NS	h.root-servers.net.
.			512518	IN	NS	i.root-servers.net.
.			512518	IN	NS	j.root-servers.net.
.			512518	IN	NS	k.root-servers.net.
.			512518	IN	NS	l.root-servers.net.
.			512518	IN	NS	m.root-servers.net.
;; Received 525 bytes from 1.1.1.1#53(1.1.1.1) in 41 ms

One of those will be used, and then we’ll try to go to a top level domain nameserver.

io.			172800	IN	NS	a0.nic.io.
io.			172800	IN	NS	a2.nic.io.
io.			172800	IN	NS	b0.nic.io.
io.			172800	IN	NS	c0.nic.io.
;; Received 628 bytes from 193.0.14.129#53(k.root-servers.net) in 30 ms

Now one of these will be used, and we’ll try to get the authoritative nameservers for atomiccommits.io.

atomiccommits.io.	86400	IN	NS	carla.ns.cloudflare.com.
atomiccommits.io.	86400	IN	NS	tanner.ns.cloudflare.com.
;; Received 602 bytes from 2a01:8840:a1::17#53(a2.nic.io) in 31 ms

Then we’ll query one of the authoritative nameservers, and get some DNS records in response.

atomiccommits.io.	300	IN	A	172.67.201.200
atomiccommits.io.	300	IN	A	104.21.58.68
;; Received 77 bytes from 162.159.44.97#53(tanner.ns.cloudflare.com) in 9 ms

The returned result are these A records.

atomiccommits.io.	300	IN	A	172.67.201.200
atomiccommits.io.	300	IN	A	104.21.58.68

DNS Records

There are a lot of different types of DNS records, but just a few we need to know for this.

  • A records contain an IP address for some domain. AAAA records are the same, for IPv6. A = address.
  • CNAME records forward one domain or subdomain to another.
  • NS records say what server is the authoritative nameserver for that domain. For this site, it’s tanner.ns.cloudflare.com..

Switching nameservers really just means changing the server and database responsible for answering questions about your domain.

DNS queries ultimately need to arrive at an A record.

adsf

(Screenshot from Julia Evan’s DNS tool.)

One limitation is that you can’t create CNAME records for the apex domain (e.g. atomiccommits.io), whereas it’s fine for a subdomain (e.g. www.atomiccommits.io). Here’s a good explanation of why.

However, Cloudflare an awesome feature called CNAME flattening, where it let’s you create a CNAME record for the root domain, and under the hood it goes and gets the IP for the domain you pointed at and creates an A record.

I use this because I deploy this site to Netlify, and they give me the url condescending-franklin-2dadfd.netlify.app. I want to just redirect atomiccommits.io to that, and a CNAME record is the most natural way to do that.

The IP addresses returned in the above A records are for Cloudflare’s proxy servers.

They proxy to the real IP address, which is a server under Netlify’s control. I do this out of habit — using Cloudflare’s proxying can protect you from DDOS attacks, provide HTTPS if you only have HTTP, and is generally a good security practice.

Additional Thoughts

Overriding domains in /etc/hosts

Sometimes my wife asks me to block Facebook and Instagram on her computer, so she can focus. I don’t like installing extra stuff unnecessarily, so I override their domains in her /etc/hosts file.

When you go to facebook.com, it’s redirecting you to www.facebook.com.

$ curl -IL facebook.com
HTTP/1.1 301 Moved Permanently
Location: https://facebook.com/
# ...

HTTP/2 301
location: https://www.facebook.com/
# ...

# Finally, when we hit www.facebook.com we get a 200
HTTP/2 200
# ...

That pattern, of having the apex domain redirect to the www subdomain, is common.

So, I make a custom DNS entry in the etc/hosts file for www.facebook.com.

0.0.0.0         www.facebook.com

Then she gets this if she tries to go there in the browser.

Note that dig and nslookup ignore your /etc/hosts file. You have to use dscacheutil to verify your change.

$ dscacheutil -q host -a name www.facebook.com

name: www.facebook.com
ip_address: 0.0.0.0

You can use that for normal DNS queries, and also to flush your OS’s DNS cache.

$ dscacheutil -q host -a name alexhwoods.com

name: alexhwoods.com
ip_address: 76.76.21.21

$ dscacheutil -flushcache

What is a DNS Zone?

A zone in the DNS is a distinct area of management.

They can correspond to one domain or several — a zone can contain multiple subdomains.

For example, atomiccommits.io and blog.atomiccommits.io could be in one zone, while shop.atomiccommits.io could be in another.

A DNS zone is really about control, access, and management.

Why does updating DNS records take a while to propagate?

There is caching everywhere in the process of resolving a domain. In your browser. In your OS. In the recursive resolver. Everywhere.

Records have a time to live, which is how long records stay in any particular cache. And since there’s many caches that a record needs to expire in, it gives the appearance of gradual propagation.

After you have an IP, what’s next?

  • TLS
  • Making the HTTP request, the simplest part
  • Rendering HTML, CSS, and JavaScript in your browser


Get new posts in your inbox


icon by smalllikeart