多个应用程序如何在同一个端口(80)上侦听
本文关键字:应用程序 同一个 | 更新日期: 2023-09-27 18:08:46
许多与端口80有关的问题的答案都说有许多程序使用它作为默认端口。这篇文章提到了一些:Skype, IIS, Apache…
既然一次只有一个应用程序可以监听任意一个端口,那怎么可能呢?如果答案是那只是他们的默认端口,那么应用程序如何知道它必须将信息发送到不同的端口呢?例如,如果iis将监听端口81,因为Skype正在监听端口80,那么请求网页的人如何知道将请求发送到theip:81而不是theip:80?
我的目标是有一个强大的方式来建立程序之间的连接,当任何硬编码端口可能失败,由于一些应用程序已经在监听它。端口只需要使用一次,以便通信将在会话的其余部分使用哪个动态端口。这对于网络连接和连接同一台计算机上的多个应用程序都是一个问题。
向IANA注册并不总是可行的,甚至不一定能解决问题——有人可能仍然在注册的端口上侦听。很明显,"希望没有碰撞"的解决方案——根本行不通。
(我确实理解一个连接有两个套接字(和一个协议),因此一个套接字可以有多个连接。我的问题是关于监听套接字以建立连接。)
我所期望的是,在操作系统(Windows)上存在一些服务,我可以注册我的应用程序,并接收带有某些签名的所有传入流量-即使它只是一些魔法字符串。或者在某个端口上,多个应用程序可以并发侦听,并且所有应用程序都可以接收每个传入消息。但到目前为止我还没有发现类似的东西。
这怎么可能呢?简单……它不是。只有一个应用程序将监听每个端口。——阿德里亚诺·雷佩蒂
。当Skype在我启动我的网络服务器之前监听这些端口时,服务器失败了。我花了好一会儿才找到原因。
只有一个应用可以以同样的方式监听套接字。如果你指定特殊选项,操作系统允许多个应用程序监听同一个端口,但这太疯狂了。接受的连接然后以未指定的(即随机的)方式分配给不同的应用程序。
IIS可以在同一个端口上运行多个web应用程序,因为它在内核模式下打开端口一次,并将连接分配给它的工作进程。我不相信在同一个(TCP)端口上监听多个套接字是可能的。如果你试图将一个套接字绑定到一个已经打开的端口,你将得到一个错误。
我相信Skype通过使用他们自己的服务器作为集合点来解决你所描述的问题。简单的解释是:- Alice启动她的客户端,连接到中央服务器,并通知它她正在侦听的端口。
- Bob启动他的客户端,同样通知中央服务器。 现在,Alice想要连接到Bob,但不知道发送数据包到哪个端口。然后Alice将向中央服务器查询Bob的端口号。有了这些信息,就可以使用该端口与Bob建立直接连接。
逻辑当然可以扩展到学习对方的IP地址,甚至获得公钥。
请注意,实际上在大多数现代点对点应用程序中都有更多的涉及,Skype也不例外。现在的问题是,大多数计算机都在至少一个NAT路由器的后面。让两台设备各自在自己的路由器后面相互连接被称为NAT穿越——最常见的技术是让一个中央协调服务器指示两个客户端同时相互连接。关于这方面的更多信息,我推荐Steve Gibson的Security Now!, episode #42
在端口转发设置页面上,我只是添加了一个逗号并添加了另一个要打开的端口。它不允许你设置监听端口80的附加规则但它允许你用一个监听端口
- 对于TCP,您只能在一个端口上监听一个应用程序有一次。现在如果你有2张网卡或者创建了一个虚拟接口,您可以让一个应用程序监听第一个IP和 在第二个IP上使用相同的端口号。
- 对于UDP (Multicasts),多个应用程序可以订阅相同的港口。
one application listening on a single port
,这就是端口存在的原因。允许多个应用程序共享网络而没有冲突。
但是有很多方法可以满足你的要求:
- 你可以写一个
- 在Linux和BSD上,您可以设置重新映射规则,将数据包从
visible
端口重定向到不同的端口(例如侦听器应用程序),再次通过使用一些分离逻辑(例如:
master
进程,它拥有端口,并使用一些分离逻辑通知slave
进程。注意:对于TCP,您的多个应用程序可以通过在绑定之前使用SO_REUSEADDR
选项在同一个套接字上侦听,但这样做的是将传入的连接重定向到仅一个侦听器。