linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的
问题有一个概念上的误解,错误的把TCP端口号的上限65535理解成了TCP连接数的上限,进而认为Linux无法实现超过65,535个的并发任务,实际上端口号数量和TCP连接数确实有关联,但并非一一对应的关系。
65,535从哪来的,干啥的?
要解释好这个问题,就要先说清楚65,535的含义。
在Linux系统中,如果两个机器要通信,那么相互之间需要建立TCP连接,为了让双方互相认识,Linux系统用一个四元组来唯一标识一个TCP连接: {local ip, local port, remote ip, remote port},即本机IP、本机端口、远程IP、远程端口,IP和端口就相当于小区地址和门牌号,只有拿到这些信息,通信的双方才能互相认知。在Linux系统中,表示端口号(port)的变量占16位,这就决定了端口号最多有2的16次方个,即65,536个,另外端口0有特殊含义不给使用,这样每个服务器最多就有65,535个端口可用。因此,65,535代表Linux系统支持的TCP端口号数量,在TCP建立连接时会使用。
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连接数跟65,535没有一一对应关系,事实上,真正影响TCP连接数量的,是服务器的内存以及允许单一进程同时打开文件的数量,因为每创建一个TCP连接都要创建一个socket句柄,每个socket句柄都占用一部分系统内存,当系统内存被占用殆尽,允许的TCP并发连接数也就到了上限。一般来讲,通过增加服务器内存、修改最大文件描述符个数等,可以做到单台服务器支持10万+的TCP并发。
当然,在真实的商用场景下,单台服务器都会编入分布式集群,通过负载均衡算法动态的调度不同用户的请求给最空闲的服务器,如果服务器平均内存使用超过80%的警戒线,那么就会及时采用限流或者扩展集群的方式来保证服务,绝对不会出现服务器的内存被耗尽的情况,那样就算事故了。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论