什么是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地址。
DNS是怎么解析域名的?
DNS解析一般在没有缓存的时候,需要分级查询。我们先来补习下DNS域名的结构。
DNS域名结构
- 根域名
root domain
比如,域名www.baidu.com
显示为www.baidu.com.
(简写), 实际是www.baidu.com.root
。
这不是疏忽,而是所有域名的尾部,实际上都有一个根域名。而这个根域名都是一样的。
-
顶级域名
top-level domain
(TLD) 根域名的下一级,叫做"顶级域名",比如.com
、.net
; -
次级域名
second-level domain
(SLD) 再下一级叫做"次级域名",比如www.baidu.com
里面的.baidu
,这一级域名是用户可以注册的; -
主机名
host
(三级域名) 再下一级是主机名,比如www.example.com
里面的www
, 这是用户在自己的域里面为服务器分配的名称,是用户可以任意分配的。
综上,域名的结构如下
主机名.次级域名.顶级域名.根域名
host.sld.tld.root
DNS查询流程
在没有缓存
的情况下,DNS解析器执行iterative查询,一般需要8步:
- 假设用户在浏览器键入
example.com
后,DNS查询请求通过网络被DNS解析器(DNS resolver
)接收。 DNS resolver
会先查询根服务器。- 根服务器随后基于url最右边的域名返回一个顶级域名
TLD
服务器的地址(.com or .net
)给解析器。 - 收到从根服务器发来的TLD服务器地址后,
DNS resolver
随即向该地址发送域名解析请求。 - TLD服务器收到请求后,会进行解析并将
example.com
域名服务器的IP地址发送给DNS resolver
DNS resolver
将查询请求发送给example.com
的域名服务器example.com
的域名服务器将example.com
网站的IP发送给DNS resolver
- 最终,
DNS resolver
将IP地址发送给浏览器 - 浏览器接收到IP地址后,向
example.com
服务器发送请求 example.com
服务器收到请求并响应,返回资源
而有缓存的情况下, dns解析会现在客户端本地一次查询:
- 浏览器DNS缓存
- 系统DNS缓存
- 路由器缓存
- ISP缓存
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的查询方式主要分为三类:
- iterative -- 迭代查询,从根域名服务器开始往下查询,直到解析成功或失败。
- recursive -- 一个DNS解析器查询一个实现了解析器功能的DNS服务器,要求该服务器返回结果,不论是成功或者失败。
- 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查询时间,为前端页面首屏渲染时间的缩短尽一份力。
- dns-prefetch
- dns-preconnect