如果到服务器的一堆"慢速HTTP"连接会消耗大量资源,从而导致拒绝服务,那么为什么到服务器的一群web套接字不会导致同样的问题呢?
另一个SO问题的公认答案是,保持空闲连接几乎是免费的。
如果维护开放的TCP连接不需要任何费用,为什么"慢速HTTP"会导致拒绝服务?
WebSocket和"慢速"HTTP连接都使用开放连接。不同之处在于对服务器设计的期望。
典型的HTTP服务器不需要处理大量的开放连接,并且是围绕开放连接数量较少的假设进行设计的。如果服务器不能抵御速度较慢的客户端,那么攻击者可以强制根据此假设设计的服务器达到资源限制。
以下是几个例子,展示了不同的期望如何影响设计:
-
如果一次只有几个HTTP请求在运行,那么每个连接使用一个线程是可以的。对于WebSocket服务器来说,这不是一个好的设计。
-
默认的文件描述符限制通常适用于典型的HTTP场景,但不适用于大量连接。
可以设计一个HTTP服务器来处理大量打开的连接,并且有几个服务器可以开箱即用。