核心是配平syn队列、accept队列与网卡收包能力:设tcp_max_syn_backlog=65535、somaxconn=65535、应用backlog≥65535;调大netdev_max_backlog至30000;启用tcp_syncookies=1并设tcp_abort_on_overflow=1。

强化服务器 TCP 连接队列保护,核心是防溢出、防攻击、防静默丢包。关键不在单点调大,而在 SYN 队列、accept 队列、网卡收包能力三者配平,并配合行为策略控制溢出响应。
同步调大两个核心队列上限
半连接队列(SYN Queue)和全连接队列(Accept Queue)必须等量放大,否则短板效应立现:
- net.ipv4.tcp_max_syn_backlog:设为 65535,直接提升未完成握手连接的容纳能力
- net.core.somaxconn:同样设为 65535,确保 accept 队列不被系统级限制截断
- 应用层 listen 的 backlog 参数(如 Nginx 的
listen 80 backlog=65535)必须≥上述值,否则实际生效仍取最小值
加固网卡与软中断承载力
队列再大,若网卡来不及把包送进内核协议栈,一样会丢包:
- net.core.netdev_max_backlog:建议设为 30000,避免高并发收包时软中断处理不过来而丢弃数据包
- 检查是否启用 RPS/RFS(Receive Packet Steering/Flow Steering),在多核场景下可显著分摊软中断压力
- 确认网卡驱动已加载并启用了多队列(RSS),避免单队列成为瓶颈
主动控制溢出行为,拒绝“假装在线”
默认 tcp_abort_on_overflow=0 会导致客户端超时重试,掩盖问题且拖慢故障发现:
- 将 net.ipv4.tcp_abort_on_overflow 设为 1,队列满时立即发 RST 给客户端,让错误快速暴露
- 搭配监控:用
netstat -s | grep -i "listen drops"或ss -s中的listen overflows计数,实时告警 - 注意:此设置需配合业务侧重试逻辑,避免因瞬时尖峰误杀合法请求
防御 SYN Flood 的兜底机制
即使队列调大,面对伪造源 IP 的洪泛攻击仍需纵深防护:
- 务必启用 net.ipv4.tcp_syncookies=1,在内存紧张或半队列满时自动启用 Cookie 验证,绕过队列存储
- 降低 net.ipv4.tcp_synack_retries 至 3(默认 5),缩短无效连接占用资源的时间
- 不依赖
tcp_tw_recycle(已在 4.12+ 内核移除),NAT 环境下它会引发连接异常











