【发布时间】:2020-01-02 23:56:34
【问题描述】:
当有很多连接时,我们想通过设置框架中的SETTINGS_HEADER_TABLE_SIZE来减小动态表的大小。如果客户端忽略设置帧,并且不发送带有ack flag的设置帧,服务器会使用默认值(4096 字节)吗?如果是这样,客户端可以发送许多请求收到服务器设置帧后的 4096 个八位字节动态表。这可能会导致服务器的内存使用过多。如何避免这种情况?
【问题讨论】:
标签: http2
当有很多连接时,我们想通过设置框架中的SETTINGS_HEADER_TABLE_SIZE来减小动态表的大小。如果客户端忽略设置帧,并且不发送带有ack flag的设置帧,服务器会使用默认值(4096 字节)吗?如果是这样,客户端可以发送许多请求收到服务器设置帧后的 4096 个八位字节动态表。这可能会导致服务器的内存使用过多。如何避免这种情况?
【问题讨论】:
标签: http2
客户端must 迅速应用设置并发送回设置确认,这不是可选的。来自客户端的任何其他行为都是不合规的,在这些情况下,服务器可以关闭连接。对于客户端在没有确认设置的情况下停留太久的特定情况,服务器可以使用 GoAway 帧关闭连接,原因为 SETTINGS_TIMEOUT。
另一件事是 HPACK 动态表对于 HTTP/2 连接是“全局的”。因此,攻击者真正滥用默认大小的唯一方法是打开许多不同的连接,而不是在同一个连接上发出许多请求。在我看来,您总是希望限制来自单个 IP 地址的连接数,否则攻击者甚至不需要僵尸网络来对您的服务器执行 DDOS 攻击。
将动态表的大小减少到 4096 字节以下可能会增加标头流量,并且可能会适得其反。
【讨论】: