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

आनं*_*नंद 5 java sockets web-services tcp client-server

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

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

现在如果我没有错,那么端口大小是16位,这限制了65K左右的最大端口数.这意味着如果服务器的所有端口都绑定到某个客户端本地端口,则服务器在任何时刻都无法处理超过65535个连接.而像一些答案这样的计算器显示,有活动连接没有限制.这是真的,有什么不对?

编辑1:如果服务器确实无法处理超过2 ^ 16-1的连接,那么像谷歌这样的网站如何处理这种限制呢?

Ste*_*ich 6

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

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