单台机器和客户端的连接数量上限是多少?

单台机器和客户端的连接数量上限是多少?

经常看到很多错误的言论:”由于单台机器和客户端的连接数量有限(比如小于 2^16=65536,xxxx“ 等等

为什么他们会觉得限制在于服务器的端口数量?这种言论在知乎等等平台上多的可怕。
理论上 server 的一个 port 就能同时连接上亿的 socket 连接吧!

socket 连接需要一个四元组: (server ip, server port, client ip, clinet port),对于想 nginx 这样的服务器来说,前两者固定,后两者随意。

尤其是现在流行微服务,服务之间经常需要用 HTTP 相互调用,这个时候 65000 的限制可能会在高并发下称为瓶颈。

不考虑硬件瓶颈,比如什么内存不够


回答:

TCP 协议格式里,源端口和目的端口均占用2字节,假设一个主机只有1个IP地址。1个TCP连接由四元组(serverip, serverport, clientip, clientport)确定,分两种情况讨论:

  1. 对一个服务端而言,它在服务器中只占用1个端口,也就是他监听的端口。不管来多少连接,serverip和serverport都是不变的,而 (clientip, clientport) 组合是每个连接都不一样的,因此理论上每个服务端可以容纳 \( 2^{(4+2)\times 8}\) 个连接。在linux系统中,连接数量还受到文件描述符数量限制。
  2. 对于客户端而言,如果要创建多个连接,连接同一个服务端,serverip、serverport和clientip是固定的,而 clientport 是每个连接都不一样的。因此理论上每个主机最多可以创建 \( 2^{16} \) 个指向同一个服务端的TCP连接。在linux系统中,连接数量也受到文件描述符数量限制,还受到内核参数 =net.ipv4.ip_local_port_range= 的限制。

你提到的 nginx 是个 HTTP 反向代理软件,它作为服务端开放端口接收连接,同时作为客户端去连接上游。如果上游只有1个的话,它作为客户端的那一边很可能会受到 \( 2^{16} \) 的限制。


回答:

需要考虑到一个连接涉及几方面:

  1. 一个连接需要一个结构去描述,这个结构本身是要占用内存的;
  2. OS 需要维护这些结构,例如在 Linux 下连接也是文件,而系统允许的同时打开的文件描述符数量是有限制的;

更多的内容可以看看这个讨论.


回答:

“单台机器和客户端的连接数量有限"这句话本身应该是正确的,不过具体是多少,可能是不同的。

需要区分 连接数,和 单位时间服务客户端的数量( 或者 处理并发请求能力 或 处理每秒请求数 )这些个概念并不完全等同。
虽然二者有一定正相关性,但意义不同,也不是完全的正相关。这在性能压力测试中也能体现出来。


回答:

可以看一下这个链接

以上是 单台机器和客户端的连接数量上限是多少? 的全部内容, 来源链接: utcz.com/p/938273.html

回到顶部