很多网站管理人员大概都了解域名解析的原理和过程,但是对于一些细节问题可能不太清楚,比如当客户端对域名发起请求时,具体的解析顺序是什么样的。这里我们简单讲述以下。

1. DNS的作用

在互联网中,其实没有类似于www.example.con这样的域名方式,计算机识别的是纯数字的IP地址,如222.222.222.222,比如我们知道一个网站的IP地址,直接输入访问绝对是能打开的。

但现在网站成千上万,如果我们只能通过IP地址访问,这得需要我们花很大力气去记住这些繁琐和相似的数字,所以域名就作为一种更简便的寻址方式出现了。

那为什么会有DNS呢?因为域名是给人使用的,计算机只能识别IP地址,所以需要DNS作为桥梁将域名翻译成IP地址。这样就能保证我们通过域名也能到达对应的服务器地址了。

我们平时工作时会发现,有时候会出现能够登陆qq、微信,但是却打不开网页的情况,其中大部分原因都是DNS服务器故障造成的。因为网站需要通过DNS服务器查询解析结果,用户根据这个结果才能通过域名去访问,但是qq、微信等聊天软件,采用的是UDP传输协议,即不可靠传输协议,无需DNS服务器地址,也能登陆,所以才会出现上面的情况。

2. DNS解析过程

当客户端对域名发起访问时,会将解析请求发送给递归解析服务器,递归服务器会代替客户端进行全球递归查询。

首先递归服务器会请求根域名服务器,根域名服务器根据域名后缀,告知对应的顶级域名服务器;递归服务器再向顶级服务器发起请求,顶级域名服务器告知对应的权威服务器;递归服务器向权威服务器发起请求,权威服务器告知解析结果;递归服务器将结果告知客户端,客户端完成访问。

ps: 根域名服务器、顶级域名服务器、权威域名服务器

dns-resolve

2.1 DNS缓存

以上是DNS解析的标准流程,但是由于各种DNS缓存的存在,导致DNS解析环节更为复杂。

所谓DNS缓存是指DNS返回正确的IP地址之后,系统会将这个结果临时储存起来,并为缓存设定一个失效时间(TTL值),在TTL失效前,当再次访问这个网站,系统就会直接从DNS 缓存中将结果返回,而不必再次委托递归服务器进行全球解析查询,加快了DNS解析的流程。

当然TTL值失效后,系统还会自动再次询问DNS服务器以获取最新的解析结果。

2.2 DNS缓存分类

1) 浏览器DNS缓存:浏览器会根据一定频率缓存DNS记录;

2) 本地DNS缓存:如果浏览器缓存中找不到解析记录,就会去询问操作系统中的缓存;

3) 本地HOSTS文件:HOSTS是记录域名与IP地址一一映射关系的本地文件,Windows系统中位于C:\Windows\System32\drivers\etc;

ps: linux中host文件在/etc/hosts

4) 路由器DNS缓存:我们常用的路由器也带有自动缓存功能,路由器DNS被篡改会造成域名劫持,将访问网址定位到另外一个服务器;

5) 递归服务器缓存:递归服务器在将解析结果告知客户端的同时,将记录缓存下来,当下次请求同一个域名时,直接会将记录返回,而无需再进行全球查询。

2.3 DNS解析顺序

DNS解析顺序是“先查缓存,再递归解析”,查询顺序为:浏览器缓存—系统缓存—路由器缓存—递归服务器缓存—递归查询。

我们以www.example.com这个域名为例进行查询,具体流程如下:

1) 搜索浏览器自带的DNS缓存

当收到访问请求后,浏览器首先会查询浏览器自身的DNS缓存,这个缓存时间比较短(chrome://net-internals/#dns 这里可以查询缓存的dns记录),且只能容纳 1000条缓存,如果缓存中有对应条目,返回结果,解析到此结束。

2) 查询操作系统缓存和hosts本地文件

如果浏览器缓存中没有找到对应条目(ipconfig /displaydns可以查看),操作系统也会有一个域名解析的过程,浏览器会先搜索操作系统的DNS缓存中是否有这个域名解析记录,如果有返回结果,解析结束。

此外,电脑本地文件HOSTS中可以设定域名到IP地址的指向关系。如果HOSTS文件中保存有该域名的记录,浏览器会首先使用这个IP地址,并将其结果缓存下来,缓存时间同样受域名失效时间和缓存空间大小决定

3) 查询路由器缓存

如果浏览器和操作系统中没有域名解析记录,就会查询路由器中的DNS缓存,如果路由器DNS缓存中有解析条目,直接返回结果,解析结束。

