gpt4 book ai didi

java - 如何防止拒绝服务耗尽 Java 套接字服务器上的线程池?

转载 作者:搜寻专家 更新时间:2023-11-01 03:12:13 25 4
gpt4 key购买 nike

为了工作,我编写了一个专门的 HTTP 服务器,它只为网站执行 301/302/Frame 重定向。最近,一些恶意客户端故意打开套接字并每 500 毫秒写入一个字符,以破坏我的 TCP 套接字超时。然后他们无限期地保持套接字打开,并让多个客户端在分布式拒绝服务中做同样的事情。这最终会耗尽处理 TCP 连接的线程池。您将如何编写代码以使其不易受到此类不良行为的影响?这是我的套接字接受代码:

while (true) {
// Blocks while waiting for a new connection
log.debug("Blocking while waiting for a new connection.") ;
try {
Socket server = httpServer.accept() ;

// After receiving a new connection, set the SO_LINGER and SO_TIMEOUT options
server.setReuseAddress(true) ;
server.setSoTimeout(timeout) ;
server.setSoLinger(true, socketTimeout) ;

// Hand off the new socket connection to a worker thread
threadPool.execute(new Worker(cache, server, requests, geoIp)) ;
} catch (IOException e) {
log.error("Unable to accept socket connection.", e) ;
continue ;
}
}

timeout 和 socketTimeout 当前设置为 500 毫秒。

最佳答案

一段时间后开始关闭套接字。如果套接字保持打开状态的时间过长,只需将其关闭即可。您可以通过两种方式做到这一点:

您还可以限制客户向您发送请求所需的时间。如果他们不能维持一定水平的吞吐量,请关闭他们。当您的线程正在读取请求时,通过在开始时添加 System.currentTimeInMillis() 并与您在循环时的位置进行比较,这在您的读取循环中很容易做到。如果它漂移超过某个限制,它们将被关闭并丢弃。

这个想法的另一种想法可能不是拒绝它们,而是让您的线程返回到池中,而是将套接字放在堆栈上以供观察。让字节堆积起来,在它们达到一定大小后,您可以将它们传递给池中的线程进行处理。这是切断 em 的混合方法 vs. 也许它们不坏但很慢。

另一种处理方法是观察线程处理请求的时间,如果未在时限内完成,则关闭底层套接字。然后该线程将得到一个 SocketException 并且它可以关闭并清理。

这里有一些其他想法,主要涉及使用外部硬件,如防火墙、负载平衡器等。

https://security.stackexchange.com/questions/114/what-techniques-do-advanced-firewalls-use-to-protect-againt-dos-ddos/792#792

关于java - 如何防止拒绝服务耗尽 Java 套接字服务器上的线程池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734745/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com