在 Linux 网络编程和内核网络中,backlog 和 TCP 有紧密关系,主要体现在 TCP 连接建立过程(三次握手) 以及 内核中两个队列的管理 上。
下面从概念到内核实现逐步说明。
在 Linux 中,backlog 通常出现在:
listen(sockfd, backlog);
作用:
告诉内核,该 socket 能够容纳的“等待被 accept 的 TCP 连接”的最大数量(近似含义)。
但需要注意:
backlog 并不等于“最大并发连接数”,也不等于“已完成连接数 + 半连接数”的精确值。
TCP 建立连接的过程:
SYNSYN+ACK
ACK
Linux 内核为此维护了两个队列:
SYN_RCVDnet.ipv4.tcp_max_syn_backlogbacklog(间接)ESTABLISHEDlisten(backlog) 限制在 现代 Linux 内核(2.2+) 中:
min(backlog, somaxconn)
决定的是 全连接队列(Accept Queue)的最大长度。
somaxconn:cat /proc/sys/net/core/somaxconn
默认通常是 128 或 4096例如:
listen(sockfd, 1000);
如果 somaxconn = 128,实际队列长度 ≈ 128。
虽然 listen(backlog) 主要控制 全连接队列,但:
相关参数:
net.ipv4.tcp_max_syn_backlog
net.ipv4.tcp_syncookies
accept() 阻塞或无新连接tcp_syncookies:
❌ backlog 是最大连接数
✅ 它是 等待 accept 的已完成连接上限
❌ backlog 越大越好
✅ 太大可能占用内存、掩盖程序性能问题
❌ backlog 控制半连接
✅ 主要影响全连接队列
# 提高全连接队列上限
net.core.somaxconn = 4096
# 提高半连接队列
net.ipv4.tcp_max_syn_backlog = 8192
# 防止 SYN 攻击
net.ipv4.tcp_syncookies = 1
应用层:
listen(fd, 4096);
backlog 是 TCP 服务端在 accept 之前,内核为其预留的“已完成连接”的缓冲长度,是 TCP 三次握手后在 Linux 内核中的关键参数。
如果你愿意,我也可以画一张 TCP 队列 + backlog 的示意图,或者结合 Nginx / Redis / 自写 server 讲具体影响。