linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?
这明显是进入了思维的误区,65535是指可用的端口总数,并不代表服务器同时只能接受65535个并发连接。
举个例子:
我们做了一个网站,绑定的是TCP的80端口,结果是所有访问这个网站的用户都是通过服务器的80端口访问,而不是其他端口。可见端口是可以复用的。
即使Linux服务器只在80端口侦听服务, 也允许有10万、100万个用户连接服务器。Linux系统不会限制连接数至于服务器能不能承受住这么多的连接,取决于服务器的硬件配置、软件架构及优化。
01
我们知道两个进程如果需要进行通讯最基本的一个前提是:能够唯一的标示一个进程。在本地进程通讯中我们可以使用PID来唯一标示一个进程,但PID只在本地唯一,网络中的两个进程PID冲突几率很大。
这时候就需要另辟它径了,IP地址可以唯一标示主机,而TCP层协议和端口号可以唯一标示主机的一个进程,这样可以利用IP地址+协议+端口号唯一标示网络中的一个进程。
能够唯一标示网络中的进程后,它们就可以利用socket进行通信了。socket(套接字)是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信。
socket源自Unix,是一种'打开—读/写—关闭'模式的实现,服务器和客户端各自维护一个'文件',在建立连接打开后,可以向自己文件写入内容供对方读取或者读取对方内容,通讯结束时关闭文件。
02
唯一能够确定一个连接有4个东西:
1. 服务器的IP
2. 服务器的Port
3. 客户端的IP
4. 客户端的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个端口决定的。服务器同时能够承受的并发数是由带宽、硬件、程序设计等多方面因素决定的。
所以也就能理解淘宝、腾讯、头条、百度、新浪、哔哔哔哔等为什么能够承受住每秒种几亿次的并发访问,是因为他们采用的是服务器集群。服务器集群分布在全国各地的大型机房,当访问量小的时候会关闭一些服务器,当访问量大的时候回不断的开启新的服务器。
以上个人浅见,欢迎批评指正。
认同我的看法,请点个赞再走,感谢!
喜欢我的,请关注我,再次感谢!