一台服务器​最大并发TCP连接数多少?百万链接?

2022-11-11 18:51:11 浏览数 (1)

【Linux250个常用命令速查手册】关注【入门小站】,后台回复 「1001」 自取。

首先,问题中描述的 65535 个连接指的是客户端连接数的限制。

在 tcp 应用中,server 事先在某个固定端口监听,client 主动发起连接,经过三路握手后建立 tcp 连接。那么对单机,其最大并发 tcp 连接数是多少呢?

如何标识一个 TCP 连接

在确定最大连接数之前,先来看看系统如何标识一个 tcp 连接。系统用一个 4 四元组来唯一标识一个 TCP 连接:{localip, localport,remoteip,remoteport}。

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 系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。

我们知道两个进程如果需要进行通讯最基本的一个前提是:能够唯一的标识一个进程。在本地进程通讯中我们可以使用 PID 来唯一标识一个进程,但 PID 只在本地唯一,网络中的两个进程 PID 冲突几率很大。

这时候就需要另辟它径了,IP 地址可以唯一标示主机,而 TCP 层协议和端口号可以唯一标示主机的一个进程,这样可以利用 IP 地址+协议+端口号唯一标示网络中的一个进程。

能够唯一标识网络中的进程后,它们就可以利用 socket 进行通信了。socket(套接字)是在应用层和传输层之间的一个抽象层,它把 TCP/IP 层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。

socket 源自 Unix,是一种 "打开—读 / 写—关闭" 模式的实现,服务器和客户端各自维护一个 "文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。

唯一能够确定一个连接有 4 个东西:

  • 服务器的 IP
  • 服务器的 Port
  • 客户端的 IP
  • 客户端的 Port

服务器的 IP 和 Port 可以保持不变,只要客户端的 IP 和 Port 彼此不同就可以确定一个连接数。

一个 socket 是可以建立多个连接的,一个 TCP 连接的标记为一个四元组 (source_ip, source_port, destination_ip, destination_port),即(源 IP,源端口,目的 IP,目的端口) 四个元素的组合。只要四个元素的组合中有一个元素不一样,那就可以区别不同的连接。

举个例子:

你的主机 IP 地址是 1.1.1.1, 在 8080 端口监听

当一个来自 2.2.2.2 发来一条连接请求,端口为 5555。这条连接的四元组为 (1.1.1.1, 8080, 2.2.2.2, 5555)

这时 2.2.2.2 又发来第二条连接请求,端口为 6666。新连接的四元组为 (1.1.1.1, 8080, 2.2.2.2, 6666)

那么,你主机的 8080 端口建立了两条连接;

(2.2.2.2)发来的第三条连接请求, 端口为 5555(或 6666)。第三条连接的请求就无法建立,因为没有办法区分于上面两条连接。

同理,可以在同一个端口号和 IP 地址上绑定一个 TCP socket 和一个 UDP socket 因为端口号虽然一样,但由于协议不一样,所以端口是完全独立的。TCP/UDP 一般采用五元组来定位一个连接: source_ip, source_port, destination_ip, destination_port, protocol_type 即(源 IP,源端口,目的 IP,目的端口,协议号)

综上所述,服务器的并发数并不是由 TCP 的 65535 个端口决定的。服务器同时能够承受的并发数是由带宽、硬件、程序设计等多方面因素决定的。

所以也就能理解淘宝、腾讯、头条、百度、新浪、哔哔哔哔等为什么能够承受住每秒钟几亿次的并发访问,是因为他们采用的是服务器集群。服务器集群分布在全国各地的大型机房,当访问量小的时候会关闭一些服务器,当访问量大的时候会不断的开启新的服务器。

65535 从哪来的,干啥的?

