linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?

news2025/2/25 12:35:59

文章目录

  • 65535从哪来的,干啥的?
  • 最大并发tcp连接数是多少呢?
    • 如何标识一个TCP连接
    • client最大tcp连接数
    • server最大tcp连接数
    • 实际的tcp连接数
      • 01
      • 02
    • TCP怎么建立连接,与端口号是什么关系?
      • (1)Linux服务器只作为客户端
      • (2)Linux服务器只作为服务端

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连接数是多少呢?

在tcp应用中,server事先在某个固定端口监听,client主动发起连接,经过三次握手后建立tcp连接。那么对单机,其最大并发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系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。

01

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

这时候就需要另辟它径了,IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样可以利用IP地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了。socket(套接字)是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。在这里插入图片描述

02

唯一能够确定一个连接有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个端口决定的。服务器同时能够承受的并发数是由带宽、硬件、程序设计等多方面因素决定的。
所以也就能理解淘宝、腾讯、头条、百度、新浪、哔哔哔哔等为什么能够承受住每秒种几亿次的并发访问,是因为他们采用的是服务器集群。服务器集群分布在全国各地的大型机房,当访问量小的时候会关闭一些服务器,当访问量大的时候回不断的开启新的服务器。

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

Linux服务器在交互时,一般有两种身份:客户端或者服务器端。典型的交互场景是:
(1)服务器端主动创建监听的socket,并绑定对外服务端口port,然后开始监听
(2)客户端想跟服务器端通信时,就开始连接服务器的端口port
(3)服务端接受客户端的请求,然后再生成新的socket
(4)服务器和客户端在新的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的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【分享】订阅万里牛集简云连接器同步企业采购审批至万里牛系统

方案场景 面临着数字化转型的到来,不少公司希望实现业务自动化需求,公司内部将钉钉作为办公系统,万里牛作为ERP系统,两个系统之前的数据都储存在各自的后台,导致数据割裂,数据互不相通,人工手动…

springboot 自动注入源码分析spring.factories

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言 一、铂金手写starter组件,开源starter组件结构 1.项目层级 2. 各个项目引入关系 3.项目侧使用 二、星耀源码跟踪分析 1.SpringApplication.run开…

sHMIctrl智能屏幕使用记录

手上有个案子,“按压机器人”,功能是恒定一个力按下一定时间。 屏幕选型使用“sHMIctrl”,一下记录使用过程中遇到的问题以及解决方法。 目录 问题1:按键控件做定时触发,模拟运行时触发不了。 问题2:厂家…

数字IC设计工程师是做什么的?

随着我国半导体产业的发展,近几年的新入行的从业人员,除了微电子相关专业的,还有就是物理、机械、数学、计算机等专业,很多人对这一高薪行业充满了好奇,那么数字IC设计工程师到底是做什么的? 首先来看看数…

Vue3.x+Element Plus仿制Acro Design简洁模式分页器组件

Vue3.xElement Plus仿制Acro Design简洁模式分页器组件 开发中难免会遇到宽度很窄的列表需要使用分页器的情况,这时若使用Element Plus组件的分页器会导致分页器内容超出展示的区域,而Element Plus组件中目前没有Acro Design那样小巧的分页器&#xff08…

AWS 中文入门开发教学 43- Cloud9 - 云端集成开发环境(IDE)

知识点 Cloud9 - 云的集成开发环境(IDE)的基本介绍 官网 https://aws.amazon.com/cn/cloud9/ 功能 只需一个浏览器即可进行编码,无需配置各种开发环境实时共同编写代码,团队协作直接通过终端访问AWS资源迅速开始新项目无缝集成CodeSeries(Commit,Bu…

vscode报错Vetur can‘t find ‘tsconfig.json‘ or ‘jsconfig.json‘

文章目录问题描述解决办法方案一方案二方案三方案四问题描述 今天启动vscode的时候发现vetur插件需要更新,重新加载以后点击 .vue后缀的文件发现就会弹出如下报错,并且此时写代码没有代码提示!! 用提示快捷键一直显示正在加载… …

日日顺于贞超:供应链数字化要做到有数、有路、有人

在供应链行业里面,关于“数字化”的讨论绝对是一个经久不衰的话题。 但关于这个话题的讨论又时常让人觉得“隔靴搔痒”,因为数字化变革为非一日之功,对于企业来说意味着投入和牺牲。企业既怕不做怕将来被淘汰,又怕投入过高、不达预…

