现代 Linux 机顶盒可以拥有的理论最大开放 TCP 连接数是多少

What is the theoretical maximum number of open TCP connections that a modern Linux box can have

提问人:fadedbee 提问时间:2/25/2010 最后编辑:tshepangfadedbee 更新时间:1/16/2021 访问量:240906

问:

假设硬件性能无限,Linux 盒子能否支持 >65536 开放式 TCP 连接?

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

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

系统中是否有其他 16 位限制?也许是文件描述符的数量?

tcp linux-kernel 端口 文件描述符

评论


答:

446赞 Will 2/25/2010 #1

单个侦听端口可以同时接受多个连接。

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

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

source_ip source_port destination_ip destination_port
<----- client ------> <--------- server ------------>

在 TCP 堆栈中,这四个字段用作复合键,用于将数据包与连接(例如文件描述符)匹配。

如果客户端与同一目标上的同一端口有许多连接,则其中三个字段将是相同的 - 只是为了区分不同的连接而有所不同。端口是 16 位数字,因此任何给定客户端可以与任何给定主机端口的最大连接数为 64K。source_port

但是,多个客户端每个客户端可以与某个服务器的端口建立多达 64K 的连接,如果服务器有多个端口或其中一个是多宿主的,那么您可以进一步增加。

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

对于普通盒子来说,吹嘘的现实限制约为 80K,例如单线程 Jabber 消息服务器。

评论

4赞 Darron 9/8/2010
理论上,如果 (a) 使用 SO_REUSEADDR 和 (b) 定位不同的目标 IP 地址,则可以拥有超过 64K 的传出连接。但是内核内存限制可能会首先阻止您。
1赞 Will 9/8/2010
@Darron 我以为SO_REUSEADDR是重新启动时用于服务器绑定的?
7赞 pacoverflow 11/1/2013
sysctl 限制是针对整个系统的,对吧?还有一个可使用 ulimit 配置的限制,它限制了进程的最大文件描述符数。默认情况下,这比 300K 小得多,通常是 1024。
1赞 Kind Contributor 4/11/2017
轻微的技术性:客户端计算机还可以从路由器分配多个 IP 地址。这些都可以分配给单个 MAC,或者该计算机可以具有多个物理网络接口以用于其他 IP 地址。OP 指定了 1 个 IP,但其他人不要排除更多 IP 地址,这一点很重要。
2赞 fgwaller 7/11/2018
请注意,默认情况下,tcp_fin_timeout会再阻止同一套接字(源、目标、端口组合)60 秒,如果连接频繁断开并重新连接,这将大大减少两个系统之间实际可用的 tcp 连接数。通过允许重用处于TIME_WAIT状态(并不总是受支持)的 (tcp_tw_reuse=1) 套接字,或者通过打破 TCP/IP 标准将此超时减少到较低的值(通常工作正常)来最大程度地减少此问题。
21赞 Spaceghost 9/8/2010 #2

If you are thinking of running a server and trying to decide how many connections can be served from one machine, you may want to read about the C10k problem and the potential problems involved in serving lots of clients simultaneously.

评论

19赞 Chandranshu 11/12/2013
C10k is 10 years old and no longer fun. [Read this] to see how C1024K can be tackled.
1赞 Mikko Rantalainen 8/16/2017
@Chandranshu - did you mean metabrew.com/article/… ?
1赞 Chandranshu 8/16/2017
@MikkoRantalainen - yes. I think there are better benchmarks available now. Phoenix guys have already pushed it to 2 million simultaneous connection.
4赞 Mikko Rantalainen 8/18/2017
@Chandranshu - there is Dell demo with 12M connections: mrotaru.wordpress.com/2013/06/20/…
2赞 Klaws 9/11/2019
Quite a few years ago: Intel Atom D2700, 2GB RAM, 1.2M concurrent connections. The only issues I had were with the Windows boxes in the test work; these regularly went belly up while attempting to DoS the Intel Atom box...
13赞 sbirch 11/12/2013 #3

If you used a raw socket () and re-implemented TCP in userland, I think the answer is limited in this case only by the number of tuples (~2^64 per local address).SOCK_RAW(local address, source port, destination address, destination port)

It would of course take a lot of memory to keep the state of all those connections, and I think you would have to set up some iptables rules to keep the kernel TCP stack from getting upset &/or responding on your behalf.