![](/img/trans.png)
[英]How do I check if InetAddress was created using a hostname or an IP address?
[英]How does InetAddress find the IP of a given hostname?
InetAddress 是如何工作的? 它如何找到主机名的 IP 地址。
我知道我们可以将 Java 中的 InetAddress 用于 DNS 分辨率,但我想知道它是如何工作的。 它如何找到一个 DNS 服务器来解析地址?
我最近看到了一个配置错误的cname
,它没有被 InetAddress 正确解析。 它间歇性地得到解决,但大多数时候都失败了。 dig
命令一直在同一台机器上成功。 尽管在修复配置后, InetAddress
也始终如一地工作。 但我不明白为什么它之前间歇性地成功了。 它应该一直失败或成功。
根据 Javadoc,Java 的InetAddress
class 使用机器网络配置作为解析主机名的策略。
From http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/net/InetAddress.java or 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)
,则有几个因素会导致结果不一致:
InetAddress.getAllByName(String)
的第一个地址,getaddrinfo
。 这个 function 所做的是特定于平台的。 在带有 glibc 的 Linux 上,这是通过gai.conf和nsswitch.conf 配置的。 在回dns
数据库之前,这会参考许多数据库(几乎总是/etc/hosts
文件)。 您可以通过以下方式获得类似的结果:
getent hosts <host_name>
总而言之,您通过dig
获得的只是一长串步骤中的最后一个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.