在tcp连接中,服务器如何在一瞬间处理超过65535个客户端?

时间:2017-06-17 14:31:51

标签: java web-services sockets tcp client-server

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

  

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

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

编辑1:如果服务器确实无法处理超过2 ^ 16-1个连接,那么Google等网站如何处理此限制?

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:-1)

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

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