为了工作,我编写了一个专门的 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 毫秒。