Very nice explanation. Your two well-chosen examples clarified how
rotation works beautifully.
Thanks, Brian.
Regards,
- Robert
On Tue, Sep 11, 2012 at 10:03 PM, Brian Pitts <
br...@polibyte.com> wrote:
> Host and dig are a little tricky to run under strace, since they fork
> several times. I might try a simple python program like this.
>
> #!/usr/bin/env python
> import socket
> for x in range(4):
> socket.getaddrinfo('
google.com', 80)
>
> Now, if I trace the connect system call and filter only for port 53,
> I'll see
>
> strace -e trace=connect ./lookup_google.py 2>&1 | grep 53
>
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.222.222")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.222.222")}, 16) =
>
> (Instead of using strace, I could have used tshark or tcpdump to watch
> the traffic, e.g. tshark -i wlan0 'udp port 53')
>
> Which is what I would expect when my resolv.conf is
>
> options rotate
> nameserver 208.67.222.222
> nameserver 208.67.220.22
>
> However, what if I change my program to just
>
> #!/usr/bin/env python
> import socket
> socket.getaddrinfo('
google.com', 80)
>
> And run it four times?
>
> for i in $(seq 1 4); do strace -e trace=connect ./lookup_google.py 2>&1
> | grep 53; done
>
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
> connect(4, {sa_family=AF_INET, sin_port=htons(53),
> sin_addr=inet_addr("208.67.220.220")}, 16) = 0
>
> Now you see that it always hits the first nameserver. The rotation only
> takes place for multiple lookups within a single program. That makes
> sense when you think about it. There's not some central program the all
> the programs on your system are talking to to make these lookups (unless
> you're using nscd); instead, each program is loading and executing
> library function independently.