在 Linux 网络编程中,backlog 通常出现在 listen() 系统调用里,用来描述等待被 accept 的已建立连接队列长度上限。不同内核版本中,backlog 实际包含的内容有所不同。
listen(sockfd, backlog) 中的 backlog 是什么int listen(int sockfd, int backlog);
backlog 表示:内核为该 socket 维护的“未完成 + 已完成连接”队列的总长度上限(历史定义),但现代 Linux 已实现细分。
在 Linux 内核 2.2 以后,TCP 连接队列被拆分为两个:
SYN,但还没完成三次握手net.ipv4.tcp_max_syn_backlogtcp_syncookiesaccept() 取走的连接min(backlog, net.core.somaxconn)✅ 现代 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 / 高并发场景 讲。