在 Linux 网络编程和系统调优中,backlog 队列通常指的是 TCP 监听 socket 的连接请求队列,用于管理已完成连接和未完成连接的请求。它是服务端在接受客户端连接之前,内核临时保存连接请求的地方。
下面从概念、结构、参数和行为几个方面说明。
在服务器端调用:
listen(sockfd, backlog);
其中的 backlog 参数,就是连接队列长度提示值,表示内核应该为这个监听 socket 保留多少“等待被 accept”的连接。
历史上(尤其早期 Linux),backlog 涉及两个队列:
SYN_RECV/proc/sys/net/ipv4/tcp_max_syn_backlog 影响ESTABLISHEDlisten(fd, backlog) 和内核限制共同影响客户端 SYN
↓
[ 半连接队列 ]
↓ 三次握手完成
[ 全连接队列 ]
↓ accept()
应用程序
listen() 的 backlog 只表示全连接队列长度实际 backlog = min(backlog, /proc/sys/net/core/somaxconn)
somaxconn 默认通常是 128 或 4096(取决于发行版)listen(fd, 1000),也可能被限制为 128connection refused(某些情况)# 全连接队列上限
/proc/sys/net/core/somaxconn
# 半连接队列上限
/proc/sys/net/ipv4/tcp_max_syn_backlog
# 是否启用 SYN Cookie
/proc/sys/net/ipv4/tcp_syncookies
int fd = socket(AF_INET, SOCK_STREAM, 0);
bind(fd, ...);
listen(fd, 128);
somaxconn 限制❌ backlog 是“总连接数”
✅ 只是等待 accept 的队列长度
❌ backlog 越大越好
✅ 过大会消耗内核内存,且掩盖程序处理慢的问题
Linux 中的 backlog 队列,是监听 socket 在
accept之前,用于缓存 已完成 TCP 三次握手连接 的内核队列,其长度受listen(backlog)和somaxconn共同限制。
如果你愿意,我也可以结合 Nginx / Redis / 高并发服务器 讲 backlog 的实战调优。