这是一个相关的问题,但我不知道如何将答案应用于 mechanize/urllib2: how to force python httplib library to use only A requests
基本上,给出这个简单的代码:
#!/usr/bin/python
import urllib2
print urllib2.urlopen('http://python.org/').read(100)
这导致wireshark说以下内容:
0.000000 10.102.0.79 -> 8.8.8.8 DNS Standard query A python.org
0.000023 10.102.0.79 -> 8.8.8.8 DNS Standard query AAAA python.org
0.005369 8.8.8.8 -> 10.102.0.79 DNS Standard query response A 82.94.164.162
5.004494 10.102.0.79 -> 8.8.8.8 DNS Standard query A python.org
5.010540 8.8.8.8 -> 10.102.0.79 DNS Standard query response A 82.94.164.162
5.010599 10.102.0.79 -> 8.8.8.8 DNS Standard query AAAA python.org
5.015832 8.8.8.8 -> 10.102.0.79 DNS Standard query response AAAA 2001:888:2000:d::a2
那是5秒的延迟!
我的系统中的任何地方都没有启用 IPv6(gentoo 用 编译USE=-ipv6
)所以我认为 python 没有任何理由尝试 IPv6 查找。
上面引用的问题建议明确设置AF_INET
听起来不错的套接字类型。我不知道如何强制 urllib 或 mechanize 使用我创建的任何套接字。
编辑:我知道 AAAA 查询是问题,因为其他应用程序也有延迟,一旦我在禁用 ipv6 的情况下重新编译,问题就消失了……除了在 python 中仍然执行 AAAA 请求。