域名解析过程:
1、浏览器会检查缓存中有没有这个域名对应的解析过的IP地址,如果缓存中存在,此解析过程到此就已经结束。
2、如果用户的浏览器缓存(通过host文件进行设置)中没有,浏览器接下来会去操作系统缓存中查找是否有这个域名对应的DNS解析数据。
3、前面两个步骤都是在本机中进行的,如果再本机中没有找到解析的IP缓存,操作系统就会把这个域名发送到本地区的域名服务器(Local DNS Server)LDNS。这个专门的域名解析服务器的性能一般都会很好,他们一般都会缓存域名的解析结果。其实大约有80%的域名解析的工作到这里就已经完成了,所以LDNS主要承担域名的解析工作。
4、如果LDNS还没有找到,就会直接到Root Server域名服务器请求解析。根域名服务器会返回给LDNS一个所查询域的主域名服务器(gTLD Server)地址(gTLD是国际顶级的域名服务器)。
5、LDNS再向上面接受的gTLD服务器发送请求。接收请求的gTLD服务器查找到此域名对应的Name Server域名服务器(Name Server通常就是你注册的域名服务器,假如你在某个域名服务商申请的域名,那么这个域名解析的任务就会由这个域名提供商的服务器来完成)的地址并返回。
6、Name Server 域名服务器会查询存储的域名和IP的映射关系表(正常情况下,会根据域名得到目标的IP记录,和一个TTL值),返回给DNS Server域名服务器。Local DNS Server会缓存这个域名和IP对应的关系,缓存的事件由TTL值控制。
7、把解析的结果返回给用户,用户本机系统会根据TTL值来进行缓存。
大概的解析过程就是这样的,但是实际中可能还有更加复杂的解析过程,比如Name Server是多级的,或者通过一个GTM来进行负载均衡的控制等。
清除缓存的域名
DNS解析的域名主要再两个地方进行缓存,一个是Local DNS Server,另一个是本机。并且这两个缓存都是通过TTL值和本机缓存大小控制的,但是最大缓存时间是TTL值。基本上Local DNS Server的缓存时间就是TTL控制的,很难人工进行介入。
本机缓存,Windows下在命令行模式下执行ipconfig/flushdns命令来刷新缓存。
在Java应用中JVM也会缓存DNS的解析结果,这个缓存是在InetAddress类中完成的,而且这个缓存时间有两种缓存策略:一种是正确解析结果缓存(在配置项networkaddress.cache.ttl配置,默认值是-1(永不失效)),一种是失败的解析结果缓存(在配置项networkaddress.cache.negative.ttl配置,默认值10(缓存10秒))。这两个配置项是在%JAVA_HOME%\lib\security\java.security文件中配置的。
注意:如果我们需要用InetAddress类解析域名时,一定要是单例模式,不然会有严重的性能问题,如果每次都创建InetAdress实例,每次都要进行一次完整的域名解析,非常耗时。
几种域名解析方式
A记录。A代表的时Adress,用来指定域名对应的IP地址。A记录可以将多个域名解析到一个IP地址,但是不能将一个域名解析到多个IP地址。
MX记录。表示的时Mail Exchange,就是可以将域名下的邮件服务器(Mail Server)指向自己
的。
CNAME记录。Canonical Name(别名解析)。就是可以为一个域名设置一个或者多个别名。
NS记录。为某个域名指定DNS解析服务器。
TXT记录。为某个主机名或者域名设置说明。