首页 > 解决方案 > InetAddress 如何找到给定主机名的 IP?

问题描述

InetAddress 是如何工作的?它如何找到主机名的 IP 地址。

我知道我们可以在 Java 中使用 InetAddress 进行 DNS 解析,但我想知道它是如何工作的。它如何找到 DNS 服务器来解析地址?

我最近看到一个配置错误的cname, InetAddress没有正确解决它。它间歇性地得到解决,但大多数时候都失败了。该dig命令一直在同一台机器上成功。尽管在修复配置后,InetAddress工作也始终如一。但我不明白为什么它之前间歇性地成功了。它应该一直失败或成功。

标签: javadnsinetaddress

解决方案


如果您正在使用InetAddress.getByName(String),有几个因素会导致结果不一致:

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

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

getent hosts <host_name>

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


推荐阅读