本文共 2277 字,大约阅读时间需要 7 分钟。
DNS
,就是Domain Name System
的缩写,翻译过来就是域名系统,是互联网上作为域名和IP
地址相互映射的一个分布式数据库。DNS
能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP
数串。通过域名,最终得到该域名对应的IP
地址的过程叫做域名解析(或主机名解析)。
下面这张图,详细说明了一个DNS
域名解析的全过程:
下面来详细解释DNS
域名解析的过程:
第1步: 客户机就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com
,这时,浏览器会检查缓存中有没有这个域名对应的解析过的IP
地址,如果缓存中有,这个解析过程就将结束。
浏览器缓存域名也是有限制的,不仅浏览器缓存大小有限制,而且缓存的时间也有限制,通常情况下为几分钟到几小时不等,域名被缓存的时间限制可以通过TTL(Time To Live)
属性来设置。
这个缓存时间太长和太短都不好,如果缓存时间太长,一旦域名被解析到的IP
有变化,会导致被客户端缓存的域名无法解析到变化后的IP
地址,以致该域名不能正常解析,这段时间内有可能会有一部分用户无法访问网站。如果时间设置太短,会导致用户每次访问网站都要重新解析一次域名。
阿里云解析默认的TTL
是10分钟,10分钟的含义是,本地DNS
服务器对于域名的缓存时间是10分钟,10分钟之后,本地DNS
服务器就会删除这条记录,删除之后,如果有用户访问这个域名,就要重复一遍上述复杂的流程。其实,如果网站已经进入稳定发展的状态,不会轻易更换IP
地址,我们完全可以将TTL
设置到协议最大值,即24小时。带来的好处是,让域名解析记录能够更长时间的存放在本地DNS
服务器中,以加快所有用户的访问。
第2步: 如果用户的浏览器缓存中没有,操作系统会检查自己本地的hosts
文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
在操作系统中也有一个域名解析的过程,在Windows
中可以通过C:\Windows\System32\drivers\etc\hosts
文件来设置,你可以将任何域名解析到任何能够访问的IP
地址。
如果你在这里指定了一个域名对应的IP
地址,那么浏览器会首先使用这个IP
地址。例如,我们在测试时可以将一个域名解析到一台测试服务器上,这样不用修改任何代码就能测试到单独服务器上的代码的业务逻辑是否正确。
正是因为有这种本地DNS
解析的过程,所以黑客就有可能通过修改你的域名解析来把特定的域名解析到它指定的IP
地址上,导致这些域名被劫持。早期的Windows
版本中出现过很严重的问题,而且对于一般没有太多电脑知识的用户来说,出现问题后很难发现,即使发现也很难自己解决,所以Windows 7
中将hosts
文件设置成了只读的,防止这个文件被轻易修改。
在Linux
中这个配置文件是/etc/named.conf
,修改这个文件可以达到同样的目的,当解析到这个配置文件中的某个域名时,操作系统会在缓存中缓存这个解析结果,缓存的时间同样是受这个域名的失效时间和缓存的空间大小控制的。
第3步: 如果本机缓存没有相应的网址映射关系,客户机会发出一个DNS
请求到本地DNS
服务器。本地DNS
服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
这个专门的本地DNS
服务器性能都会很好,它们一般都会缓存域名解析结果,当然缓存时间是受域名的失效时间控制的,一般缓存空间不是影响域名失效的主要因素。大约80%的域名解析都到这里就已经完成了,所以本地DNS
服务器主要承担了域名的解析工作。
在Windows
下可以通过ipconfig
查询这个地址:
在Linux
下可以通过如下方式查询配置的DNS Server
:
第4步: 查询www.163.com
的DNS
请求到达本地DNS
服务器后,若要查询的域名包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。如果要查询的域名,不由本地DNS
服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP
地址映射,完成域名解析,此解析不具有权威性。
第5步: 如果本地DNS
服务器本地区域文件与缓存解析都失效,则根据本地DNS
服务器的设置(是否设置转发器)进行查询。
如果未用转发模式,本地DNS
就把请求发至13台根DNS
,根DNS
服务器收到请求后会判断.com
域名是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP
。本地DNS
服务器收到IP
信息后,将会联系负责.com
域的这台服务器。这台负责.com
域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com
域的下一级DNS
服务器地址(163.com
)给本地DNS
服务器。当本地DNS
服务器收到这个地址后,就会找163.com
域服务器,重复上面的动作,进行查询,直至找到www.163.com
主机。
如果用的是转发模式,此DNS
服务器就会把请求转发至上一级DNS
服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS
或把转请求转至上上级,以此循环。
不管是本地DNS
服务器用是哪种模式,最后都是把结果返回给本地DNS
服务器,由此DNS
服务器再返回给客户机。
第6步: 返回该域名对应的IP
和TTL
值,本地DNS
服务器会缓存这个域名和IP
的对应关系,缓存的时间由TTL
值控制。
第7步: 把解析的结果返回给用户,用户根据TTL
值缓存在本地系统缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问,域名解析过程结束。
参考链接