从硬件假设无限的性能,可以在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连接到一些服务器的端口,如果服务器有多个端口或任是多穴则可以进一步繁殖。
所以,真正的限制是文件描述符。 每个单独的插座连接给出一个文件描述符,所以限制是真的,该系统已经被配置为允许文件描述符和资源来处理的数量。 最大限制通常最高超过30万,但配置如带的sysctl 。
现实限制被夸大约为正常盒是80K左右例如单线程的Jabber消息收发服务器。
如果您想运行的服务器,并试图决定多少连接可以从一台机器提供服务的,你可能想了解的问题,C10K和参与同时投放大量的客户的潜在问题。
如果您使用原始套接字( SOCK_RAW
在用户态),并重新实现TCP,我想答案是在这种情况下,只能通过数量有限的(local address, source port, destination address, destination port)
的元组(〜2 ^ 64每个本地地址)。
当然,这将需要大量的内存,以保持所有这些连接的状态,我想你将不得不建立一些iptables规则,以保持内核的TCP协议栈从件事苦恼和/或回应您的名义。