DNS 解析过程详解

1. DNS解析过程

DNS 解析过程详解_第1张图片

1
2
3
4
5
6
7
1)、在浏览器中输入 www.baidu.com 域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
2)、如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
3)、如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地DNS服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
4)、如果要查询的域名,不由本地DNS服务器区域解析,但该DNS服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
5)、如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地DNS服务器的设置(没有设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至13台根DNS,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个IP。本地DNS服务器收到IP信息后,将会联系负责 .com域的这台服务器。这台负责 .com域的服务器收到请求后,如果自己无法解析,它就会找一个管理 .com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作进行查询,直至找到www.baidu.com主机。
6)、如果用的是转发模式(设置转发器),此DNS服务器就会把请求转发至上一级ISP DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根DNS或把转请求转至上上级,以此循环。不管是本地DNS服务器用是是转发,还是根提示,最后都是把结果返回给本地DNS服务器,由此DNS服务器再返回给客户机。
注:从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是迭代查询。

2. DNS扩展(本地DNS缓存)

Windows和Linux系统都会在本地缓存dns解析的记录,提高速度。但是,测试dns服务器的解析时,需要快速刷新(清除)本地的dns缓存,下面是linux和windows下如何快速刷新本地dns缓存记录的方法:


1)、Windows 客户端     
获得缓存中的DNS :   

1
ipconfig /displaydns

强制清除DNS 缓存:    

1
ipconfig /flushdns

也可以在服务器管理中重新启动DNS Client服务:    

1
net stop dnscache

重启动DNS Client服务:    

1
net start dnscache

2)、Linux 客户端     
开启本地DNS 缓存的服务    

1
2
# chkconfig –list | grep nscd
nscd 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭

该服务除了提供DNS 缓存外,还缓存/etc/passwd, /etc/groups 缓存,DB文件在/var/db/nscd下 ,还可提供 NIS 加速的作用。    
启动本地 DNS 缓存服务即可:    

1
# service nscd start

反之    

1
# service nscd stop

需要注意的是,在linux下没有强制清除DNS缓存的命令。但是,我们可以通过删除其后台数据库记录信息,达到清除DNS缓存的目的:    

1
2
# rm /var/db/nscd/hosts
# service nscd restart


3)、Linux Bind 服务    
有时候,我们的客户端是处于某台 DNS 缓存服务器后面的。常见的情况是,作为 NAT 网关的 Linux 服务器,通过bind 服务,提供 DNS 缓存和转发功能。这可通过配置/etc/named.conf,加入forward来实现:

1
2
3
4
5
6
7
8
9
options {
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
forward only;
forwarders {
8.8.8.8;
};
};

这时,客户端对外的 DNS 解析结果,除保留在客户端本地的 DNS 缓存中,同样会保留在这台网关服务器上。还有一种情况就是,当我们修改 named 提供的DNS服务时,也需要刷新缓存。   
bind 提供的 rndc 命令可以清空缓存的功能:    

1
# rndc flush

你可能感兴趣的:(DNS 解析过程详解)