在 Linux 网络(尤其是 TCP 服务端编程)中,backlog 和连接数是两个密切相关但含义不同的概念。下面从原理到实际关系给你讲清楚。
指当前系统中存在的 TCP 连接数量,通常分为:
backlog 是 listen(sockfd, backlog) 中的参数,表示内核为该 socket 维护的“等待被 accept 的连接队列”长度上限。
但要注意:
backlog 不是“最大连接数”
TCP 连接建立分两步队列(Linux 内核实现):
/proc/sys/net/ipv4/tcp_max_syn_backlog
控制min(backlog, /proc/sys/net/core/somaxconn)
决定✅ backlog 实际影响的是“全连接队列”长度
backlog 限制的是“已建立但未被 accept 的连接数”,而不是总连接数
客户端
|
| SYN
v
[半连接队列]
|
| ACK
v
[全连接队列] <-- backlog 限制这里
|
| accept()
v
应用程序
假设:
somaxconn = 128listen(sock, 50)那么:
如果:
accept() 很慢那么:
真正的“最大连接数”受以下影响:
| 项目 | 说明 |
|---|---|
| 文件描述符限制 | ulimit -n |
| 内存 | 每个连接占用内核内存 |
| somaxconn | accept 队列上限 |
| tcp_max_syn_backlog | 半连接上限 |
| 应用处理能力 | accept + 业务处理速度 |
❌ backlog = 最大连接数
✅ backlog = 已建立但未被 accept 的队列长度
❌ 调大 backlog 就能支持更多并发
✅ 还要应用能及时 accept
❌ SYN 攻击只和 backlog 有关
✅ 还和 tcp_max_syn_backlog、tcp_syncookies 有关
# 提高 accept 队列
echo 1024 > /proc/sys/net/core/somaxconn
# 提高半连接队列
echo 8192 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# 防止 SYN 洪水
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
代码中:
listen(sock, 1024);
如果你愿意,我也可以:
直接说场景就行。