我注意到Linux默认情况下似乎有串行/同步DNS解析而不是并行/异步DNS解析 .

我在Virtualbox中使用2个网络适配器( eth0eth1 )进行了测试,一个用于NAT,另一个是连接到公共互联网的家用路由器的桥接网络 . 这给了我2个DNS服务器,一个来自VirtualBox NAT,另一个是我的家庭网络路由器的DNS .

这是我 /etc/resolv.conf 的内容:

vagrant@vagrant-ubuntu-trusty-64:~$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 10.0.2.3
nameserver 10.1.1.1

然后我尝试使用 eth0 在我的根命名空间上联系谷歌两次,并在我的网络命名空间中使用桥接器 eth1 两次:

vagrant@vagrant-ubuntu-trusty-64:~$ curl -w "@timing_curl" -o /dev/null -s http://google.com

            time_namelookup:  0.004
               time_connect:  0.030
            time_appconnect:  0.000
           time_pretransfer:  0.031
              time_redirect:  0.000
         time_starttransfer:  0.066
                            ----------
                 time_total:  0.067

vagrant@vagrant-ubuntu-trusty-64:~$ curl -w "@timing_curl" -o /dev/null -s http://google.com

            time_namelookup:  0.004
               time_connect:  0.032
            time_appconnect:  0.000
           time_pretransfer:  0.032
              time_redirect:  0.000
         time_starttransfer:  0.065
                            ----------
                 time_total:  0.065

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip netns exec robots curl -w "@timing_curl" -o /dev/null -s http://google.com

            time_namelookup:  10.530
               time_connect:  10.560
            time_appconnect:  0.000
           time_pretransfer:  10.560
              time_redirect:  0.000
         time_starttransfer:  10.594
                            ----------
                 time_total:  10.594

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ip netns exec robots curl -w "@timing_curl" -o /dev/null -s http://google.com

            time_namelookup:  5.519
               time_connect:  5.548
            time_appconnect:  0.000
           time_pretransfer:  5.548
              time_redirect:  0.000
         time_starttransfer:  5.582
                            ----------
                 time_total:  5.583

正如您所看到的,使用 eth0 的root命名空间和使用 eth1 的robots命名空间之间的 time_namelookup 存在显着差异 .

我在 /etc/resolv.conf 中交换了2个名称服务器条目,这减少了机器人名称空间内的名称查找时间 . 我也试过ping,这导致了相同的时差 .

这一切都让我得出结论,默认情况下Linux内的DNS解析是顺序的 . 是否有一个原因?为什么不并行解析DNS?并且正确的解决方案是运行能够并行解析的本地递归DNS服务器吗?

(顺便说一下,这是用于卷曲的格式https://gist.githubusercontent.com/spiermar/8888552/raw/efc0b09699b0fd619eb32638d4f1099db528fe54/curl-format