Mechanizm rozwiązywania nazw sieciowych do adresów IP
Miałem okazję przeczytać dzisiaj małe opracowanie, traktujące o sposobie w jaki Java przechowuje i rozwiązuje nazwy adresów sieciowych do numerów IP, z którymi próbuje się połączyć. Nie jest to może szalenie istotne zagadnienie, jednak dobrze jest mieć chociaż z grubsza świadomość, jak ów mechanizm funkcjonuje.
Załóżmy, że wykonujemy następujący kod Javy:
1
2
3
URL url = new URL("http://www.google.pl");
InputStream in = url.openConnection().getInputStream();
IOUtils.copy(in, System.out);
Przystępując do ustalania adresu IP Java zagląda najpierw do pliku hosts (domyślnie: c:\Windows\System32\drivers\etc\hosts). Jeśli nie znajdzie tam adresu IP powiązanego z rozpatrywanym adresem internetowym łączy się ze skonfigurowanym w systemie serwerem DNS.
Zapewne dla większości z Was, nie ma w tym nic odkrywczego. Warto jednak wiedzieć, że jako programiści, mamy wpływ na czas, przez jaki Java przechowuje informacje o poszukiwanych adresach IP.
Określają to dwa poniższe parametry:
- networkaddress.cache.ttl - określa czas, przez jaki Java przechowywać będzie w pamięci podręcznej znalezione adresy IP (wartość ujemna - bezterminowo, wartość dodatnia - liczba sekund do wygaśnięcia adresu, zero - przechowywanie wyłączone)
- networkaddress.cache.negative.ttl - określa czas, przez jaki Java przechowywać będzie w pamięci podręcznej informację o braku możliwości znalezienia adresu IP. Po tym czasie nastąpi kolejna próba odpytania serwera DNS (wartość ujemna - bezterminowo, wartość dodatnia - liczba sekund do wygaśnięcia adresu, zero - przechowywanie wyłączone)
Domyślne wartości wynoszą:
- networkaddress.cache.ttl = 30 - tryb zwykły, domyślny dla aplikacji SE,
- networkaddress.cache.ttl = -1 - tryb cache forever, gdy używany jest Security Manager, np. w przypadku apletów,
- networkaddress.cache.negative.ttl = 10
Wartości te możemy zmienić na trzy poniższe sposoby:
- Ustawiając parametry systemowe w kodzie programu:
1 2
java.security.Security.setProperty("networkaddress.cache.ttl", "10"); java.security.Security.setProperty("networkaddress.cache.negative.ttl", "5");
- Edytując plik java.security w katalogu *JAVA_HOME\jre\lib\security* - to wymaga jednak fizycznego dostęp do komputera.
- Z poziomu linii komend ustawiając parametry:
- -Dsun.net.inetaddr.ttl powiązany z parametrem networkaddress.cache.ttl
- -Dsun.net.inetaddr.negative.ttl powiązany z parametrem networkaddress.cache.negative.ttl
Więcej informacji na temat parametrów funkcji sieciowych Javy znaleźć można pod adresem:
http://java.sun.com/javase/6/docs/technotes/guides/net/properties.html
W Javie 1.5 zachowanie w kontekście cache’owania adresów różni się nieco od Javy 1.6. Otóż, w Javie 1.5:
- Można było przekazać parametry w parametrach uruchomienia programu w postaci np.: -Dnetworkaddress.cache.ttl=20.
- Adres w środowisku bez Security Managera cache’owany był w nieskończoność.