我们正在为我们的网站启用H2。在测试过程中,我观察到一些资源似乎是用Http /1.1请求的,而大多数其他资源都是H2。有趣的是,当通过一条路径请求时,相同的资源似乎使用http / 1.1,而在另一点似乎使用H2。
请参阅以下Chrome开发者工具的截图,了解资源。
此外,使用http / 1.1也请求的其他资源很少。关于为什么会发生这种情况的任何想法?此外,当从http / 2切换到http / 1.1时,同样的连接似乎可以重复使用,这是否也会导致线路阻塞问题呢?
任何帮助都将不胜感激!!
答案 0 :(得分:1)
我无法解释为什么HTTP / 1.1会在某些时候被使用,而不能根据您在屏幕截图中给出的有限信息来使用,因为这不应该发生。
你是否100%确定他们都属于同一血统?资源是否可以从缓存中提供,是否在HTTP / 1.1下缓存?
另一方面,为什么你要在相同的页面加载中两次请求相同的源,因为这似乎是错误的?对于更改的数据(例如JSON请求)是否足够公平,但是不明白为什么要多次加载jquery-UI或甚至是你正在做的同一个css文件?似乎是一个非常奇怪的用例,至少你应该缓存它再次使用它。
对于您的第二个问题,在HTTP / 2下,相同的连接被重用于同一个源(如果您在具有相同https证书的相同IP地址上具有单独的vhost,则这包括在某些用例中的相同效果起源)。由于HTTP / 2协议是专门为此方案设计的,并且使用多路复用来混合请求,因此不会导致行阻塞。
但是,这确实会改变请求在开发工具中的显示方式,具体取决于客户端,服务器和带宽。例如,假设您有两个资源的请求,每个资源需要5秒钟才能下载。在HTTP / 1.1下你会看到:
示例强>
Request 1: start 0 seconds, end 5 seconds.
Request 2: start 5 seconds, end 10 seconds.
Total time to download could be calculated as: 5s + 5s = 10s
Overall Page load time would be 10 seconds
在HTTP / 2下你可能会看到这一点(假设第一个请求被优先排序,先完全发回):
示例2a
Request 1: start 0 seconds, end 5 seconds.
Request 2: start 0 seconds, end 10 seconds.
Total time **looks** be 5s + 10s = 15s
Overall Page load time would still be 10 seconds
或者,如果您有足够的带宽同时处理飞行中的两个请求,并且服务器响应第二个请求比第一个请求晚一秒,那么它可能看起来像这样:
示例2b
Request 1: start 0 seconds, end 5 seconds.
Request 2: start 0 seconds, end 6 seconds.
Total time **looks** be 5s + 6s = 11s
Overall Page load time would be 6 seconds
如果你尝试对部分求和,那么在HTTP / 2下点“看起来”都会变慢,即使实例2a的总时间相同,实际上2b也快了4秒。您无法比较HTTP / 1.1和HTTP / 2之间的开发人员工具中的类似基础上的各个请求。
这与比较多个HTTP / 1.1请求的方式相同(浏览器通常每个主机打开4-8个连接而不是一个),除了在HTTP / 2下打开和管理多个连接没有任何开销,因为它已被烘焙到协议。在HTTP / 2下没有4-8限制,通过浏览器和服务器通常会实现一个Apache defaults to 100 for example)。
说出一切,我仍然认为在客户端和服务器上仍有很多优化要做,以充分利用HTTP / 2。互联网也为HTTP / 1.1及其工作方式进行了大量优化,因此有些事情可能需要撤消,或者至少需要调整,以制作大部分HTTP / 2。例如,页面加载通常加载HTML,然后加载CSS,然后加载自然导致优先级的图像。在HTTP / 2下,您可以同时请求所有资产,但实际上应该优先考虑CSS对图像的优先级。大多数浏览器都是这样做的,但他们是否以最佳方式完成了这项工作?