由于工作原因,我使用strace命令追踪了curl和wget请求的整个过程,其中关于DNS域名解析的部分,得出了如下结论。其中有些不太理解,而源码又看不懂(运维一枚),请给予协助,感谢!
假设一共域名:test.domain.com的域名,DNS配置了2个A记录
测试命令:
strace curl -v test.domain.com
strace wget test.domain.com
我的结论:
(1)curl是通过libcurl跨平台库去实现的,暂且搞不懂curl是通过何种方式或规律由域名转为IP地址的,不过多次使用curl去请求,从strace的结果中来看,它并没有去轮询请求两个A记录的IP地址。
(2)相对于curl来说,一次wget请求,它把很多时间都用在了域名解析上,在查找hosts文件无果的情况下,通过类似dig的方式解析获取所有ip地址并去选择其一去请求数据,多次测试,结果:它可以轮询使用DNS解析出的(2个A记录IP)去请求资源。
我的问题:
我想更进一步了解curl和wget(尤其是curl)关于DNS域名解析部分的原理
curl会用一个子线程去做DNS查询,所以要用
strace -f
才能看到。大概看了一下curl的代码,DNS解析有多种实现,我用的版本是用线程实现的异步DNS,但最终执行解析的都是
curl_addrinfo.c
的Curl_getaddrinfo_ex
函数,里面会调用getaddrinfo获得IP列表。