深入分析JavaWeb技术内幕系列之—DNS域名解析过程
- 浏览器会检查浏览器缓存中有没有这个域名对应的IP地址,如果有,解析过程结束。
浏览器缓存的时间与服务器返回的TTL(Time To Live)值无关,通常有一个自己的固定值,Google与FireFox默认都是一分钟。
关于TTL这个概念,还有很多不清楚的地方,待到写完DNS再写一篇单独的关于TTL的文章
以Google为例,查看DNS缓存可以访问, chrome://net-internals/#dns 结果如下图:
关闭浏览器再重新打开后,缓存并没有消失,初步判断浏览器的dns缓存是以文件或其他形式保存的,至少不是保存在内存中。
如果浏览器缓存中没有,那么浏览器会去操作系统的缓存中查找。操作系统也会有一个域名解析的过程,这个过程是通过配置文件完成的。Windows文件位置是C:\Windows\System32\drivers\etc\hosts。Linux的是/etc/hosts。文件以键值对的形式存在,IP地址在前,域名在后。
笔者尝试将一个脸滚键盘打出来的域名解析到百度的IP地址,如上图最后一条记录。但是失败了,错误信息是链接被重置。百思不得其解,域名ping的通,从上图最后两条数据也可以看到域名已经被正确解析成百度的IP地址。苦思良久,想起这种行为跟被黑客入侵修改hosts文件没什么区别,那会不会被当成危险操作被拦截了呢?继续尝试将百度的域名以及自己瞎编的域名解析到其他IP地址 如127.0.0.1。测试结果:百度的域名解析到其他地址浏览器会直接发出警告并阻止继续访问,而自己瞎编的域名则正确解析到了本地。猜测是正确的!
那具体是哪一步被拦截了呢?做了很多测试依然没有个可信的结论,如果有比较了解这方面的朋友请不吝赐教。
以上步骤均是在本地完成,如果本地不能完成域名的解析,那么就会开始请求域名服务器了。
怎么才能知道该请求哪个DNS服务器呢?如果我们配置了自动获取DNS地址,那么这个DNS服务器通常就是由你接入互联网的应用商提供,如电信联通。这个DNS服务器又被叫做LDNS(Local DNS)。查看自己使用的DNS地址可以使用 ipconfig/all 或者 nslookup命令。这种域名解析服务器的性能都很好,它们会缓存解析结果,这个缓存时间与浏览器不同,它们是受TTL失效时间控制的。百分之八十的解析到这里就完成了。
Local(本地)的概念是相对全球只有13台的根域名服务器(Root Server)来说的,并不是说就在我们附近的才叫做本地域名服务器。当然了,如果你不手动配置DNS地址的话,那么通常分配给你的DNS服务器就在你的城市附近。如果你觉得自动分配的DNS太慢,可以手动配置其他的如114或者阿里的DNS,虽然地理位置上可能离我们很远,但本质上它们还是LDNS。- 如果LDNS没有命中,那么就直接到Root Server根域名服务器请求解析。
- Root Server返回给LDNS一个所查询的主域名服务器(gTLD Server)地址,gTLD是国际顶级域名服务器,如.com、.cn等。
- LDNS再向Root Server返回的gTLD服务器发送请求。
- gTLD服务器查找并返回此域名对应的Name Server域名服务器的地址,这个Name Server通常就是你注册的域名服务器,例如你在某个域名服务提供商申请的域名,那么这个域名解析就由这个域名提供商的服务器完成。
- Name Server域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个TTL值返回给LDNS。
- LDNS缓存域名和IP的对应关系,缓存时间由TTL值控制。
- 把解析的结果返回给用户,用户根据TTL值缓存在本地系统中,域名解析过程结束。
附图:
图片来自网络,侵删