Linux 上每个 IP 地址是否有 65536 个打开的 TCP 连接的硬限制?

Chr*_*ris 22 linux connection tcp tcpip

Linux 上每个 IP 地址是否有 65536 个打开的 TCP 连接的硬限制?我在某处读到过,但有人要求确认,我就是找不到。

我似乎记得文件描述符是一个 16 位整数,这以某种方式限制了它?

或者是这个 hokum,除了服务器有多强大之外,没有任何限制吗?

Ric*_*lka 35

您可能会考虑端口数量。在当前版本的 IPv4 中,TCP 中有 65536 个可用端口。这不仅仅是 Linux 的限制,它是协议的一部分。您的 IP 地址识别您的机器,端口识别您机器上的程序。

但是,连接数不受此限制。一个连接由 5 条信息组成,在 geek 中是 5 元组。它由协议(TCP、UDP)、本地IP地址和端口、远程IP地址和端口决定。所以,拿一个网络服务器。它可以在同一个端口(很可能是 80)上为多个连接提供服务。您的网络服务器甚至可以支持到同一台客户端机器的多个连接。假设您从两个窗口连接到 google.com。您的机器将为每个连接选择一个未使用的端口。因此,google 的服务器必须跟踪 (TCP, google.com, 80, yourmachine, someport1) 和 (TCP, google.com, 80, yourmachine, someport2)。在某些时候,您会遇到限制,但这不是硬限制,并且非常依赖于系统。

是的,每个套接字都是一个文件描述符,但并非所有机器都对 fd 表使用 shorts。在我的系统上,一个根本没有调整过的系统cat /proc/sys/fs/file-max给出了 323997。如果需要,我相信我可以提升它。

因此,有 65336 的限制,但它与寻址有关,而不是连接数。连接数是有限的,但更多取决于系统配置,以及它有多少内存。

  • @Chris:每个传入 IP 地址 _在单个本地端口_上有 64k 个连接,是的。 (3认同)
  • 所以,关于 5 元组:即使我被限制为 65536 个端口,也只将我限制为 64k 个连接*每个传入的 IP 地址*,是吗?所以唯一的限制是文件描述符,但它们不一定是 16 位?所以基本上你说的是没有限制? (2认同)