在 Linux 网络编程和系统运维中,backlog 最常见的含义是:TCP 监听套接字(listen socket)的连接队列长度限制。下面按“什么场景会用到 / 碰到 backlog”来说明。
当你写一个 TCP 服务端,流程通常是:
socket()
bind()
listen(sockfd, backlog)
accept()
这里的 backlog 指的是:
已完成三次握手、但还没被 accept 的客户端连接,最多能排队多少个
listen(fd, 128);
表示最多允许 128 个“已连接但未被处理”的客户端排队。
防止:
如果 backlog 太小:
ECONNREFUSED在 Linux 2.2+ 中:
backlog = 已完成连接队列(accept queue)的最大长度
半连接队列(SYN queue)由:
net.ipv4.tcp_max_syn_backlog
控制。
所以 backlog 主要控制的是:
accept queue(全连接队列)
ss -lnt
看 Recv-Q 是否接近 Send-Q
或:
netstat -s | grep listen
看:
times the listen queue of a socket overflowed
# 半连接队列
net.ipv4.tcp_max_syn_backlog = 8192
# 全连接队列上限(会影响 listen backlog)
net.core.somaxconn = 65535
应用层:
listen(fd, 65535);
somaxconn 可能很小(如 128)只要你在 Linux 上写或运维“TCP 监听服务”,并且可能面对并发连接、重启重连、瞬时高峰,就需要关注 backlog。
如果你愿意,我可以: