Linux TCP Link

Posted by Will on April 15, 2019

“walk beside you ”

前言

回舟不待月,归去越王家。 李白 《子夜吴歌 夏歌》


正文

单台服务器最大支持多少链接数?

首先先了解下如何标识一个链接,操作系统是通过一个四元组来标识一个TCP链接:{本地ip,本地port,远程ip,远程port} 这四个要素唯一确定一个TCP链接,任意一个要素不相同,就认为是一个不同的链接。 然后再分客户端、服务端 两个角色来说。

客户端

当一台机器作为客户端的时候,究竟能支持多少个TCP连接? 客户端每发起新链接就会占用一个端口,而服务器端口数只有6万多个(0-65535;16位无符号整数)扣除系统保留端口,我们能用的大概6万4千多 上面说过确定一个链接的4要素,我们发现可以修改客户端ip来突破端口数量的限制, 所以我们可以再其他网卡上绑定新的ip 所以客户端能发起的连接数是 N*64000 ; N 绑定的IP数

服务端

对于服务器来说,不用关心可用端口数。所以在 服务端IP和端口是固定的情况下。 Tcp连接4元组中只有客户端 ip 和客户端 port 是可变的。它可能建立的最大的连接数是2的32次方(ip数)×2的16次方(port数)。这是2.8*10的14次方的一个大数字,两百万亿。

但是Linux每维护一条TCP连接都要花费资源。处理连接请求,保活,数据的收发时需要消耗一些CPU,维持TCP连接主要消耗内存。 一条TCP连接如果不发送数据的话,消耗内存是3.3K左右。 假设你只保持连接不发送数据,那么你服务器可以建立的连接最大数量 = 你的内存/3.3K。 假如是4GB的内存,那么大约可接受的TCP连接数量是100万左右。

最后

  • TCP连接的客户端机:每一个ip可建立的TCP连接理论受限于ip_local_port_range参数,也受限于65535。但可以通过配置多ip的方式来加大自己的建立连接的能力
  • TCP连接的服务器机:每一个监听的端口虽然理论值很大,但这个数字没有实际意义。最大并发数取决你的内存大小,每一条静止状态的TCP连接大约需要吃3.3K的内存