---

description: DNS是什么，我们的日常工作中有什么和DNS有关系？

---

# DNS
## 背景知识

因为计算机网络上的计算机彼此之间只能用 IP 地址才能相互识别，这就导致了一个问题，IP 地址很难被人们记住，举个例子，我们中山学院网络维护科的官网的 IP 地址是 `47.52.33.166` ，记住这个 IP 地址是困难的。

于是互联网的前辈们想了一个方法，用域名来进行访问，例如访问 `www.zsxyww.com` 就可以访问到网维的官网，不需要去记住 IP 地址了，`www.zsxyww.com` 这个有意义的字段很容易记住（中山学院网维的拼音缩写嘛）。

然后问题就来了：计算机之间只能用 IP 地址识别，我们使用域名，计算机没法识别怎么办？

对于这个问题，互联网前辈们想了个法子，使用 DNS 服务器作为一个中介，我们使用浏览器访问 `www.zsxyww.com` 的时候，会先请求 DNS 服务器获取该域名对应的计算机的 IP 地址，然后与该 IP 地址对应的计算机（网维服务器）沟通。

## 定义

DNS 是进行域名和与之相对应的 IP 地址转换的服务器。DNS 中保存了一张域名和与之相对应的 IP 地址的表，以解析消息的域名。

简单来说就是 DNS 是一个服务器，能够返回域名对应的服务器的 IP 地址。

## 需要理解的简单的浏览器工作机制

![工作流程](/img/wiki/dns.png)

## 缓存机制

为了节约资源及加快速度，互联网前辈还想了个 DNS 缓存机制。

计算机会按照下列顺序方式进行查询
1. 浏览器缓存
2. 操作系统缓存
3. 各级 DNS 服务器(这边也有缓存)

## 日常工作相关

- 怎么判断是否是 DNS 的问题？

  特征就是使用 IP 地址能够正常访问（例如 QQ），而使用域名访问却没法访问。

  一般来说遇到的会是所有域名都没法访问，不过偶尔也会遇到部分域名能访问，部分域名没法访问的情况。

- 怎么查询本地 DNS 缓存？

  - 查询浏览器缓存
    - Chrome 浏览器访问 `chrome://net-internals/#dns`，可查询浏览器缓存
    - 同理，基于Chromium内核的浏览器（比如Brave，Edge...）也可以使用。需要查询对应的协议段代号。如Edge对应`edge://net-internals/#dns`
    - Firefox(Gecko)需要在地址栏输入：`about:networking#dns`
    - Safari需要按如下步骤操作：`偏好设置` --> `高级`，`在菜单栏中显示 “开发” 菜单`，随后在顶栏的`开发`菜单中进行操作  
    需要注意的是，对于Safari来说，其更依赖MacOS的DNS缓存。
  - 查询操作系统缓存
    - Windows 系统 使用命令 `ipconfig /displaydns` 查询，可以使用 `ipconfig /flushdns` 清除操作系统缓存
    - macOS 系统不同版本的清除方法不同，可以尝试：  
    `sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder`  
    适用于macOS 10.15 (Catalina)以上
    - Linux 系统根据发行版的不同也有着不同的清除方法。可以尝试以下命令：  
    `sudo resolvectl flush-caches`  
    `sudo /etc/init.d/nscd restart`  
    `sudo systemctl restart dnsmasq`    
    刷新 DNS 缓存后，可以使用 dig 命令验证缓存是否已成功清除：  
    `dig baidu.com `  
    如果查询时间值大于 0 毫秒，则缓存已成功清除。

- 怎么解决 DNS 的问题？

  更换 DNS 服务器、使用神器清除本机 DNS 缓存即可。

  常见的 DNS 服务器地址：

  ```text
  8.8.8.8  Google（不推荐作为主 DNS 服务器，可以作为次 DNS 服务器）
  114.114.114.114   114(疑似存在劫持？)
  223.5.5.5  223.6.6.6  阿里
  119.29.29.29  腾讯
  ```
