一台服务器的最大并发tcp连接数是多少
最大值与最大文件描述符个数、内存等硬件配置、软件架构及优化有很大关系。
服务器的并发数并不是由 TCP 的 65535 个端口决定的。服务器同时能够承受的并发数是由带宽、硬件、程序设计等多方面因素决定的。
真正影响 TCP 连接数量的,是服务器的内存以及允许单一进程同时打开文件的数量,因为每创建一个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄都占用一部分系统内存,当系统内存被占用殆尽,允许的 TCP 并发连接数也就到了上限。一般来讲,通过增加服务器内存、修改最大文件描述符个数等,可以做到单台服务器支持 10 万 + 的 TCP 并发。
如何标识一个 TCP 连接
在确定最大连接数之前,先来看看系统如何标识一个 tcp 连接。系统用一个 4 四元组来唯一标识一个 TCP 连接:{localip, localport,remoteip,remoteport} = {本地 ip,本地 port,远程 ip,远程 port}
client 最大 tcp 连接数
client 每次发起 tcp 连接请求时,除非绑定端口,通常会让系统选取一个空闲的本地端口(local port),该端口是独占的,不能和其他 tcp 连接共享。tcp 端口的数据类型是 unsigned short,因此本地端口个数最大只有 65536,端口 0 有特殊含义,不能使用,这样可用端口最多只有 65535,所以在全部作为 client 端的情况下,一个 client 最大 tcp 连接数为 65535,这些连接可以连到不同的 serverip。
server 最大 tcp 连接数
server 通常固定在某个本地端口上监听,等待 client 的连接请求。不考虑地址重用(unix 的 SO_REUSEADDR 选项)的情况下,即使 server 端有多个 ip,本地监听端口也是独占的,因此 server 端 tcp 连接 4 元组中只有 remoteip(也就是 clientip)和 remote port(客户端 port)是可变的,因此最大 tcp 连接为客户端 ip 数 × 客户端 port 数,对 IPV4,不考虑 ip 地址分类等因素,最大 tcp 连接数约为 2 的 32 次方(ip 数)×2 的 16 次方(port 数),也就是 server 端单机最大 tcp 连接数约为 2 的 48 次方。
实际的 tcp 连接数
上面给出的是理论上的单机最大连接数,在实际环境中,受到机器资源、操作系统等的限制,特别是 sever 端,其最大并发 tcp 连接数远不能达到理论上限。在 unix/linux 下限制连接数的主要因素是内存和允许的文件描述符个数(每个 tcp 连接都要占用一定内存,每个 socket 就是一个文件描述符),另外 1024 以下的端口通常为保留端口。
所以,对 server 端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发 TCP 连接数超过 10 万,甚至上百万是没问题的。
这明显是进入了思维的误区,65535 是指可用的端口总数,并不代表服务器同时只能接受 65535 个并发连接。
举个例子:
我们做了一个网站,绑定的是 TCP 的 80 端口,结果是所有访问这个网站的用户都是通过服务器的 80 端口访问,而不是其他端口。可见端口是可以复用的。
即使 Linux 服务器只在 80 端口侦听服务, 也允许有 10 万、100 万个用户连接服务器。Linux 系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。