在 Linux 网络编程和系统管理中,backlog 通常出现在 TCP 监听 socket 的上下文中,最典型的是 listen() 系统调用里的参数。
int listen(int sockfd, int backlog);
backlog 表示:
内核为该监听 socket 维护的 “已完成连接(ESTABLISHED)” 队列长度上限(历史上也包含半连接队列,现代内核已细分)
简单说:
connect() 成功accept()流程示意:
客户端 connect
↓
TCP 三次握手完成
↓
进入 accept 队列(长度受 backlog 限制)
↓
服务端 accept()
如果:
现代 Linux 中:
/proc/sys/net/ipv4/tcp_max_syn_backlog 控制min(backlog, somaxconn) 控制实际 backlog = min(backlog, net.core.somaxconn)
查看:
cat /proc/sys/net/core/somaxconn
常见默认值:
| 队列类型 | 含义 | 控制参数 |
|---|---|---|
| SYN 队列 | 收到 SYN,未完成握手 | tcp_max_syn_backlog |
| Accept 队列 | 握手完成,等 accept | backlog + somaxconn |
connection timeoutconnection resetaccept() 来不及消费listen(fd, 1024);
并确保:
sysctl -w net.core.somaxconn=65535
somaxconntcp_max_syn_backlogtcp_tw_reuse❌ backlog 是“最大并发连接数”
✅ 不是,只是 等待 accept 的队列长度
❌ backlog 越大越好
✅ 太大无意义,内存和调度有成本
Linux 中的 backlog 决定了:在应用程序调用 accept 之前,内核最多能缓存多少个已经建立完成的 TCP 连接。
如果你愿意,我也可以结合 Nginx / Java / Go / C 的实际代码示例来讲。