DNS

什么是 DNS

​ DNS代表域名服务器。 当网站或Web应用程序托管在服务器上时,无论是基于Linux还是基于Windows,都会为其分配一个特定的十进制分隔数字系列,这在技术上称为IP地址。 DNS就像这些数字的英文翻译。

​ 当我们想浏览一个网页时只需要在浏览器的地址栏输入对应的网址域名就能够访问。假如没有网址域名能不能实现网站访问呢?当然是可以的。我们可以使用网站的 IP 进行访问,那很多同学又有个疑问啦那我怎么知道网站的 IP 呢?其实很简单我们在自己的电脑上使用 ping 工具即可查看网址对应的 IP,使用方法 ping + 网站地址 下面我们以 www.baidu.com 为例。

~ ping www.baidu.com
PING www.baidu.com (14.215.177.38): 56 data bytes
64 bytes from 14.215.177.38: icmp_seq=0 ttl=56 time=9.965 ms
64 bytes from 14.215.177.38: icmp_seq=1 ttl=56 time=8.349 ms
64 bytes from 14.215.177.38: icmp_seq=2 ttl=56 time=8.098 ms

可以看到 www.baidu.com (14.215.177.38) 这里 14.215.177.38 就是 Baidu 的 IP,我们可以在浏览器中输入这个 IP 看看会发生什么吧。

假如每次你想访问百度的时候都去输入这个 IP 是不是一件挺令人崩溃的事,因此 DNS 就应运而生啦。DNS 就是为了解决这种尴尬,它可以实现域名和 IP 地址之间映射。

DNS 的全程是 domain name system,即域名系统。DNS是因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的去访问互联网而不用去记住能够被机器直接读取的IP地址。通过域名,最终得到该域名对应的IP地址的过程则是域名解析的过程。

DNS 如何解析的

DNS 解析分为递归查询以及迭代查询,下面我们具体讲讲这两种查询方式

递归查询

查询实例过程如下(还是以baidu为例子)

某天,客户端想要访问baidu网站,但是,客户端并不知道baidu网站的IP地址。于是,展开了如下对话
客户端:“本地DNS服务器大佬,求问baidu的IP地址是多少?”
本地DNS服务器:“不好意思,我不知道,但是根域名服务器可能会知道,我替去问他吧”
本地DNS服务器:“根域名服务器大佬,求问baidu的IP地址是多少?”
根域名服务器:“不好意思,我不也知道,但是A顶级域名服务器可能会知道,我替你去问他吧”
根域名服务器:“A顶级域名服务器,求问baidu的IP地址是多少?”
A顶级域名服务器:“根域名服务器,查到baidu的IP地址是14.215.177.38”
根域名服务器:“本地DNS服务器,求问baidu的IP地址是14.215.177.38”
本地DNS服务器: “客户端,查到baidu的IP地址是14.215.177.38”
客户端:“谢谢各位大佬,baidu的IP地址是14.215.177.38,我可以和他愉快的通讯了”

通过上面的对话,我们可以发现,递归查询时如果客户端所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其他顶级域名服务器继续发出查询,直到查询到结果后,再层层传递回来。

迭代查询

客户端:“本地DNS服务器大佬,求问baidu的IP地址是多少?”
本地DNS服务器:“不好意思,我不知道,但是根域名服务器可能会知道,你去问他吧”,本地DNS服务器说完,并把根域名服务器地址发给客户端。
客户端:“根域名服务器大佬,求问baidu的IP地址是多少?”
根域名服务器:“不好意思,我不也知道,但是A顶级域名服务器可能会知道,你去问他吧”,根域名服务器说完,并把A顶级域名服务器地址发给客户端。
客户端只能又跑去问A顶级域名服务器了。
客户端:“A顶级域名服务器大佬,求问baidu的IP地址是多少?”
A顶级域名服务器:“客户端,查到baidu的IP地址是14.215.177.38”。

迭代查询时如果客户端所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器会向其他顶级域名服务器继续发出查询,直到查询到结果。

