半连接 backlog(半连接队列) 是 TCP 协议在 三次握手 过程中的一个重要概念,通常出现在 Linux 网络/性能/高并发 相关讨论中。
TCP 建立连接需要三次握手:
SYNSYN+ACKACK在 第 1 步和第 2 步之间,服务端已经收到了客户端的 SYN,但连接还没完成,此时连接处于:
SYN_RECV
这个状态的连接就被称为 半连接(half-open connection)。
半连接 backlog 指的是:
内核用于存放「未完成三次握手的 TCP 连接」的队列长度上限
也就是说:
如果队列满了,新的 SYN 包可能被:
TCP 实际有两个队列:
| 队列 | 状态 | 含义 |
|---|---|---|
| 半连接队列 | SYN_RECV | 收到 SYN,但还没完成三次握手 |
| 全连接队列(accept queue) | ESTABLISHED | 三次握手完成,等待 accept() |
对应关系:
客户端 SYN
↓
半连接队列(SYN_RECV)
↓
服务端 SYN+ACK
↓
客户端 ACK
↓
全连接队列(ESTABLISHED)
↓
应用程序 accept()
在 Linux 中,半连接队列大小不是直接配置一个参数,而是由以下因素共同决定:
net.ipv4.tcp_max_syn_backloglisten() 调用时的 backlog 参数sysctl net.ipv4.tcp_max_syn_backlog
示例:
net.ipv4.tcp_max_syn_backlog = 8192
表示系统级半连接队列上限。
listen(fd, backlog);
backlog 主要影响 全连接队列SYN Flood 攻击 就是:
Linux 的应对方式:
✅ SYN Cookies(默认开启)
sysctl net.ipv4.tcp_syncookies
当半连接队列满时:
ss -s
或:
netstat -ant | grep SYN_RECV | wc -l
半连接 backlog 是 TCP 用来缓存“正在进行三次握手的连接”的队列大小,主要防止连接建立阶段的突发流量或 SYN Flood 攻击。
如果你愿意,我也可以: