假设硬件有无限的性能,Linux机器能支持>65536打开TCP连接吗?
我知道临时端口的数量(<65536)限制了从一个本地IP到一个远程IP上的一个端口的连接数量。
元组(本地ip,本地端口,远程ip,远程端口)是唯一定义TCP连接的;这是否意味着如果这些参数中有多个是空闲的,则可以支持超过65K个连接?例如,从多个本地ip连接到多个远程主机上的单个端口号。
系统中还有16位限制吗?文件描述符的数量?
假设硬件有无限的性能,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消息服务器。
如果您使用原始套接字(SOCK_RAW)并在用户域中重新实现TCP,我认为在这种情况下,答案只受限于(本地地址、源端口、目的地址、目的端口)元组的数量(每个本地地址~2^64)。
当然,要保存所有这些连接的状态需要大量内存,而且我认为您必须设置一些iptables规则,以防止内核TCP堆栈被打乱&/或代表您进行响应。