1. DNS域名解析过程
用户在浏览器输入 URL 地址后:
1. 浏览器检查缓存中是否存在这个域名对应的解析过的IP地址,如果有,则解析结束。(浏览器缓存大小有限制、域名被缓存的时间也可以通过TTL属性来设置)
2. 若浏览器缓存中没有,浏览器会查找操作系统缓存中是否存在该域名对应的DNS解析结果。Windows中可以通过 C:\Windows\System32\drivers\etc\hosts,Linux中这个配置文件是 /etc/hosts
3. 如果前面两步仍然无法解析,那么浏览器就会请求本地的域名服务器(Local DNS Server/ LDNS)。在Windows下通过 ipconfig 命令查询到这个地址(DNS服务器),Linux下通过命令 cat /etc/resolv.conf。这个专门的域名解析服务器性能都会很好,一般也会缓存域名解析结果(有时效),LDNS承担了主要的域名解析工作。
4. 如果 LDNS 仍然没有命中,就直接到 Root DNS Server服务器请求解析。
5. 根域名服务器(Root DNS Server)返回给 本地域名服务器(Local DNS Server)一个所查询域的主域名服务器(gTLD Server)地址。gTLD 是国际顶级域名服务器,如.com、.cn、.org等,全球只有13台左右。
6. LDNS 再向上一步返回的 gTLD 服务器发送请求
7. 接受请求的 gTLD 服务器查找并返回此域名对应的 Name Server 域名服务器的地址,这个 Name Server 通常就是你注册的域名服务器。
8. Name Server域名服务器会查询存储的域名和IP的映射关系表,在正常情况下都根据域名得到目标IP记录,连同一个 TTL值返回给 LDNS。
9. LDNS 得到返回的 IP 和 TTL 值之后,会缓存 域名和IP,缓存时间由 TTL 值控制。
10. 将解析结果返回给用户,用户根据 TTL 值缓存在本地系统缓存中,域名解析结束。
在实际的DNS解析过程中,可能不止这10个步骤,如 Name Server 也可能有多级,或者有一个GTM来负载均衡控制。
2. 清除缓存的域名
DNS域名解析后会缓存解析结果,主要是缓存在 LDNS和本机。基本上 LDNS的缓存很难人工介入,而本机缓存可以,如下:
Windows 下可以在命令模式下执行 ipconfig/flushdns 命令来刷新缓存,Linux下通过 /etc/init.d/nscd restart 来清除缓存。
Java 应用中JVM也会缓存DNS的解析结果,这个缓存是在 InetAddress类中完成的,有两种缓存策略:a. 正确解析结果缓存,b. 失败的解析结果缓存。这两个缓存时间分别由 networkaddress.cache.ttl 和 networkaddress.cache.negative.ttl 控制(默认值分别是 -1(永不失效)和 10(缓存10秒)),配置项是在 %JAVA_HOME%\lib\security\java.security 中配置的。
要修改这两个值同样有几种方式:a. 直接修改 java.security 文件中的默认值 b. 在Java的启动参数中增加 -Dsun.net.inetaddr.ttl=xxx 来修改默认值 c. 通过InetAddress 类动态修改。特别强调一下,如果我们需要调用 InetAddress 类解析域名,必须是单例模式,不然会有严重的性能问题。
3. 几种域名解析方式
域名解析记录主要分为 A记录、MX记录、CNAME记录、NS记录 和 TXT 记录。