网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
我们做了一个网站,绑定的是TCP的80端口,结果是所有访问这个网站的用户都是通过服务器的80端口访问,而不是其他端口。可见端口是可以复用的。即使Linux服务器只在80端口侦听服务, 也允许有10万、100万个用户连接服务器。Linux系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。
01
我们知道两个进程如果需要进行通讯最基本的一个前提是:能够唯一的标示一个进程。在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大。
这时候就需要另辟它径了,IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样可以利用IP地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了。socket(套接字)是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket源自Unix,是一种"打开—读/写—关闭"模式的实现,服务器和客户端各自维护一个"文件",在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
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没有关系。不管是Windows还是Linux,只要使用TCP/IP,那么单个IP地址连接相同互联网服务的TCP连接数,就不会超过65535个,甚至在一般情况下,我们认为不会超过4万个(注意,这里指相同互联网服务,即相同目的地址和端口)。
这个原因是因为,TCP/IP中,一个TCP连接,就要耗费源IP地址一个TCP端口,而TCP的端口数量也就是65535个,因为协议规定了TCP端口的长度也就是16位(二进制),所以换成十进制也就是1~65535.
这也就意味着,如果你的电脑要访问一个网站,那么你的电脑只能和这个网站建立65535个连接,一个连接消耗一个TCP端口。当然这是理想的情况,实际的情况是,有很多端口被一些知名的协议占据了,或者做了预留,例如80端口就属于HTTP的,所以一般认为能使用的端口就是4万个左右。
第二个错误是,TCP的端口数量和服务器没有关系。因为这里所说的4万个TCP的端口,是指源端口,也就是你访问网站时使用的个人电脑使用的端口,而对于目的端口,也就是网站的端口,使用的TCP端口也就是相同的23端口。这个意思也就意味着,4万个连接都连的是这个网站的23端口,换一个用户又可以用4万个连接连接服务器的23端口。
所以我们可以粗略估算一下,如果是100万个并发连接,在1个用户4万个访问的情况下,也就是25个并发的用户。当然,实际使用时,你的PC机不会有4万个连接访问相同的网站,假设我们按照一个PC机4个连接访问网站计算,100万个并发也就是25万个用户访问。
最后回答一下你的问题,服务器如何撑住百万千万个TCP连接呢?这个和服务器的资源有关。实际上单个服务器支持的TCP连接数的确是有限的,单个服务器所支持的TCP连接不可能到达理论值,服务连接一多,CPU撑不住内存也顶不住,所以每个服务器都有规格限制,硬件性能越强,服务器支持的TCP连接数越大。
但是一个网站可以有多个服务器啊,可以有集群服务器啊,服务器的规模越大,支持的访问能力就越强,所以这个也不是问题。
比如阿里巴巴是如何撑过双11的?阿里云在北上广深等很多地方都有服务器,而且每个地方的服务器都是弹性集群,这些服务器实时同步保障淘宝上的数据一致。所以双11访问淘宝时,有的访问的是北京的服务器,有的访问的是上海的服务器,这样通过分布式服务分布式的存储,网站可以应对的并发自然就很大了。
楼主所理解的65535(端口数量)与连接数是一个东西,这个是错的。具体原因前面已经有不少同行小伙伴描述的非常清楚了,我就不再阐述了。
下面我具体来回答一下楼主的后半部分:服务器是如何支撑百万并发的。
下面阐述的观点是:通过优化系统架构提升系统负载能力,即提高系统并发量。
一、什么是高并发
高并发是互联网系统所面临的普通问题,也是系统架构时考虑的重要因素之一。
【并发与负载】是相对的两个词。
想实现高并发,就要提高系统负载能力。系统负载能力强了,自然可以处理高并发请求。
所以,实现高并发,本质就是提高系统的负载能力。
一般对于系统负载能力的评估参数有:响应时间 、吞吐量、每秒请求数QPS、并发用户数。
响应时间:系统对请求做出响应的时间。例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间。
吞吐量:单位时间内处理的请求数量。
QPS:每秒响应请求数,与吞吐量概念类似。
并发用户数:同时使用系统功能的用户数量。
二、如何提高并发处理能力(并发数)
需要说明的是:以下内容不考虑【带宽】和【硬件配置】这两个因素。
很显然,带宽高、硬件配置高,系统负载能力就强,能处理的并发用户数就多。
那么如何提高并发处理能力呢?
答案就是:通过优化系统架构来提高并发处理能力。
并且系统架构设计是一个复杂的过程,不仅涉及到技术层面,还包括业务层面。
三、通过业务拆分提高并发处理能力(微服务架构)
将一个系统拆分为多个子系统,每个子系统负责一个单独的服务,这就是常说的【服务治理】
拆分为多个子系统后,每个子系统(服务)独立运行,每个服务之间通过REST/RPC方式调用,用户也可以直接调用这些服务接口。
这种设计将大化小,这种架构也称为【微服务架构】。
举例:商城系统中,可拆分为【订单服务】【用户服务】【产品服务】等多个服务接口。
四、通过水平扩展提高并发处理能力
1. 前端部分
使用nginx反向代理软件提高并发处理量
nginx进行水平扩展:DNS轮询等
2. 应用服务器部分
java中常见的应用服务器tomcat为例,它可以实现集群和负载均衡。集群配置成功后,相当于提供了一个“服务器池”,如果想要再提高处理能力,只需要向“池”中继续添加应用服务器即可。另外,集群也实现了系统高可用。
3. 数据库层面
常见的分库分表,读写分离都是解决数据库压力大的方法之一。
数据库瓶颈是系统在运行中最先碰到、最常碰到的问题之一。
经常见到的问题就是磁盘IO高,导致处理缓慢。
刚才所说方法都可以解决这一问题。
常见的分表原则有:按范围分,按哈希值分。
4. 缓存层面
在系统中添加缓存是当前必选的方案。
添加缓存的主要目标是减少磁盘IO。
可以缓存的内容很多,例如缓存页面内容(HTML,CSS,图片),缓存应用服务器中数据对象等。
通过设计多级缓存,实现数据的快速获取、请求的快速响应。
在分布式架构中,还要注意分布式缓存的更新一致性问题。(不再详述)
五、最后
其实很多系统的并发数都不到百万级,只有少量头部网站才会有,例如淘宝。
但我们之所以研究如何解决百万级并发架构,是从中学会和掌握【系统架构演变过程】。
最后的话
最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!
资料预览
给大家整理的视频资料:
给大家整理的电子书资料:
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
715818174082)]
给大家整理的电子书资料:
[外链图片转存中…(img-0OuVGlo6-1715818174082)]
如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!