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

Posted

技术标签:

【中文标题】在一个 tcp 连接中,一个服务器怎么可能同时处理超过 65535 个客户端呢?【英文标题】:In a tcp connection, how possibly can a server handle more than 65535 client at an instant? 【发布时间】:2017-11-20 04:59:33 【问题描述】:

我一直在阅读 Oracle 的 this socket tutorial 并偶然发现以下文字:

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

现在,如果我没记错的话,那么端口大小是 16 位,这将端口的最大数量限制在 65K 左右。这意味着如果服务器的所有端口都绑定到某个客户端本地端口,则服务器在任何时刻都无法处理超过 65535 个连接。虽然 *** 上的一些答案(如 this)表明活动连接没有限制。什么是正确的,什么是错误的?

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于在一个 tcp 连接中,一个服务器怎么可能同时处理超过 65535 个客户端呢?的主要内容,如果未能解决你的问题,请参考以下文章

请问linux怎么增大socket连接上限?

如何与服务器同时处理多个请求

计算机网络:TCP同时打开和同时关闭

java socket多线程问题,我写了一个socket tcp服务端,高手来进来看下,谢啦。是关于多客户端并联的问题

TCP和服务器断开连接后重连怎么处理

SQL Server 2008/2014无法远程连接的可能原因之一