前言
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、结语讲解
fs.file-max = 2097152
-
含义 :系统级最大文件句柄数。
-
作用:限制整个操作系统所有进程可以打开的文件描述符(File Descriptor, FD)总数。在 Linux 中,TCP 连接、普通文件、Socket 等都视为文件描述符。
-
为什么调大 :默认值通常较小(如几万个)。在高并发场景下,如果系统总 FD 数达到上限,即使单个进程的
ulimit足够,新连接也会因系统资源耗尽而被拒绝,表现为Too many open files或连接建立失败。 -
数值解读:2097152 约等于 200 万,意味着系统同时最多能维持约 200 万个打开的文件或网络连接。
net.core.somaxconn = 65535
-
含义 :**监听队列的最大长度(全连接队列)**。
-
作用 :定义了处于
ESTABLISHED状态(即已完成三次握手,等待应用程序accept()取走)的 Socket 队列最大长度。 -
为什么调大 :默认值通常为 128。如果并发连接请求瞬间激增,而应用程序处理
accept的速度跟不上,队列就会满。一旦队列满,新的已握手连接会被丢弃或重置,导致客户端连接超时或报错Connection refused。 -
注意 此值不应超过应用层 backlog 参数(如 Nginx 的
listen backlog或 Java 的backlog参数)。
net.ipv4.tcp_max_syn_backlog = 65535
-
含义 :半连接队列的最大长度。
-
作用 :定义了处于
SYN_RECV状态(已收到客户端 SYN 包,发送了 SYN+ACK,等待客户端 ACK)的连接队列最大长度。这是 TCP 三次握手的中间状态。 -
为什么调大:默认值通常为 1024 或 2048。在面对 SYN Flood 攻击或极高并发新建连接时,如果半连接队列满,内核会丢弃新的 SYN 包,导致客户端连接超时。增大此值可以容纳更多正在握手的连接。
-
关联 :通常建议此值与
somaxconn保持一致或略大,以应对握手阶段的突发流量。
net.core.netdev_max_backlog = 65535
-
含义 :网络设备接收队列的最大长度。
-
作用:当网卡接收数据包的速度快于内核协议栈处理速度时,数据包会暂存于此队列中。如果队列满,新到达的数据包将被直接丢弃。
-
为什么调大:默认值通常为 1000。在高带宽或高包率(PPS)场景下,内核软中断可能来不及处理所有数据包,导致丢包。增大此值可以作为缓冲区,吸收突发流量,减少因内核处理延迟导致的丢包。
-
适用场景:特别适用于千兆/万兆网卡、高吞吐量的网关或负载均衡器。
net.ipv4.tcp_syncookies = 1
-
含义 :启用 SYN Cookies 机制。
-
作用 :一种防御 SYN Flood 攻击的保护机制。当半连接队列(
tcp_max_syn_backlog)满时,内核不再丢弃新的 SYN 包,而是通过一种特殊的算法(Cookie)生成初始序列号回应客户端,而不分配完整的 Socket 结构体内存。只有当客户端返回正确的 ACK 时,内核才分配资源建立连接。 -
为什么开启:在不显著增加内存消耗的前提下,极大提高了服务器抵御 SYN Flood 攻击的能力,保证在极端压力下仍能为合法用户提供服务。
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 环境下需谨慎使用,可能导致数据包混淆;但在大多数内部集群通信中是安全的且必要的。
net.ipv4.tcp_fin_timeout = 30
-
含义 :FIN-WAIT-2 状态的超时时间。
-
作用 :定义了当本地主动关闭连接并收到对方的 FIN 包后,进入
FIN-WAIT-2状态的保持时间。默认值通常为 60 秒。 -
为什么调小:将其从 60 秒降低到 30 秒(甚至更低,如 15 秒),可以加速无效连接的清理过程,释放内核内存和文件描述符资源。这对于高并发短连接场景非常有效,能更快地回收系统资源。