DNS
关于域名系统(Domain Name System)的笔记
DNS的定义
DNS是Domain Name System的缩写,其本质上是一组分布式服务器,提供将域名和IP地址转换的服务
一般DNS使用UDP协议,但同时也支持TCP,有时域名会发送大于512KB的响应,此时会用到TCP连接;在进行Zone Transfer时也会用到TCP,这属于DNS服务器管理的问题,与一般用户无关。
值得注意的是,DNS属于应用层的服务,DNS查询的调用(getaddrinfo(3)
)位于libc中,不是系统调用,内核中实现的TCP/IP协议栈完全不关心域名,只关心IP地址和端口等
DNS的一般查询
一般的主机DNS查询将example.com
转换为IP地址的过程如下:
- 先检查本地的DNS缓存有没有需要的结果,没有则请求resolver(解析服务器),一般是主机配置的DNS服务器,例如
1.1.1.1
- resolver检查自己的缓存有没有该域名的记录,若有则返回,此时若返回为非权威记录,因为是在缓存里找到的(缓存有过期风险),而不是权威服务器返回的(递归请求)
- 如果resolver缓存没有该记录,则会像根服务器(Root Server)请求,根服务器IP的数量是固定的,目前为13个(2024年2月),它会将resolver请求重定向到顶级域服务器。
一个普遍的误解是,世界上只有 13 台根服务器。实际上根服务器有许多,但只有 13 个 IP 地址用于查询不同的根服务器网络。DNS 原始架构的限制要求根区域中最多只能有 13 个服务器地址。在 Internet 面世之初,这 13 个 IP 地址的每一个都只有一台服务器,其中大多数位于美国。
如今,这 13 个 IP 地址中的每一个都有多个服务器,这些服务器使用 Anycast 路由基于负荷和距离分发请求。目前,地球上每座有人生活的大陆上都分布着 600 多台 DNS 根服务器。
- 根服务器将resolver的请求重定向到顶级域服务器(TLD Server),这个例子是
.com
,顶级域服务器管理该顶级域下的所有内容,它再将resolver的请求重定向到权威服务器。 - 权威服务器中包含该域所有的域名的记录,这里获取的记录为权威记录,在这里可以获得该域名的IP地址(A记录)
- resolver将获取到的IP地址返回给主机
域名层级
域名层级可以看成是反向的Unix文件目录,例如www.example.com
可以看成/com/example/www
:
以.
结尾的域名称为FQDN(fully qualified domain name),也称为绝对域名(absolute domain name)。绝对域名可以在树状图中指示唯一的位置,一般在DNS服务器中使用,日常使用不会碰到;没有以.
结尾的域名会自动补全。例如,www.example.com
补全后是www.example.com.
,可以分成几部分:
分别是子域名(www),二级域名(example),顶级域名(.com)和根域名(.)
域名记录类型
上面提到域名可以分为多个层级,有时我们会碰到www.example.com
和example.com
都可以进去同一个网站的情况,这是为什么呢?
前文提到DNS查询返回的是A记录,DNS服务器中的类型有很多种,最常见的是A记录(还有AAAA记录用于查询IPv6的结果),包含了域名和IP地址:
example.com | record type | value | TTL |
---|---|---|---|
@(@表示这是根域的记录) | A | 192.0.2.1 | 14400 |
还有CNAME记录(canonical name),用于给域名取别名,www.example.com
和example.com
指向同一个记录就是使用了CNAME记录:
blog.example.com | record type | value | TTL |
---|---|---|---|
@ | CNAME | is an alias of www.example.com | 32600 |
www.example.com | record type | value | TTL |
---|---|---|---|
@ | CNAME | is an alias of example.com | 32600 |
NS记录(name server记录) 表示哪个服务器对该域名具有权威性,用于指示权威服务器或辅助服务器。
example.com | record type | value | TTL |
---|---|---|---|
@ | NS | ns1.exampleserver.com | 32600 |
SRV记录(service记录) 类似A记录,但是它还包含了端口的内容,用于给特定服务指定域名 SRV 记录必须指向一个 A 记录或一个 AAAA 记录。它们列出的服务器名称不能是CNAME
PTR记录(pointer记录) 指针记录用于反向DNS查找,即提供IP地址,查询是否存在对应的域名。 查询邮件发送方IP对应的域名是否为邮件发送方声称的域名,可以用于邮箱的垃圾邮件检测
MX记录(main exchange记录) 用于获取邮箱子域名
example.com | record type | value | TTL |
---|---|---|---|
@ | MX | 10 | mailhost1.example.com |
@ | MX | 20 | mailhost2.example.com |