全连接 backlog(fully connected backlog) 通常指的是 TCP 全连接队列(accept queue),是 Linux 网络编程中一个非常核心的概念。
下面从是什么、为什么存在、怎么工作、如何查看和调优几个方面解释。
全连接 backlog 指的是 已完成 TCP 三次握手、但尚未被应用程序 accept() 取走的连接队列长度。
换句话说:
全连接 backlog = 已经建立完成、等待应用层接收的连接数量上限
它对应的是内核中的 accept queue。
Linux 内核在处理 TCP 连接时,有两个关键队列:
| 队列 | 名称 | 状态 | 对应 backlog |
|---|---|---|---|
| 半连接队列 | SYN queue | 收到 SYN,未完成三次握手 | net.ipv4.tcp_max_syn_backlog |
| 全连接队列 | Accept queue | 三次握手完成 | listen(fd, backlog) |
客户端 SYN
↓
服务器 SYN_RECV(半连接队列)
↓
客户端 ACK
↓
ESTABLISHED(全连接队列)
↓
应用调用 accept()
listen(fd, backlog);
这里的 backlog 不是精确值,最终生效的是:
min(backlog, net.core.somaxconn)
| 参数 | 含义 |
|---|---|
net.core.somaxconn |
全连接队列最大长度 |
net.ipv4.tcp_max_syn_backlog |
半连接队列最大长度 |
如果 全连接队列满了:
ssss -lnt
示例输出:
State Recv-Q Send-Q Local Address:Port
LISTEN 128 128 *:8080
含义:
| 字段 | 含义 |
|---|---|
| Recv-Q | 当前全连接队列中的连接数 |
| Send-Q | 全连接队列最大长度 |
✅ 如果 Recv-Q 经常接近 Send-Q,说明队列快满了
netstat -s | grep -i listen
关注:
listen queue overflows
数字持续增长 = 全连接队列溢出
listen(fd, 4096);
sysctl -w net.core.somaxconn=4096
永久生效:
echo "net.core.somaxconn=4096" >> /etc/sysctl.conf
sysctl -p
错,那是
tcp_max_syn_backlog
不是,过大会:
全连接队列会迅速被打满
全连接 backlog 是 TCP 中“已经握手完成、但还没被应用 accept 的连接队列长度”,它直接影响高并发场景下的连接成功率。
如果你愿意,我可以:
只要告诉我你的使用场景即可。