⼀台服务器最⼤可以⽀撑多少条TCP连接

在⽹络开发中,我发现有很多同学对⼀个基础问题始终是没有彻底搞明⽩。那就是⼀台服务器最⼤究竟能⽀持多少个⽹络连接?我想我有必要单独发⼀篇⽂章来好好说⼀下这个问题。
很多同学看到这个问题的第⼀反应是65535。原因是:“听说端⼝号最多有65535个,那⻓连接就最多保持65535个了”。是这样的吗?还有的⼈说:“应该受TCP连接⾥四元组的空间⼤⼩限制,算起来是200多万亿个!”

如果你对这个问题也是理解的不够彻底,那么今天讲个故事讲给你听!

一次关于服务器端并发的聊天

在这里插入图片描述
“TCP连接四元组是源IP地址、源端⼝、⽬的IP地址和⽬的端⼝。任意⼀个元素发⽣了改变,那么就代表的是⼀条完全不同的连接了。拿我的Nginx举例,它的端⼝是固定使⽤80。另外我的IP也是固定的,这样⽬的IP地址、⽬的端⼝都是固定的。剩下源IP地址、源端⼝是可变的。所以理论上我的Nginx上最多可以建⽴2的32次⽅(ip数)×2的16次⽅(port数)个连接。这是两百多万亿的⼀个⼤数字!!”
在这里插入图片描述
“进程每打开⼀个⽂件(linux下⼀切皆⽂件,包括socket),都会消耗⼀定的内存资源。如果有不怀好⼼的⼈启动⼀个进程来⽆限的创建和打开新的⽂件,会让服务器崩溃。所以linux系统出于安全⻆度的考虑,在多个位置都限制了可打开的⽂件描述符的数量,包括系统级、⽤户级、进程级。这三个限制的含义和修改⽅式如下:”

  • 系统级:当前系统可打开的最⼤数量,通过fs.file-max参数可修改
  • ⽤户级:指定⽤户可打开的最⼤数量,修改/etc/security/limits.conf
  • 进程级:单个进程可打开的最⼤数量,通过fs.nr_open参数可修改

在这里插入图片描述
“我的接收缓存区⼤⼩是可以配置的,通过sysctl命令就可以查看。”

$ sysctl -a | grep rmem
net.ipv4.tcp_rmem = 4096 87380 8388608
net.core.rmem_default = 212992
net.core.rmem_max = 8388608

“其中在tcp_rmem"中的第⼀个值是为你们的TCP连接所需分配的最少字节数。该值默认是4K,最⼤的话8MB之多。也就是说你们有数据发送的时候我需要⾄少为对应的socket再分配4K内存,甚⾄可能更⼤。”
在这里插入图片描述
"TCP分配发送缓存区的⼤⼩受参数net.ipv4.tcp_wmem配置影响。

$ sysctl -a | grep wmem
net.ipv4.tcp_wmem = 4096 65536 8388608
net.core.wmem_default = 212992
net.core.wmem_max = 8388608

“在net.ipv4.tcp_wmem"中的第⼀个值是发送缓存区的最⼩值,默认也是4K。当然了如果数据很⼤的话,该缓存区实际分配的也会⽐默认值⼤。”

在这里插入图片描述

[推荐一个零声学院免费公开课程,个人觉得老师讲得不错,分享给大家:Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,点击立即学习:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值