在 tcp 连接中,服务器怎么可能同时处理超过 65535 个客户端?



我一直在阅读Oracle的套接字教程,偶然发现了以下文本:

如果一切顺利,服务器将接受连接。接受后,服务器将获得绑定到同一本地端口的新套接字,并将其远程终结点设置为客户端的地址和端口。它需要一个新的套接字,以便它可以继续侦听连接请求的原始套接字,同时照顾连接的客户端的需求。

现在,如果我没记错的话,那么端口大小为 16 位,这将最大端口数限制在 65K 左右。这意味着,如果服务器的所有端口都绑定到某个客户端本地端口,则服务器在任何时刻都无法处理超过 65535 个连接。虽然堆栈溢出上的一些类似答案表明活动连接没有限制。这到底是怎么回事,又是错的呢?

编辑 1:如果服务器确实不能处理超过 2^16-1 的连接,那么像 Google 这样的网站如何处理这个限制?

唯一的 TCP 连接由客户端 IP、客户端端口、服务器 IP 和服务器端口的唯一组合定义。对于特定的服务服务器,IP 和端口是恒定的(即 HTTP 的端口 80),但客户端 IP 和端口可能会有所不同。由于端口范围仅为 1..65535,这意味着服务器最多只能同时处理来自同一客户端 IP 地址的65535 个不同连接,因为当只有端口可以更改时,这些都是连接元组的唯一可能组合。但是,如果有多个客户端具有不同的 IP 地址,则此限制分别适用于其中每个客户端。如果您随后查看不同可能的IP地址(IPv4和IPv6)的数量,您会发现理论上服务器可以处理的连接量基本上没有真正的限制。

实际上,这些TCP连接中的每一个都会占用服务器上的内存,因为必须保留当前状态。内核和应用程序中需要额外的内存,用于文件描述符和应用程序协议状态等。这意味着根据机器的资源,有一个实际的限制,可能小于64k,但也更多,具体取决于系统及其配置。

他们为您的ISP使用NAT(网络地址转换)之类的东西。 您可以访问路由器后面的其他计算机,因为路由器在内部将路由映射到 PC。

例如,谷歌数据中心也做同样的事情。将"Google.com"映射到不同的内部服务器,允许它们总共接受超过 65k 的连接。

相关内容

  • 没有找到相关文章

最新更新