DNS域名解析 -- 前端网络必知

902 阅读5分钟

什么是DNS?

DNS(Domain Name System),是一个层次化、分布式域名系统。 它主要是用于将域名转换成对应的IP地址。

The Domain Name System (DNS) is the phonebook of the Internet.
DNS就像是互联网的一本电话簿

每当用户去访问某个网站www.baidu.com, 键入这个url后, DNS就会开始去解析当前域名, 最终找到对应的IP地址。

这就好比, 今天我要打电话给某某好友, 但没有记住好友的具体电话号码。最终通过电话簿找到了对应的电话。 DNS域名解析其实就是做了类似的事情。

DNS就像是一个庞大的对象,里面存储了很多键值对,key是域名,而value则是对应IP地址。

theinternet-dns.svg

DNS是怎么解析域名的?

DNS解析一般在没有缓存的时候,需要分级查询。我们先来补习下DNS域名的结构。

DNS域名结构

  1. 根域名 root domain

比如,域名www.baidu.com显示为www.baidu.com.(简写), 实际是www.baidu.com.root
这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。而这个根域名都是一样的。

  1. 顶级域名 top-level domain (TLD) 根域名的下一级,叫做"顶级域名",比如.com.net

  2. 次级域名 second-level domain(SLD) 再下一级叫做"次级域名",比如www.baidu.com里面的.baidu,这一级域名是用户可以注册的;

  3. 主机名 host (三级域名) 再下一级是主机名,比如www.example.com里面的www, 这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。

综上,域名的结构如下

主机名.次级域名.顶级域名.根域名

host.sld.tld.root

DNS查询流程

没有缓存的情况下,DNS解析器执行iterative查询,一般需要8步:

  1. 假设用户在浏览器键入example.com后,DNS查询请求通过网络被DNS解析器(DNS resolver)接收。
  2. DNS resolver会先查询根服务器。
  3. 根服务器随后基于url最右边的域名返回一个顶级域名TLD服务器的地址(.com or .net)给解析器。
  4. 收到从根服务器发来的TLD服务器地址后,DNS resolver 随即向该地址发送域名解析请求。
  5. TLD服务器收到请求后,会进行解析并将example.com域名服务器的IP地址发送给DNS resolver
  6. DNS resolver 将查询请求发送给example.com的域名服务器
  7. example.com的域名服务器将example.com网站的IP发送给DNS resolver
  8. 最终,DNS resolver将IP地址发送给浏览器
  9. 浏览器接收到IP地址后,向example.com服务器发送请求
  10. example.com服务器收到请求并响应,返回资源

flow2.png

而有缓存的情况下, dns解析会现在客户端本地一次查询:

  • 浏览器DNS缓存
  • 系统DNS缓存
  • 路由器缓存
  • ISP缓存 flow.png

DNS缓存

有的时候为了缩短DNS整体的查询时间,DNS缓存

  • 浏览器DNS缓存

现代浏览器默认都会将DNS记录缓存一段时间。当DNS开始解析的时候,浏览器缓存是第一个访问的地点。

Chrome中,可以访问chrome://net-internals/#dns 查看dns缓存

  • 系统DNS缓存

系统DNS缓存是,本地dns缓存最后一站。如果这里没有查询到IP,就要离开本地查找了。

OS缓存会参考DNS服务器响应的TTL值,但是不完全等于TTL值。

  • ISP 运营商缓存

宽带运营商自己的缓存

DNS解析查询方式

其实每个终端都是域名服务器的客户端,又称DNS解析器(DNS resolver),它主要用来向域名服务器发起域名解析请求,然后找到对应IP地址。
DNS resolver的查询方式主要分为三类:

  1. iterative -- 迭代查询,从根域名服务器开始往下查询,直到解析成功或失败。
  2. recursive -- 一个DNS解析器查询一个实现了解析器功能的DNS服务器,要求该服务器返回结果,不论是成功或者失败。
  3. non-recursive -- 类似iterative,但是查询的时候利用DNS解析器的缓存。

域名类型

域名其实有好几种类型,我们也称其为"记录"(record)类型。它就相当于域名与IP之间的对应关系

(1) A:地址记录(Address),返回域名与IP地址的直接映射。

(2) NS:域名服务器记录(Name Server),返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址。

(3)MX:邮件记录(Mail eXchange),返回接收电子邮件的服务器地址。

(4)CNAME:规范名称记录(Canonical Name),返回另一个域名,即当前查询的域名是另一个域名的跳转,详见下文。

(5)PTR:逆向查询记录(Pointer Record),只用于从IP地址查询域名,详见下文。

一般来说,为了服务的安全可靠,至少应该有两条NS记录,而A记录和MX记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。

CNAME记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,facebook.github.io这个域名就是一个CNAME记录。我们平常注册CDN时都能看见CNAME

前端开发中使用的DNS相关技术

DNS相关技术可以使用在前端性能优化的时候, 主要是为了缩短DNS查询时间,为前端页面首屏渲染时间的缩短尽一份力。

  1. dns-prefetch
  2. dns-preconnect

参考链接