【发布时间】:2010-01-06 16:43:31
【问题描述】:
这是一个相关问题,但我不知道如何将答案应用于 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 请求。
【问题讨论】:
-
这里相同,在连接到不同供应商的不同机器上。我使用了 libwww-perl,它是 GET 命令——它可以立即在所有机器上运行。
标签: python mechanize ipv6 urllib