现代Linux机器可以拥有的开放TCP连接的理论最大数量是多less?

假设硬件性能无限,一个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的连接到某个服务器的端口,如果服务器有多个端口或者是多宿主,那么你可以进一步扩大。

所以真正的限制是文件描述符。 每个单独的套接字连接都有一个文件描述符,所以限制实际上是系统已经configuration允许和处理的文件描述符的数量。 最大限制通常超过300K,但可以使用sysctl进行configuration。

对于普通盒子来说,真实的限制是大约80K,例如单线程的Jabber消息服务器。

如果您正在考虑运行服务器并尝试确定可以从一台计算机提供多less个连接,则可能需要了解C10k问题以及同时为多个客户端提供服务的潜在问题。

如果你使用一个原始套接字( SOCK_RAW )并在用户空间重新实现了TCP,我认为在这种情况下,答案仅限于(local address, source port, destination address, destination port)元组的数目(~2 ^ 64每个本地地址)。

当然,需要大量的内存来保持所有这些连接的状态,我想你将不得不build立一些iptables规则来防止内核TCP堆栈不适和/或代表你响应。