腾讯三面:一台服务器,最大支持的TCP连接数是多少?

简介: 一个 TCP 对象占用的大小,等于它所包含的一些数据结构占用大小的总和,也是就把上面这些数据结构的大小累加起来,就是一个 TCP 连接占用的大小了。实际过程中的 TCP 连接,肯定不是静止状态的,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,8 GB 物理内存的服务器实际并发很难达到百万级别。

大家好,我是小林。

最近有读者面试腾讯的时候,被问到 2 个很有意思的问题:

  1. 一个 服务端进程 最大能支持多少条 TCP 连接?
  2. 一台 服务器 最大能支持多少条 TCP 连接?
    很多同学第一反应就是端口的限制,端口号最多是 65536 个,那就最多只能支持 65536TCP 连接。

实际上这是不对的!

今天都带大家分析一波这两个问题。

一个服务端进程最大能支持多少条 TCP 连接?

首先我们要知道 TCP 连接本质上在内核里就是一个 socket 对象。

struct socket {
     
    ....
    //INET域专用的一个socket表示, 提供了INET域专有的一些属性,比如 IP地址,端口等
    struct sock             *sk;  
    //TCP连接的状态:SYN_SENT、SYN_RECV、ESTABLISHED.....
    short                   type;  
    ....
};  

struct inet_sock {
     
...
  __u32    daddr;   //IPv4的目标地址。  
  __u16    dport;   //目标端口。   
  __u32    saddr;   //源地址。  
  __u16    sport;   //源端口。  
...
};

这个 socket 对象也就是一个数据结构,里面包含了 TCP 四元组的信息:源IP、源端口、目标IP、目标端口

tcp-四元组

所以,只要确认了【源IP、源端口、目标IP、目标端口】这四个信息,就能在内核中找到这个 socket 对象,也就能确定一条 TCP 连接。

一个服务端进程通常是监听 1 个端口号(当然也可能监听多个端口号,这里不考虑),比如我的图解网站的 nginx 服务,就监听了 443 端口。

nginx-443

你们看图解网站的时候,实际上就是通过 nginx 服务把网页数据发送给你们的。

然后,服务端进程除了会固定监听某个一个端口之外,也通常会绑定 0.0.0.0 IP 地址。

这个 IP 地址是特殊的,0.0.0.0 指的是本机上的所有 IPV4 地址,如果一个主机有两个 IP 地址,192.168.1.110.1.2.1,并且该主机上的一个服务监听的地址是 0.0.0.0,那么通过两个 IP 地址都能够访问该服务。

所以一个服务端进程,意味着他的 IP 地址和端口号是固定的(0.0.0.0:443)。

也就是当客户端与服务端建立一条 TCP 连接的时候,这个 TCP 连接的四元组信息中服务端的 IP地址和端口 号是固定的,能产生变化的就是客户端的 IP 地址和端口号了。

因此,一个服务端进程最大能支持的 TCP 连接个数的计算公式如下:

【最大 TCP 连接数】=【客户端的 IP 数】X【客户端的 PORT 数】

IPv4,客户端的 IP 数最多为 232 次方,客户端的端口数最多为 216 次方。

那么一个服务端进程理想情况下,最大的 TCP 连接数约为 248 次方【 2^32 (ip数) * 2^16 (端口数)】,这数值是非常夸张的了,约等于 两百多万亿

当然,服务端进程最大能支持的 TCP 连接数远不能达到理论上限,还会受到 文件描述符、内存大小资源的限制,毕竟 socketLinux 的视角其实就是文件资源,而且一个 socket 对象也会占用一定的内存资源。

因此,会受以下因素影响:

  1. 文件描述符限制,每个 TCP 连接都是一个文件,如果文件描述符被占满了,会发生 Too many open filesLinux 对可打开的文件描述符的数量分别作了三个方面的限制:

    • 系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看;
    • 用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看;
    • 进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看;
  2. 内存限制,每个 TCP 连接都要占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生 OOM

一台服务器最大最多能支持多少条 TCP 连接?

