多个应用程序如何在同一端口(80)上监听?

14
许多关于端口80被使用的问题有答案指出许多程序将其作为默认端口。这篇帖子提到了一些:Skype、IIS、Apache等。
由于任何一个端口同一时间只能被一个应用程序监听,那么这是怎么回事呢?如果答案是这只是它们的默认端口,那么一个应用程序如何知道它必须发送信息到另一个端口?例如,如果iis会监听端口81,因为Skype正在监听80,那么请求网页的任何人都将知道要将请求发送到theip:81而不是theip:80吗?
我的目标是建立一种强大的方法来设置程序之间的连接,当任何硬编码的端口可能由于已经被某个应用程序监听而失败时。端口只需要在通信的起始阶段使用一次,以确定接下来会使用什么动态端口。这是一个网络连接和连接同一台计算机上的几个应用程序的问题。
注册IANA并不总是可能的,甚至不一定能解决问题——仍然可能会有人监听已注册的端口。显然,“希望不发生冲突”的解决方案是行不通的。
(我确实理解连接有两个套接字(和一个协议),因此一个套接字可以有多个连接。我的问题是关于监听套接字以建立连接的。)
我期望的是,在操作系统(Windows)上存在某些服务,我可以在其中注册我的应用程序,并使用某些签名接收所有传入的流量,即使只是一些魔术字符串。或者可能有一些端口,多个应用程序可以同时监听,并且所有应用程序都将获得每个传入的消息。但到目前为止,我还没有找到类似的东西。

怎么可能?简单来说,是不行的。每个端口只能有一个应用程序监听。那么...任何人怎么知道呢?配置。 - Adriano Repetti
简短的回答是,如果Skype已经打开并监听端口80,则监听端口80的IIS网站将无法启动。它不会更改为81或其他端口,您需要手动更改或停止Skype进程。 - Andrew
服务器和客户端端口与该问题的答案相关吗? - Mare Infinitus
4个回答

3
如何做到这一点?简单地说……不行。每个端口只能有一个应用程序监听。-Adriano Repetti
没错。当Skype在我启动web服务器之前监听这些端口时,服务器会失败。我花了一段时间才弄清楚原因。
合理的情况下,只有一个应用程序可以监听套接字。如果指定特殊选项,操作系统允许多个应用程序在同一端口上监听,但这是不合理的。接受的连接然后以未指定(即随机)的方式分派给不同的应用程序。
IIS可以在同一端口上运行多个Web应用程序,因为它在内核模式下仅打开端口并将连接分派给其工作进程。

1
谢谢。你关于Skype和Web服务器的轶事确实深入人心。但是我还没有接受,因为还有可能会有一个“啊哈!”的解决方案出现。 - ispiro
@ispiro,此主题的标准线程为:https://dev59.com/rWYq5IYBdhLWcg3wjBQM - Pacerier

1

我不相信多个套接字可以在同一(TCP)端口上侦听。如果您尝试将套接字绑定到已经打开的端口,您将收到错误。

我认为Skype通过使用自己的服务器作为约会点来解决了您所描述的问题。简单的解释是:

  • Alice启动她的客户端,连接到中央服务器,并告知它她正在监听哪个端口。
  • Bob启动他的客户端,同样告知中央服务器。
  • 现在,Alice想要连接到Bob,但不知道要发送数据包到哪个端口。
  • Alice然后查询中央服务器以获取Bob的端口号。
  • 有了这个信息,就可以使用该端口与Bob建立直接连接。

当然,这种逻辑可以扩展到学习其他方的IP地址甚至获取公钥。

请注意,对于大多数现代点对点应用程序来说,实际上涉及更多内容,Skype也不例外。问题在于,现在大多数计算机都在至少一个NAT路由器后面。让两个设备各自位于其自己的路由器后面并相互连接被称为NAT穿透 - 最常见的技术是有一个中央协调服务器指示两个客户端同时连接到彼此。如需了解更多信息,请查看Steve Gibson的Security Now!第42集

你的意思是Alice和Bob都向Skype发起连接,并告诉它他们正在使用哪个端口。我理解得对吗? - ispiro

0
在端口转发设置页面上,我只需输入逗号并添加另一个要打开的端口即可。它不允许您设置具有侦听端口80的附加规则,但它将允许您使用该侦听端口触发多个端口。

-1
  • TCP协议下,同一时间只能有一个应用程序监听单个端口。如果您有两张网络卡或创建了虚拟接口,则可以让一个应用程序在第一个IP上监听,另一个应用程序在第二个IP上使用相同的端口号监听。
  • 对于UDP(多播),多个应用程序可以订阅同一个端口。

一个应用程序监听单个端口这就是端口存在的原因。为了允许多个应用程序共享网络而不发生冲突。

但是有方法可以实现您所请求的功能:

  • 您可以编写一个主进程,该进程拥有端口并使用某些分离逻辑通知从属进程
  • 在Linux和BSD上,您可以设置重定向规则,将来自可见端口的数据包重定向到不同的端口(例如监听器应用程序),再次使用某些分离逻辑(例如根据网络来源进行重定向)。

注意:对于TCP,您可以在绑定之前使用SO_REUSEADDR选项使多个应用程序监听同一个套接字,但这样做只会将传入的连接重定向到其中一个监听者。


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