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