背景:
- IP 地址是一个 32 位的整数,所以源 IP 最大有 2 的 32 次方即4294967296。
- 端口是一个 16 位的整数,所以端口的数量就是 2 的 16 次方即65536。
- 2 的 32 次方(ip数)× 2的 16 次方(port数)大约等于两百多万亿。所以理论上,我们每个 server 可以接收的连接上限就是两百多万亿。(不过每条 TCP 连接都会消耗服务器内存,实践中绝不可能达到这个理论数字。)
结论:无论服务器还是客户端,单机支撑100W以上的连接都可以。
先要明白一个概念,一台服务器可以做为客户端和服务端,是相对而言的。既然如此,我们分开看。
客户端
客户端理论最大并发数:
- 一般系统1024以下端口都是保留的,可以使用的一般是64K
情况1:
这个 64 k 的端口号实际上说的是一个 ip 下的可用端口号数量。而一台 Linux 机器上是可以配置多个 IP 的。假如配置了 20 个 IP,那这样一台客户端机就可以发起 120 万多个 TCP 连接了。
情况2:
再退一步讲,假定一台 Linux 上确实只有一个 IP,那它就只能发起 64 k 条连接了吗? 其实也不是的。
根据四元组的理论,只要服务器的 IP 或者端口不一样,即使客户端的 IP 和端口是一样的。这个四元组也是属于一条完全不同的新连接。
比如下面的两条连接里,虽然客户端的 IP 和端口完全一样,但由于服务器侧的端口不同,所以仍然是两条不同的连接。
- 连接1:客户端IP 10000 服务器IP 10000
- 连接2:客户端IP 10000 服务器IP 20000
结论:
所以一台客户端机器理论并发最大数是一个比服务器的两百万亿更大的一个天文数字(因为四元组里每一个元素都能变)。
检查Linux可用端口参考这篇文章
服务端
对于服务器来说,最大支持的并发连接是多少呢?就有人开始说了:“服务器端理论也是端口限制吗?”。假设如果受影响的话,那我们的mysql服务器只监听了一个80端口。那Nginx只能接受一个TCP连接?这明显是太荒唐了。因为一个客户端有多个端口,根据四元组,参考下面结论。
服务端理论最大并发数:
- 2 的 32 次方(ip数)× 2的 16 次方(port数)大约等于两百多万亿。(四元组)
不过理想和实际总是会有差距的,因为Linux每维护一条TCP连接都要花费资源。处理连接请求,保活,数据的收发时需要消耗一些CPU,维持TCP连接主要消耗内存。所以能连接多少得看服务器内存。
结论:一条TCP连接如果不发送数据的话,消耗内存是3.3K左右,非静态根据传输数据大小而变化。
参考: