【问题标题】:What is the theoretical maximum number of open TCP connections that a modern Linux box can have现代 Linux 机器可以拥有的打开 TCP 连接的理论最大数量是多少
【发布时间】:2011-01-20 22:09:47
【问题描述】:

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

我了解临时端口的数量 (

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

系统中还有 16 位限制吗?可能是文件描述符的数量?

【问题讨论】:

    标签: tcp linux-kernel port file-descriptor


    【解决方案1】:

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 如果您 (a) 使用 SO_REUSEADDR 和 (b) 以不同的目标 IP 地址为目标,理论上您可以拥有超过 64K 的传出连接。但是内核内存限制可能会首先阻止您。
    • sysctl 限制是针对整个系统的,对吧?还有一个可使用 ulimit 配置的限制,它限制了进程的文件描述符的最大数量。默认情况下远小于 300K,通常为 1024。
    • 有点技术性:客户端机器也可以有多个从路由器分配的 IP 地址。这些都可以分配给一个 MAC,或者该机器可以有多个物理网络接口用于额外的 IP 地址。 OP 指定了 1 个 IP,但重要的是其他人不要排除更多 IP 地址。
    • @Will 解释得很漂亮!!非常有帮助...想给 +100 upvotes...谢谢:-)
    • 注意tcp_fin_timeout默认阻塞同一个socket(源、目标、端口组合)60秒,如果连接断开,这会大大减少两个系统之间实际可用的tcp连接数并经常重新连接。通过允许在 TIME_WAIT 状态下重用 (tcp_tw_reuse=1) 套接字(并不总是支持)或通过打破 TCP/IP 标准将此超时值降低到较低值(通常无论如何都可以正常工作),可以最大限度地减少此问题。
    【解决方案2】:

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

    【讨论】:

    • C10k 10 岁了,不再有趣。 [阅读本文] 了解如何处理 C1024K。
    • @Chandranshu - 你是说metabrew.com/article/… 吗?
    • @MikkoRantalainen - 是的。我认为现在有更好的基准。凤凰人已经把它推到了 200 万并发连接。
    • @Chandranshu - 有 12M 连接的戴尔演示:mrotaru.wordpress.com/2013/06/20/…
    • 几年前:Intel Atom D2700,2GB RAM,120 万并发连接。我遇到的唯一问题是测试工作中的 Windows 框;在尝试对 Intel Atom 机器进行 DoS 攻击时,这些经常会崩溃......
    【解决方案3】:

    如果您使用原始套接字 (SOCK_RAW) 并在用户空间中重新实现 TCP,我认为在这种情况下答案仅限于 (local address, source port, destination address, destination port) 元组的数量(每个本地地址约 2^64)。

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

    【讨论】:

      猜你喜欢
      • 2016-04-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2011-07-09
      • 1970-01-01
      相关资源
      最近更新 更多