为内部应用分配TCP/IP端口

62

我编写了一个由Windows服务托管的WCF服务,它需要侦听已知的TCP/IP端口。在我们的组织范围内,我可以从哪个范围安全地分配端口?该端口将嵌入服务和消费该服务的客户端的配置文件中。

您可以从动态和私有端口号范围(49152-65535)中选择一个可用的端口号来为您的WCF服务分配一个端口。请确保不要选择已经被其他应用程序使用的端口号,以避免端口冲突。一旦选择了一个端口号,请将其添加到WCF服务的配置文件中,并告知所有使用服务的客户端将其添加到其相应的配置文件或代码中。

1
最佳TCP端口号范围用于内部应用程序的副本。 - matt2000
2
这是一个有用的问题,其他回答者提出了一个很好的观点,即“被接受”的答案(由Jorge Ferreira提供)是不正确或者至少是不完整的,这也适用于这个问题的重复版。是否可能取消接受该答案? - Nat Kuhn
可能是内部应用程序最佳TCP端口号范围的重复问题。 - Mohammad Sadegh
@MohammadSadegh - 我不认为这个问题是一个重复的问题。我认为它是一个原创的问题。评论中提到的其他类似的问题似乎是在这个问题之后被问的。matt2000持有与你类似的立场,但我也不同意他。最好的祝福! - Shawn Eary
6个回答

125

端口号0-1023是众所周知的端口,由IANA指定。这些端口应仅用于公共网络上分配的协议。

端口号1024-65535曾经被称为注册端口号(参见rfc1700),但现在分成两个区域(参见rfc6335)。

端口号1024-49151是用户端口,是用于您自己的协议的端口。

端口号49152-65535是动态端口,不应将其指定给协议。

用户端口可以用于任何协议,但数量有限,因此您的使用可能会与其他某些网络上的使用冲突。IANA保留已注册端口号(0-49151)的记录。如果您的协议将在公共网络上使用,则需要研究如何向IANA注册它。如果只在自己的网络中使用它,请选择此区域内的一个端口(1024-49151),并检查该端口是否与IANA注册表中已分配用于您的网络上可用的某个协议的端口重复。对于私人使用,最好选择已分配给您知道不会被使用的协议的端口号,而不是选择未分配的端口号,因为后者可能会在将来被分配。

不要使用动态范围内的端口号。这些端口号由操作系统动态且随机地分配。如果您打开一个客户端连接(使用bind()指定端口号为0),则将从动态范围中分配未使用的端口。无法保证此范围内的端口始终空闲以供您的协议使用。


没错。如果您选择动态范围内的端口用于您的应用程序,比如使用 WCF 进行监听,那么并不能保证该端口始终是空闲的,而且没有被其他应用程序使用,因为 Windows 可能会将该端口分配给其他应用程序用于打开出站连接。 - David Oliván
严格来说,就所提出的问题而言,这个答案似乎基本上是错误的;线索似乎在RFC 6335第6节中的“由IANA分配”注释(以及正确答案的“从未分配”提示) - https://datatracker.ietf.org/doc/html/rfc6335#section-6 - 至少对于尚未提交给/被认为已被接受/“分配”给IANA的端口。 - DennisVM-D2i

24

从49152到65535中选择一个端口号。

IANA发布了当前已分配端口的列表。

http://www.iana.org/assignments/port-numbers

动态和/或私有端口是从49152到65535的端口范围。这是您应该为内部应用程序选择端口的范围。当然,可以使用已发布列表上未分配范围之一所属的任何端口。但请注意,通过从那些未分配的范围选择端口号,无论如何都不能保证您选择的端口不会在将来成为保留端口。

不应使用未分配的端口号。 IANA将在批准您的应用程序后为该端口分配号码。

确保您选择的端口号可配置,正如您所述:

该端口将嵌入服务和使用服务的客户端的配置文件中。

这将避免头疼,以防其他第三方软件正在使用您的端口号。如果发生这种情况,只需在配置文件中更改它即可。


24
另一方面,应用软件不得假定动态端口范围内的特定端口号始终可用于通信,因此该范围内的端口号不得用作服务标识符。 RFC 6335 - Bolu
14
博鲁是正确的。不要使用动态范围内的端口号。请参见本页面其他地方的解释。 - adrianwadey
3
不明智。因为系统可能会选择在任何给定时刻分配你正在使用的端口。因此,你的服务器可能看起来正在运行,但稍后重新加载时会失败。 - rxantos
4
相反,选择一个已分配给您确定永远不会需要的内容的端口。例如,TCP 31457已分配给TetriNET,因此这是一个非常可靠的选择(除非您的业务是多人俄罗斯方块)。 - maaartinus
2
考虑@adrianwadey的评论。如所述,“端口1024-49151是用户端口,是用于自己的协议的端口。”但是与在同一端口上侦听的另一个应用程序的冲突很少,并且可以通过选择另一个端口来解决。如果您选择动态范围内的端口,则随时可能已被其他应用程序使用,因为Windows将它们用于出站连接,因此几乎不可能保证动态范围内的端口始终可用于您的应用程序。 - David Oliván
4
所以我不太明白为什么这仍然是被选择的答案…… - Leonmax

14

简短回答:避免使用1023及以下或49152以上的端口,并针对您网络中的服务测试所选端口。

如果你已经采取了合理的预防措施(将端口号放在配置文件中),那么如果后来发现冲突,这不应该造成巨大的干扰。

但是(为了补充其他建议),请确保轻松更改端口!如果它在配置文件中,请让它显而易见。文档化并在故障排除中指出。这种事情可能会出错,因此如果需要更改,请确保易于调试。


12
等等,你是告诉我要避免使用49152以上的端口,但是最佳答案说你应该只选择49152及以上的端口。这是怎么回事? - Camilo Martin
5
请参考adrianwadey的答案。对于点对点应用程序(例如BitTorrent),顶级答案提供了有益的建议,因为它们通常使用动态端口,并经常配有某种类型的发现服务;但是对于需要合理稳定的端口号的客户端-服务器应用程序而言,情况并非如此,即使端口号存储在配置文件中,每当端口号更改时,您也需要重新配置服务器 它的客户端。 - JuSTMOnIcAjUSTmONiCAJusTMoNICa

5
除了其他关于选择常见应用程序端口的建议之外,我建议您在应用程序中使端口可配置。硬编码端口号是一个坏主意,特别是如果您后来发现与另一个应用程序存在端口冲突并需要更改您的端口号。

0
作为一个提示,请记得通过 netstat /a /n 检查这些端口,以查看它们是否被其他应用程序使用。我发现 Vista 用于某些应用程序级别原因的是 49152.... 基本上,由于大多数系统级别的监听器都没有实现端口共享,因此最好使用那些根本没有被使用的端口,这样更安全。

-1

这里有一个很好的常见应用程序端口列表。在空槽中自己作出选择。也许你应该扫描一下你的网络以检查是否有内部特殊应用程序。

通常高数字端口是可用的,我建议使用它们,但它们可能被防火墙阻塞。


3
链接已损坏,请修复。 - German Capuano

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接