HTML教程8:混淆概念:端口数和连接数
有人提出了疑问:linux的TCP连接数量最大不能超过65535个吗,那服务器是如何应对百万千万的并发的?
这是理解是有误的。65535这个最大值指的是你作为客户端去连别人,而你作为服务器,别人来连你,理论上是没有限制的。注意,仅仅理论上。
65535是怎么来的?是TCP协议规定的端口字段的最大范围,2个字节,16比特,每一比特有0和1两种状态,按照排列组合,2的16次方,一共就是65536,端口0预留不用,就是65535。
客户端每发起一次TCP连接,要消耗一个端口,并独占该端口,最大只能同时发起65535个TCP连接,实际上65535这个最大值只是TCP协议的规定,操作系统还有限制呢,发起主动连接前1024个端口号(0-1023)都不给用,真实最大只有64512个。
说完客户端再说服务端。服务端一般都监听某一个端口,比如80的web端口,比如22的ssh端口,比如3306的mysql端口,都是在被动等待别人来连,所以没有限制。
你如果真要算最大值也能算。TCP连接的唯一性靠四元组,源目的IP,源目的端口,假设服务端只有一个IP,开了一个端口,相当于把两个固定了,另两个的范围一个是0.0.0.0-255.255.255.255,一个是0-65535,一乘就是最大连接数。其实按照比特数最好算,2的32次方乘上个2的16次方,作为服务端最大连接数就是2的48次方。有意义吗?没有意义!
前面为什么又说是理论上无限制呢,因为最大的限制不在TCP连接数上,而在硬件上,主要是CPU和内存,一个连接占几k内存。一个市面上现在普通的物理服务器,最大也就十几万并发连接吧。题主所述服务器如何应对百万千万的并发,现在没什么好办法,其实就是堆服务器,一台十万,十台百万,百台千万……我们给这一堆服务器一个高大上的名字“集群”。