温馨提示×

linux backlog包含哪些

小樊
39
2026-09-20 17:22:21
栏目: 智能运维

在 Linux 网络编程中,backlog 通常出现在 listen() 系统调用里,用来描述等待被 accept 的已建立连接队列长度上限。不同内核版本中,backlog 实际包含的内容有所不同。


一、listen(sockfd, backlog) 中的 backlog 是什么

int listen(int sockfd, int backlog);

backlog 表示:内核为该 socket 维护的“未完成 + 已完成连接”队列的总长度上限(历史定义),但现代 Linux 已实现细分。


二、Linux 中 backlog 实际包含哪些队列

在 Linux 内核 2.2 以后,TCP 连接队列被拆分为两个:

1️⃣ 半连接队列(SYN Queue)

  • 存放状态为 SYN_RCVD 的连接
  • 对应收到的 SYN,但还没完成三次握手
  • 受以下参数影响:
    • net.ipv4.tcp_max_syn_backlog
    • tcp_syncookies

2️⃣ 全连接队列(Accept Queue)

  • 存放状态为 ESTABLISHED 但还没被 accept() 取走的连接
  • 这才是 backlog 主要控制的对象
  • 队列长度 = min(backlog, net.core.somaxconn)

三、backlog 实际包含什么(总结)

✅ 现代 Linux 中:

backlog ≈ 全连接队列(Accept Queue)的最大长度

❌ 不再直接等于:

SYN 队列 + Accept 队列

四、相关内核参数

参数 作用
net.core.somaxconn accept 队列上限(默认 128)
net.ipv4.tcp_max_syn_backlog SYN 队列上限
net.ipv4.tcp_syncookies SYN 溢出时启用 cookie

示例:

sysctl -w net.core.somaxconn=1024

五、常见误区

❌ 认为 backlog 越大越好
✅ 过大会消耗内存,且不能替代应用层处理能力

❌ 认为 backlog 包含 SYN 攻击连接
✅ SYN 队列受 tcp_max_syn_backlog 控制


六、一句话总结

Linux 中的 backlog 主要表示“已完成连接但未被 accept 的队列长度”,不包括 SYN 半连接。

如果你愿意,我也可以画一张 TCP 三次握手 + 队列示意图 或结合 Nginx / Redis / 高并发场景 讲。

0 踩