'gethostbyname'에 해당되는 글 1건

  1. 2010.11.11 DNS 요청에 대한 TimeOut시간의 진실은.
시스템이야기2010. 11. 11. 22:04
커피닉스(coffeenix.net)의 '범냉이'님이 dig과 nslookup툴을 사용하여, resolv.conf에서 지정한 DNS 서버가 죽었을 경우 timeout시간은 어떻게 되는지 테스트를 하셨다. 테스트한 글은 '커피닉스'에 'DNS 질의 TimeOut의 진실은..'  에 정리되어 있다.

lookup

※ 이미지 출처 : 구글 'domain lookup' 이미지 검색


resolv.conf에 지정한 DNS서버 중 한대가 응답이 없을 때, DNS 요청의 timeout은 5초일까? 1초일까?
왜 이런 궁금증을 갖게됐을까? /usr/include/resolv.h에는 RES_TIMEOUT은  5초로 설정되어 있다. 하지만 dig이나 nslookup으로 테스트한 결과는 1초였기 때문이다.

1) Primary 정상, Secondary 정상
2) Primary 비정상, Secondary 정상
3) Primary 정상
4) Primary 비정상

위 4가지 상황에 대한 테스트 결과는 범냉이님의 글을 읽어보면 결과를 확인할 수 있다.
이후, 추가적인 실험은 제가 넘겨받아 하게 됐다. 자세한 글은 '커피닉스'의 'DNS 질의 TimeOut의 진실은.. (2번째)' 에 쓰여있고, 여기에는 간단하게 요약해서 적었다.

1. dig, nslookup에서는 왜 timeout이 1초인가?

결론적으로는 bind 소스내의 dig과 nslookup툴은 resolv.h의 설정값을 사용하지 않는다. dig소스의 dig.h에 timeout이 1초(#define SERVER_TIMEOUT 1)로 정의되어 있기 때문이다.

2. 만약 resolv.conf에 지정한 모든 서버가 응답이 없다면 dig, nslookup의 timeout 결과는?

정리하면 다음과 같다.
1) resolv.conf에 나열된 서버간 요청 대기는 1초(SERVER_TIMEOUT)
2) 나열된 모든 서버 요청 후 retry시 대기는 5초(UDP_TIMEOUT)
3) retry 횟수는 3번이다.

resolv.conf에 지정한 서버 대수에 따라서,

1) 1대일 때 응답없다면 : 5초 + 5초 + 5초 = 총 15초 소요.
2) 2대일 때 모두 응답이 없다면 : 1초+5초  +  1초+5초  +  1초+5초 = 총 18초 소요
3) 3대일 때 모두 응답이 없다면 : 1초+1초+5초  +  1초+1초+5초   +  1초+1초+5초 = 총 21초 소요

3. gethostbyname() 함수, ping 프로그램 테스트 결과는?

gethostbyname()함수를 사용하는 C프로그램이라면 지금까지 설명한 resolv.h와 resolv.conf을 따르게 된다. 대표적인 것이 ping일 것이다.

resolv.conf에 지정한 DNS서버에서 ICMP응답을 받을 수 있느냐 없느냐에 따라서 대기시간(timeout시간)은 달라지게 된다.

ICMP Port Unreachable

ICMP Port Unreachable (UDP Port 53)


1) ICMP응답이 온다면, timeout없이 바로 다음 서버로 요청을 한다.
2) ICMP응답이 없다면, timeout동안(5초) 대기하다가 다음 서버로 요청을 한다.

4. 효과적인 resolv.conf 설정

만약 resolv.conf에 지정한 첫번째 네임서버(또는 네임서버 VIP) 자체가 죽는다면 ICMP 응답을 못받을 것이다. 따라서 응답시간을 줄이고자 한다면 resolv.conf에서 timeout시간을 줄여주는게 더 나은 대비책이 될 것이다.

options timeout:1 attempts:2 또는
options timeout:1 attempts:1

하지만 resolv.conf 설정을 사용하지 않는 프로그램도 있다. 모든게, resolv.conf 설정대로 될 것이라는 믿음은 절대 금물.

Posted by 좋은진호