适合运动的无线蓝牙耳机有哪些,运动无线蓝牙耳机推荐

最为适合运动的无线蓝牙耳机还是骨传导耳机最为合适,骨传导耳机在运动当中使用不仅更加安全,在耳机的佩戴方式上也是十分舒适的,开放式的佩戴设计,即使是长时间运动使用也依旧能够保证耳道舒适、佩戴牢固,下面就分享几…

圆角矩形的绘制和曲线均匀化

摘要: 圆角矩形是软件 UI 等视觉设计中的常见表达,一种常见的绘制方法是将矩形的四角替换为与边相切的四分之一圆弧,然而这种绘制方式会在连接处产生视觉上的切折感,这是因为圆弧和直线的连接处只满足 G1G^1G1 连续性。本文探究了…

【刷题篇】链表(下)

前言🌸各位读者们好,本期我们来填填之前留下的坑,继续来讲解几道和链表相关的OJ题。但和上期单向链表不一样的是,我们今天的题目主要是于环形链表有关,下面让我们一起看看吧。💻本期的题目有:环…

vue3-element-admin搭建

vue3-element-admin 是基于 vue-element-admin 升级的 Vue3 Element Plus 版本的后台管理前端解决方案,是 有来技术团队 继 youlai-mall 全栈开源商城项目的又一开源力作功能清单技术栈清单技术栈 描述官网Vue3 渐进式 JavaScript 框架 https://v3.cn.vuejs.org/Ty…

IDEA 开发一个简单的 web service 项目,并打包部署到 Tomcat

文章目录实现的效果一、创建 web service 项目二、测试类运行 web service 服务端三、IDEA 打包 web service 项目四、web service 项目部署到 Tomcat五、web service 客户端总结实现的效果 通过 IDEA 创建一个简单的 web service 项目 用测试类运行这个 web service 项目 通…

软件测试面试-一线大厂必问的测试思维面试题

五、测试思维5.1 打电话功能怎么去测?我们会从几个方面去测试:界面、功能、兼容性、易用性、安全、性能、异常。1)界面我们会测试下是否跟界面原型图一致,考虑浏览器不同显示比例,屏幕分辨率。2)功能&#…

【Linux】环境变量,命令行参数,main函数三个参数保姆教学

目录 ☃️1.奇奇怪怪的现象和孤儿进程 ☃️2.环境变量 ☃️3.深刻理解main函数的前两个参数和命令行参数 ☃️1.奇奇怪怪的现象和孤儿进程 首先回顾一下之前我们学过的fork()创建子进程 fork(void)的返回值有两种 注意fork()头…

C#:Krypton控件使用方法详解(第八讲) ——kryptonBreadCrumb

今天介绍的Krypton控件中的kryptonBreadCrumb,下面开始介绍这个控件的属性:首先要介绍的是RootItem属性和外观属性:RootItem属性组中包含属性如下:image属性:代表在文字对象的前方插入一个图片,属性值如下图…

多元化业务布局全面开花,松井股份有望步入高成长正轨

2022年,宏观经济下行压力加大、疫情反复不断、国内消费需求不足等诸多因素,导致国内涂料行业遭遇“至暗时刻”,企查查平台数据显示,2022年1-10月,破产重整、注销拍卖的涂料企业超过700家。2月11日,国内涂料…

使用 PyTorch+LSTM 进行单变量时间序列预测(附完整源码)

时间序列是指在一段时间内发生的任何可量化的度量或事件。尽管这听起来微不足道,但几乎任何东西都可以被认为是时间序列。一个月里你每小时的平均心率,一年里一只股票的日收盘价,一年里某个城市每周发生的交通事故数。 在任何一段时间段内记…

代码随想录算法训练营第四天 | 链表理论基础、4. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

打卡第四天,因为科三前几天没有带电脑,现在重新补一下第四天的卡 今日任务 24. 两两交换链表中的节点19.删除链表的倒数第N个节点面试题 02.07. 链表相交142.环形链表II 24. 两两交换链表中的节点 给你一个链表,两两交换其中相邻的节点&#…

C++类和对象_02----对象模型和this指针

目录C对象模型和this指针1、成员变量和成员函数分开存储1.1、空类大小1.2、非空类大小1.3、结论2、this指针概念2.1、解决名称冲突2.2、在类的非静态成员函数中返回对象本身,可使用return *this2.3、拷贝构造函数返回值为引用的时候,可进行链式编程3、空…