必须调整五项关键限制才能解决Windows 11高并发测试中的套接字耗尽问题:①查看并扩容动态端口范围;②设置MaxUserPort为65534;③确保起始端口与数量匹配;④解除TcpNumConnections软限制;⑤重启生效。

在 Windows 11 上进行本地开发高并发测试(如压测工具、微服务调用、爬虫连接池)时,若频繁出现“套接字耗尽”“No buffer space available (10055)”或“Only one usage of each socket address is normally permitted”等错误,说明系统级 TCP 连接资源已被打满,必须调整五项关键限制才能继续推进测试。
查看当前动态端口范围
客户端每发起一个新 outbound 连接,就占用一个动态端口;该范围直接决定单进程理论最大并发连接数。默认 Win11 已将起始端口提升至 49152,但若未手动确认,可能仍沿用旧范围(1024–5000),仅剩约 3977 个可用端口——这连一次中等规模的 JMeter 压测都撑不住。
以管理员身份打开 PowerShell 或命令提示符,执行:
netsh int ipv4 show dynamicportrange tcp
观察输出中的 Start Port 和 Number of Ports。若显示 Start Port: 49152, Number of Ports: 16384,则实际可用端口仅 16384 个;【这是当前并发瓶颈的首要指标】。若数值低于 60000,必须扩容。
扩大动态端口上限(MaxUserPort)
MaxUserPort 决定了动态端口分配的最高边界,它和起始端口共同决定总数。Windows 默认值为 5000(桌面版),严重制约高并发场景。
方法一:注册表手动设置
1. 按 Win + R,输入 regedit 回车 → 导航至 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
2. 右键 → 新建 → DWORD (32 位) 值,命名为 MaxUserPort
3. 双击该值,将“数值数据”设为 65534(十进制),基数选“十进制”
4. 重启电脑生效
方法二:命令行一键写入(需管理员权限)
在 PowerShell(管理员)中执行:
netsh int ipv4 set dynamicport tcp start=49152 num=16384
→ 此命令仅修改端口范围,不改 MaxUserPort;若要彻底放开,仍需配合注册表设为 65534,否则系统仍按旧上限截断。
⚠️ 注意:MaxUserPort 必须 ≥ 起始端口 + 端口数量 − 1,否则设置无效。例如起始为 49152、数量为 16384,则 MaxUserPort 至少设为 65535,但系统最大只接受 65534,因此推荐统一设为 65534 并将起始端口设为 1024。
解除 TcpNumConnections 软限制
TcpNumConnections 是一个可选注册表项,指定系统允许的最大 TCP 连接总数(inbound + outbound)。它不强制拦截,但某些内核路径会参考此值做快速拒绝判断。若存在且数值偏低(如 20000),会成为隐形天花板。
第一步:检查是否存在
在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下查找 TcpNumConnections 项。
第二步:若存在且值 65535(十进制);若不存在,无需创建——系统将忽略此项,按底层资源实际容量运行。
释放 TIME_WAIT 连接积压
高并发短连接测试后,大量 socket 会卡在 TIME_WAIT 状态(默认持续 240 秒),持续占用端口和 TCB(传输控制块)资源。不清理会导致“端口明明没用完却无法新建连接”的假象。
① 启用 TIME_WAIT 快速回收(谨慎启用)
在注册表路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下,新建 DWORD 值:
名称:TcpTimedWaitDelay
数值:30(十进制,单位秒,范围 30–300)
→ 该值越小,TIME_WAIT 回收越快,但过低(如设为 15)可能引发 RST 包误判,建议从 30 开始测试。
② 启用端口复用(推荐优先启用)
同一注册表路径下,新建 DWORD 值:
名称:EnableAddressSharing
数值:1(十进制)
→ 允许处于 TIME_WAIT 的端口被新连接立即复用,对本地开发测试安全有效,无兼容性风险。
重置 Winsock 与协议栈
长期运行代理、抓包工具(Fiddler/Charles)、虚拟网卡(Docker WSL2、Hyper-V)易导致 Winsock 目录污染,表现为 socket 创建失败但端口未耗尽。此时所有注册表修改都无效,必须底层重置。
1. 以管理员身份运行 PowerShell
2. 依次执行:
netsh winsock reset
netsh int ip reset
3. 执行完成后,必须重启系统 —— 【不重启,更改完全不生效】

















