Windows 2008如何特别select临时端口(是否testing以避免冲突)?

我有一个服务器应用程序,它使用永久连接的input端口,范围是W2k8现在在IANA推荐范围内使用的〜49000-65000。 (由于遗留的原因,改变这个是非常困难的, 所以我将不得不改变Window的范围来避免我的范围,但这不是问题 )。

我一直在研究如何避免与Windows 2008 Server中的短暂端口发生冲突,但无法find有关select临时端口的Windowsalgorithm的详细信息。

当Windowsnetworking层为响应传出TCP / IP连接分配一个“随机”临时端口时, 是否testingbuild议的端口以查看它是否已被使用?

(Linux内核似乎做了check_establishedtesting,但仍然可以重复使用一些使用的连接,所以我想知道Windows可能会做出什么样的决定,使看似未使用或闲置的端口closures另一个进程…)

即如果我的服务器在其所有端口上打开winsocks,并保持它们处于LISTENING状态,那么Windows会尊重并忽略它们,因为它们正在使用中? 还是会忽略它们正在使用的事实,并将它们分配给其他进程以用于短暂使用,从而导致冲突?

我发现有时当我的服务器启动时,它不能分配一些端口,因为它们被其他进程用于随机目的 – 这是有道理的,我明白这一点。 但是,我还没有能够certificate它是否设法初始打开的端口随后被“偷”出于短暂的目的(由于大范围和随机性,这是一个难以testing或强制的事情)。

正如我所说,我将重新configurationWindows以避免我的服务器,所以这个问题更多的是好奇心,并更清楚地解释最近的行为(以排除其他可能的错误!

提前致谢

我会回答这个问题。

对于用winsock API编写的程序来说,它就是这样处理的; http://support.microsoft.com/kb/173619

当您closures套接字句柄时,客户端和服务器之间会进行一些额外的协商。 套接字将等待最多等待窗口等待接收来自closures端口的套接字的另一端的确认的最大时间的两倍。 默认情况下,该选项设置为两分钟。 因此,Windows可能会在实际释放端口之前等待四分钟。 这使得特定的端口不可用,直到它被释放。

对于Windows RPC服务;

*本文不指定哪些服务依赖其他服务进行networking通信。 例如,许多服务依靠Microsoft Windows中的远程过程调用(RPC)或DCOMfunction为其分配dynamicTCP端口。 远程过程调用服务协调使用RPC或DCOM与客户端计算机通信的其他系统服务的请求。 许多其他服务依赖于networking基本input/输出系统(NetBIOS)或SMB,服务器服务提供的协议。 其他服务依赖于HTTP或安全超文本传输​​协议(HTTPS)。 这些协议由Internet信息服务(IIS)提供。 Windows操作系统体系结构的完整讨论超出了本文的范围。 但是,Microsoft TechNet和Microsoft开发人员networking(MSDN)网站上提供了有关此主题的详细文档。 尽pipe许多服务可能依赖于特定的TCP或UDP端口,但一次只能有一个服务或进程在该端口上进行侦听。

当您使用RPC与TCP / IP或UDP / IP作为传输时,传入端口经常dynamic分配到系统服务根据需要; 使用高于端口1024的TCP / IP和UDP / IP端口。 这些也被非正式地称为随机RPC端口。 在这些情况下,RPC客户端依靠RPC端点映射器来告诉他们哪个或哪些dynamic端口被分配给服务器。 对于某些基于RPC的服务,可以configuration特定端口,而不是让RPCdynamic分配端口。 无论服务如何,您也可以将RPCdynamic分配的端口范围限制在一个小范围内。 有关此主题的更多信息,请参阅“参考”部分。

来自: http : //support.microsoft.com/kb/832017