Windows 经常报 WinError 10048 问题解决
下面是一篇可直接发到 CSDN 的草稿。Windows 经常报 WinError 10048原来是 TCP 动态端口范围被改小了最近在 Windows 上运行代理工具、Python 网络脚本时偶尔会遇到类似错误[WinError 10048] 通常每个套接字地址(协议/网络地址/端口)只允许使用一次有时表现为代理程序无法连接有时则是 Pythonrequests/urllib3报NewConnectionError。很多人第一反应是“端口被占用”但如果多个不同程序都频繁出现问题可能是 Windows 的 TCP 动态端口范围被改得太小导致临时端口耗尽。先区分两种“端口占用”WinError 10048不一定只有一种原因程序监听的固定端口已被占用例如代理程序监听1080、7890但已有另一个程序在使用该端口。用于“向外建立连接”的动态端口不足浏览器、代理工具、Python 脚本等每建立一个 TCP 连接系统都需要分配一个本机临时源端口范围过小、连接过多时就会出现 10048。如果是固定监听端口冲突可以用下面命令查netstat -ano | findstr :1080将1080换成实际冲突端口再根据 PID 找到对应程序。本文重点讨论第二种动态端口耗尽。Windows 的正常默认值现代 WindowsVista / Server 2008 及以后包括 Windows 10、Windows 11的默认动态端口范围通常是项目默认值起始端口49152结束端口65535端口数量16384TCP、UDP、IPv4、IPv6 都分别维护自己的动态端口范围。查看当前 TCP 配置netsh int ipv4 show dynamicport tcp netsh int ipv6 show dynamicport tcp正常情况下应接近Start Port : 49152 Number of Ports : 16384微软官方说明Windows 使用49152-65535作为默认动态客户端端口范围连接过多而可用端口不足时可能发生端口耗尽。Microsoft LearnTCP/IP port exhaustion troubleshooting一个典型异常配置我遇到的机器配置为Start Port : 50000 Number of Ports : 500这意味着 TCP 临时端口只有50000-50499总共 500 个。继续查看保留端口netsh interface ipv4 show excludedportrange protocoltcp如果其中又有大量端口被 WSL、Hyper-V、Docker、VPN 或安全软件保留真正可供程序使用的端口可能只剩两三百个。对于代理工具、浏览器、多线程下载器、频繁请求接口的 Python 脚本来说这点端口很快就不够用了。解决方案恢复正常动态端口范围以“管理员身份”打开 PowerShell执行netsh int ipv4 set dynamicport tcp start49152 num16384 netsh int ipv6 set dynamicport tcp start49152 num16384也建议检查 UDPnetsh int ipv4 show dynamicport udp netsh int ipv6 show dynamicport udp如果 UDP 也被设置得很小可恢复为netsh int ipv4 set dynamicport udp start49152 num16384 netsh int ipv6 set dynamicport udp start49152 num16384修改后建议重启电脑。虽然配置会更新但重启可以清理已建立连接和TIME_WAIT状态验证效果更可靠。重启后再次验证netsh int ipv4 show dynamicport tcp netsh int ipv6 show dynamicport tcp不建议直接删除端口保留范围查看到excludedportrange后不建议为了“腾端口”直接删除保留项。这些保留范围可能由以下组件创建WSL / Hyper-VDocker DesktopVPN、代理、安全软件系统网络服务。正确做法通常是恢复足够大的动态端口范围而不是强行删除系统保留端口。Windows 官方也提供了查看和管理保留端口范围的netsh interface命令说明Microsoft Learnnetsh interface总结当 Windows 上多个网络程序都出现WinError 10048时不要只盯着某个程序或某个监听端口。建议按下面顺序排查检查固定监听端口是否被其他进程占用检查 TCP 动态端口范围检查端口保留范围将异常的小范围恢复为49152-65535重启系统后复测。如果动态端口只有几百个而不是默认的 16384 个那么它非常可能就是代理工具、Python 网络请求频繁失败的根因。