前面分析是一个服务端进程理的情况,理论上能最大支持约为 2 的 48 次方(2^32 (ip数) * 2^16 (端口数),约等于 两百多万亿

那到了一台服务器的视角就会有一点不一样。

一台服务器是可以有多个服务端进程的,每个服务端进程监听不同的端口,比如:ssh22Redis6379,当然所有 65535 个端口你都可以用来监听一遍。

linux-端口监听

当然所有 65535 个端口你都可以用来监听一遍,这样理论上线就到了 2的32次方(ip数)×2的16次方(port数)×2的16次方(服务器port数)个,感兴趣你可以算一下,这个基本相当于 无穷个 了。

server-tcp-max

不过理想和实际总是会有差距的!

因为 Linux 每维护一条 TCP 连接都要花费资源,处理连接请求,保活,数据的收发时需要消耗一些 CPU,维持 TCP 连接主要 消耗内存

我们题目的问题是考虑最大多少个连接,所以我们先不考虑数据的收发,那么 TCP 在静止的状态下,就不怎么消耗 CPU 了,主要消耗内存,而 Linux 上内存是有限的。

首先,我们要知道一条处于 ESTABLISH 状态的 TCP 连接具体占用多大内存?

一个 TCP 对象占用的大小,等于它所包含的一些数据结构占用大小的总和,也是就把上面这些数据结构的大小累加起来,就是一个 TCP 连接占用的大小了。

ESTABLISH-tcp-count

这里直接给大家一个结论,一条处于 ESTABLISH 状态的 TCP 连接占用的大小是 3.44 KB(0.81K+2.19K+0.19K+0.25K)

也就是,每一条静止状态的 TCP 连接大约需要吃 3.44K 的内存。

那么 8 GB 物理内存的服务器,最大能支持的 TCP 连接数 = 8GB/3.44KB=2,438,956(约240万)

当然, 实际过程中的 TCP 连接,肯定不是静止状态的,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,并发很难达到百万级别。

总结

  • 一个服务端进程最多能支持多少条 TCP 连接?

如果在不考虑服务器的内存和文件句柄资源的情况下,理论上一个服务端进程最多能支持约为 2 的 48 次方(2^32 (ip数) * 2^16 (端口数),约等于两百多万亿!

但是在实际中是支持不了这个数值的,每个 TCP 连接都是一个文件,会占用文件句柄资源,也会占用一定的内存空间。

  • 一台服务器最大最多能支持多少条 TCP 连接?

一台服务器是可以有多个服务端进程的,每个服务端进程监听不同的端口,当然所有 65535 个端口你都可以用来监听一遍。

当然所有 65535 个端口你都可以用来监听一遍,这样理论上线就到了 2的32次方(ip数)×2的16次方(port数)×2的16次方(服务器port数)个,这个基本相当于无穷个了。

但是 Linux 每维护一条 TCP 连接都要花费内存资源的,每一条静止状态(不发送数据和不接收数据)的 TCP 连接大约需要吃 3.44K 的内存,那么 8 GB 物理内存的服务器,最大能支持的 TCP 连接数 = 8GB/3.44KB=2,438,956(约240万)。

实际过程中的 TCP 连接,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,并发很难达到百万级别。

完!你学废了吗?理想和现实的差距!

转载声明:

目录
相关文章
|
5月前
|
安全
基于Reactor模式的高性能服务器之Acceptor组件(处理连接)
本节介绍了对底层 Socket 进行封装的设计与实现,通过 `Socket` 类隐藏系统调用细节,提供简洁、安全、可读性强的接口。重点包括 `Socket` 类的核心作用(管理 `sockfd_`)、成员函数的功能(如绑定地址、监听、接受连接等),以及 `Acceptor` 组件的职责:监听连接、接收新客户端连接并分发给上层处理。同时说明了 `Acceptor` 与 `EventLoop` 和 `TcpServer` 的协作关系,并展示了其成员变量和关键函数的工作机制。
121 2
|
4月前
|
SQL Oracle 关系型数据库
【赵渝强老师】Oracle客户端与服务器端连接建立的过程
Oracle数据库采用客户端-服务器架构,客户端通过其网络环境与服务器通信,实现数据库访问。监听程序负责建立连接,通过命令lsnrctl可启动、停止及查看监听状态。本文介绍了监听器的作用及相关基础管理操作。
198 0
|
12月前
|
缓存 网络协议 Java
【JavaEE】——TCP回显服务器(万字长文超详细)
ServerSocket类,Socket类,PrintWriter缓冲区问题,Socket文件释放问题,多线程问题
|
12月前
|
存储 弹性计算 固态存储
阿里云服务器按月租用价格是多少,月付收费标准与活动价格参考
阿里云服务器月付租用价格是多少?阿里云服务器既可以月租也可以按年租用,按月可选的时长有1个月到10个月,通常选择较多的是1个月、3个月、6个月时长,目前按月租用价格有经济型e实例4核16G配置10M带宽100G ESSD Entry云盘,月租优惠价70元1个月、210元3个月,如果选择8核32G配置的月付优惠价是160元1个月、480元3个月。本文将详细介绍阿里云服务器的月付收费标准及当前活动价格,帮助您更好地了解在阿里云服务器月付租用价格情况。
|
IDE 网络安全 开发工具
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
本文介绍了如何在PyCharm专业版中连接远程服务器并配置远程Python环境解释器,以便在服务器上运行代码。
3940 0
IDE之pycharm:专业版本连接远程服务器代码,并配置远程python环境解释器(亲测OK)。
|
IDE 网络安全 开发工具
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
本文介绍了如何使用VS Code通过Remote-SSH插件连接远程服务器进行代码开发,并与PyCharm进行了对比。作者认为VS Code在连接和配置多个服务器时更为简单,推荐使用VS Code。文章详细说明了VS Code的安装、远程插件安装、SSH配置文件编写、服务器连接以及如何在连接后切换文件夹。此外,还提供了使用密钥进行免密登录的方法和解决权限问题的步骤。
5417 0
IDE之vscode:连接远程服务器代码(亲测OK),与pycharm链接服务器做对比(亲自使用过了),打开文件夹后切换文件夹。
|
网络协议 Java API
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
【网络】TCP回显服务器和客户端的构造,以及相关bug解决方法
220 2
|
Apache 数据中心 Windows
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
将网站迁移到阿里云Windows系统云服务器,访问该站点提示连接被拒绝,如何处理?
|
弹性计算 安全 Windows
通过远程桌面连接Windows服务器提示“由于协议错误,会话将被中断,请重新连接到远程计算机”错误怎么办?
通过远程桌面连接Windows服务器提示“由于协议错误,会话将被中断,请重新连接到远程计算机”错误怎么办?

热门文章

最新文章