在 Linux 网络(尤其是 TCP 服务端编程)中,backlog 和连接数是两个密切相关但含义不同的概念。下面从原理、参数、区别和实际影响几个层面说明它们的关系。
指当前系统中存在的 TCP 连接数量,通常分为:
连接数上限受多种因素影响:
net.core.somaxconn)backlog 是 listen(sockfd, backlog) 中的参数,表示内核为该 socket 维护的“未完成 + 已完成”连接队列的长度上限(历史定义有变化)。
在 Linux 中,实际行为受两个队列控制:
net.ipv4.tcp_max_syn_backlog 影响min(backlog, net.core.somaxconn) 限制backlog 只限制“等待 accept 的连接数”,不限制总连接数
例如:
listen(sockfd, 128);
表示:
客户端发起 SYN
↓
SYN_RCVD(半连接队列)
↓
三次握手完成
↓
ESTABLISHED(全连接队列,等待 accept)
↓
accept() → 应用持有连接
如果:
实际全连接队列大小:
real_backlog = min(backlog, net.core.somaxconn)
示例:
# 系统默认
net.core.somaxconn = 4096
listen(sockfd, 50);
→ 实际队列上限 = 50
✅ 错误
并发连接数取决于:
✅ 不一定
✅ 主要影响服务端,但客户端会感知为:
net.core.somaxconn # 全连接队列上限
net.ipv4.tcp_max_syn_backlog # 半连接队列上限
net.ipv4.tcp_syncookies # SYN 溢出保护
查看:
sysctl -a | grep somaxconn
listen(fd, 1024);
同时设置:
net.core.somaxconn=1024
否则实际仍受 somaxconn 限制。
backlog 控制的是“已完成握手、等待被 accept 的连接上限”,而不是系统总连接数;真正的总连接能力由 fd、内存、应用处理速度和内核参数共同决定。
如果你愿意,我也可以结合 Nginx / Redis / 自写 socket 服务 给你具体分析。