1、基础概念

tcp四元组

所谓tcp连接是由一个四元组组成,如下所示:

本地ip地址+本地端口+远端ip地址+远端端口

一个设备不管是服务端还是客户端,所支持的最大tcp连接数,如果不考虑cpu及内存消耗,只和这四个因素有关;

单tcp连接占用内存

请参考如上连接描述,这里不再过多描述;

 

2、服务端支持最大多少tcp连接?

在不考虑服务端cpu和内存消耗情况下,一个服务端web程序,不论是netty、tomcat、jetty、undertow,还是其他语言其他框架的web应用,

其首先在四元组中有两个确定参数,即:本地主机ip+本地主机监听端口,

变化本分为:客户端ip地址,有多少个客户端就有多少个端口,因此这里可以理解为很大;

第二个参数是客户端发起端口,通常linux默认情况下单ip支持的端口是65536个,除去前1024个端口外,其他均可以作为客户端发起端口,因此这里的个数是6w以上;

总结下来:一个web应用,监听某个端口,在不考虑内存、cpu及linux文件数目限制的前提,其可以建立的web连接是可以很大的,具体大于多少?肯定大于百万,甚至千万。

3、客户端连接同一服务端web应用最大支持多少个tcp连接?

上两节已经提到,tcp连接是一个四元组,对于连接同一个服务端 的web,其远端ip及远端端口已经固定,唯一的变量是本地ip和本地端口,

通常情况下由于本地ip也是固定的,因此唯一的变量成为发起连接的端口号,由于一个ip linux最多支持65536个端口,其中前1024个端口保留,剩下来了6w多个端口,

也就是说,如果客户端连接最多支持向统一服务端web应用的统一端口建立6w多个连接。

当然这里也有几个注意事项:

  • 客户端连接同一服务端web应用的相同监听端口最大支持6w多个端口,这里的前提是linux调整tcp连接参数,默认情况下这个分配范围并不是1024-65536,这个值需要修改;
  • 客户端如果可以在发起连接的时候改变本地ip地址,每增加一个ip,其最大连接能力也因此增加6w多个,这里有许多做法,比如配置多网卡、配置子接口等等,请查看其他资料;
  • 微服务化日益流行的当下,通常使用nginx做反向代理,将请求hash到不同服务端,对于需要支持百万连接的服务,如果只有一个nginx不配置多个ip或者开启相关配置(这里nginx是否支持向同一服务端口以不同ip发起连接,本人并没有研究,有待确认),最多也就是支持像一个服务同时连接6w多个tcp连接;