访问网址,正常情况下不会以直接访问的形式去访问,都是通过DNS服务器去解析,获取到 IP 地址之后去访问 (因为这样方便记忆)
那么 DNS 解析的流程是什么样子呢?
和其他 思路是一样的 本地 优先级大于 外部服务器 ,从本地到外部服务器一层一层迭代。
1 、查看本地缓存
是的,你买东西也是一样的 ,你会先看自己有没有,然后再去买
DNS 解析时 也会查看自己是否有 ,如果本地有缓存,直接使用即可 ,能够节约很多时间和资源
在 windows 环境下可以使用
ipconfig /displaydns
来查看 DNS 缓存
如果没有缓存怎么办呢?
可以想想一下,编写应用程序的时候,内存中没有的就去 硬盘中找,那么 DNS 解析也是如此
2、查看 hosts 文件 (DNS 客户端服务解析器)
想必大家做大学作业的时候,应该用过这个办法假装自己的网站,然后去装 b , 使用过该方法来做课程设计。
在 windows 下 我们可以在 C:\Windows\System32\drivers\etc 目录下找到 hosts 文件
本质上 host 文件也是一种dns解析,客户端会根据存储在 hosts 文件内部的信息进行 DNS 解析
如果依旧在 hosts 文件内部查询不到,就会去 DNS 服务器上查找了
3 、 DNS 服务器查询
DNS 服务器查询的时候,是一个逐渐缩小范围的查询了,服务器先是会检测域名的格式,然后根据格式做出不同的判断,具体行为可以参考微软官网Windows 和 Windows Server 中的 DNS 查询和查找 | Microsoft Learn 。如果是一个比较完整的域名,他会先前往 根DNS服务器 查询,也就是 . 终止 DNS 服务器,然后根据传递过来的域名,从后往前依次迭代查询 次级DNS服务器 。比如你访问 www.baidu.com 时,会在末尾添加 . 形成 www.baidu.com. 这样的 FQDN (Full Qulified Domain Name) ,然后前往 根DNS服务器 ,根DNS服务器 从后往前去找 次级DNS服务器 这里就是去查找 com ,然后以此类推,找 baidu,找 www。
这里的解析结构可以总结为下图
摘抄自DNS原理及解析过程详解 - 知乎 的图片
具体过程可以总结为以下步骤
如果查询是完全限定的域名(FQDN),这意味着它以终止点(
.
)结尾,则将查询提交到 DNS 服务器。 例如:www.contoso.com.
如果查询是一个不合格的多标签查询,这意味着它不会以终止点结尾(
.
),则 DNS 客户端会将其提交到具有终止点的 DNS 服务器(.
)。 例如:www.contoso.com.
若不合格的是单个标签查询例如
www
。 然后,根据 NIC 上的 DNS 设置,行为会有所不同。如果有 DNS 后缀搜索列表,则 DNS 客户端服务会按顺序从第一个到最后一个追加到单个标签查询,并将带有终止点(
.
)的查询提交到 DNS 服务器。 这个过程是一个重复的过程,直到用完所有 DNS 后缀搜索列表。如果未配置 DNS 后缀搜索列表,则 DNS 客户端服务会将主 DNS 后缀追加到带有终止点(
.
)的单个标签查询,并提交到 DNS 服务器。当 DNS 客户端配置为执行名称分配时,它会解除主 DNS 后缀,并在主 DNS 后缀失败时发送另一个带有终止点(
.
)的查询。 例如,如果解析www.test.contoso.com
失败,客户端将退回到www.contoso.com
如果在适配器上配置了特定连接的 DNS 后缀,则查询会被加上一个结束点(
.
)并提交到 DNS 服务器
以上摘抄自微软官网
当服务器正返回了解析之后的 IP 地址之后,客户端就可以正常访问网站了。
那么如果处理请求超时 (查询不到)呢?
和网络连接一样,每个 DNS解析请求都有他们的生存时间。
在缓存中 有 TTL 用于表示该缓存的生存时间,默认是为 3600 秒(1小时),这也是生存时间最小值。
在DNS客户端中,则是把解析出来的内容,交给缓存,使用缓存的 TTL 机制来处理失败查询
在DNS服务器当中,则是通过 DNS客户端 是否收到正确的响应来判断的,如果收到了负响应(错误的响应),或者响应超时(默认为8秒),则表示请求超时。
总结
DNS解析全流程大概可以总结为以下这张图片
摘抄自DNS原理及解析过程详解 - 知乎 的图片
这样的话,DNS全流程大概就是这样,如果文章中有什么错误或者不对的地方欢迎评论区指出或者联系博主。