一个现代Linux机器可以拥有的理论上最大开放TCP连接数是多少

一个现代Linux机器可以拥有的理论上最大开放TCP连接数是多少,tcp,linux-kernel,port,file-descriptor,Tcp,Linux Kernel,Port,File Descriptor,假设硬件性能无限,Linux机箱是否可以支持>65536的开放TCP连接 我知道单个侦听端口可以同时接受多个连接的临时端口( 有一个经常被引用的“64K”限制,但这是每个客户端每个服务器端口的限制,需要澄清 每个TCP/IP数据包基本上有四个用于寻址的字段。这些字段是: source_ip source_port destination_ip destination_port <----- client ------> <--------- server -----------

假设硬件性能无限,Linux机箱是否可以支持>65536的开放TCP连接


我知道单个侦听端口可以同时接受多个连接的临时端口(

有一个经常被引用的“64K”限制,但这是每个客户端每个服务器端口的限制,需要澄清

每个TCP/IP数据包基本上有四个用于寻址的字段。这些字段是:

source_ip source_port destination_ip destination_port
<----- client ------> <--------- server ------------>
source\u ip source\u port destination\u ip destination\u port
在TCP堆栈中,这四个字段用作复合键,用于将数据包与连接(例如,文件描述符)匹配

如果一个客户端在同一目标上有多个到同一端口的连接,那么其中三个字段将是相同的-只有
source\u port
不同以区分不同的连接。端口是16位数字,因此任何给定客户端到任何给定主机端口的最大连接数为64K

但是,多个客户端最多可以有64K个连接到某个服务器的端口,如果服务器有多个端口或其中一个是多主端口,则可以进一步增加该端口

因此,真正的限制是文件描述符。每个单独的套接字连接都有一个文件描述符,因此限制实际上是系统配置为允许的文件描述符数量和处理的资源。最大限制通常超过300K,但可以配置,例如使用


普通机箱的实际限制大约为80K,例如单线程Jabber消息服务器。

如果您正在考虑运行一台服务器,并试图确定一台机器可以提供多少连接,那么您可能需要了解为大量客户机同时提供服务所涉及的潜在问题最近。

如果您使用原始套接字(
SOCK_raw
)并在userland中重新实现TCP,我认为在这种情况下,答案仅限于
(本地地址、源端口、目标地址、目标端口)
元组(每个本地地址约2^64)的数量


当然,要保持所有这些连接的状态需要大量内存,而且我认为您必须设置一些iptables规则,以防止内核TCP堆栈因您的原因而出现混乱和/或响应。

如果您(a)使用SO_REUSEADDR和(b)使用SO_REUSEADDR,理论上您可以拥有超过64K个传出连接针对不同的目标IP地址。但是内核内存限制可能会首先阻止您。sysctl限制是针对整个系统的,对吗?ulimit还有一个可配置的限制,它限制了进程的最大文件描述符数量。默认情况下,这大大少于300K,通常是1024。有一点技术性:客户端机器也可以从路由器分配多个IP地址。这些地址都可以分配给一个MAC,或者该机器可以有多个物理网络接口以获得额外的IP地址。OP指定了1个IP,但其他人不要排除更多IP地址,这一点很重要。@将很好地解释!!非常有用…希望to给予+100次投票…谢谢:-)请注意,默认情况下,tcp_fin_超时会将同一套接字(源、目标、端口组合)再阻塞60秒,如果连接频繁断开和重新连接,这将大大减少两个系统之间实际可用的tcp连接数。通过允许在TIME_WAIT状态下重用(tcp_tw_reuse=1)套接字(不总是受支持),或者通过打破tcp/IP标准将超时时间减少到较低的值(通常可以正常工作),可以将此问题降至最低。C10k已经10年了,不再有趣。[阅读此文]看看如何应对C1024K。@Chandranshu-你的意思是什么?@MikkoRantalainen-是的。我认为现在有更好的基准。凤凰城的家伙们已经把它推到了200万个同时连接。@Chandranshu-有一个拥有1200万个连接的戴尔演示:几年前:Intel Atom D2700,2GB RAM,120万个并发连接。我遇到的唯一问题是测试工作中的窗口框;在尝试DoS Intel Atom box时,它们经常会崩溃。。。