前面的文章我们已经说过了,网站一般都是用B/S架构,统一使用应用层协议HTTP来进行数据交互,并且HTTP是无状态的短连接。每一个请求后台都有一个业务逻辑相对应。下面,咱们来看一下B/S网络架构的设计,如图所示:
我们可以从图中发现,首先,DNS把域名解析成对应的ip地址,然后再根据ip地址找到对应的服务器并发送GET请求,最终,服务器将相应的资源返回到客服端。接下来,我们来分析一下DNS到底是怎么进行解析的(红框标注的) ?
1域名解析的那几种方式?
A记录:用来指定域名对应的IP地址,A纪录可以将多个域名解析到一个IP地址,但不能将一个域名解析到多个IP地址。
MX记录:即Mail Exchange,它可以将域名下的邮箱服务器指向自己的Mail Server。
CNAME记录:即Canonical Name(别名解析),可以为一个域名设置一个或者多个别名。
NS记录:为某个域名指定DNS解析服务器,即该域名用指定的DNS服务器去解析IP地址。
TXT记录:为域名设置说明。
2怎么用工具查看域名解析过程?
在windows和linux环境,都可以用nslookup工具来查看解析结果,如图所示:
在linux系统,也可以使用dig命令来查询DNS的解析过程,如图所示:
从上面我们可以清楚的看到整个域名是如何发起和解析的。从根域名(.)到gtld server (.com),再到Name Server(baidu.com.)的整个过程,我们可以发现baidu的dns备份服务器有好几个。
3怎么清除缓存的域名?
在windows环境,我们可以用ipconfig工具来处理,命令如下:
ipconfig /flushdns
结果如图所示:
在linux环境,我们可以用nscd 工具来处理,命令 如下:
sudo apt-get install nscd sudo /etc/init.d/nscd restart
结果如图所示:
4JVM中DNS缓存设置
一般像高级语言的虚拟机都会缓存DNS解析结果,因为这样可以节约DNS解析时间,同样JVM也不例外;JVM的DNS缓存一般是在InetAddress类中完成的,它有两种缓存结果,一种是正确解析结果的缓存,另一种是失败解析结果的缓存。由两个配置项来控制,配置项是在%JAVA_HOME%\lib\security\java.security文件中配置的。两个配置项分布是networkaddress.cache.ttl和networkaddress.cache.negtive.ttl,其默认值分别是-1(永不失效)和10(保留10秒钟)。
怎么进行修改呢?
- 直接修改java.secury文件的默认值。
- 在JAVA启动时加启动参数 -Dsun.NET.inetaddress.ttl=XXX来修改默认值。
5DNS域名解析详细过程
主要请求过程实例图如下所示:
下面,咱们结合图来详细聊聊它的请求流程:
首先,浏览器会检查缓存中有没有这个域名所对应的ip地址;如果有,整个解析过程就结束了;如果没有,则会查找操作系统缓存中是否有这个域名对应的DNS解析结果。操作系统也可以通过改hosts文件来改变DNS解析过程。
操作系统会把域名发送到你系统设置的LDNS(本地区域服务器)进行解析;如果没有命中,直接向Root Server域名服务器发送请求,根域名服务器直接返回本地域名服务器一个所查询域的主域名服务器(gTLD),如 .com/.cn/.org等;
本地域名服务器再向上一步返回的gTLD服务器发送请求,gTLD服务器查找并返回该域名对应的Name Server域名服务器地址,该Name Server通常是你注册的域名服务器;Name Server会查找域名和IP的映射表,并返回对应的IP和TTL;
Local DNS Server会缓存这个域名和IP的映射关系,缓存时间由TTL决定,并把解析结果返回给用户,用户的本地域名缓存时间也由TTL决定。
6造成DNS域传输漏洞原因?
DNS区域传送:指一台备用服务器使用来自主服务器的数据刷新自己的域数据库。
一般只有在真的需要备用域名DNS服务器的安全网络环境中才有必要使用DNS区域传送,但是许多DNS服务器却被错误地配置成只要有client发出请求,就会向对方提供一个zone数据库的详细信息,造成这个漏洞的主要原因是:允许了不受信任的网络环境用户执行DNS区域传送(zone transfer)操作。