Python设置120秒连接超时仍20秒失败,如何解除Windows TCP限制?
解决方案:Windows下Python TCP连接超时受限问题
问题原因
Windows系统TCP栈的SYN重传机制默认会在约21秒后放弃连接尝试,这个超时是系统层面的,和你Python代码中设置的timeout参数无关——Python的timeout是连接成功后的读写超时,无法覆盖连接建立阶段的系统级超时。
Windows默认的SYN重传策略是:第一次发送SYN包后等待3秒,第二次等待6秒,第三次等待12秒,累计3+6+12=21秒后就会终止连接,抛出WinError 10060。
推荐解决方案:代码层面循环重试
最稳妥且不影响系统全局设置的方式,是在代码中主动循环尝试连接,直到达到你需要的总超时时间。
针对Socket连接的实现
import socket import time TARGET_HOST = "192.168.254.254" TARGET_PORT = 1234 TOTAL_TIMEOUT = 120 # 总等待时长 RETRY_INTERVAL = 5 # 每次失败后重试间隔 start_time = time.time() sock = None while time.time() - start_time < TOTAL_TIMEOUT: try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(3) # 单次连接尝试用短超时,避免不必要的等待 sock.connect((TARGET_HOST, TARGET_PORT)) print("设备连接成功") break except (socket.timeout, ConnectionRefusedError, TimeoutError): print(f"连接失败,{RETRY_INTERVAL}秒后重试...") time.sleep(RETRY_INTERVAL) if sock: sock.close() else: raise TimeoutError(f"等待{TOTAL_TIMEOUT}秒后仍无法连接设备") # 后续使用socket进行操作 # sock.send(...)
针对Web接口的实现
from urllib.request import urlopen import time TARGET_URL = "http://192.168.254.254" TOTAL_TIMEOUT = 120 # 总等待时长 RETRY_INTERVAL = 5 # 每次失败后重试间隔 start_time = time.time() response = None while time.time() - start_time < TOTAL_TIMEOUT: try: response = urlopen(TARGET_URL, timeout=3) # 单次请求短超时 print("Web接口连接成功") break except (TimeoutError, ConnectionRefusedError): print(f"连接失败,{RETRY_INTERVAL}秒后重试...") time.sleep(RETRY_INTERVAL) else: raise TimeoutError(f"等待{TOTAL_TIMEOUT}秒后仍无法访问设备Web接口") # 后续处理响应 # content = response.read()
关于修改系统TCP超时的说明
如果一定要通过修改系统设置来延长连接建立超时,可以编辑Windows注册表,但不推荐,因为会影响全系统的TCP连接行为:
- 以管理员权限打开注册表编辑器(
regedit) - 定位到路径:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters - 新建或修改
DWORD类型的TcpMaxConnectRetransmissions值:- 默认值为3,对应总超时21秒
- 修改为5时,重传间隔为3/6/12/24/48秒,总超时93秒,刚好覆盖你的90秒设备启动时间
- 修改后需要重启系统生效
内容的提问来源于stack exchange,提问作者Basj
相关产品推荐
相关产品推荐

