DNS

最后编辑于 2024-02-02

关于域名系统(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地址返回给主机

resolver

域名层级

域名层级可以看成是反向的Unix文件目录,例如www.example.com可以看成/com/example/wwwhierarchy

hierarchy-2.结尾的域名称为FQDN(fully qualified domain name),也称为绝对域名(absolute domain name)。绝对域名可以在树状图中指示唯一的位置,一般在DNS服务器中使用,日常使用不会碰到;没有以.结尾的域名会自动补全。例如,www.example.com补全后是www.example.com.,可以分成几部分:

example.com

分别是子域名(www),二级域名(example),顶级域名(.com)和根域名(.)

域名记录类型

上面提到域名可以分为多个层级,有时我们会碰到www.example.comexample.com都可以进去同一个网站的情况,这是为什么呢? 前文提到DNS查询返回的是A记录,DNS服务器中的类型有很多种,最常见的是A记录(还有AAAA记录用于查询IPv6的结果),包含了域名和IP地址:

example.comrecord typevalueTTL
@(@表示这是根域的记录)A192.0.2.114400

还有CNAME记录(canonical name),用于给域名取别名,www.example.comexample.com指向同一个记录就是使用了CNAME记录:

blog.example.comrecord typevalueTTL
@CNAMEis an alias of www.example.com32600
www.example.comrecord typevalueTTL
@CNAMEis an alias of example.com32600

NS记录(name server记录) 表示哪个服务器对该域名具有权威性,用于指示权威服务器或辅助服务器。

example.comrecord typevalueTTL
@NSns1.exampleserver.com32600

SRV记录(service记录) 类似A记录,但是它还包含了端口的内容,用于给特定服务指定域名 SRV 记录必须指向一个 A 记录或一个 AAAA 记录。它们列出的服务器名称不能是CNAME

PTR记录(pointer记录) 指针记录用于反向DNS查找,即提供IP地址,查询是否存在对应的域名。 查询邮件发送方IP对应的域名是否为邮件发送方声称的域名,可以用于邮箱的垃圾邮件检测

MX记录(main exchange记录) 用于获取邮箱子域名

example.comrecord typevalueTTL
@MX10mailhost1.example.com
@MX20mailhost2.example.com