猿问

TCP:两个不同的套接字可以共享一个端口吗?

这可能是一个非常基本的问题,但使我感到困惑。

两个连接的插座可以共享一个端口吗?我正在编写一个应该能够处理超过100k并发连接的应用程序服务器,并且我们知道系统上可用的端口数约为60k(16位)。一个已连接的套接字被分配给一个新的(专用)端口,因此这意味着并发连接数受端口数的限制,除非多个套接字可以共享同一端口。那么问题来了。

我在这里先向您的帮助表示感谢!


侃侃尔雅
浏览 1930回答 3
3回答

阿晨1998

一个服务器套接字监听在一个端口上。该服务器上的所有建立的客户端连接与同一侦听端口相关联在服务器端的连接。客户端和服务器端IP /端口对的组合唯一标识已建立的连接。只要同一服务器上的多个连接与不同的客户端 IP /端口对关联,它们就可以共享相同的服务器端 IP /端口对,并且该服务器将能够处理可用系统资源允许的尽可能多的客户端至。在客户端上,新的出站连接通常使用随机的客户端端口,在这种情况下,如果您在短时间内建立大量连接,则可能会耗尽可用端口。

哆啦的时光机

从理论上讲,是的。练习,不行。大多数内核(包括linux)不允许您bind()使用已经分配的端口。允许这样做不是一个很大的补丁。从概念上讲,我们应该区分socket和port。套接字是双向通信端点,即我们可以发送和接收字节的“事物”。这是一个概念性的事情,在名为“ socket”的数据包头中没有这样的字段。端口是能够识别套接字的标识符。对于TCP,端口是16位整数,但是还有其他协议(例如,在unix套接字上,“端口”本质上是字符串)。主要问题如下:如果传入数据包到达,则内核可以通过其目标端口号识别其套接字。这是最常见的方式,但不是唯一的可能性:套接字可以通过传入数据包的目标IP进行标识。例如,如果我们有一台服务器同时使用两个IP,就是这种情况。然后,我们可以在相同的端口上但在不同的IP上运行不同的Web服务器。套接字也可以通过其源端口和ip 进行标识。在许多负载平衡配置中就是这种情况。因为您正在使用应用程序服务器,所以它将能够做到这一点。
随时随地看视频慕课网APP
我要回答