4) 递归解析服务器缓存

如果本机和路由器DNS缓存中没有该域名的解析记录,浏览器就会向递归服务器发起请求,如果递归服务器缓存有该域名解析条目,返回结果,解析结束。

5) 查询根域名服务器 如果递归服务器缓存中没有结果,就会委托递归服务器发起全球查询,首先递归服务器会向根域名服务器发起解析请求。根域名服务器告知.com顶级域名服务器地址。

6) 查询顶级域名服务器

递归服务器向.com顶级域名服务器发起DNS请求,.com顶级服务器告知example.com所属权威域名服务器地址。

7) 查询权威域名服务器

递归服务器向example.com的权威域名服务器地址发起请求,权威服务器告知www.example.com所对应的IP地址。

8)返回解析结果

得到www.example.com的IP地址后,递归服务器将结果告知客户端,客户端对该IP地址发起访问。整个DNS解析流程到此结束。

3. Linux中如何查看和刷新DNS缓存

DNS(Domain Name System)是一个用于将域名解析为相应 IP 地址的网络服务。在 Linux 操作系统上,为了提高 DNS 查询的性能和效率,系统会缓存最近的 DNS 查询结果。但有时候你可能需要手动刷新 DNS 缓存,以便获取最新的 DNS 解析结果。本文将介绍如何在 Linux 上刷新 DNS 缓存,并提供详细的步骤。

3.1 操作步骤

以下是在 Linux 上刷新 DNS 缓存的详细步骤:

1) 步骤1:确定你的 Linux 发行版

不同的 Linux 发行版可能使用不同的 DNS 解析工具和服务。在开始之前,首先确定你正在使用的 Linux 发行版。本文将介绍两种常见的发行版:Ubuntu 和 CentOS。

2)步骤2:Ubuntu 上刷新 DNS 缓存

  • 方法1:使用 systemd-resolved 服务

Ubuntu 使用 systemd-resolved 服务来处理 DNS 解析和缓存。要刷新 DNS 缓存,你可以执行以下命令:

# sudo systemd-resolve --flush-caches

这将清除 systemd-resolved 服务的 DNS 缓存,并使其从头开始重新解析 DNS。

  • 方法2:重启 systemd-resolved

服务另一种方法是重启 systemd-resolved 服务,这将同时清除缓存并重启服务。执行以下命令:

# sudo systemctl restart systemd-resolved

3) 步骤3:CentOS 上刷新 DNS 缓存

  • 方法1:使用 NetworkManager服务

CentOS 使用 NetworkManager 服务来管理网络连接和 DNS 解析。要刷新 DNS 缓存,可以执行以下命令:

# sudo systemctl reload NetworkManager

这将重新加载 NetworkManager 服务并清除 DNS 缓存。

  • 方法2:重启 NetworkManager服务

另一种方法是通过重启 NetworkManager 服务来刷新 DNS 缓存。执行以下命令:

# sudo systemctl restart NetworkManager

4) 步骤4:其他 Linux 发行版 对于其他的 Linux 发行版,你可以尝试以下方法之一:

  • 重启网络服务:通过执行 sudo systemctl restart network 或 sudo service network restart 命令来重启网络服务,这可能会刷新 DNS 缓存。

  • 重启计算机:如果上述方法都无效,你可以尝试重启计算机,这将清除 DNS 缓存并重新加载所有网络配置。

3.2 结论

通过执行以上步骤,你可以在 Linux 上刷新 DNS 缓存,以获取最新的 DNS 解析结果。请记住,在某些情况下,可能需要等待一段时间才能完全看到新的 DNS 解析结果。如果你的网络连接存在问题或者 DNS 服务器有其他配置问题,刷新 DNS 缓存可能不会立即生效。此外,不同的 Linux 发行版可能使用不同的工具和服务来处理 DNS 解析和缓存,因此在执行上述步骤时请确保使用适用于你的发行版的命令和方法。

如果你仍然遇到 DNS 解析问题,你可以尝试使用其他 DNS 解析服务器,或者检查你的网络配置和 DNS 设置是否正确。同时,还可以尝试清除浏览器的 DNS 缓存,因为浏览器也会缓存 DNS 解析结果。

总而言之,刷新 DNS 缓存是解决一些 DNS 相关问题的常用方法,在 Linux 上也可以轻松执行。根据你所使用的 Linux 发行版,选择相应的方法来刷新 DNS 缓存,并确保在尝试其他解决方法之前先尝试刷新 DNS 缓存。

参考:

  1. DNS解析顺序是怎样的?

  2. 如何查看和刷新DNS缓存?