说说半连接队列和 SYN Flood 攻击的关系?

什么是半连接队列?

在TCP进行三次握手之前,服务端从CLOSED状态转变为LISTEN状态,并在内部创建了两个队列:半连接队列(SYN队列)和全连接队列(ACCEPT队列)。

半连接队列存放的是未完成三次握手的连接,而全连接队列存放的是已经完成三次握手的连接。

  • 在TCP三次握手中,客户端向服务端发送SYN报文,服务端接收后回复ACK和SYN,状态从LISTEN转变为SYN_RCVD,此时该连接被推入半连接队列(SYN队列)。
  • 当客户端回复ACK后,服务端接收到并完成三次握手。此时连接等待具体应用程序处理,在被处理之前,它会被推入全连接队列(ACCEPT队列)。

什么是SYN Flood?

SYN Flood是一种典型的DDoS(分布式拒绝服务)攻击,它在短时间内伪造不存在的IP地址,向服务器发送大量的SYN报文。当服务器回复SYN+ACK报文后,却不收到ACK回应报文,导致半连接队列(SYN队列)中的连接一直未被处理,最终占满了服务器的SYN接收队列(半连接队列),导致服务器无法为正常用户提供服务。

那么有什么应对方案呢?

主要有"syn cookie"和"SYN Proxy防火墙"等方案。

  • syn cookie:在收到SYN包后,服务器根据一定的方法,利用数据包的源地址、端口等信息计算出一个cookie值作为自己的SYN+ACK报文的序列号,并回复该报文。服务器在收到发送方的ACK包后,再次根据数据包的源地址、端口计算确认序列号是否正确。如果正确,则建立连接,否则丢弃该包。
  • SYN Proxy防火墙:服务器防火墙对收到的每个SYN报文进行代理和回应,并保持半连接状态。当接收到发送方的ACK包后,再次构造SYN报文发送到服务器,建立真正的TCP连接。这样可以有效防止SYN Flood攻击。

标签: java, Java面试题, Java问题合集, Java编程, Java问题精选, Java常见问题, 计算机网络, 计算机网络面试题