Skip to content

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 万)。

基于 VitePress 重建