首页 文章

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

提问于
浏览
196

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

据我所知,短暂端口的数量(<65536)限制了从一个本地IP到一个远程IP上的一个端口的连接数 .

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

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

3 回答

  • 287

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

    通常引用了'64K'限制,但这是每个服务器端口的每个客户端,并且需要澄清 .

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

    source_ip source_port destination_ip destination_port
    < client            > < server                      >
    

    在TCP堆栈内,这四个字段用作复合密钥,以将数据包与连接(例如文件描述符)进行匹配 .

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

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

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

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

  • 15

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

  • 10

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

    它当然需要大量内存来保持所有这些连接的状态,并且我认为你必须设置一些iptables规则来防止内核TCP堆栈代表你感到不安和/或响应 .

相关问题