TCP backlog 是 Linux(及类 Unix 系统)中,用于 TCP 连接建立过程中,控制“已完成握手”和“未完成握手”连接队列长度的一个参数。它直接影响服务端能同时接受多少新连接。
下面从原理到实践系统说明。
在这两个阶段,内核分别为连接维护两个队列:
| 队列 | 名称 | 保存的连接 |
|---|---|---|
| 半连接队列 | SYN queue | 收到 SYN,但未完成三次握手 |
| 全连接队列 | Accept queue | 三次握手完成,但尚未被 accept() |
backlog 是 应用层在调用 listen() 时,告诉内核:
“我最多能处理多少个已经完成三次握手的连接”。
int listen(int sockfd, int backlog);
✅ backlog 主要影响的是“全连接队列(Accept queue)”的大小
在 Linux 中,真实的全连接队列大小 不是 backlog 本身,而是:
min(backlog, net.core.somaxconn)
listen(fd, 128);
如果:
cat /proc/sys/net/core/somaxconn
# 输出 4096
那么实际队列大小 = 128
如果:
somaxconn = 64
那么实际队列大小 = 64
✅ backlog 是上限,somaxconn 是最终限制
半连接队列大小由以下参数控制(与 backlog 间接相关):
net.ipv4.tcp_max_syn_backlog
例如:
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
# 常见 256 / 512 / 2048
SYN flood 攻击时,这个队列非常关键。
⚠️ 服务看起来“卡住”或“拒绝连接”
| 场景 | backlog |
|---|---|
| 普通 Web 服务 | 128~512 |
| 高并发服务 | 1024~4096 |
| 网关 / 代理 | 4096 或更高 |
⚠️ 单纯加大 backlog 没用,还要同步调整内核参数
# 全连接队列上限
net.core.somaxconn
# 半连接队列上限
net.ipv4.tcp_max_syn_backlog
# SYN cookies(防 SYN flood)
net.ipv4.tcp_syncookies
net.core.somaxconn = 4096
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_syncookies = 1
实际全连接队列大小 = min(listen backlog, net.core.somaxconn)
TCP backlog 是应用层向内核声明的“已完成三次握手的连接最大等待数量”,
它主要受listen(backlog)和net.core.somaxconn共同限制。
如果你愿意,我可以:
只要告诉我你的使用场景即可。