Da'sBlog

写给前端工程师的DNS基础知识

DNS

在工作中,经常切换本地和服务器,添加各种解析。遇到DNS引起的一些问题。发现网上资料很混乱,用心整理写了下,希望对大家有帮助。

DNS(Domain Name System,域名系统),最初,由于ip长且难记,通过ip访问网站不方便。。所以后来通过发明了DNS服务器,这个时候我们访问网站输入网站域名,DNS服务器就解析我们的域名为ip。这样我们实际访问的就是对应的ip地址啦。

抽象点DNS就是 一个记录ip地址的超级分布式数据库。

根域和根域服务器

首先我们要明白如何区分域,至于如何解析我们后面慢慢讲。

当我们输入www.sunhao.win访问网站。实际上是访问了不同的域。
其中”.”是DNS 命称空间,用来分割不同域,

www,sunhao,win分别代表不同的域。其实还有个域,跟在win后面,只是因为是域名系统默认的,所以这里不用写,这个就是根域。

意义上域名应该是这样。

www.sunhao.win.根域

根域记录了所有win域(这一个位置的叫顶级域),它和sunhao(二级域),共同构成顶级域名sunhao.win

www(三级域)和sunhao.win叫二级域名www.sunhao.win

这里大家要明白sunhao.win和www.sunhao.win是两个不同的网址。

因为我们上网使用的UDP/TCP,UDP数据往往没有保障,但速度快,通常用于查询和响应,TCP由于多次验证,传输有保证,但速度慢,多用于主服务器和从服务器之间的传送。

因此我们DNS主要通过UDP。

当我们访问www.sunhao.win的时候,如果本地dns服务器没有记录,那么它就会向根服务器去请求地址。

也就是它会向根服务器请求win域的地址。然后通过win域继续向下请求。根域名服务器并不直接把待查询的域名直接解析出IP地址,而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。

所以根域名服务器很重要。假定所有的根域名服务器都瘫痪了,那么整个DNS系统就无法工作。

顶级域和顶级域服务器

例如www.sunhao.win

win所在的位置就是顶级域

域名只是逻辑概念,并不代表计算机所在的物理地点。据2006年12月统计,现在顶级域名TLD(Top Level Domain)已有265个,分为三大类:

(1)国家顶级域名nTLD:采用ISO3166的规定。如:cn代表中国,us代表美国,uk代表英国,等等。国家域名又常记为ccTLD(cc表示国家代码contry-code)。

(2)通用顶级域名gTLD:最常见的通用顶级域名有7个,即:com(公司企业),net(网络服务机构),org(非营利组织),int(国际组织),gov(美国的政府部门),mil(美国的军事部门)。
(3)基础结构域名(infrastructure domain):这种顶级域名只有一个,即arpa,用于反向域名解析,因此称为反向域名。

顶级域名服务器主要负责管理在该顶级域名服务器注册的二级域名。

权威DNS和权威域名服务器

权威DNS服务器是经过上一级授权,对域名进行解析的服务器,同时它可以把解析授权转授给其他人。

例如,
在互联网上,谁售出的域名,就把域名授权给谁,比如sunhao.win是阿里售出的,所以权威服务器是阿里的dns解析服务器。(为了保障安全和保障一般权威DNS服务器都是俩)

dns9.hichina.com
dns10.hichina.com

但是由于业务我从后台调整解析到yunjiasu。

1
2
3
;; AUTHORITY SECTION:
sunhao.win. 2992 IN NS n563.ns.yunjiasu.com.
sunhao.win. 2992 IN NS n3101.ns.yunjiasu.com.

其中n563.ns.yunjiasu.com和n3101.ns.yunjiasu.com是sunhao.win的权威服务器。
由顶级域名win授权ns.yunjiasu.com.进行管理的。

当访问sunhao.win通过顶级域名解析后,顶级域名win就给用户说,你要访问sunhao.win是吧,你得去n563.ns.yunjiasu.com看看,它那记录了ip地址,不行就去n3101.ns.yunjiasu.com.再不行,你就自己报错把。^_^.

通俗点说,就是爸爸给孩子十块钱(这里指域名),这十块钱,孩子可以自己花,也可以转给别人。拥有了控制十块钱的所有权限。简单点说,就是一旦把域名授权给我,授权给我的那部分,我做主。

运营商DNS服务器和本地DNS服务器

在实际上网中,我们不是直接连接根服务器,而是通过本地DNS服务器上网。

如果DNS设置不好,或者不对,会导致如我们qq能登陆,而页面无法浏览网页的症状、

在这,本地DNS主要指是指各地电信运营商提供的域名解析服务器。也就是我们在上网网卡里面你设置的DNS地址。当然也可以自己建设一个服务器。

mark

当一个主机发出DNS查询请求时,这个查询请求报文就发送给本地域名服务器,本地服务器替我们进行DNS解析,我们得到的ip地址是由本地服务器返回的。

查询

我们了解了个个服务器,理一下常规DNS系统如何运作的吧

1,用户—>本地递归服务器— > 根权威服务器— > COM权威服务器— > X(X代表任意地址).COM权威服务器— > 本地递归服务器— >用户

2,用户—>本地递归服务器— > 缓存 — >用户

在这我们要明白两点。

一、递归查询:主机向本地域名服务器的查询一般都是采用递归查询。所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。

简单说 就是说我们请求的地址 必须返回一个准确的ip地址,没有就向别的地址查询,然后返回给我们一个准确的ip地址。我们的本地服务器就是递归服务器。

二、迭代查询:本地域名服务器向根域名服务器的查询的迭代查询。迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机。

