深入分析不是不复制、不黏贴,全部内容手打,边打边学习、理解

前言

本文来自《深入解析Java Web技术》这本书,由于我对DNS不是特别熟悉,所以本书中关于DNS的部分也有比较详细的介绍,所以我直接使用书的内容。老规矩,不复制,不粘贴,所有内容都是手写,边打字边学习理解。

DNS 域名解析

我们知道互联网通过URL发布和请求资源,需要将URL中的域名解析成IP地址才能与远程主机建立连接。将域名解析为IP地址属于DNS解析的范畴。

毫不夸张地说,虽然我们平时上网时感觉不到DNS解析的存在,但一旦DNS解析出了问题,就有可能导致非常严重的互联网灾难。目前,全世界的整个互联网都有好几台DNS根域名服务器。如果任何根服务器出现故障,后果将非常严重。

DNS域名解析流程

当我们在浏览器中输入时,DNS解析会有近10个步骤。这个过程大致可以用一张图来表示:

p>

整个过程大致描述如下,其中前两步在本地完成,后八步涉及到真正的DNS服务器:

1、浏览器会检查缓存中是否有对应域名的解析IP地址。如果缓存中有一个,则解析过程将结束。浏览器缓存域名也是有限的,不仅浏览器缓存大小有限,而且缓存时间也有限,通常从几分钟到几小时不等。可以通过 TTL 属性设置域名缓存的时间限制。缓存时间过长或过短。如果时间过长,一旦域名解析到的IP地址发生变化,客户端缓存的域名就无法解析到变化后的IP地址,导致域名无法正常。分析,部分用户在此期间无法访问该网站。如果设置时间过短,会导致用户每次访问网站时都要重新解析域名。

2、如果用户浏览器缓存中没有数据,浏览器会检查操作系统缓存中是否有对应域名的DNS解析结果。其实操作系统也有域名解析的过程。在 Windows 中,可以通过 C:\Windows\System32\drivers\etc\hosts 文件进行设置。在 Linux 中,可以通过 /etc/hosts 文件进行设置。用户可以解析任何域名。到任何可访问的 IP 地址。比如我们可以在测试的时候将一个域名解析到一个测试服务器上,这样我们就可以在不修改任何代码的情况下测试单独的服务器上代码的业务逻辑是否正确。正是由于这种本地DNS解析程序,黑客可能会修改用户的域名,将特定的域名解析为他指定的IP地址,从而导致这些域名被劫持。

3、当前两个进程无法解析时,会使用我们网络配置中的“DNS服务器地址”。操作系统会将域名发送到本地域名服务器LDNS。这个DNS通常为用户的本地Internet访问提供DNS解析服务。比如用户在学校上网,那么用户的DNS服务器就必须在学校;如果用户在一个社区访问互联网,那么用户的DNS就是第二个提供互联网访问的应用提供商,即中国电信或中国联通,也称为SPA,那么DNS通常位于某个角落用户所在的城市,不是很远。在Windows环境下,通过命令行输入ipconfig,在Linux环境下,可以通过cat /etc/resolv.conf查询配置的DNS服务器。这个专门的域名解析服务器的性能会非常好。他们通常缓存域名解析结果。当然,缓存时间是由域名的过期时间控制的。大约80%的域名解析到此结束,所以LDNS主要负责域名解析。

4、如果LDNS还是没有命中,直接去Root Server域名服务器请求解析

5、根域名服务器向本地域名服务器返回查询。主域名服务器(gTLD 服务器)的地址。 gTLD是国际顶级域名服务器,如.com、.cn、.org等,全球只有13个左右

6、本地域名服务器LDNS向上一步返回的gTLD服务器发送请求

6、 p>

7、 接受请求的 gTLD 服务器搜索并返回该域名对应的 Name Server 域名服务器的地址。这个Name Server通常是用户注册的域名服务器,例如用户申请一个域名服务商的域名,那么域名解析任务就由域名服务商的服务器完成

8、NameServer域名服务器会查询存储的域名和IP映射关系表,一般情况下都根据域名获取目标IP地址,并返回给DNS Server域名服务器加上一个 TTL 值。

9、返回域名对应的IP和TTL值,LDNS会缓存域名和IP的对应关系,缓存时间由TTL值控制

10、将解析结果返回给用户,用户根据TTL值缓存在本地系统缓存中,域名解析过程结束

在实际的DNS解析过程中,可能不止这10个步骤。例如,Name Server 可能有很多层级,或者可能有一个 GTM 用于负载均衡控制,这可能会影响域名解析过程。

清除缓存的域名

我们知道DNS域名解析会缓存解析结果,主要缓存在两个地方:

1、本地 DNS 服务器

2、用户的本地机器

这两个缓存是由TTL值和本地缓存大小控制的,但是最大缓存时间是TTL值,基本上Local DNS Server的缓存时间是由TTL控制的,手动干预比较困难,但是我们的本地缓存可以如下清除:

1、在Windows环境下,可以在命令行执行ipconfig /flushdns命令用于刷新缓存dns根域名解析失败有什么影响,如图

2、在Linux环境下,可以通过 /etc/init.d/nscd restart 清除缓存,因为我家电脑上安装的虚拟机比较卡,就不截图了

重启仍然是解决很多问题的首选。

在 Java 应用程序中,JVM 也会缓存 DNS 解析结果。这个缓存是在 InetAddress 类中完成的,缓存时间比较特殊。它有两种缓存策略:

1、正确解析结果缓存

2、解析结果缓存失败

两个缓存时间由两个配置项控制,配置项在%JAVA_HOME%\lib\security\java.security文件中配置,这两个配置项分别是networkaddress.cache.ttl和networkaddress.cache。负.ttl,它们的默认值为-1(永不失效)和10(缓存10秒),可以直接修改这两个值。也可以通过在Java启动参数中添加-Dsun.net.inetaddr.ttl=xxx来修改默认值,也可以通过InetAddress类动态修改。

几种域名解析方式

域名解析记录主要分为A记录、MX记录、CNAME记录、NS记录和TXT记录:

1、一条记录

A代表Address,用于指定域名对应的IP地址,如指定item.taobao.com为115.238.23.xxx ,将switch.taobao.com分配给121.14.24.xxx。一条记录可以将多个域名解析为一个IP地址,但不能将一个域名解析为多个IP地址

2、MX 记录

邮件交换,可以将域名下的邮件服务器指向自己的邮件服务器。例如淘宝网域名A记录的IP地址为115.238.25.xxx。如果MX记录设置为115.238.25.xxx,xxx@taobao.com的邮件路由,DNS会发邮件到115.23 8.2 5.xxx所在的服务器,A记录的IP地址依然解析为正常的web请求

3、CNAME 记录

Canonical Name,别名 Parse。所谓别名解析,是指可以为一个域名设置一个或多个别名,如将aaa.com解析为bbb.net,将ccc.com解析为bbb.net,其中bbb.net为aaa.comdns根域名解析失败有什么影响, ccc.com分别别名

4、NS 记录

为域名指定DNS解析服务器,即域名由指定IP地址的DNS服务器解析

5、TXT 记录

为某个主机名或域名设置描述,例如可以将ddd.net的TXT记录设置为“这是XXX的博客”这样的描述

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论