Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 30 Sep 2004 08:31:24 -0700 (PDT)
From:      Rostislav Krasny <rosti_bsd@yahoo.com>
To:        freebsd-net@freebsd.org
Subject:   default resolver(5) configuration and behavior of functions like gethostbyname(3)
Message-ID:  <20040930153124.59272.qmail@web14826.mail.yahoo.com>

next in thread | raw e-mail | index | archive | help
Hello all. Please consider following two questions:

1. According to the resolver(5) manual page the default number of times the
resolver will send a query to each of its name servers is defined as
RES_DFLRETRY in resolv.h standard header file. Actually there was no
RES_DFLRETRY in the resolv.h before following commits to HEAD made by Yar
Tikhiy:

http://docs.freebsd.org/cgi/mid.cgi?200409091739.i89HdlwM019548
http://docs.freebsd.org/cgi/mid.cgi?200409091742.i89HgIan019681
http://docs.freebsd.org/cgi/mid.cgi?200409091719.i89HJRGu019026

This default number of retries (the RES_DFLRETRY macro in the HEAD and a
hardcoded constant value in 5.x) is 4. But in most of other UNIX or
UNIX-like systems (Solaris, AIX, Linux, NetBSD) this default value is 2.
Only in OpenBSD it is 4 and also it is a hardcoded constant there.

Please explain why developers of FreeBSD had chose 4 instead of 2? Maybe
they should change it to 2, as this default value is defined on most of
other systems, including NetBSD?


2. Please consider following experimets I did on FreeBSD 5.3-BETA2-BETA6:

I changed the /etc/resolv.conf so it had only one following line:

nameserver      21.21.21.21

21.21.21.21 is just some black-hole host without any working DNS on it.
Then I ran 'tcpdump -nvi ed1' on one pseudo terminal and 'ping yahoo.com'
on other pseudo terminal. This way I counted the "A? yahoo.com." DNS
queries before ping(8) returned an error. With this configuration there
were 8 "A? yahoo.com." DNS queries. Then I added following line to the
/etc/resolv.conf

options         attempts:1

With this configuration there were 2 "A? yahoo.com." DNS queries. With
"attempts:2" there were 4 "A? yahoo.com." DNS queries, with "attempts:3"
there were 6 "A? yahoo.com." DNS queries, with "attempts:5" there were 10
"A? yahoo.com." DNS queries and so on.

I repeated this experiment with following program been used instead of the
ping(8):

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>

int main(void)
{
        const char *name="yahoo.com";
        struct hostent *ps_hostent;
        char **st;

        ps_hostent=gethostbyname(name);
        if (ps_hostent!=NULL) {
                printf("%s\n", ps_hostent->h_name);
                for (st=ps_hostent->h_addr_list; *st!=NULL; st++) {
                        printf("%s\n",
                                inet_ntoa(*(struct in_addr *)*st));
                }
                if (st==ps_hostent->h_addr_list)
                        fputs("It have no address.\n", stderr);
        } else {
                herror(name);
        }
        return 0;
}

The results where exactly the same.

Why the number of DNS queries is always doubled? With default resolver(5)
configuration there are 8 DNS queries to one non-working DNS server and it
takes 2:30 minutes before an error returned. IMHO this is too much time and
too much queries for default resolver(5) configuration. Who and why is
doubling the number of DNS queries? Is it gethostbyname(3) function or the
resolver itself?


		
_______________________________
Do you Yahoo!?
Declare Yourself - Register online to vote today!
http://vote.yahoo.com



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040930153124.59272.qmail>