本文主要介绍Windows实例无法访问内网或外网服务器的端口,查看系统日志提示“TCP/IP无法建立传出连接”错误信息的解决方案。
问题描述
Windows实例多次出现无法访问到任何内网或外网服务器端口的问题,期间可以正常执行ping。经过一段时间后,可以正常访问目标端口。通过查看系统日志提示如下错误信息:
TCP/IP无法建立传出连接,因为选定的本地终结点最近用于连接到相同的远程终结点。当以高速率打开和关闭传出连接时,会导致所有可用的本地端口被使用,并迫使TCP/IP重新使用本地端口进行传出连接,此时通常会产生这种错误。为了最大限度地降低数据受到损坏的风险,在给定的本地终结点和给定的远程终结点之间的连续连接中,TCP/IP标准需要等待一段最短的时间段。关于如何查看系统日志的具体操作,请参见查看实例的系统日志和屏幕截图。
问题原因
该问题通常是由于Windows实例的TCP连接数已达到上限,无法建立新的TCP连接导致。
解决方案
通过调整注册表项,例如将MaxUserPort限制提高到65534,以及将TcpTimeWaitDelay设置减少到30秒等修改操作,将有助于增加可用的TCP端口数量,从而在接近端口极限时,提高新建TCP连接的成功率。
请根据您的具体使用情况调整这些数值以达到最佳效果。
- 远程连接Windows实例。 - 具体操作,请参见通过密码或密钥认证登录Windows实例。 
- 打开运行对话框,输入 - regedit命令,然后单击确定。
- 在弹出的注册表编辑器窗口中,进入 - 计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目录下。
- 创建并修改MaxUserPort值。 - 右键单击 - Parameters目录,选择,并命名新值为- MaxUserPort。
- 双击 - MaxUserPort文件,基数区域选择十进制,数据数值设为- 65534。 
- 重启Windows实例使配置生效。具体操作,请参见重启实例。 说明- 为了使注册表的更改生效,需要重启服务器。如果您暂时不能重启服务器,您可以打开命令提示符(cmd)尝试通过执行 - netsh int ipv4 set dyn tcp [$Start_Num] [$Num_Range]命令来临时增加可用端口的数量。其中- [$Num_Range]为端口数,- [$Start_Num]为启动端口,请替换为实际所需数值。
 
- (可选)创建并修改其他相关TCP参数,然后重启Windows实例。 - 方法 - 配置项名称 - 设定值(示例) - 说明 - 调整 - TcpTimedWaitDelay以缩短关闭端口后的等待时间。- TcpTimedWaitDelay - 30 - 默认情况下,一个端口关闭后需要等待120秒才能再次使用。通过修改 - TcpTimedWaitDelay的值,您可以减少这个时间。例如,将其设置为30秒可以使端口更快地重新可用。- 减少TCP的 - KeepAlive时间以自动清理- CLOSE_WAIT的连接- KeepAliveTime - 300000毫秒(5分钟) - 控制TCP保持连接存活的时间,减小该值可以使操作系统更快地关闭无效或半开放的连接。 - KeepAliveInterval - 1000 - 控制KeepAlive探测包之间的间隔时间。 - TcpMaxDataRetransmissions - 5 - 定义了最大数据重传次数,减小其值有助于在网络不稳定时更快地识别断线。