现代Linux机顶盒理论上最大的TCP连接数是多少

假设硬件有无限的性能,Linux机器能支持>65536打开TCP连接吗?

我知道临时端口的数量(65536)限制了从一个本地IP到一个远程IP上的一个端口的连接数量。

元组(本地ip,本地端口,远程ip,远程端口)是唯一定义TCP连接的;这是否意味着如果这些参数中有多个是空闲的,则可以支持超过65K个连接?例如,从多个本地ip连接到多个远程主机上的单个端口号。

系统中还有16位限制吗?文件描述符的数量?

229831 次浏览

一个监听端口可以同时接受多个连接。

有一个经常被引用的“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堆栈被打乱或代表您进行响应。