在之前的文章《DNS 系列(一):为什么更新了 DNS 记录不生效?》中,我们主要讲解了DNS和DNS传播。我们知道网络通信主要是通过IP地址进行的,而域名系统(DNS)就是为了保证用户在浏览器中输入域名后,可以访问到相应的网络服务器。那么这个过程是如何进行的呢?DNS记录DNS记录是位于权威DNS服务器中的指令,提供有关域和主机名的详细信息,包括哪些IP地址与该域相关联以及如何处理对该域的请求。当我们在浏览器中输入一个网站地址时,浏览器首先会在计算机内部缓存中查找属于该域名的IP地址,如果没有,则在网络提供商的数据库或其他DNS服务器中查找。DNS记录由一系列以DNS语法编写的文本文件组成。每个DNS记录都有一个单独的行。记录一般遵循这样的格式::指域,是用户在浏览器中输入的名称:TTL代表"timetolive",表示一条记录可以在缓存中暂存多长时间(以秒为单位):理论上,DNS记录有不同的类别。但在实际中,记录往往是Internet(即IN),:不同的记录类型:指定后续数据字段的大小(可选值):解析出的域名信息(如IP地址)我们可以使用dig命令查询DNS记录信息,例如:www.example.comwww.example.com。69288INA93.184.216.34表示这条记录可以在缓存中保存69288秒,其中涉及到互联网上的DNS记录(IN),指向一条A类记录,域名解析为IP地址(93.184.216.34)。DNS记录类型我们上面提到DNS记录有不同的类型,其实就是指记录中信息的类型。比较常见的有:A记录。互联网上的大部分DNS解析都是通过A记录来进行的,指向一个IPv4地址。通过这条记录,用户在浏览器中输入域名后,客户端向对应的IP地址发送HTTP请求。由于IPv4地址的大小始终为4个字节,因此rdlength的值始终为4。AAAA记录AAAA记录,也称为“quadA”,功能与A记录相同。但是,它指向一个IPv6地址。因为IPv6的长度是128位(16字节),所以这里也将rdlength预定义为16。SOA记录SOA记录包含区域文件或DNS服务器的区域信息。由于DNS区域传输是将DNS记录数据从主要名称服务器发送到次要名称服务器的过程,并且首先传输SOA记录,因此每个DNS区域都需要一个SOA记录。CNAME记录CNAME记录(规范名称记录)将记录值指向别名域而不是IP地址。对于这种类型,rdata字段填充了一个域名,可以继续指向下一个域名或IP地址。MX记录MX记录是指邮件交换器或SMTP邮件服务器,MX记录可以有多个,使用顺序通过指定优先级来决定。PTR记录PTR记录(指针)是允许反向查找的DNS记录。与“A”记录相反,它可以通过IP地址查找对应的域名。NS记录NS(名称服务器)记录指定特定区域的管辖权。一个域通常有多个NS记录,这些记录指示该域的主要和次要名称服务器。正确配置的NS记录告诉Internet在哪里可以找到域的IP地址来加载网站或应用程序。TXT记录TXT记录包含用户或机器可读信息的文本。一个域可以有很多TXT记录。SRV记录通过SRV记录,服务器可以为一些特定的服务提供主机和端口信息,例如即时通讯。某些Internet协议需要使用SRV记录才能运行。除了这些常见的DNS记录外,还有很多不太常用的记录类型,比如:APL、CAA、DNAME等。了解了DNS记录,接下来就要详细看看DNS是如何请求这些记录的。DNS请求每当我们在浏览器的搜索栏中输入URL时,首先会向本地名称服务器(LocalDNS)发出请求。本地DNS是检查记录是否在本地缓存中的组件,其查询是递归/迭代的。Client和LocalDNS都是递归查询,这是最常见的查询方式。具体来说,如果LocalDNS无法响应请求,它会继续向其他根域名服务器而不是客户端发送查询请求,即继续为客户端查询,而不是让客户端自己进行下一次查询。相反,会反复查询本地DNS和其他名称服务器。具体来说,如果LocalDNS请求的DNS服务器不能回答查询,它将返回下一个DNS服务器的地址作为答复。然后LocalDNS向下一个DNS服务器发送新的请求,并继续搜索,直到找到一条记录。所以LocalDNS查询的整体过程是先将之前获取的IP地址记录到缓存中,根据请求将结果传递给客户端。如果所需的记录不在本地DNS缓存中,请求将被转发到相应ISP的DNS服务器。如果当前DNS服务器不能回答查询,它将请求转发到不同的DNS服务器。请注意,递归查询通常比迭代查询更快。因为递归DNS服务器缓存它执行的每个查询的结果并将结果保存TTL时间。当递归解析器收到对其缓存中已有的IP地址的查询时,它可以快速将结果提供给客户端,而无需与其他DNS服务器通信。然而,允许在开放的DNS服务器上进行递归查询会产生安全漏洞,并且这种配置容易受到DNS放大攻击和DNS缓存中毒。知道了DNS记录,下次遇到无法访问网站的错误信息时,可以先检查一下是不是DNS有问题。如果您是网站管理员,您可以检查您的DNS记录是否配置错误,或者您的DNS服务器是否没有响应。如果您是网站访问者,可以尝试切换网络或更换本地DNS来解决。推荐阅读Redis改进之路关于GIN的路由树。什么是索引?