【问题标题】:In http2, if the client ignores the server's settings frame, what should the server do?在http2中,如果客户端忽略了服务端的设置框,那么服务端应该怎么做呢?
【发布时间】:2020-01-02 23:56:34
【问题描述】:

当有很多连接时,我们想通过设置框架中的SETTINGS_HEADER_TABLE_SIZE来减小动态表的大小。如果客户端忽略设置帧,并且不发送带有ack flag的设置帧,服务器会使用默认值(4096 字节)吗?如果是这样,客户端可以发送许多请求收到服务器设置帧后的 4096 个八位字节动态表。这可能会导致服务器的内存使用过多。如何避免这种情况?

【问题讨论】:

    标签: http2


    【解决方案1】:

    客户端must 迅速应用设置并发送回设置确认,这不是可选的。来自客户端的任何其他行为都是不合规的,在这些情况下,服务器可以关闭连接。对于客户端在没有确认设置的情况下停留太久的特定情况,服务器可以使用 GoAway 帧关闭连接,原因为 SETTINGS_TIMEOUT。

    另一件事是 HPACK 动态表对于 HTTP/2 连接是“全局的”。因此,攻击者真正滥用默认大小的唯一方法是打开许多不同的连接,而不是在同一个连接上发出许多请求。在我看来,您总是希望限制来自单个 IP 地址的连接数,否则攻击者甚至不需要僵尸网络来对您的服务器执行 DDOS 攻击。

    将动态表的大小减少到 4096 字节以下可能会增加标头流量,并且可能会适得其反。

    【讨论】:

    • 真的非常感谢!我的错。我没有注意 SETTINGS_TIMEOUT。你的建议真的很有帮助。
    • 其实我只是想在我的服务器上做一个测试,看看哪个是瓶颈,内存或CPU,当有很多连接并且每个连接上都有很多请求(流)时。我的服务器是 NGINX-1.9.7,但是它没有实现设置确认逻辑。现在我需要实现它,并制定一个指令来设置动态表大小,而不是只使用默认值。
    • 您可以使用来自 Moto Ishizawa 的工具 h2spec 来检查 NginX HTTP/2 实现的程度。您也可以尝试Shimmercat,如果您有任何问题,我会与您一起解决。您打算如何为您的设置生成负载?你在 JMeter 中配置了 http/2 吗?
    • 真的很好!我没有在JMeter中配置http/2,需要深入了解。非常感谢您的建议和善意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-26
    • 1970-01-01
    • 2021-02-04
    • 2012-09-22
    • 1970-01-01
    • 2012-05-26
    • 2020-08-30
    相关资源
    最近更新 更多