簡體   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