P48 一台服务器最多能建立多少个 TCP 连接
面试题:一台 Linux 服务器理论上最多能建立多少个 TCP 连接?
1. 先说结论
没有固定上限。TCP 连接数受多个资源共同约束,对服务端来说,连接数上限 = 受 文件描述符(fd)数、端口数、内存 等共同决定,实践中单机几十万~几百万连接都是可以做到的。
2. 资源约束逐个分析
① 文件描述符(最关键)
每个 TCP 连接都是一个 socket,占用一个 fd:
bash
ulimit -n # 单进程 fd 上限
fs.file-max # 系统级 fd 上限默认 1024,生产要调大(如 65535、百万级)。
② 端口数(对客户端是限制)
发起连接的客户端受本地端口限制:
bash
sysctl net.ipv4.ip_local_port_range # 默认 32768~60999,约 2.8 万个端口- 客户端向同一目标 IP:PORT 连接,本地端口不够就建不了更多(约 2.8 万);
- 但服务端监听一个端口可以接受海量连接(连接由四元组区分),不受 65535 限制。
③ 内存
每个连接有收发缓冲区(tcp_rmem/tcp_wmem,默认几十 KB),百万连接 × 几十 KB = 几十 GB 内存,内存是实际瓶颈。
④ 其他
- TIME_WAIT 数量(
tcp_tw_reuse等)影响新建连接; - CPU 中断处理、网络带宽、
somaxconn等。
3. 四元组决定连接唯一性
text
源 IP + 源端口 + 目的 IP + 目的端口服务端 (IP:80) 与不同客户端建连,每个连接四元组不同,所以单端口可支撑海量连接。
4. 面试答法(C10K/C1000K)
- 经典问题演进:C10K(1 万连接)→ C1000K(百万连接);
- 能支撑多少的关键:
- IO 模型:BIO 一连接一线程撑不了多少;NIO(epoll)+ 事件驱动(Netty)才能支撑十万/百万连接;
- 调大 fd 和内存参数;
- 减少每连接内存开销。
5. 加分点
- 区分"客户端连接数"(受本地端口 ~2.8 万限制)和"服务端连接数"(受 fd/内存限制);
- 长连接场景连接数高、并发活跃连接低;
- 性能瓶颈通常不是"建多少连接",而是活跃连接的处理能力和内存。
一句话总结
服务端 TCP 连接数没有固定上限,实际受文件描述符、内存、端口、IO 模型约束;BIO 撑不了几万,调大 fd + 用 epoll/Netty 等 NIO 事件驱动,单机支撑百万连接可行;客户端则受本地端口范围限制(约 2.8 万)。