温馨提示×

什么是全连接backlog

小樊
56
2026-07-18 07:52:48
栏目: 编程语言

全连接 backlog(fully connected backlog) 通常指的是 TCP 全连接队列(accept queue),是 Linux 网络编程中一个非常核心的概念。

下面从是什么、为什么存在、怎么工作、如何查看和调优几个方面解释。


一、什么是全连接 backlog?

全连接 backlog 指的是 已完成 TCP 三次握手、但尚未被应用程序 accept() 取走的连接队列长度

换句话说:

全连接 backlog = 已经建立完成、等待应用层接收的连接数量上限

它对应的是内核中的 accept queue


二、TCP 连接的两个队列(重点)

Linux 内核在处理 TCP 连接时,有两个关键队列:

队列 名称 状态 对应 backlog
半连接队列 SYN queue 收到 SYN,未完成三次握手 net.ipv4.tcp_max_syn_backlog
全连接队列 Accept queue 三次握手完成 listen(fd, backlog)

连接建立流程

客户端 SYN
        ↓
服务器 SYN_RECV(半连接队列)
        ↓
客户端 ACK
        ↓
ESTABLISHED(全连接队列)
        ↓
应用调用 accept()

三、backlog 参数到底控制什么?

listen(fd, backlog);

这里的 backlog 不是精确值,最终生效的是:

min(backlog, net.core.somaxconn)

相关内核参数

参数 含义
net.core.somaxconn 全连接队列最大长度
net.ipv4.tcp_max_syn_backlog 半连接队列最大长度

四、全连接队列满了会发生什么?

如果 全连接队列满了

  • 新完成三次握手的连接 会被丢弃
  • 客户端可能表现为:
    • 连接超时
    • 偶尔成功、偶尔失败
  • 服务端可能:
    • 不报错
    • 但吞吐量上不去

五、如何查看全连接队列是否溢出?

1️⃣ 使用 ss

ss -lnt

示例输出:

State      Recv-Q Send-Q Local Address:Port
LISTEN     128    128    *:8080

含义:

字段 含义
Recv-Q 当前全连接队列中的连接数
Send-Q 全连接队列最大长度

如果 Recv-Q 经常接近 Send-Q,说明队列快满了


2️⃣ 查看溢出统计

netstat -s | grep -i listen

关注:

listen queue overflows

数字持续增长 = 全连接队列溢出


六、如何调优全连接 backlog?

✅ 应用层

listen(fd, 4096);

✅ 系统层

sysctl -w net.core.somaxconn=4096

永久生效:

echo "net.core.somaxconn=4096" >> /etc/sysctl.conf
sysctl -p

七、常见误区

❌ backlog 是半连接队列?

错,那是 tcp_max_syn_backlog

❌ backlog 越大越好?

不是,过大会:

  • 占用更多内核内存
  • 掩盖应用处理慢的问题

❌ accept 慢没关系?

全连接队列会迅速被打满


八、一句话总结

全连接 backlog 是 TCP 中“已经握手完成、但还没被应用 accept 的连接队列长度”,它直接影响高并发场景下的连接成功率。

如果你愿意,我可以:

  • 画一张 TCP 队列流程图
  • 结合 Nginx / Redis / Java / Go 的实际配置讲
  • 帮你分析 线上连接异常问题

只要告诉我你的使用场景即可。

0