Windows10下Python socket.connect() IPv6卡顿63秒的原因及解决办法
问题原因
- IPv6连接超时后回退IPv4的延迟:Windows默认优先尝试IPv6连接目标地址。当你的设备自动获取的IPv6地址无法连通
https://foo.bar的IPv6服务端时,系统会等待IPv6连接超时(约60秒,和你遇到的63秒匹配),之后才会切换到IPv4连接,这就导致了整体请求的卡顿。 - 本地IPv6链路或配置异常:虽然你的IPv6是自动获取,但可能存在本地IPv6路由配置错误、链路不通,或者目标服务器的IPv6服务在你的网络环境下无法正常访问(比如运营商IPv6链路质量差、防火墙拦截),而IPv4链路正常,所以禁用IPv6后直接走IPv4就没有延迟。
解决方法(启用IPv6且避免延迟)
方法一:让requests优先用IPv4
修改代码,强制requests在解析域名时优先选择IPv4地址,绕过系统的IPv6优先策略:
import json import requests import socket from urllib3.util.connection import create_connection def force_ipv4(host, port=None, **kwargs): # 只返回IPv4地址信息 addrs = socket.getaddrinfo(host, port, socket.AF_INET, socket.SOCK_STREAM) return create_connection((addrs[0][4][0], port), **kwargs) # 替换requests底层的连接创建逻辑 requests.adapters.HTTPAdapter.init_poolmanager = lambda self, *args, **kwargs: super(type(self), self).init_poolmanager(*args, **kwargs, connection_factory=force_ipv4) response = requests.post( url="https://foo.bar/baz", headers={ 'Content-Type': "application/json", 'Authorization': "bazz", }, data=json.dumps({"key":"value"}) )
方法二:调整Windows的IPv4/IPv6优先级
修改系统网络配置,让IPv4的优先级高于IPv6,这样系统会先尝试IPv4连接:
- 以管理员身份打开命令提示符(CMD)
- 执行命令:
netsh interface ipv6 set prefixpolicy ::ffff:0:0/96 46 4- 该命令将IPv4映射地址的优先级设为46,高于默认的IPv6前缀优先级,系统会优先选择IPv4
- 若要恢复默认配置,执行:
netsh interface ipv6 reset
方法三:排查修复本地IPv6网络问题
- 检查IPv6地址有效性:在CMD执行
ipconfig,查看以太网适配器下是否有全局单播IPv6地址(不是fe80开头的链路本地地址) - 测试目标IPv6连通性:执行
ping -6 foo.bar,如果丢包或超时,说明你的网络到目标IPv6链路存在问题,可联系运营商排查或调整路由器IPv6配置
内容的提问来源于stack exchange,提问作者urig
相关产品推荐
相关产品推荐