这里由各级服务器进行的就是迭代查询,自身不返回ip,而是返回给下一级的DNS服务器地址。

实际一般本地DNS访问量巨大,会有一个前置的F5服务器,用于分发给后缀的服务器实现负载均衡。同时服务器会根据设置会缓存一段时间地址。所以有时候我们在服务器改完DNS,有时候会等一段时间,才能访问到新的地址。

解析记录

域名解析记录A、CNAME、MX、NS、TXT、AAAA、SRV、显性URL、隐形URL含义

  1. A记录:解析域名到指定ip

  2. CNAME记录(Canonical Name 别名指向):解析域名到域名

  3. MX记录:指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器。

  4. NS记录:解析服务器记录。用来表明由哪台服务器对该域名进行解析,这里的NS记录只对子域名生效。
    优先级:NS记录优先于A记录。即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。这里的NS记录只对子域名生效。

  5. TXT记录:为某个主机名或域名设置联系信息,如:
    admin IN TXT “管理员, 电话: 1000000000”

  6. AAAA记录(AAAA record):是用来将域名解析到IPv6地址的DNS记录。用户可以将一个域名解析到IPv6地址上,也可以将子域名解析到IPv6地址上。

  7. SRV记录:一般是为Microsoft的活动目录设置时的应用。

  8. 显性URL记录:访问域名时,会自动跳转到所指的另一个网络地址(URL),此时在浏览器地址栏中显示的是跳转的地址。

  9. 隐形URL记录:访问域名时,会自动跳转到所指的另一个网络地址(URL),此时在浏览器地址栏中显示的是原域名地址。

应答

权威应答

由权威服务器区域直接返回的应答地址

非权威应答

由缓存或者其他服务器返回的地址

TTL值和缓存

假如我们每次都发送一次DNS请求,那么服务器的压力会相当大,但是服务器的ip地址一般会经常变,所以实际我们都设置TTL把DNS缓存到本地。

什么是域名的TTL值?
TTL(Time- To-Live),简单的说它就是返回的记录在DNS服务器上保留的时间,就是TTL值。
mark

DNS会将最终域名解析的结果缓存至本地。分为两种浏览器缓存和操作系统(OS)缓存。

在浏览器中访问的时候,会优先访问浏览器缓存,如果访问指定域名,没有命中返回,则访问OS缓存。最后再次访问dns服务器。

所以我们在调试的时候,更换了本地hosts仍然访问的是旧地址,那么就等一会吧。

mark

我们可以看到chrome会自动缓存70s dns。

那么我们如果想在70s内清除缓存怎么办呢?

mark

我们在chrome地址栏里面输入chrome,会自动索引出有关的基本地址。选择chrome-urls

往下拉选择chrome://net-internals

mark

其中最右面

mark

可以清除页面缓存

mark

点Clear host cache,可以用于清除DNS缓存。

其实这个页面最好收藏下来,便于以后调试时及时刷新。

hosts

在DNS系统之前,对应ip都是保存在hosts文件之中,现在系统仍然保留它。

实际通过浏览器访问,会先查询浏览器dns缓存,再查询hosts里面是否有记录

mark

一般win系统Hosts文件就在C:\WINDOWS\system32\drivers\etc中

通过hosts我们可以把域名改成本地的地址,进行调试开发。

对于经常访问的网站,也可以直接设置到hosts里,加快访问速度。

sunhao.win解析过程分析

最后我们看下用dig +trace 跟踪的全部解析过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[root@sunhao ~]# dig +trace www.sunhao.win
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.37.rc1.el6 <<>> +trace www.sunhao.win
;; global options: +cmd
. 12674 IN NS e.root-servers.net.
. 12674 IN NS i.root-servers.net.
. 12674 IN NS h.root-servers.net.
. 12674 IN NS k.root-servers.net.
. 12674 IN NS d.root-servers.net.
. 12674 IN NS l.root-servers.net.
. 12674 IN NS a.root-servers.net.
. 12674 IN NS c.root-servers.net.
. 12674 IN NS m.root-servers.net.
. 12674 IN NS g.root-servers.net.
. 12674 IN NS b.root-servers.net.
. 12674 IN NS f.root-servers.net.
. 12674 IN NS j.root-servers.net.
;; Received 492 bytes from 211.161.46.85#53(211.161.46.85) in 42 ms
win. 172800 IN NS ns1.dns.nic.win.
win. 172800 IN NS ns6.dns.nic.win.
win. 172800 IN NS ns3.dns.nic.win.
win. 172800 IN NS ns2.dns.nic.win.
win. 172800 IN NS ns5.dns.nic.win.
win. 172800 IN NS ns4.dns.nic.win.
;; Received 412 bytes from 192.36.148.17#53(192.36.148.17) in 191 ms
sunhao.win. 3600 IN NS n563.ns.yunjiasu.com.
sunhao.win. 3600 IN NS n3101.ns.yunjiasu.com.
;; Received 86 bytes from 156.154.145.182#53(156.154.145.182) in 2415 ms
www.sunhao.win. 300 IN A 162.159.211.33
www.sunhao.win. 300 IN A 162.159.210.33
;; Received 92 bytes from 220.181.111.112#53(220.181.111.112) in 6 ms

.就是一开始说的根域。NS就是指定该域名由哪个DNS服务器来进行解析。

我们可以清晰的看到第一步先从13台dns服务器,然是顶级域win,最后权威域sunhao.win。
查到地址在162.159.211.33和162.159.210.33上。最后的是A记录。不再是NS了哦。

坚持原创技术分享,您的支持将鼓励我继续创作!