服务器/OS:用 nstat 的 TcpExtListenOverflows、TcpExtListenDrops 和日志中的“Possible SYN flooding”警告确认服务器连接队列是否溢出;调大 somaxconn(与 listen 参数一起);启用 SYN Cookie。网络:放宽防火墙、DDoS 防护的 SYN 限制。
数值参考
Linux(包括 Android)的第一次 SYN 重传在 1 秒后。旧内核此后间隔每次翻倍,在第 1、3、7、15 秒……时重发,6.5 及以上版本则在 1、2、3、4、5 秒重发五次,之后再翻倍(7、11、19 秒……)(tcp_syn_linear_timeouts=4)。Android 手机即使升级了系统,往往还在用出厂时的内核,所以即使 Android 版本相同,不同机型也可能不一样。无论哪种,全部失败后约 2 分钟放弃。Windows 视版本和设置从 1 秒或 3 秒开始拉长,重发次数为 2~4 次,20~30 秒就放弃(该 PC 的值可用 netsh int tcp show global 的 Max SYN Retransmissions 查看)。
监控图上
开服/维护后激增 · 连接尝试数,连接队列溢出数
查看位置
看服务器 nstat 中的 TcpExtListenOverflows、TcpExtListenDrops 和 dmesg 中的“Possible SYN flooding on port”警告,用 ss -lnt 看监听 socket 的 Recv-Q(等待 accept 的连接数)是否达到 Send-Q(backlog 上限)。用服务器侧抓包确认 SYN 是否到达、是否回了 SYN-ACK
确认依据
维护结束后连接涌入时 TcpExtListenOverflows 增加,Recv-Q 紧贴 Send-Q。抓包中同一客户端的 SYN 以秒级间隔重复到来,服务器却不响应
排除依据
SYN 没到服务器,服务器计数器也不变,就是前端防火墙或 DDoS 防护丢弃了,看该设备的 SYN 限制和丢弃日志。服务器已回 SYN-ACK 而连接仍慢,就是回程方向丢包