温馨提示×

半连接backlog是什么

小樊
57
2026-07-18 07:54:45
栏目: 编程语言

半连接 backlog(半连接队列) 是 TCP 协议在 三次握手 过程中的一个重要概念,通常出现在 Linux 网络/性能/高并发 相关讨论中。


一、什么是半连接(SYN_RECV)?

TCP 建立连接需要三次握手:

  1. 客户端发送 SYN
  2. 服务端回复 SYN+ACK
  3. 客户端回复 ACK

第 1 步和第 2 步之间,服务端已经收到了客户端的 SYN,但连接还没完成,此时连接处于:

SYN_RECV

这个状态的连接就被称为 半连接(half-open connection)


二、半连接 backlog 是什么?

半连接 backlog 指的是:

内核用于存放「未完成三次握手的 TCP 连接」的队列长度上限

也就是说:

  • 当大量客户端同时发起连接(SYN 包)时
  • 内核暂时把这些 SYN_RECV 状态的连接 放进一个队列
  • 这个队列的最大长度,就是 半连接 backlog

如果队列满了,新的 SYN 包可能被:

  • 直接丢弃
  • 或触发 SYN Flood 防护机制

三、和“全连接队列”的区别(非常重要)

TCP 实际有两个队列:

队列 状态 含义
半连接队列 SYN_RECV 收到 SYN,但还没完成三次握手
全连接队列(accept queue) ESTABLISHED 三次握手完成,等待 accept()

对应关系:

客户端 SYN
   ↓
半连接队列(SYN_RECV)
   ↓
服务端 SYN+ACK
   ↓
客户端 ACK
   ↓
全连接队列(ESTABLISHED)
   ↓
应用程序 accept()

四、Linux 中半连接 backlog 如何控制?

1️⃣ 半连接队列大小由谁决定?

在 Linux 中,半连接队列大小不是直接配置一个参数,而是由以下因素共同决定:

  • net.ipv4.tcp_max_syn_backlog
  • listen() 调用时的 backlog 参数
  • 内存限制
  • 是否启用 SYN cookies

2️⃣ 关键参数

sysctl net.ipv4.tcp_max_syn_backlog

示例:

net.ipv4.tcp_max_syn_backlog = 8192

表示系统级半连接队列上限。

3️⃣ listen backlog 的影响

listen(fd, backlog);
  • backlog 主要影响 全连接队列
  • 但也会影响半连接队列的计算

五、SYN Flood 与半连接 backlog

SYN Flood 攻击 就是:

  • 攻击者大量发送 SYN
  • 不完成第三次握手
  • 占满半连接队列
  • 导致正常用户无法连接

Linux 的应对方式:

SYN Cookies(默认开启)

sysctl net.ipv4.tcp_syncookies

当半连接队列满时:

  • 不再存储半连接
  • 通过加密 cookie 验证第三次握手
  • 防止资源耗尽

六、如何查看半连接数量?

ss -s

或:

netstat -ant | grep SYN_RECV | wc -l

七、一句话总结

半连接 backlog 是 TCP 用来缓存“正在进行三次握手的连接”的队列大小,主要防止连接建立阶段的突发流量或 SYN Flood 攻击。

如果你愿意,我也可以:

  • 结合 源码/内核实现
  • 对比 Linux vs BSD
  • 或结合 高并发服务调优 给你实际参数建议

0