0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一台服务器,最大支持的TCP连接数是多少?

小林coding 来源:小林coding 2024-01-19 18:16 次阅读

大家好,我是小林。

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

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

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

很多同学第一反应就是端口的限制,端口号最多是 65536个,那就最多只能支持 65536 条 TCP 连接。

实际上这是不对的!

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

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

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

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

structinet_sock{
...
__u32daddr;//IPv4的目标地址。
__u16dport;//目标端口。
__u32saddr;//源地址。
__u16sport;//源端口。
...
};

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

6ee88d74-b6a5-11ee-8b88-92fbcf53809c.png

TCP 四元组

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

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

6efcd57c-b6a5-11ee-8b88-92fbcf53809c.png

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

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

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

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

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

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

6f00b48a-b6a5-11ee-8b88-92fbcf53809c.png

对 IPv4,客户端的 IP 数最多为 2 的 32 次方,客户端的端口数最多为 2 的 16 次方。

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

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

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

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

系统级:当前系统可打开的最大数量,通过 cat /proc/sys/fs/file-max 查看;

用户级:指定用户可打开的最大数量,通过 cat /etc/security/limits.conf 查看;

进程级:单个进程可打开的最大数量,通过 cat /proc/sys/fs/nr_open 查看;

内存限制,每个 TCP 连接都要占用一定内存,操作系统的内存是有限的,如果内存资源被占满后,会发生 OOM。

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

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

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

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

6f05e95a-b6a5-11ee-8b88-92fbcf53809c.png

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

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

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

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

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

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

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

6f09bf44-b6a5-11ee-8b88-92fbcf53809c.png

TCP对象内存开销总结

也就是,每一条静止状态的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 连接,还会进行发送数据和接收数据了,那么这些过程还是会额外消耗更多的内存资源的,并发很难达到百万级别。







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10992

    浏览量

    206744
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1272

    浏览量

    78305

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

文章出处:【微信号:小林coding,微信公众号:小林coding】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何标识一个TCP连接

    tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三路握手后建立tcp连接。那么对单机,其最大并发
    的头像 发表于 10-10 10:33 2406次阅读

    服务器超出了连接范围的解决方法

    服务器超出了连接范围的解决方法终端服务器超出了最大允许连接解决方法使用远程桌面链接登录到终端服务器
    发表于 01-06 22:59

    LABVIEW连接数据库如何处理并发竞争问题?

    各位大神,我现在有多台电脑使用LABVIEW的Database Connectivity工具包访问同一台服务器的ACCESS数据库,有时会出现某台电脑连接数据库后,报错提示数据库被锁定无法向数据库中
    发表于 12-20 14:21

    为什么STM32 LWIP服务器模式无法重复连接

    问题是这样的,我使用LWIP建立了服务器,然后我设置这个服务器只能让个客户端连接进来,设置如下tc
    发表于 11-03 19:26

    为什么STM32 lwip的服务器模式无法重复连接

    问题是这样的,我使用LWIP建立了服务器,然后我设置这个服务器只能让个客户端连接进来,设置如下tc
    发表于 11-05 03:42

    Linux的TCP Server最大连接数是多少

    无论是Linux还是Windows作为服务器都可以支持众多的Client的长连接,例如我实验的在单I7 4790+8G内存的机器上搭建的服务器
    发表于 05-17 23:30

    怎样把设计的library移动到另一台服务器上去?

    在完成设计之后,想把设计的library移动到另一台服务器。直接copy过去,设计相关的工艺库的信息怎么处理啊?在设计之前,会做attach工艺库的动作。对于完整的设计,这个要怎么attach工艺库呢?
    发表于 06-24 06:44

    TCP服务器创建过程

    用过正点原子LWIP服务器例程开发的朋友可能知道,例程的设计是只支持个客户端连接的,但实际应用中往往需要用到多客户端连接。下面是在正点原子
    发表于 08-24 08:03

    ESPxxx UDP最大连接数是多少

    大家好。新手提问:各种文档都提到个ESP的最大连接数是4个。我猜这个限制是由于协议栈实现(?)。它是否也适用于无连接的 UDP 协议?谢谢你!
    发表于 02-21 09:05

    如何将整个POST参数字符串传递到另一台服务器

    正在发送“X=nnn&Y=nnn&Z=nnn”,并希望将其原封不动地传递给另一台服务器
    发表于 02-27 06:18

    有没有人有多个LWIP客户端通过个端口连接一台服务器的示例?

    有没有人有多个客户端通过个端口连接一台服务器的示例?这样做的最佳做法是什么?
    发表于 03-02 08:17

    如何使用tcp连接自己搭建的服务器

    大家好,我想使用tcp连接自己搭建的服务器 这个服务器不是本地local的IP4而是有域名的,类似espslr.*****.com,端口是8591 我使用examples\protoc
    发表于 03-07 06:58

    一台Linux服务器最多能支撑多少个TCP连接

    量,还是内存大小,亦或者是可创建文件句柄数量?让我们一起来了解下吧。 困惑很多人的并发问题 在网络开发中,我发现有很多同学对一个基础问题始终是没有彻底搞明白。那就是一台服务器最大究竟能支持多少个网络
    的头像 发表于 12-29 11:13 4964次阅读

    台服务器支持TCP并发连接数

    的文件数量有关系,通过端口复用及调整服务器参数等手段,单台服务器支持TCP并发连接数是可以高于65535的。
    的头像 发表于 11-06 19:36 1186次阅读

    一台服务器最大能建立多少条TCP连接呢?

    我们知道在Linux中一切皆文件,那么一台服务器最大能打开多少个文件呢?Linux上能打开的最大文件数量受三个参数影响
    的头像 发表于 02-03 10:11 1393次阅读