DNS 解析过程总结:

在DNS查询过程中,客户端和服务器也都会加入缓存的机制(将已经查询到的 IP用小本本记录下来),这样可以减少查询的次数,加快域名解析过程。当我们在浏览器中输入一个网站时,会发生如下过程:

1、浏览器中输入想要访问的网站的域名,操作系统会先检查本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。

2、如果hosts里没有这个域名的映射,客户端会向本地DNS服务器发起查询。本地DNS服务器收到查询时,如果要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析。

3、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置,采用递归或者迭代查询,直至解析完成。

在这里插入图片描述

DNS 带来的问题

上面详细的讲述啦 DNS 解析过程,在这个过程中客户端和服务端都会加入缓存机制,这可能会导致如下问题:

网站所有者已将网站迁移到新DNS(和IP地址)的其他服务器,则由于本地计算机缓存了老的服务器的DNS,您可能仍会看到旧服务器上的网站。要从新服务器获取网站最新内容,您需要清除你本地电脑的DNS缓存。有时缓存存储时间较长,在清除缓存之前,您将无法看到新的网站内容。

清除 DNS 缓存的方法

通过清除 Web 浏览器强制刷新网页

在刷新DNS之前,您可以尝试强制刷新要访问的网页。 这将清除网页缓存,帮助浏览器查找网页的更新文件。

  • Windows操作系统:Internet Explorer,Microsoft Edge,Mozilla Firefox或Google Chrome,使用组合键“Ctrl + F5”。
  • Apple/MAC计算机:Mozilla Firefox或Google Chrome,使用组合键“CMD + SHIFT + R”。如果您使用Apple Safari,则使用组合键“SHIFT + Reload”。

您还可以尝试使用隐身模式(Chrome)或隐私窗口(Firefox)访问该页面。如果这个方式无效我们可以试试从操作系统的层面上去清除缓存。

Windows

  1. 进入命令提示符模式:
    • 使用键盘组合键Windows+R
    • 弹窗Run窗口flush-DNS-2
    • 在输入框中键入CMD
    • Enter键确定将打开命令提示符窗口
  2. 输入 ipconfig/flushdns 并按Enter键,如下所示
    flush-DNS-3
  3. 窗户提示DNS Flush的成功信息
    flush-DNS-4

Mac

  1. 打开 Terminal(终端)

  2. 执行以下命令清除计算机上的 DNS 缓存

    sudo killall -HUP mDNSResponder && echo macOS DNS Cache Reset

  3. 注意以上命令因操作系统版本而异,各版本对应的命令如下所示:

    1. Mac OS Sierra, Mac OS X El Capitan, Mac OS X Mavericks, Mac OS X Mountain Lion, Mac OS X Lion操作系统使用以下命令

      sudo killall -HUP mDNSResponder

    2. Mac OS X Yosemite操作系统使用以下命令

      sudo discoveryutil udnsflushcaches

    3. Mac OS X Snow Leopard操作系统使用以下命令

      sudo dscacheutil -flushcache

    4. Mac OS X Leopard and below操作系统使用以下命令

      sudo lookupd -flushcache

Linux

在Ubuntu Linux和Linux Mint上:

  1. 使用键盘组合键Ctrl+Alt+T打开终端

  2. 启动终端后,输入以下命令代码

    sudo /etc/init.d/networking restart

    flush-DNS-7

  3. 它可能会要求输入管理员密码

  4. 一旦成功,它将显示如下确认消息:

    [OK] Restarting networking (via systemctl): networking.service

  5. 如果DNS Flush不成功,请按照以下步骤操作

  6. 在终端输入以下命令

    sudo apt install nscd

  7. 完成上述命令后,重复步骤1到4

在CentOS上:

  1. 使用键盘组合键Ctrl+Alt+T打开终端

  2. 输入以下命令:

    nscd -i hosts

  3. 要重新启动DNS服务,请输入以下命令

    service nscd restart

    flush-DNS-8