要解释好这个问题,就要先说清楚 65535 的含义。在 Linux 系统中,如果两个机器要通信,那么相互之间需要建立 TCP 连接,为了让双方互相认识,Linux 系统用一个四元组来唯一标识一个 TCP 连接:{local ip, local port, remote ip, remote port},即本机 IP、本机端口、远程 IP、远程端口,IP 和端口就相当于小区地址和门牌号,只有拿到这些信息,通信的双方才能互相认知。在 Linux 系统中,表示端口号(port)的变量占 16 位,这就决定了端口号最多有 2 的 16 次方个,即 65536 个,另外端口 0 有特殊含义不给使用,这样每个服务器最多就有 65535 个端口可用。因此,65535 代表 Linux 系统支持的 TCP 端口号数量,在 TCP 建立连接时会使用。

TCP 怎么建立连接,与端口号是什么关系?

Linux 服务器在交互时,一般有两种身份:客户端或者服务器端。典型的交互场景是:

  • 服务器端主动创建监听的 socket,并绑定对外服务端口 port,然后开始监听
  • 客户端想跟服务器端通信时,就开始连接服务器的端口 port
  • 服务端接受客户端的请求,然后再生成新的 socket
  • 服务器和客户端在新的 socket 里进行通信

可以看到,端口 port 主要用在服务器和客户端的 “握手认识” 过程,一旦互相认识了,就会生成新的 socket 进行通信,这时候 port 就不再需要了,可以给别的 socket 通信去使用,所以很明显 TCP 连接的数量可以大于 TCP 端口号的数量 65,535。

考虑一下两个极端场景,即某台 Linux 服务器只作为客户端或者服务器端

(1)Linux 服务器只作为客户端

这时候每发起一个 TCP 请求,系统就会指定一个空闲的本地端口给你用,而且是独占式的,不会被别的 TCP 连接抢走,这样最多可以建立 65535 个连接,每个连接都与不同的服务器进行交互。这种场景,就是题主所描述的样子,但是由于条件过于苛刻,属于小概率事件,所以更多的还是理论上的可能,现实的环境中几乎不会出现。

(2)Linux 服务器只作为服务端

这种场景下,服务端就会固定的监听本地端口 port,等着客户端来向它发起请求。为了计算简单,我们假设服务器端的 IP 跟端口是多对一的,这样 TCP 四元组里面就有 remote ip 和 remote port 是可变的,因此最大支持创建 TCP 个数为 2 的 32 次方(IP 地址是 32 位的)乘以 2 的 16 次方(port 是 16 位的)等于 2 的 48 次方。

现实中单台 Linux 服务器支持的 TCP 连接数量

通过前面的分析我们知道,在现实场景中,由于存在端口 port 复用的情况,服务器可同时支持的 TCP 连接数跟 65535 没有一一对应关系,事实上,真正影响 TCP 连接数量的,是服务器的内存以及允许单一进程同时打开文件的数量,因为每创建一个 TCP 连接都要创建一个 socket 句柄,每个 socket 句柄都占用一部分系统内存,当系统内存被占用殆尽,允许的 TCP 并发连接数也就到了上限。一般来讲,通过增加服务器内存、修改最大文件描述符个数等,可以做到单台服务器支持 10 万 的 TCP 并发。

当然,在真实的商用场景下,单台服务器都会编入分布式集群,通过负载均衡算法动态的调度不同用户的请求给最空闲的服务器,如果服务器平均内存使用超过 80% 的警戒线,那么就会及时采用限流或者扩展集群的方式来保证服务,绝对不会出现服务器的内存被耗尽的情况,那样就算事故了。

总之,65535 只是 Linux 系统中可使用端口 port 数量的上限,端口 port 数量与 TCP 连接数量并非完全一一对应的关系,服务器支持的 TCP 并发连接数量主要跟服务器的内存以及允许单个进程同时打开的文件数量有关系,通过端口复用及调整服务器参数等手段,单台服务器支持的 TCP 并发连接数是可以高于 65535 的。

来源:blog.csdn.net/daocaokafei/article/details/115410761

【Linux250个常用命令速查手册】关注【入门小站】,后台回复 「1001」 自取。

近期热文

如何在Linux中删除软链接

图解TCP,UDP,流量控制,拥塞控制,一次看懂

如何学习 Linux 内核网络协议栈

100 个网络基础知识普及,看完成半个网络高手!

有了这篇网络排错思路大总结/我帮了不少女同事~

带你破解DDOS攻击的原理

0 人点赞