在Windows中保留TCP端口

Mar*_*tos 13 windows network-programming zeromq

我想保留一个TCP端口,以便稍后由服务绑定,以便Windows在分配随机端口号时不会无意中使用相同的号码.我知道这可以通过注册表和重新启动,但我想避免这种严厉的解决方案.

一个进程如何在没有实际绑定/监听它的情况下保留一个端口,然后安全地(即避免竞争条件)根据请求将其移交给另一个进程?

端口号无需事先确定.第一个进程可以获取随机端口号,并将其传递给请求进程.

编辑:我觉得我的问题有点不明确.我真正想要的是将动态端口号的分配与bind-to-port-zero操作分开.这意味着不仅要避免意外随机分配该端口号,还要防止任何其他进程在此期间绑定到同一地址/端口.或者,换句话说,我希望一个进程启动bind-to-port-zero操作 - 立即学习将要使用的端口号 - 并让指定的第二个进程在将来的某个时间完成绑定操作.

目前,我能想到的最接近的解决方法是第一个进程立即绑定到地址/ 0,并保持绑定直到第二个进程请求它,此时它取消绑定并告诉另一个进程端口号获取,然后明确绑定到地址/端口.这有两个问题:1)在第二个过程出现之前我根本不会绑定; 2)有一小段时间间隔,第三方可能会意外(或故意)篡夺该端口.

背景

你可能很好奇为什么我想做一些如此奇怪的事情.我一直在玩ZeroMQ,一个主要的限制是ipc://Windows上没有传输.让我感到震惊的是,端口映射器进程(类似于RPC终结点映射器,或Erlang的epmd)只是使用tcp://带有动态端口分配的传输来实现解决方案的票据.但是,允许ZeroMQ客户端和服务器无序连接(即,在服务器绑定之前,客户端连接不是错误),所以我试图弄清楚连接客户端如何发现 - 非常高度确定性 - 在服务器实际绑定到该端口之前将用于通信的端口.

I s*_*ica 6

正如@vahapt所提到的,您可以使用修改动态端口范围netsh.

但是,更好的解决方案可能是使用netsh来保留应用程序所需的端口,而不使用默认的动态端口范围.

为此:

  1. 在Server 2008/2008 R2上,安装此Microsoft修补程序.Server 2012或更高版本不需要这样做.
  2. 使用要保留的端口停止任何进程.如果进程正在使用包含在要保留的端口范围内的端口,则NETSH将返回以下错误,并且预留将失败:

    该进程无法访问该文件,因为该文件正由另一个进程使用.

  3. 使用以下NETSH命令保留端口:

    netsh int <ipv4|ipv6> Add excludedportrange [protocol=]tcp|udp [startport=]<integer> [numberofports=]<integer> [[store=]active|persistent]

    例如,要为UDPv6保留端口55368-55372,请使用以下命令:

    netsh int ipv6 add excludedportrange protocol=udp startport=55368 numberofports=5

笔记:

  • 默认情况下,端口保留在重新引导后保持不变
  • 可以为协议的版本4或6保留端口,但不能同时保留两者(即,不能为TCPv4和TCPv6保留端口60000)

有关详细信息,请参阅https://support.microsoft.com/en-us/kb/929851,包括如何查看或删除现有端口保留.


vah*_*apt 5

使用netsh命令可能对您有所帮助.您可以更改Windows使用的动态端口范围.
这就像您指出的注册表修改,但它立即生效.

有关netsh命令的详细信息,请参阅:http://support.microsoft.com/kb/929851.


edh*_*tig 5

编辑:这仅适用于 Windows Server 2008 之前的版本(Microsoft 支持知识库

您可以编辑“ReservedPorts”注册表设置

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters

要保留一系列端口,请遵循“4000-4010”或“xxxx-yyyy”格式,但要保留单个端口,您必须使用“4000-4000”或“xxxx-xxxx”格式

http://support.microsoft.com/kb/812873

  • 这适用于 Server 2003,但从 Server 2008 开始,“ReservedPorts”注册表设置已[删除](https://support.microsoft.com/en-us/kb/2665809)。 (3认同)