DNS域名解析过程

时间:2024-03-22 11:17:14

    通过《计算机网络》这本书上学习DNS域名解析时,了解的还是比较浅显,最近在看《深入分析Java web技术内幕》这本书,就想通过这篇博客将书上所讲和自己的理解融合一下,作一个记录。本文大部分内容来自于《深入分析Java web技术内幕》。

一、DNS域名解析

    如果我们需要在浏览器上发起对一个网页的访问,那必需的输入就是网址,即URL,只有把URL的域名中解析成IP地址,才能和远程主机建立连接,完成数据的交互。所以DNS(Domain Name System)就负责域名到IP地址的解析过程。域名及域名结构不在本文讨论范围内。

    在我们平时上网时是感受不到DNS解析的存在的,但是毫无疑问,DNS解析是非常重要的,一旦DNS解析出错,可能会导致很严重的互联网灾难。我们都知道,现在整个互联网上只有几个很重要的DNS根域名服务器,任何一台根服务器坏掉,后果都是非常严重的。

二、DNS域名服务器系统

    因特网上的DNS域名服务器是按照层次安排的,每一个域名服务器都只对域名系统中的一部分进行管辖,根据域名服务器所起的作用,我们对其进行如下划分:

1、根域名服务器

    根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。根域名服务器管理下一层的*域名服务器的域名和IP地址。在因特网上共有13个不同IP地址的根域名服务器,它们的名字都是用一个英文字母命名,从a一直到m。要注意的是根域名服务器并不是13个机器组成,而是13套装置,每个装置使用一个域名,现在全世界的多个地点都有根域名服务器机器,这样大部分DNS域名服务器都能就近找到一个根域名服务器。

2、*域名服务器(TLD服务器)

    *域名服务器负责管理在其上注册的所有二级域名(域名系统请自行了解)。

3、权限域名服务器

    负责一个区的域名服务器,如果一个权限域名服务器对其接收到的DNS查询请求不能给出最终的查询结果时,就会告诉发出请求的DNS客户,下一步应该去找哪个权限域名服务器。

4、本地域名服务器(local name server)

    当一个主机发出DNS查询请求时,首先就发送给本地域名服务器,由此可以看出本地域名服务器的重要性,这个本地域名服务器通常是你本地互联网接入的一个DNS解析服务,例如你是在学校接入互联网,那么本地域名服务器就在学校里;如果你是在小区中接入互联网,那么本地域名服务器就是你接入互联网的应用提供商,即移动、电信或联通,也就是我们常说的SPA,这个域名服务器离你也不会太远,会在你所在城市的某个角落,离你几个路由的距离。可以看出,如果需要查询的主机和发出请求的主机同属一个本地域名服务器,那么会很快给出解析结果,不需要再去询问其他域名服务器。

    域名解析的过程是一个迭代或者递归的过程,所以在了解了域名服务器系统的层次后,就可以更好的理解域名解析是如何在各个层次之间进行的。

三、DNS域名解析过程

下图是从书上截取的DNS域名解析的主要过程,我根据这张图对解析过程进行分析。

DNS域名解析过程

 假设用户在浏览器中输入www.abc.com时,DNS解析会有大致10个步骤,大体描述如下:

    step 1:浏览器检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中有,则解析过程结束。浏览器对缓存域名的大小和缓存时间也是有限制的,通常情况下为几分钟到几小时不等,域名缓存时间可以通过TTL属性设置,如果缓存时间过长,一旦域名解析到IP地址有变化,会导致客户无法解析到变化后的IP地址,导致该域名不能正常解析;反之,如果缓存时间过短,会导致每次用户访问网站时都要重新解析一次域名,所以需要设置合理的缓存时间。

    step 2:如果用户浏览器缓存未命中,浏览器会在操作系统缓存中查找是否有这个域名对应的DNS解析结果。操作系统的域名解析在window中通过C:\Windows\System32\drivers\etc\hosts文件来设置,你可以将任何域名解析到能访问的IP地址。正是由于这种本地DNS解析过程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到他指定的IP地址上,导致域名被劫持,所以现在的hosts文件都被设置为只读,防止这个文件被轻易修改。

    前面两个步骤都是在本机完成的,所以在上图中没有显示出来,如果到这两步还没有完成域名解析,就会请求真正的域名服务器来解析这个域名了。

    step 3:本机将DNS域名解析请求发送给本地域名服务器(LDNS),LDNS一般都会缓存域名解析结果,当然这个缓存时间是受域名失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析到这里都已经完成了,所以LDNS承担了大部分的域名解析工作。

    step 4:如果LDNS没有命中,直接到根域名服务器请求解析。

    step 5:根域名服务器返回给本地域名服务器一个所查询的*域名服务器(gTLD),这里可以理解为LDNS代理本机进行域名解析查询,LDNS就是一个DNS客户。

    step 6:LDNS向上一步返回的gTLD服务器发送请求。

    step 7:请求的gTLD服务器查找并返回该域名对应的权限域名服务器的之地,这个权限域名服务器就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析任务就有由这个域名提供商的服务器完成。

    step 8:权限域名服务器会查询存储的域名和IP地址映射关系,在正常情况下都能获得目标IP记录,连同一个TTL值返回给LDNS。

    step 9:LDNS获得该域名对应的IP地址和TTL值,并缓存这个域名和IP地址的映射关系,缓存时间由TTL值控制。

    step 10:LDNS把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。

四、跟踪域名解析过程

    由于博主还没有学习Linux,所以这里只把书上给出的几个指令列出,学习以后再实际试用一下。

    在Linux和windows下都可以使用nslookup命令来查询域名的解析结果,在Linux系统中还可以使用dig命令来查询DNS的解析过程,可以清晰的获得整个域名是如何发起和解析的。

五、清除域名缓存

    从上述可以知道域名缓存在两个地方,一个是本地域名服务器,另一个是用户的本地系统上。基本上LDNS的缓存时间是由TTL控制的,很难人工介入,但是本地系统的可以通过一些命令清除。

    最简单粗暴的方法就是重启!!!

    当然在windows下可以通过ipconfig/flushdns命令刷新缓存,Linux下可以通过/etc/init.d/nscd restart来清除缓存。


博主的第一篇博客,如果有问题希望多多指正,最近会持续记录看《深入分析Java web技术内幕》这本书的理解和体会,move on!!!