InetAddress是如何工作的?它如何找到主机名的IP地址。
我知道我们可以在Java中使用InetAddress进行DNS解析,但我想知道它是如何工作的。它如何找到DNS服务器来解析地址?
我最近看到一个配置错误的cname
,它不是由InetAddress正确解决。它得到了间歇性的解决,但大多数时候都失败了。dig
命令始终在同一台机器上成功执行。尽管在修复了配置之后,InetAddress
也一直工作。但我不明白为什么它以前会间歇性地成功。要么它应该一直失败,要么它成功了。
根据Javadoc,Java的InetAddress
类使用机器网络配置作为解析主机名的策略。
发件人http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/net/InetAddress.java或https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/InetAddress.html(InetAddress来源(:
主机名解析主机名到IP地址的解析是通过使用本地机器配置信息和网络命名服务(如域名系统(DNS(和网络信息服务(NIS((的组合来实现的。默认情况下,使用的特定命名服务是本地机器配置的命名服务。对于任何主机名,都会返回其相应的IP地址。
这意味着,如果有多个网络,或者为单个网络配置了多个DNS服务器,您可能会得到不同的解析结果,因为不同的主机可能会对修复损坏的地址采取不同的宽容态度。
至于为什么另一个应用程序可能更成功,通常取决于它们的解决策略。
如果您使用InetAddress.getByName(String)
,有几个因素会导致不一致的结果:
- 它只返回来自对CCD_ 6的调用的第一个地址
- 对相同地址的重复查询被缓存
- 如果查询不在缓存中,则将其转发到平台名称解析服务。对于Windows和Unixes,这将导致对
getaddrinfo
的调用
此函数的作用是特定于平台的。在带有glibc的Linux上,这是通过gai.conf和nsswitch.conf进行配置的。这会在返回到dns
数据库之前查询许多数据库(几乎总是/etc/hosts
文件(。您可以使用获得类似的结果
getent hosts <host_name>
总之,您使用dig
获得的只是一长串步骤中的最后一个。