概括来说有两个方面的原因
1.TCP两个队列满了(半链接和全链接队列),造成SYN报文被丢弃
2.开启了tcp_tw_recylce调优参数,并且在NAT环境下,造成了SYN报文丢弃
原因一分析
回忆一下三次握手:
1.服务端收到客户端发起的SYN请求后,内核会把该链接存储到半链接队列,并向客户端响应SYN+ACK。
2.接着客户端返回ACK, 服务端收到第三次握手的ACK后,内核会把链接从半链接队列移除
3.然后创建新的完全的链接,并将其添加到aceept队列(全链接队列),等待进程调用accept 函数时把链接取出来。
如果大量的syn数据包同时到达服务端,导致半连接队列瞬间被打满,多余的SYN就丢弃了(DDOS攻击),怎么解决?
(1)增大半链接队列
tcp_max_syn_backlog和backlog somaxconn,同时增大全链接队列
(2)开启tcp_syncookies
服务器更具当前状态计算出一个值,