【Linux】单机可建立的最大TCP连接数
- 背景
- 介绍
- 环境
- 客户端
- 服务端
- 总结
背景
本文内容大多基于网上其他参考文章及资料整理后所得,并非原创,目的是为了需要时方便查看。
介绍
本文介绍Linux单机作为客户端或服务端时可建立的最大TCP连接数。
环境
分类 | 名称 | 版本 |
---|---|---|
操作系统 | Linux | Ubuntu 22.04.3 LTS |
客户端
Linux作为客户端时,可建立的最大TCP连接数量受内核参数 net.ipv4.ip_local_port_range
限制,net.ipv4.ip_local_port_range
是可配置的,最大理论范围是 0 ~ 65535
。
可以通过命令 sysctl -a | grep ip_local_port_range
命令查看机器端口数量配置。
net.ipv4.ip_local_port_range = 15000 65000
基于以上结果计算出剩余 50000
(65000 - 15000)个端口可供TCP连接使用。
此限制仅限于单个IP,当机器存在多个网卡,或可以配置多个IP(如K8S)时,最大连接数理论是:
net.ipv4.ip_local_port_range限制的值 * IP数量
服务端
一个TCP连接由一个TCP四元组组成,TCP四元组由TCP协议中唯一标识一个TCP连接的四个参数组成,分别是:
- 源IP地址
- 源端口号
- 目标IP地址
- 目标端口号
对于服务器来说,可用于建立TCP连接的IP和端口号是固定的(即 目标IP地址 和 目标端口号 固定),因此可建立的TCP连接数量取决于 源IP地址 和 源端口号 数量的限制。IPv4地址数量理论最大值为 2^32
(2
的32
次方),源端口号数量理论最大值为2^16
(2
的16
次方),所以理论最大连接数 = 2^32
* 2^16
。
最大连接数除受以上限制外,还受内存大小限制,每个TCP连接都会消耗内存,通常一个静态TCP连接(不发送数据)占用内存是 3.1K
~ 3.5K
,所以Linux单机作为服务端可建立的最大连接数 = Linux单机内存 ÷ 单条TCP连接占用内存
,以单机内存 8G
、单条TCP连接占用内存 3.1K
为例,最大连接数:8 * 1024 * 1024 ÷ 3.1 ≈ 270万
。如果TCP连接有数据发送,则还需要为每个TCP连接分配发送缓冲区,缓冲区大小受 net.ipv4.tcp_wmem
配置影响,默认情况下最小是 4K
。
总结
注意:本文基于IPv4场景。