HTTP / 2请求标头压缩

时间:2016-08-26 15:04:24

标签: http2 spdy

由于我不是专家,因此我对HTTP / 2有一般性问题。

众所周知,HTTP2会压缩标头以减少邮件大小。这仅适用于响应还是请求?如果进行一个小型实验并运行两个小型HTTP服务器,一个使用1.1版,另一个使用版本2,让两者发送完全相同的内容,然后在Firefox中请求两个页面,我可以看到响应头大小明显小于HTTP / 2版本。但是,请求标头大小几乎相同。根据我的理解,这是有道理的,因为浏览器事先不知道,服务器是否支持HTTP / 2,因此无法预先压缩标头。我对吗?如果是这样,有没有办法“强制”客户端使用HTTP / 2(客户端我不是指brwoser,而是一个程序员)并且还压缩请求标头?

另一个问题:如果我想在负载下对HTTP / 1.1与HTTP / 2性能进行基准测试,那么有用的测试设置会是什么样的,哪些参数会有所不同以及测量哪些指标是有意义的(RTT, TTFB,...?)

1 个答案:

答案 0 :(得分:4)

启动连接时,您需要协商协议。在知道要发送的格式之前,客户端需要知道它是否在谈论HTTP / 1.1,HTTP / 2或其他内容。对于HTTPS连接,这由使用ALPN的TLS连接协商处理。

也可以在HTTP / 1.1上启动第一个(或更多)请求,然后在稍后阶段升级到HTTP / 2。这是通过HTTP / 1.1连接上的服务器广告h2支持来处理的,方法是在响应中发送Upgrade: h2(用于HTTPS)或Upgrade: h2c(用于HTTP)HTTP标头,然后客户端可以选择升级。这对于最初没有TLS协商的HTTP连接更有用,因此客户端可能会假设HTTP / 1.1。但是,所有的Web浏览器都声明它们不支持HTTP / 2(HTTP)(h2c),并且只支持HTTPS(h2)。老实说,我想不出为什么HTTPS连接会在HTTP / 1.1中启动然后升级到HTTP / 2 - 而不是从get go开始作为HTTP / 2,但理论上它是可能的。

您可以点击此链接查看升级标头的示例: https://securityheaders.io/?q=https%3A%2F%2Fwww.tunetheweb.com&followRedirects=on 注意我只使用securityheaders.io网站作为显示HTTP标头的快捷方式。从理论上讲,您可以通过浏览器直接访问https://www.tunetheweb.com并查看响应标头来查看相同内容,但这很可能是通过HTTP / 2完成的,因此不会有标头。另请注意,这是一个可选的标头,并非所有HTTP / 2服务器都发送它(Apache确实如此,NGINX没有) - 可能是因为它不像上面讨论的那样对HTTPS有用。

了解压缩如何在HTTP / 2上运行非常重要。首先,您可以获得二进制而不是基于文本的协议,因此可以节省一些成本。然而,主要的节省是通过创建标题字典来避免重复。这意味着第一个请求将是完整大小,并且只有后续请求将更小,因为它们用字典引用替换实际标头。响应头也类似(压缩用于两者)。

我非常肯定(尽管不是100%)浏览器显示完整的大小而不考虑HTTP / 2 HPACK压缩,因为它在较低级别上很好(尽管大多数显示两个数字 - 有和没有gzip身体压缩,但那是不同的)。要查看实际的HTTP / 2详细信息和大小写,您需要使用诸如wire shark或Chrome的net-internals页面之类的工具。有关建议的工具,请参阅此页面:https://community.akamai.com/community/web-performance/blog/2015/06/05/useful-tools-for-http2-debugging。另外需要注意的是,与大多数实体相比,标题大小通常很小。

对于超出堆栈溢出范围的大量主题的性能基准测试工具,因为有很多变量会影响这一点(例如网络位置,类型 - 影响延迟和带宽 - 浏览器和客户端上HTTP / 2的软件实现一边......等等)。我建议的最好是尽可能多地复制用户的典型设置并尽可能多地重复测试,或者在分析软件中使用RUM(真实用户监控)指标。 HTTP / 2应该使大多数网站更快,但它不是给定的。这个网页是一个极好的带宽绑定站点的一个很好的例子,它实际上比没有调整的HTTP / 2连接慢:https://99designs.ie/tech-blog/blog/2016/07/14/real-world-http-2-400gb-of-images-per-day/

希望有所帮助。

相关问题