关于问题linux 的 TCP 连接数量最大不能超过 65535 个吗,那服务器是如何应对百万千万的并发的?一共有 2 位热心网友为你解答:
【1】、来自网友【DeveloperPeer】的最佳回答:
首先你的理解是错误的,下面会一点一点分析。
TCP 连接数量为什么不能超过 65535?
65536 = 2^16-1,对应的两字节的长度,这里的两字节指的什么?
指的是 TCP 四元组(源 IP,源端口,目的 IP,目的端口)中的源端口,因为源端口是 2 字节,不论是 IPv4, 还是 IPv6, 端口长度都是 2 字节。
为什么不是目的端口那,因为目的端口,通常指的是服务器端监听的端口都是固定的,比如 http 的 80 端口,https 的 443 端口。
由此可见,这里的 65535 指的是客户端的同时最大 TCP,连接数量,那这 65535 的限制与服务器有什么关系那?一点关系也没有,是你理解错了。
服务器可以同时处理多少 TCP 连接那?
假设服务器只有一个端口(可以是多个)对外提供服务,那么根据四元组,理论上应该有 2^32 * 2 ^ 16 个连接,虽然 IP 数可能会少于 2^32,因为会有些保留地址,如果是 IPv6 地址,这里会更多;同样端口数也少于 2^16,因为有些保留端口,此外客户端上其他服务也会占用些端口(虽然几乎是用不尽的,同时用完了也会释放掉,可供重新使用)。
由此可见,理论上是几乎是一个天文数字,但是实际情形是每一个 TCP 连接,都会耗用服务器的资源,比如 CPU,内存等,因此这里的最大连接数会收到系统资源的限制。
【2】、来自网友【汇聚魔杖】的最佳回答:
这明显是进入了思维的误区,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 个端口决定的。服务器同时能够承受的并发数是由带宽、硬件、程序设计等多方面因素决定的。
所以也就能理解淘宝、腾讯、头条、百度、新浪、哔哔哔哔等为什么能够承受住每秒种几亿次的并发访问,是因为他们采用的是服务器集群。服务器集群分布在全国各地的大型机房,当访问量小的时候会关闭一些服务器,当访问量大的时候回不断的开启新的服务器。
以上个人浅见,欢迎批评指正。
认同我的看法,请点个赞再走,感谢!
喜欢我的,请关注我,再次感谢!