繁体   English   中英

InetAddress 如何找到给定主机名的 IP?

[英]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) ,则有几个因素会导致结果不一致:

  1. 它仅返回调用InetAddress.getAllByName(String)的第一个地址,
  2. 对同一地址的重复查询被缓存,即使是否定的结果,
  3. 如果查询不在缓存中,则将其转发到平台名称解析服务。 对于WindowsUnix ,这会导致调用getaddrinfo

这个 function 所做的是特定于平台的。 在带有 glibc 的 Linux 上,这是通过gai.confnsswitch.conf 配置的。 在回dns数据库之前,这会参考许多数据库(几乎总是/etc/hosts文件)。 您可以通过以下方式获得类似的结果:

getent hosts <host_name>

总而言之,您通过dig获得的只是一长串步骤中的最后一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM