Loading

DNS

date: 2019-12-27 11:09:28
updated: 2020-01-16 11:09:28

DNS

DNS(Domain Name System):将一个网站的域名转换为对应的IP

1. 源起

方案1:访问一台计算机需要通过 IP 地址,但是访问如果 IP 发生变更,需要告诉所有人。所以这个方法不可行。

方案2:为每一台计算机起一个名字,然后建立计算机名字到 IP 地址的一个映射关系。访问计算机名字,由计算机来完成映射的转换。每台计算机保存一个 hosts 文件,里面列出所有计算机名字和对应的 IP 地址,然后定期从一个维护此文件的站点更新里面的记录。当我们访问某个计算机名字时,先在 hosts 文件找到对应的IP,然后就可以建立连接。但是计算机越来越多,让每台计算机的 hosts 文件来保存所有计算机的名字和对应的 IP 地址不现实。

方案3:域名系统(DNS, Domain Name System),这是一种层次的、基于域的命名方案,并且用一个分布式数据库系统加以实现。当我们需要访问一个域名(计算机名字)时,应用程序会向 DNS 服务器发起一个 DNS 请求,DNS 服务器返回该域名对应的 IP 地址。通过下面三种手段解决了上面的问题:

1. 用户计算机上并没有存储所有的名字到 IP 的映射,这样避免了 hosts 文件过于庞大(现在各操作系统中 hosts 文件默认都是空的)。
2. 规定了域名的命名规则,保证主机名字不会重复。
3. DNS 服务器不再是单一的一台机器,而是一个层次的、合理组织的服务器集群。

2. 协议

  1. 命名规则,防止域名出现重复。使用层次的地址结构。

DNS 设计之初是用来建立域名到 IP 地址的映射,理论上对于每一个域名我们只需要在域名服务器上保存一条记录即可。这里的记录一般叫作域名资源记录,它是一个五元组,可以用以下格式表示:

Domain_name Time_to_live Class Type Value
- Domain_name:指出这条记录适用于哪个域名;
- Time_to_live:用来表明记录的生存周期,也就是说最多可以缓存该记录多长时间(后面会讲到缓存机制);
- Class:一般总是IN;
- Type:记录的类型;
- Value:记录的值,如果是A记录,则value是一个IPv4地址。
  1. 划分域名资源记录

域名的名字空间转化为一棵树,划分为不重叠的区域。然后将每个区域与多个域名服务器(其中一个是 master,其他 slave 服务器则用来提供数据备份、加快解析速度、保证服务可用性)关联起来,称这些域名服务器为该区域的权威域名服务器(Authoritative Name Servers),它保存两类域名资源记录:

1. 该区域内所有域名的域名资源记录。
2. 父区域和子区域的域名服务器对应的域名资源记录(主要是NS记录)。

引入根域名服务器,它保存了所有顶级区域的权威域名服务器记录。现在通过根域名服务器,我们可以找到所有的顶级区域的权威域名服务器,然后就可以往下一级一级找下去了。

3. 解析

因为每当连接上网络之后,计算机会自动获得一个默认的 DNS 服务器,当然你也可以用自己信任的 DNS 服务器,比如8.8.8.8,我们把这个域名服务器也叫作本地域名服务器。接下来当我们需要知道一个域名对应的资源记录时,会向本地域名服务器发起请求,如果该域名恰好在本地域名服务器所辖属的域名区域(DNS zone)内,那么可以直接返回记录。

如果在本地域名服务器没有发现该域名的资源记录,就需要在整个域名空间搜索该域名。而整个域名空间的资源记录存储在一个分层的、树状联系的一系列域名服务器上,所以本地域名服务器首先要从根域名服务器开始往下搜索。这里有一个问题就是本地域名服务器如何找到根域名服务器在哪里呢?其实域名服务器启动的时候,就会加载一个配置文件,里面保存了根域名服务器的NS记录(要知道根域名服务器地址一般非常稳定,不会轻易改变,并且数量很少,所以这个配置文件会很小)。找到根域名服务器之后,就可以一级一级地往下查找啦。

用语言简单描述如下:
1:用户:喂,本地域名服务器,告诉我math.sysu.edu.cn的地址;
2:本地域名服务器:哎呀,我不知道啊,不在我的辖区,容我去问问老大哥吧。root老大,能告诉我math.sysu.edu.cn的地址吗;
3:根域名服务器:忙着呢,你去问B(.cn);
4:本地域名服务器:喂,B,告诉我math.sysu.edu.cn的地址;
5:B:你去问D(.edu.cn);
6:本地域名服务器:喂,D,告诉我math.sysu.edu.cn的地址;
7:D:你去问F(sysu.edu.cn);
8:本地域名服务器:喂,F,告诉我math.sysu.edu.cn的地址;
9:F:容老衲看看,哎呀,找到了,是X.X.X.X;
10:本地域名服务器:踏破铁鞋终于找到啦,喂用户,出来啊,我找到了,是X.X.X.X

4. 缓存机制

1:80%的时间我们都在看那些20%的网站,这就是大名鼎鼎的80/20 Rule;
2:我们会在一个网站的不同网页之间跳转,也就是不断地访问同一个域名,类似程序访问的局部性原理。

基于以上两个结论,在实际访问网站时,会将已经访问过的那些域名的解析结果缓存在自己的计算机上,那么下次访问的时候可以直接读取结果,不用再次重复 DNS 查询过程。

当然,这样做的一个前提是要缓存的解析结果不会频繁更改,也就是说我十分钟后解析一个域名的结果和现在解析的结果是一样的。对大多数域名来说,这都是一个不争的事实。但是难免有一些“善变”的域名,他们可能会频繁更改自己的解析结果。为了使缓存机制适应这两类情况,我们在域名资源记录里面添加一个 Time_ti_live 字段,表明这条记录最多可以缓存多久。对于那些稳定的域名,给一个比较大的值,而那些经常改变的域名,则可以给定一个小的值。

同理,在域名服务器上也可以利用缓存机制。域名服务器可以将那些访问过的域名资源记录缓存,用户再次发起请求时,可以直接返回缓存结果,不用去迭代或者递归解析。

posted @ 2020-10-22 10:12  猫熊小才天  阅读(292)  评论(0编辑  收藏  举报