I've recently been introduced to the caching behaviour of InetAddress, and I think it may be improved.

The javadoc reads:
The InetAddress class has a cache to store successful as well as unsuccessful host name resolutions. The positive caching is there to guard against DNS spoofing attacks; while the negative caching is used to improve performance.

And that is all fine and well, but for multihomed hosts, I believe the current behaviour is

1) Not documented properly
2) Not correct

Coming from a unix-world, I'm used to the resolver handing out RR-replies in random order, and thus I would expect InetAddress to do the same, but a short test (courtesy of Arne Vajhøj) shows that InetAddress.getByName() will return the same IP for a lookup when the lookup is performed within the 10-second range of the cache:

public class DNSLookup {

private static final String MS = "www.microsoft.com";

public static void main(String[] args) throws Exception {

Map<String, Integer> m = new HashMap<String, Integer>();

InetAddress[] all = InetAddress.getAllByName(MS);

for(InetAddress one : all) {

m.put(one.getHostAddress(), 0);

}

for(int i = 0; i < 10000; i++) {

String ms = InetAddress.getByName(MS).getHostAddress();

m.put(ms, m.get(ms) + 1);

}

for(Entry<String, Integer> e : m.entrySet()) {

System.out.println(e.getKey() + ": " + e.getValue());

}

}

}


Outputs:
207.46.19.190: 0
207.46.193.254: 10000
207.46.192.254: 0
207.46.19.254: 0

While I would expect the replies to distribute to about 2500 on each (which it will if the cache isn't used).

--
Andreas

Reply via email to