在 Linux 网络编程里,backlog 是一个经常让人困惑的概念,尤其在使用 listen() 函数时。下面从定义、历史演变、内核实现、实际影响几个层面帮你理清。
在 TCP 服务器中,典型流程是:
socket();
bind();
listen(sockfd, backlog);
accept();
listen() 的第二个参数 backlog,字面意思是“等待被处理的连接队列长度”,但不同 Linux 版本含义并不一样。
backlog = 已完成连接(ESTABLISHED)队列的最大长度
也就是说:
accept()Linux 将连接队列分成 两个队列:
SYN_RECV/proc/sys/net/ipv4/tcp_max_syn_backlog
ESTABLISHEDaccept()Linux 中:
max_qlen = min(backlog, somaxconn)
somaxconn 默认是 128listen(fd, 1000),实际可能是 128查看:
cat /proc/sys/net/core/somaxconn
修改:
sysctl -w net.core.somaxconn=1024
把 server 想成餐厅:
如果桌子坐满了,新客人只能站着或走人。
listen(fd, 5); // 太小
listen(fd, 1024);
并配合:
net.core.somaxconn = 1024
| 参数 | 作用 |
|---|---|
net.core.somaxconn |
全连接队列上限 |
net.ipv4.tcp_max_syn_backlog |
半连接队列上限 |
net.ipv4.tcp_syncookies |
防 SYN 泛洪 |
backlog in listen() |
用户态建议值 |
Linux 中的 backlog,本质是“已完成连接、等待 accept 的队列长度上限”,但真实长度受 somaxconn 限制。
如果你愿意,我也可以:
ss -lnt 实际看队列状态