温馨提示×

什么是linux backlog队列

小樊
67
2026-09-08 10:20:24
栏目: 智能运维

在 Linux 网络编程和系统调优中,backlog 队列通常指的是 TCP 监听 socket 的连接请求队列,用于管理已完成连接和未完成连接的请求。它是服务端在接受客户端连接之前,内核临时保存连接请求的地方。

下面从概念、结构、参数和行为几个方面说明。


一、什么是 backlog

在服务器端调用:

listen(sockfd, backlog);

其中的 backlog 参数,就是连接队列长度提示值,表示内核应该为这个监听 socket 保留多少“等待被 accept”的连接。


二、backlog 队列的两种形态(经典模型)

历史上(尤其早期 Linux),backlog 涉及两个队列:

1. 半连接队列(SYN Queue)

  • 存放 已收到 SYN,但未完成三次握手 的连接
  • 状态:SYN_RECV
  • 受 /proc/sys/net/ipv4/tcp_max_syn_backlog 影响

2. 全连接队列(Accept Queue)

  • 存放 已完成三次握手,但还未被用户态 accept 的连接
  • 状态:ESTABLISHED
  • 受 listen(fd, backlog) 和内核限制共同影响
客户端 SYN
   ↓
[ 半连接队列 ]
   ↓ 三次握手完成
[ 全连接队列 ]
   ↓ accept()
应用程序

三、Linux 中 backlog 的实际含义

在 Linux 2.2+ 之后:

  • listen() 的 backlog 只表示全连接队列长度
  • 半连接队列由系统参数控制

实际队列长度计算

实际 backlog = min(backlog, /proc/sys/net/core/somaxconn)
  • somaxconn 默认通常是 128 或 4096(取决于发行版)
  • 所以即使你写 listen(fd, 1000),也可能被限制为 128

四、队列满了会怎样?

全连接队列满

  • 已完成三次握手的连接 无法进入 accept 队列
  • 客户端可能表现为:
    • 连接超时
    • 重传
    • connection refused(某些情况)

半连接队列满

  • 新 SYN 被丢弃或忽略
  • 可能触发 SYN Flood 防护

五、相关内核参数

# 全连接队列上限
/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);
  • 期望全连接队列:128
  • 实际受 somaxconn 限制

七、常见误区

❌ backlog 是“总连接数”
✅ 只是等待 accept 的队列长度

❌ backlog 越大越好
✅ 过大会消耗内核内存,且掩盖程序处理慢的问题


八、一句话总结

Linux 中的 backlog 队列,是监听 socket 在 accept 之前,用于缓存 已完成 TCP 三次握手连接 的内核队列,其长度受 listen(backlog) 和 somaxconn 共同限制。

如果你愿意,我也可以结合 Nginx / Redis / 高并发服务器 讲 backlog 的实战调优。

0 踩