278

假设硬件性能无限,Linux 机器能否支持 >65536 个打开的 TCP 连接?

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

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

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

4

3 回答 3

419

一个监听端口可以同时接受多个连接。

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

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

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

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

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

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

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

普通盒子的实际限制大约是 80K,例如单线程 Jabber 消息传递服务器。

于 2010-02-25T09:01:45.817 回答
20

如果您正在考虑运行服务器并尝试确定可以从一台机器上提供多少连接,您可能想了解C10k 问题 以及同时为大量客户端提供服务所涉及的潜在问题。

于 2010-09-07T18:30:14.940 回答
13

如果您使用原始SOCK_RAW套接字(local address, source port, destination address, destination port)

当然,要保持所有这些连接的状态需要大量内存,我认为您必须设置一些 iptables 规则来防止内核 TCP 堆栈受到干扰和/或代表您做出响应。

于 2013-11-11T19:44:10.630 回答