单机TCP最大并发连接数是多少?

原文转载自 「Gecco's Blog」 ( https://ibabysong.com/posts/202003317.html ) By Gecco

预计阅读时间 0 分钟(共 0 个字, 0 张图片, 0 个链接)

单机TCP最大并发连接数是多少?

先讲标准答案:不考虑机器配置的情况,理论单机TCP最大并发连接数是2的48次方(2^48)

1 文件句柄限制

单进程文件打开数限制

执行ulimit -n输出1024,说明对于一个进程而言最多只能打开1024个文件,所以此默认配置最多可以并发上千个TCP连接。

临时修改:ulimit -n 1000000,但是这种临时修改只对当前登录用户目前的使用环境有效,系统重启或用户退出后就会失效。

重启后失效的修改:编辑/etc/security/limits.conf文件, 修改后内容为

soft nofile 1000000

hard nofile 1000000

永久修改:编辑/etc/rc.local,在其后添加如下内容

ulimit -SHn 1000000
全局限制

执行cat /proc/sys/fs/file-nr输出 9344 0 592026,分别为:

1.已经分配的文件句柄数

2.已经分配但没有使用的文件句柄数

3.最大文件句柄数。但在Kernel 2.6版本中第二项的值总为0,

这并不是一个错误,它实际上意味着已经分配的文件描述符无一浪费的都已经被使用了 。

我们可以把这个数值改大些,用 root 权限修改 /etc/sysctl.conf 文件:

fs.file-max = 1000000

net.ipv4.ip_conntrack_max = 1000000

net.ipv4.netfilter.ip_conntrack_max = 1000000

2 端口范围限制

我之前也一直以为理论单机最大并发连接限制受到端口数65535的限制,这是不正确的!

操作系统上端口号1024以下是系统保留的,从1024-65535是用户使用的。

由于每个TCP连接都要占一个端口号,所以我们最多可以有60000多个并发连接。我想有这种错误思路朋友不在少数吧?

我们来分析一下吧

如何标识一个TCP连接:系统用一个4四元组来唯一标识一个TCP连接:{local ip, local port,remote ip,remote port}。

好吧,我们拿出《Unix网络编程:卷一》第四章中对accept的讲解来看看概念性的东西,第二个参数cliaddr代表了客户端

的ip地址和端口号。而我们作为服务端实际只使用了bind时这一个端口,说明端口号65535并不是并发量的限制。

Server最大TCP连接数:

Server通常固定在某个本地端口上监听,等待Client的连接请求。不考虑地址重用(Unix的SO_REUSEADDR选项)的情况下,

即使Server端有多个IP,本地监听端口也是独占的,因此Server端TCP连接4元组中只有remote ip(也就是Client IP)

和remote port(客户端Port)是可变的,因此最大TCP连接为客户端IP数×客户端Port数,对IPV4,不考虑IP地址

分类等因素,最大TCP连接数约为2的32次方(IP数)×2的16次方(Port数),

也就是Server端单机最大TCP连接数约为2的48次方。

3 总结

上面给出的结论都是理论上的单机TCP并发连接数,实际上单机并发连接数肯定要受硬件资源(内存)

、网络资源(带宽)的限制,至少对我们的需求现在可以做到数十万级的并发了,你的呢?

————————————————
原文链接:https://blog.51cto.com/yaocoder/1312821

more_vert