在 Linux 网络编程中,backlog 与 连接(connection) 的关系,主要体现在 TCP 连接建立过程 和 内核队列管理 上。下面从概念、流程、参数和实际影响几个层面说明。
backlog 是 listen() 系统调用的参数:
int listen(int sockfd, int backlog);
它表示:内核为该 socket 维护的“未完成 + 已完成连接”队列的最大长度(历史含义),但现代 Linux 中含义有变化(见后文)。
TCP 建立连接是三次握手,内核为此维护两个队列:
SYN_RCVD/proc/sys/net/ipv4/tcp_max_syn_backlog
ESTABLISHEDSYNaccept() 取走连接➡️ backlog 决定全连接队列能“暂存”多少已完成连接
在 Linux 2.2+ 中:
实际队列长度 = min(backlog, somaxconn)
查看系统上限:
cat /proc/sys/net/core/somaxconn
默认值通常是:
✅ listen(1000) 但 somaxconn=128 → 实际 128
| 概念 | 含义 |
|---|---|
| backlog | 已完成但未 accept 的连接数上限 |
| 并发连接数 | 已 accept 且存活的连接总数 |
| fd 数量 | 进程能打开的最大 socket 数 |
➡️ backlog 不影响已 accept 的并发连接数量
listen(sock, 1024);
并确保:
sysctl -w net.core.somaxconn=1024
sysctl -w net.ipv4.tcp_max_syn_backlog=8192
sysctl -w net.ipv4.tcp_syncookies=1
backlog 控制的是“已完成但还没被应用程序接收的 TCP 连接”在内核中的最大排队数量,直接影响高并发下的连接成功率,而不是总并发连接数。
如果你愿意,我也可以画一张 TCP 握手 + 队列图,或结合 Nginx / Redis / 自写 server 讲具体数值。