同一机器上的两个应用程序可以绑定到相同的端口和IP地址吗?更进一步,一个应用程序可以侦听来自某个IP的请求,而另一个应用程序可以侦听来自另一个远程IP的请求吗? 我知道我可以让一个应用程序启动两个线程(或分支)具有类似的行为,但是两个没有任何共同之处的应用程序也可以这样做吗?
当前回答
肯定是的。据我所知,从内核版本3.9(不确定版本)开始,就引入了对SO_REUSEPORT的支持。SO_RESUEPORT允许绑定到完全相同的端口和地址,只要第一个服务器在绑定套接字之前设置了这个选项。
它适用于TCP和UDP。有关更多详细信息,请参阅链接:SO_REUSEPORT
其他回答
您可以让一个应用程序侦听一个网络接口的一个端口。因此你可以有:
HTTPD监听远程可访问的接口,例如192.168.1.1:80 另一个守护进程监听127.0.0.1:80
示例用例可以是使用httpd作为负载均衡器或代理。
在创建TCP连接时,您要求连接到特定的TCP地址,该地址是IP地址(v4或v6,取决于您使用的协议)和端口的组合。
当服务器监听连接时,它可以通知内核它想监听特定的IP地址和端口,即一个TCP地址,或者在每个主机的IP地址(通常用IP地址0.0.0.0指定)上的相同端口,这实际上是在监听许多不同的“TCP地址”(例如,192.168.1.10:8000,127.0.0.1:8000等)。
不,您不能让两个应用程序侦听同一个“TCP地址”,因为当消息传入时,内核如何知道该将消息传递给哪个应用程序?
然而,在大多数操作系统中,您可以在单个接口上设置多个IP地址(例如,如果在一个接口上有192.168.1.10,如果网络上没有其他人使用它,则还可以设置192.168.1.11),在这些情况下,您可以在这两个IP地址的每个端口8000上设置单独的应用程序。
如果至少有一个远程ip是已知的,静态的,专用于只与你的一个应用程序对话,你可以使用iptables规则(表nat,链PREROUTING)来重定向从这个地址到“共享”本地端口的传入流量到任何其他端口,其中适当的应用程序实际监听。
简短的回答:
根据这里给出的答案。您可以让两个应用程序侦听相同的IP地址和端口号,只要其中一个端口是UDP端口,而另一个是TCP端口。
解释:
端口的概念与TCP/IP堆栈的传输层相关,因此只要使用堆栈的不同传输层协议,就可以让多个进程侦听相同的< IP -address>:<port>组合。
人们有一个疑问,如果两个应用程序运行在相同的<ip-address>:<端口>组合上,那么在远程机器上运行的客户机如何区分这两个应用程序?如果你看一下IP层数据包头(https://en.wikipedia.org/wiki/IPv4#Header),你会发现第72位到第79位是用来定义协议的,这就是如何区分的。
然而,如果你想让两个应用程序在相同的TCP < IP -address>:<port>组合上,那么答案是否定的(一个有趣的练习是启动两个vm,给它们相同的IP地址,但不同的MAC地址,看看会发生什么——你会注意到有些时候VM1将获得数据包,而其他时候VM2将获得数据包——这取决于ARP缓存刷新)。
我认为,通过让两个应用程序在相同的<op-address>:<端口>上运行,可以实现某种负载平衡。为此,您可以在不同的端口上运行应用程序,并编写IP表规则来划分它们之间的流量。
请参见@user6169806的回答。
Yes.
从这篇文章中: https://lwn.net/Articles/542629/
新的套接字选项允许同一主机上的多个套接字绑定到同一个端口
推荐文章
- 我如何找到哪个程序正在使用端口80在Windows?
- WebSockets和纯TCP之间的根本区别是什么?
- 有效地测试Linux上的端口是否打开?
- 127.0.0.1和localhost之间的区别是什么
- 为什么SCTP不常用/不为人所知
- 无法启动IIS Express Web服务器,注册URL失败,访问被拒绝
- 我可以在/etc/hosts中映射主机名*和端口*吗?
- 如何修改Play执行run命令时使用的默认端口(9000)?
- 如何找到可用的端口?
- UDP和TCP比起来快多少?
- ssh -L转发多个端口
- 套接字的连接超时和读超时之间的区别是什么?
- 将主机端口转发到docker容器
- 远程主机强制关闭现有连接
- TCP连接的最大数据包大小