半连接队列和SYN Flood攻击

三次握手前,服务端的状态从CLOSED变为LISTEN,同时在内部创建两个队列:半连接队列全连接队列,即SYN队列ACCEPT队列

半连接队列

当客户端发送SYN到服务端,服务端收到以后回复ACKSYN,状态由LISTEN变成SYN_RCVD,此时这个连接就被推入了SYN队列,也就是半连接队列

全连接队列

当客户端返回ACK,服务端接收后,三次握手完成。这个时候连接等待被具体的应用取走,在被取走之前,它会被推入另一个TCP维护的队列,也就是全连接队列

SYN Flood攻击原理

SYN Flood属于典型的DoS/DDoS攻击。其攻击的原理很简单,就是用客户端在短时间内伪造大量不存在的IP地址,并向服务端疯狂发送SYN。对于服务端而言,会产生两个危险的后果:

  • 处理大量的SYN包并返回对应的ACK,势必有大量连接处于SYN_RCVD状态,从而占满整个半连接队列,无法处理正常的请求
  • 由于是不存在的IP,服务端长时间收不到客户端的ACK,会导致服务端不断重发数据,知道耗尽服务端的资源

应对SYN Flood攻击

  1. 增加SYN连接,也就是增加半连接队列的容量
  2. 减少SYN + ACK重试次数,避免大量的超时重发
  3. 利用SYN Cookie技术,在服务端接收到SYN后不立即分配连接资源,而根据这个SYN计算出一个Cookie,连同第二次握手回复给客户端,在客户端回复ACK的时候带上这个Cookie值,服务端验证Cookie合法之后才分配连接资源

results matching ""

    No results matching ""