Linux TCP海量连接系统如何配置?

前言

Linux系统默认的tcp连接数是比Windows少很多的,服务端程序在Windows上成功接收大量设备连接,Linux却不行,就需要我们自己来手动配置;

1、查看ipv4端口范围

复制代码
cat /proc/sys/net/ipv4/ip_local_port_range

2、更改ipv4端口范围

复制代码
sudo sysctl -w net.ipv4.ip_local_port_range="1024 65535"

3、查看系统允许操作数

复制代码
ulimit -n

4、更改系统允许操作数(重中之中)

复制代码
ulimit -n 65535

提醒:可能在这一步操作之后,再启动服务端程序,海量设备连接就已经可以成功了,若设备过多,可将65535 改为 1000000...

永久更改:

复制代码
sudo vim /etc/security/limits.conf

复制下方:

限制root用户:

复制代码
root soft nofile 65535
root hard nofile 65535

允许所有用户:

复制代码
* soft nofile 65535
* hard nofile 65535

复制完成后,输入 :wq 保存并退出;

5、配置TCP监听、连接数等

配置路径:

复制代码
vim /etc/sysctl.conf

复制下方(可去除文字):

复制代码
fs.file-max = 2097152
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

复制之后,输入 :wq 保存并退出

6、结语讲解

  1. fs.file-max = 2097152
  • 含义 ‌:‌系统级最大文件句柄数‌。

  • 作用‌:限制整个操作系统所有进程可以打开的文件描述符(File Descriptor, FD)总数。在 Linux 中,TCP 连接、普通文件、Socket 等都视为文件描述符。

  • 为什么调大 ‌:默认值通常较小(如几万个)。在高并发场景下,如果系统总 FD 数达到上限,即使单个进程的 ulimit 足够,新连接也会因系统资源耗尽而被拒绝,表现为 Too many open files 或连接建立失败。

  • 数值解读‌:2097152 约等于 200 万,意味着系统同时最多能维持约 200 万个打开的文件或网络连接。

  1. net.core.somaxconn = 65535
  • 含义 ‌:‌**监听队列的最大长度(全连接队列)**‌。

  • 作用 ‌:定义了处于 ESTABLISHED 状态(即已完成三次握手,等待应用程序 accept() 取走)的 Socket 队列最大长度。

  • 为什么调大 ‌:默认值通常为 128。如果并发连接请求瞬间激增,而应用程序处理 accept 的速度跟不上,队列就会满。一旦队列满,新的已握手连接会被丢弃或重置,导致客户端连接超时或报错 Connection refused

  • 注意 ‌此值不应超过应用层 backlog 参数(如 Nginx 的 listen backlog 或 Java 的 backlog 参数)。

  1. net.ipv4.tcp_max_syn_backlog = 65535
  • 含义 ‌:‌半连接队列的最大长度‌。

  • 作用 ‌:定义了处于 SYN_RECV 状态(已收到客户端 SYN 包,发送了 SYN+ACK,等待客户端 ACK)的连接队列最大长度。这是 TCP 三次握手的中间状态。

  • 为什么调大‌:默认值通常为 1024 或 2048。在面对 SYN Flood 攻击或极高并发新建连接时,如果半连接队列满,内核会丢弃新的 SYN 包,导致客户端连接超时。增大此值可以容纳更多正在握手的连接。

  • 关联 ‌:通常建议此值与 somaxconn 保持一致或略大,以应对握手阶段的突发流量。

  1. net.core.netdev_max_backlog = 65535
  • 含义 ‌:‌网络设备接收队列的最大长度‌。

  • 作用‌:当网卡接收数据包的速度快于内核协议栈处理速度时,数据包会暂存于此队列中。如果队列满,新到达的数据包将被直接丢弃。

  • 为什么调大‌:默认值通常为 1000。在高带宽或高包率(PPS)场景下,内核软中断可能来不及处理所有数据包,导致丢包。增大此值可以作为缓冲区,吸收突发流量,减少因内核处理延迟导致的丢包。

  • 适用场景‌:特别适用于千兆/万兆网卡、高吞吐量的网关或负载均衡器。

  1. net.ipv4.tcp_syncookies = 1
  • 含义 ‌:‌启用 SYN Cookies 机制‌。

  • 作用 ‌:一种防御 SYN Flood 攻击的保护机制。当半连接队列(tcp_max_syn_backlog)满时,内核不再丢弃新的 SYN 包,而是通过一种特殊的算法(Cookie)生成初始序列号回应客户端,而不分配完整的 Socket 结构体内存。只有当客户端返回正确的 ACK 时,内核才分配资源建立连接。

  • 为什么开启‌:在不显著增加内存消耗的前提下,极大提高了服务器抵御 SYN Flood 攻击的能力,保证在极端压力下仍能为合法用户提供服务。

  1. net.ipv4.tcp_tw_reuse = 1
  • 含义 ‌:‌允许重用 TIME_WAIT 状态的 Socket‌。

  • 作用 ‌:默认情况下,TCP 连接关闭后会进入 TIME_WAIT 状态持续 60 秒(由 tcp_fin_timeout 或其他参数决定),期间该端口不能被复用。开启此选项后,如果新的连接请求使用的四元组(源IP、源端口、目的IP、目的端口)与处于 TIME_WAIT 状态的连接相同,内核允许直接复用该 Socket,跳过等待时间。

  • 为什么开启 ‌:对于作为‌客户端 ‌发起大量短连接 outbound 连接的服务器(如微服务调用、代理后端),可以快速回收端口资源,避免 Cannot assign requested address 错误。

  • 注意‌:在 NAT 环境下需谨慎使用,可能导致数据包混淆;但在大多数内部集群通信中是安全的且必要的。

  1. net.ipv4.tcp_fin_timeout = 30
  • 含义 ‌:‌FIN-WAIT-2 状态的超时时间‌。

  • 作用 ‌:定义了当本地主动关闭连接并收到对方的 FIN 包后,进入 FIN-WAIT-2 状态的保持时间。默认值通常为 60 秒。

  • 为什么调小‌:将其从 60 秒降低到 30 秒(甚至更低,如 15 秒),可以加速无效连接的清理过程,释放内核内存和文件描述符资源。这对于高并发短连接场景非常有效,能更快地回收系统资源。