我在移动客户端中遇到了一些失败的 API 调用。为了进行调查,我听从约瑟夫·斯科特的建议并使用一些调试参数执行 curl:
来自Amazon EC2服务器的结果:
time_namelookup: 0.011
time_connect: 0.011
time_appconnect: 0.016
time_pretransfer: 0.027
time_redirect: 0.000
time_starttransfer: 0.049
----------
time_total: 0.049
来自笔记本电脑(以色列)的结果:
time_namelookup: 5.004
time_connect: 5.264
time_appconnect: 5.851
time_pretransfer: 5.851
time_redirect: 0.000
time_starttransfer: 6.188
----------
time_total: 6.188
我的resolv.conf
:
#
# Mac OS X Notice
#
# This file is not used by the host name and address resolution
# or the DNS query routing mechanisms used by most processes on
# this Mac OS X system.
#
# This file is automatically generated.
#
nameserver 192.168.0.1
其他详情:
- TTL 为 300。
- 经过几次连续调用后,较高的 time_namelookup 没有改变,因此这不是本地缓存问题。
- 该问题同时发生在 CNAME 记录和 A 记录上。
dig
立即返回。
知道为什么 time_namelookup 需要这么长时间吗?
更新
当我在不同的无线网络中执行相同的命令时,得到以下结果:
time_namelookup: 0.003
time_connect: 0.273
time_appconnect: 2.189
time_pretransfer: 2.189
time_redirect: 0.000
time_starttransfer: 3.200
----------
time_total: 3.201
这可能意味着问题time_namelookup
确实是防火墙问题。感谢所有提供帮助的人!
答案1
超时时间为五秒这一事实可能意义重大。一些应用程序(但值得注意的是dig
)使用getaddrinfo()
而不是gethostbyname()
;如果使用某些参数调用前者,它将等待 IPv4 和 IPv6 响应,而后者将在收到 IPv4 回复后立即返回。在这种情况下, 的默认超时时间为getaddrinfo()
五秒。
我们确实需要tcpdump
从错误客户端的角度跟踪端口 53 流量,以了解发生了什么。我最近解决了一个这样的问题,结果发现防火墙阻止了其中一个回复数据包。
答案2
这是 macosx,我在你的 resolv.conf 转储中看到了这个。此文件用于兼容性。名称服务器 192.168.0.1 工作正常吗?行为指出,它不工作并且处理 DNS 联系超时。另外,192.168.0.1 是不可路由 IP 类中的本地 IP(未通过 Internet 路由)。这应该是任何本地缓存 DNS 服务器。这可以正常工作吗?你用 nslookup 测试过它吗?
另一点,在 macosx 上你有 /etc/resolver/* 文件。也许一个工具从 resolv.conf 获取配置并等待超时,而另一个工具从 /etc/resolver/* 文件获取它。看看该文件中配置了什么。也许你应该更新配置,特别是在 resolv.conf 里面。不要手动编辑它(如注释中所述),执行任何 macosx 工具。
我找到了一些有关 DNS 解析的秘诀,但我不确定它是否适合您: http://www.justincarmony.com/blog/2011/07/27/mac-os-x-lion-etc-hosts-bugs-and-dns-resolution/ 但也许这对你有帮助。