假设硬件具有无限的性能,Linux机箱是否支持> 65536个开放的TCP连接?
据我所知,短暂端口的数量(<65536)限制了从一个本地IP到一个远程IP上的一个端口的连接数.
元组(本地ip,本地端口,远程ip,远程端口)是唯一定义TCP连接的东西; 这是否意味着如果这些参数中有多个是免费的,则可以支持超过65K的连接.例如,从多个本地IP连接到多个远程主机上的单个端口号.
系统中还有另外16位的限制吗?或许文件描述符的数量?
单个侦听端口可以同时接受多个连接.
通常引用的是"64K"限制,但这是每个服务器端口的每个客户端,需要澄清.
每个TCP/IP数据包基本上有四个用于寻址的字段; 这些是:
source_ip source_port destination_ip destination_port < client > < server >
在TCP堆栈内,这四个字段用作复合密钥,以将数据包与连接(例如文件描述符)进行匹配.
如果客户端与同一目的地上的同一端口有许多连接,则其中三个字段将相同 - 只是source_port
区别于不同的连接.端口是16位数,因此任何给定客户端对任何给定主机端口的最大连接数为64K.
但是,多个客户端每个最多可以有64K连接到某个服务器的端口,如果服务器有多个端口或者是多宿主,那么您可以进一步增加.
所以真正的限制是文件描述符.每个单独的套接字连接都有一个文件描述符,因此限制实际上是系统已配置为允许的资源和要处理的资源的文件描述符数.最大限制通常超过300K,但可以配置,例如使用sysctl.
对于普通盒子来说,现实的限制是大约80K,例如单线程Jabber消息服务器.
如果您正在考虑运行服务器并尝试确定从一台计算机可以提供多少连接,您可能需要了解C10k问题 以及同时为大量客户端提供服务所涉及的潜在问题.
如果您使用了原始套接字(SOCK_RAW
)并在用户区重新实现了TCP,我认为答案在这种情况下仅受(local address, source port, destination address, destination port)
元组数量的限制(每个本地地址约为2 ^ 64).
它当然需要大量内存来保持所有这些连接的状态,并且我认为你必须设置一些iptables规则来防止内核TCP堆栈代表你感到不安和/或响应.