这个知识点已经是老生常谈,快被写烂了,但是为了自己能理解的更清楚一点,还是选择整理出一篇自己的文章。
DNS( Domain Name System)是“域名系统”的英文缩写,主要作用就是将便于人类记忆的单词组合(如www.taobao.com),解析成不太容易记忆的数字组合(61.154.126.109)。
序
我觉得这是互联网发展的必须结果,想一想如果没有DNS系统,平时我们想要访问百度,淘宝,腾讯的网站,都要在浏览器中输入一长串的数字,耗时又不方便,并且一旦想要访问的网站增多了,很多人也不愿意记这么多的数字在脑袋中。
然后好一点的办法就是把那些数字记录到一个清单里,对应是那个网站。仅供个人使用的时候还挺方便,但是一旦与网民互相交流的时候,每个人的清单列法不一样,讨论起来也不一致,所以规范很重要。
DNS就相当于整个网站映射的规范,适应与全球的网站,国内GFW即利用了DNS污染使得我们无法访问一些国外的网站。
过程
DNS解析过程可以分为有缓存的解析与无缓存的解析,一般都是有缓存的,虽然情况更复杂一些,但更贴近实际。
如果是在浏览器中输入域名, 检测浏览器是否有解析过的IP地址缓存,有的话直接使用上次解析的IP结果。
浏览器无缓存,则检查系统缓存。*nix下会检查
/etc/hosts
文件中是否有对应的缓存。Windows下会检查C:\Windows\System32\drivers\etc\hosts
中内容。注意:黑客可以在解析的任一流程中修改解析对应的IP,将解析的IP指向黑客的服务器,导致域名被劫持。
本地缓存如果都没有的话,会将要解析的域名(www.taobao.com)发送到本地设置的 DNS服务器。即LDNS
Linux下的NameServer配置信息在/etc/resolve.conf
.这个专门的域名解析服务器性能都会很好,它们一般都会缓存域名解析结果,80%的域名解析到这里基本已经完成了,所以LDNS主要承担了域名的解析工作。
如果LDNS没有命中结果,就直接到Root Server域名服务器请求解析
根据域名服务器返回给本地域名服务器一个所查询域的主域名服务器,(gTLD Server)地址。gTLD是国际顶级域名服务,如.com, .cn, .org。
本地域名服务器LDNS再向上一步返回的gTLD服务器发送请求。
接受请求的gTLD服务器查找并返回对应Name Server域名服务器的地址。Name Server通常是注册的域名服务器。
假如这是你再某个域名服务提供上申请的域名,那么这个域名的解析任务由这个域名提供商的服务器来完成。Name Server域名服务器会查询存储域名和IP的关系映射表,正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给DNS Server域名服务器。
根据返回该域名对应的IP和TTL值,本地DNS服务器,LDNS会缓存这域名和IP的对应关系,缓存时间由TTL值来控制。
把解析的结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束。
最后
DNS域名解析过程在面试中也是经常问到的问题,做个整理,希望能帮助到大家,以后自己也方便查看。
参考
深入理解Java Web 技术内幕