我在移动客户端中有一些失败的 API 调用。为了进行调查,我听从了 Joseph Scott 的建议,并使用一些调试参数执行了 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
这可能意味着 longtime_namelookup
确实是一个防火墙问题。感谢所有帮助过的人!
超时时间为 5 秒的事实可能很重要。一些应用程序(但特别是不是
dig
)使用getaddrinfo()
而不是gethostbyname()
; 前者,如果使用某些参数调用,将等待 IPv4 和 IPv6 响应,而后者将立即返回收到 IPv4 响应。在这种情况下,默认超时为getaddrinfo()
5 秒。我们确实需要
tcpdump
从错误客户端的角度跟踪端口 53 流量,以了解发生了什么。我最近解决了这样一个问题,结果发现防火墙阻止了其中一个回复数据包。这是 macosx,我在你的 resolv.conf 转储中看到了这个。该文件用于兼容性。名称服务器 192.168.0.1 是否正常工作?行为指向我,它不起作用并通过 dns 联系处理超时。其他,192.168.0.1 是不可路由 ip 类中的本地 ip(不通过 Internet 路由)。这应该是任何本地缓存 dns 服务器。这行得通吗?你用 nslookup 测试过吗?
另一点,在 macOS 上你有 /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/ 但也许这对你有帮助。