TCP 和 UDP 协议基于用于建立连接的端口号进行工作。 任何需要建立 TCP/UDP 连接的应用程序或服务都需要一侧端硬件。
有两种类型的端口:
- Ephemeral 端口(通常是动态端口)是每个在默认情况下都有它们才能建立出站连接的一组端口。
- 已知端口 是特定应用程序或服务的定义端口。 例如,文件服务器服务位于端口 445 上,HTTPS 为 443、HTTP 是 80 且 RPC 为 135。 自定义应用程序也将具有其定义的端口号。
连接到应用程序或服务时客户端将利用从其计算机到为该应用程序或服务定义的已知端口连接。 客户端计算机上的浏览器将使用电子式端口连接到端口 https://www.microsoft.com 443。
在这样的情况下,相同浏览器会创建与多个网站的连接数,对于浏览器尝试的任何新连接,使用一个空余端口。 一段时间后,你会注意到,连接将开始失败,而这将是因为浏览器使用了所有可用端口进行外连接,并且任何新的尝试将失败,因为不再提供更多端口。 当使用计算机上的所有端口时,我们将其术语设置为端口和端口。
TCP/IP 的默认动态端口范围
为符合 Internet 授权所有 (机构的 IANA) ,Microsoft 已将动态客户端端口范围增加,用于传出连接。 新的默认起始端口为 49152, 新的默认端口为65535。 这不同于早期版本的 Windows 配置,它使用默认端口范围从 1025 到 5000。 5000
可以使用以下网页命令查看计算机上的动态端口范围:
netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp
netsh int ipv6 show dynamicport tcp
netsh int ipv6 show dynamicport udp
对于 TCP 或 UDP 支持的每个传输 (单独设置) 范围。 现在,端口区域即为具有起点和一个终点的区域。 如果内部网络上使用防火墙,Microsoft 客户部署运行 Windows Server 的服务器的 Microsoft 客户可能存在影响服务器之间的 RPC 通信的问题。 在这些情况下,我们建议重新配置防火墙,以允许动态端口范围中的服务器到45535 的平流。 49152 此范围是服务和应用程序所使用的已知端口。 或者,可以修改服务器使用的端口范围。 可以使用网络命令来调整此范围,如下所示。 上面命令为 TCP 设置了动态端口范围。
cmd复制
netsh int <ipv4|ipv6> set dynamic <tcp|udp> start=number num=range
起始端口是号码,端口总数为范围。 以下是示例命令:
netsh int ipv4 set dynamicport tcp start=10000 num=1000
netsh int ipv4 set dynamicport udp start=10000 num=1000
netsh int ipv6 set dynamicport tcp start=10000 num=1000
netsh int ipv6 set dynamicport udp start=10000 num=1000
这些示例命令将动态端口范围设置为从端口 10000 开始,到端口 10999 (端口) 。 可设置的最低端口范围为 255 个。 可以设置 1025 的最低开始端口。 根据当前的 (,最终端口可能) 65535。 要复制 Windows Server 2003 的默认行为,请将 1025 用作开始端口,然后将 3976 用作 TCP 和 UDP 的范围。 这导致从 1025 年开始端口为 1025,而有 5000 端口。
具体而如此,有关传入连接的出站连接,不需要使用 Ephemeral 端口来接受连接。
由于出站连接的开始故障,所以将看到很多以下行为:
-
无法使用域凭据登录计算机,但使用本地帐户登录所运行。 域登录将要求您联系 DC,确定再次是出站连接。 如果您设置了缓存凭据,则域登录可能仍然有效。
-
组策略更新失败:
-
文件共享不可访问:
-
受影响服务器的 RDP 失败:
-
任何其他计算机上运行的应用程序将开始提供错误
重启动服务器可暂时解决问题,但你将看到所有问题,但你会在一段时间后再次看到所有问题。
如果你暂时检查计算机处于端口时,是否处于端口时的状态:
-
请尝试建立出站连接。 从服务器/机器访问远程共享,或试用 RDP 到另一台服务器或 Telnet 到端口上的服务器。 如果所有这些问题的出站连接失败,请转到下一步。
-
打开事件查看器,在系统日志下,查找可以明确指示当前状态的事件:
a. 事件 ID 4227
b. 事件 ID 4231
-
从服务器收
netstat -anob output
集。 净数据输出将为单个 PID 声明TIME_WAIT大量的条目。
在会话中插入机密或禁用会话后,在 4 分钟 (分钟后) ,使用该进程或应用程序的端口将重新发布到可用池。 在这 4 分钟之内,TCP 连接状态将是 TIME_WAIT状态。 在以下情况下,应用程序或进程将不能释放它已消耗的所有端口且将保持在 TIME_WAIT 状态中。
你可能还会看到同一输出中的 CLOSE_WAIT 状态连接,但CLOSE_WAIT 状态是当 TCP 对等方之一端的数据无法发送 (FIN 已发送) 但可接收另一端的数据。 此状态不一定指示端口异常。
备注
如果在 TIME_WAIT 状态中连接不大,则不会始终指示服务器当前没有端口,除非已验证前两个点。 有大量TIME_WAIT连接可以指示该过程正在创建大量 TCP 连接,最终可能导致端口异常。
Windows 10 中已经更新 Netstat,并添加 -Q 开 关,以显示已过渡到 BOUND 状态中显示已过渡过时的端口。 已发布包含此功能Windows Server 2012 Windows 8.1 和 Windows Server 2012 R2 的更新。 Windows 10 中的 PowerShell cmdlet Get-NetTCPConnection
还显示这些绑定端口。
2016 年 10 月 10 日之前,净数据不准确。 对 netstat(从 2012 R2 的反网进行移植)修复了 Netstat.exe 和 Get-NetTcpConnection 以在 Windows Server 2012 R2 中正确报告 TCP 或 UDP 端口使用情况的问题。 请参阅 Windows Server 2012 R2:深入门户修补程序以了解 详细信息。
-
在管理模式下打开命令提示符并运行以下命令
cmd复制
Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl
-
使用网络监视器打开服务器.etl 文件,并在筛选器部分中,Network Monitor将筛选器应用Wscore_MicrosoftWindowsWinsockAFD.AFD_EVENT_BIND。Status.LENTStatus.Code == 0x209。 应该能看到条目 ,STATUS_TOO_MANY_ADDRESSES。 如果找不到任何条目,服务器仍然不在端口中。 如果找到它们,然后你可以确认服务器是否在端口扩展服务下。
端口故障排除
关键是标识使用所有端口的过程或应用程序。 下面列出了一些可用于隔离单一进程的工具
方法 1
从查看 netstat 输出开始。 如果使用的是 Windows 10 或 Windows Server 2016,可运行命令并检查具有绑定项最大输入 netstat -anobq
的进程 ID。 或者,也可运行以下 Powershell 命令来标识过程:
Powershell复制
Get-NetTCPConnection | Group-Object -Property State, OwningProcess | Select -Property Count, Name, @{Name="ProcessName";Expression={(Get-Process -PID ($_.Name.Split(',')[-1].Trim(' '))).Name}}, Group | Sort Count -Descending
多数端口门的问题都是在遇到错误时,用户模式流程无法正确关闭端口的原因。 在用户模式级别端口中, (的套接字是) 进行处理。 TaskManager和ProcessExplorer都能够显示句柄计数,从而于你可以识别使用所有端口的哪个过程。
对于 Windows 7 和 Windows Server 2008 R2,可更新 Powershell 版本以包括上述 cmdlet。
方法 2
如果方法 1 在 Windows 10 和更高版本 Windows Server 2012 R2) 之后 (如何请查看任务管理器:
-
在详细信息/流程下添加名为"句柄"的列。
-
对列图柄排序,以确定具有最大数量控点的流程。 通常,包含 3000 个以上句柄的过程除非系统、lsass.exe、store.exe 等进程store.exe、sqlsvr.exe。
-
如果任何其他过程的数量较高,请停止该过程,然后尝试使用域凭据进行登录,查看是否成功。
方法 3
如果任务管理器无法帮助你确定流程,那时请使用"流程资源管理器"来调查问题。
使用进程资源管理器的步骤:
-
下载进程资源管理器并将其运行"Elevated"。
-
Alt+单击列标题,选择" 选择列", 然后在"流程性能 "选项卡上 ,添加"工作 数"。
-
选择 "视图""显示下层窗格"。
-
选择 "视图""下部窗格视图"\ 句柄。
-
单击" 控点数" 列以按该值进行排序。
-
检查其工作柄更高的流程计数大于 (如果无法在其上建立出站,超出连接时,可能会超过 10,000) 。
-
单击以突出显示具有较高句柄计数的一个进程。
-
在下面列出的图柄中,它们是套接字。 (套接字是技术文件句柄) 。
File \Device\AFD
-
其中一些是正常的,但大量字符并 (数以数,导位数永) 。 关闭提问过程。 如果该恢复出站连接,那你已经证明该应用是导致的原因。 联系该应用的供应商。
最后,如果上述方法没有帮助你隔离该进程,我们建议你收集问题状态下计算机的完整内存转盘。 深度将告诉您哪一个进程具有最大句柄。
不过,重大计算机将恢复正常状态,这将有助于解决暂时问题。 但是,当重新启动不适用时,你还可以考虑使用以下命令增加计算机上端口的数量:
cmd复制
netsh int ipv4 set dynamicport tcp start=10000 num=1000
这会将动态端口范围设置为在端口 10000 时开始,到端口 10999 (或端口 1000 端口) 。 可设置的最低端口范围为 255 个。 可以设置 1025 的最低开始端口。 根据当前的 (,最终端口可能) 65535。
备注
请注意,增加动态端口范围不是永久解决方案,但仅临时解决方法。 您需要跟踪哪个处理器使用最大数量的端口和该进程站点的疑难解答以避免其使用此类大量端口的原理。
对于 Windows 7 和 Windows Server 2008 R2,可以使用以下脚本来收集 Netstat 输出的频用频需。 从输出中,你可以看到端口使用情况趋势。
复制
@ECHO ON
set v=%1
:loop
set /a v+=1
ECHO %date% %time% >> netstat.txt
netstat -ano >> netstat.txt
PING 1.1.1.1 -n 1 -w 60000 >NUL
goto loop