慢速 HTTP 与 Web 套接字 - 资源利用率

Slow HTTP vs Web Sockets - Resource utilization

如果一堆 "Slow HTTP" 到服务器的连接会消耗如此多的资源以致导致拒绝服务,为什么一堆到服务器的网络套接字不会导致同样的问题?

a different SO question 的公认答案说保持空闲连接几乎是免费的。

如果维持开放的 TCP 连接不需要任何成本,为什么 "Slow HTTP" 会导致拒绝服务?

WebSocket 和"slow" HTTP 连接都使用开放式连接。不同之处在于对服务器设计的期望。

典型的 HTTP 服务器不需要处理大量打开的连接,并且是围绕打开的连接数很少的假设而设计的。如果服务器不能防止缓慢的客户端,那么攻击者可以强制围绕此假设设计的服务器达到资源限制。

这里有几个例子展示了不同的期望如何影响设计:

  • 如果您一次只有几个 HTTP 请求在运行,那么每个连接使用一个线程是可以的。对于 WebSocket 服务器来说,这不是一个好的设计。

  • 默认的文件描述符限制通常足以满足典型的 HTTP 场景,但不适用于大量连接。

可以设计一个 HTTP 服务器来处理大量打开的连接,并且多个服务器开箱即用。