我一直在阅读 Oracle 的 这个套接字教程,并偶然发现了以下文本:
如果一切顺利,服务器将接受连接。接受后,服务器将获得绑定到同一本地端口的新套接字,并将其远程端点设置为客户端的地址和端口。它需要一个新的套接字,以便它可以继续侦听原始套接字的连接请求,同时满足已连接客户端的需求。
如果我没记错的话,端口大小是 16 位,这将端口的最大数量限制在 65K 左右。这意味着如果服务器的所有端口都绑定到某个客户端本地端口,则服务器在任何时刻都无法处理超过 65535 个连接。虽然 stackoverflow 上的一些答案(如 this)表明活动连接没有限制。这件事的正确与否是什么?
编辑 1:如果服务器确实无法处理超过 2^16-1 个连接,那么像 Google 这样的网站如何处理此限制?
唯一的 TCP 连接由客户端 IP、客户端端口、服务器 IP 和服务器端口的唯一组合定义。对于特定的服务服务器 IP 和端口是恒定的(即 HTTP 的端口 80),但客户端 IP 和端口可能会有所不同。由于端口范围仅为 0...65535,这意味着服务器最多只能同时处理来自同一客户端 IP 地址的 65535 个不同连接,因为这些都是连接元组的所有可能的唯一组合,仅当端口可以更改。但是,如果有多个具有不同 IP 地址的客户端,则此限制分别适用于每个客户端。然后,如果您查看不同可能的 IP 地址(IPv4 和 IPv6)的数量,您会发现理论上服务器可以处理的连接数量基本上没有真正的限制。
实际上,每个 TCP 连接都会占用服务器的内存,因为必须保留当前状态。内核和应用程序中需要额外的内存来存储文件描述符和应用程序协议状态等。这意味着根据机器的资源存在实际限制,该限制可能小于 64k,但也可能更多,具体取决于系统及其配置.
例如谷歌数据中心也做同样的事情。将“Google.com”映射到不同的内部服务器,允许它们总共接受超过 65k 个连接。