1. TCP/IP 的默认动态端口范围

可以使用以下命令 netsh 查看计算机上的动态端口范围:

netsh int ipv4 show dynamicport tcp
netsh int ipv4 show dynamicport udp

为每个传输 (TCP 或 UDP) 单独设置范围

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

这些示例命令将动态端口范围设置为从端口 10000 开始,在端口 10999 结束, (1000 个端口) 。 可设置的最小端口范围为 255。 可设置的最小启动端口为 1025。 根据配置的范围) 的最大结束端口 (不能超过 65535。 若要复制 Windows Server 2003 的默认行为,请使用 1025 作为起始端口,然后使用 3976 作为 TCP 和 UDP 的范围。 此使用模式导致开始端口 1025 和结束端口 5000。

  1. 排查端口耗尽问题

从服务器收集 netstat -anob 输出。 netstat 输出将显示单个 PID TIME_WAIT状态的大量条目。
2024-11-25T01:08:19.png
正常关闭或会话突然关闭后,经过 4 分钟 (默认) ,进程或应用程序使用的端口将释放回可用池。 在这 4 分钟内,TCP 连接状态将TIME_WAIT状态。 在怀疑端口耗尽的情况下,应用程序或进程将无法释放它已使用的所有端口,并且将保持TIME_WAIT状态。

可能还会在同一输出中看到CLOSE_WAIT状态连接;但是,CLOSE_WAIT状态是 TCP 对等方的一端没有更多数据要发送 (FIN 发送) 但能够接收来自另一端的数据的状态。 此状态不一定表示端口耗尽。
在管理员模式下打开命令提示符,并运行以下命令。

Netsh trace start scenario=netconnection capture=yes tracefile=c:\Server.etl

首先查看 netstat 输出。 如果使用 Windows 10 或 Windows Server 2016,则可以运行 命令netstat -anobq,并检查包含最大条目作为 BOUND 的进程 ID。 或者,还可以运行以下 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