在 Linux 网络编程里,backlog 主要和 TCP 监听 socket(listen()) 有关,用来控制等待被 accept 的连接队列长度。
当你写服务器程序时,通常会:
socket()
bind()
listen(sockfd, backlog)
accept()
listen() 的第二个参数 backlog 表示:
内核中,已经完成 TCP 三次握手、但还没被用户程序
accept()的连接,最多可以排队多少个
Linux 内核其实维护 两个队列:
accept()backlog 主要影响的是“全连接队列”长度(不同内核版本略有差异)
accept()ECONNREFUSED)常见误解:
❌ backlog = 最大同时连接数
✅ backlog = 等待 accept 的已完成连接数
真正能连多少客户端,取决于:
accept() 的速度在 Linux 中:
实际长度 = min(backlog, /proc/sys/net/core/somaxconn)
例如:
cat /proc/sys/net/core/somaxconn
128
你写:
listen(sockfd, 1000);
实际还是 128
修改方法:
sysctl -w net.core.somaxconn=1024
Connection refused| 场景 | 建议 |
|---|---|
| 普通服务 | 128–512 |
| 高并发 | 1024+ |
| Web 服务器 | 和 somaxconn 一致 |
Linux 的 backlog 用来限制“已经完成三次握手、但还没被 accept 的 TCP 连接”的排队数量,是保护服务器、控制连接节奏的重要参数。
如果你愿意,我也可以结合 源码 / ss 命令 / 压测示例 给你讲得更底层一点。