Обратный просмотр DNS в блоке Windows в течение нескольких секунд для неразрешимых IP-адресов
Я использую JavaInetAddress.getHostName()
выполнить некоторые обратные поиски DNS, и кажется, что со временем что-то не так. Вот фрагмент кода:
public static void main(String[] args) throws IOException {
byte[][] addresses = new byte[][] { { 10, (byte) 0, (byte) 0, (byte) 138 }
, new byte[] { (byte) 216, (byte) 239, (byte) 49, (byte) 245 }
,{ 8, (byte) 8, (byte) 8, (byte) 8 } };
for (byte[] addr : addresses) {
InetAddress inet = InetAddress.getByAddress(addr);
long before = System.currentTimeMillis();
String hostName = inet.getHostName();
System.out.printf("%20s %40s %5d\n", inet.getHostAddress(), hostName, (System.currentTimeMillis() - before));
}
}
И вот вывод на моей машине:
10.0.0.138 10.0.0.138 4503
216.239.49.245 216.239.49.245 4591
8.8.8.8 google-public-dns-a.google.com 8
Разрешение 10.0.0.138 и 216.239.49.245 занимает 4,5 секунды, независимо от того, сколько раз я запускал этот код. Кажется, это происходит со всеми неразрешимыми IP-адресами.
Это не проблема сети, так как в соответствии с перехваченной проволокой, DNS-запросыдаже не отправлены когда этот код запускаетсяесли кеш DNS не очищен первым (а затем результаты еще медленнее - около 4,7 секунды на разрешение).
Так что же на самом деле занимает 4,5 секунды в Java для тайм-аута в локальном DNS-кэше ОС? Это бессмысленно. Утилита командной строкиnslookup
возвращает (неразрешимые) результаты для этих IP-адресов гораздо быстрее, и он даже не использует кеш!
Может кто-нибудь объяснить это поведение и предложить способ ускорить эти решения? Единственное, о чем я могу подумать, не обращаясь к внешним библиотекам, - это использовать несколько потоков, поэтому по крайней мере 4,5 секунды будет выполняться параллельно.
Для справки, я использую JDK 7u71 на Windows 7 x64
Edit1: это Вопрос кажется актуальным, но ответ там говорит о том, что производительность зависит от сети, а это не то, что я наблюдал.
Edit2:
Кажется, это проблема Windows. Машина в той же локальной сети, которая использует тот же DNS, на котором запущен OpenSuse 13.1 с JDK 1.7u67, дал следующие результаты:
Без кеширования DNS:
10.0.0.138 10.0.0.138 116
216.239.49.245 216.239.49.245 5098
8.8.8.8 google-public-dns-a.google.com 301
С кешированием DNS:
10.0.0.138 10.0.0.138 5
216.239.49.245 216.239.49.245 9
8.8.8.8 google-public-dns-a.google.com 40
Edit3:
В конце концов мне пришлось обойти эту проблему, выполнив свой собственный обратный поиск DNS, используяdnsjava.