Google chrome 为什么Chrome在某些资源上使用Http/1.1而不是H2

Google chrome 为什么Chrome在某些资源上使用Http/1.1而不是H2,google-chrome,google-chrome-devtools,http2,Google Chrome,Google Chrome Devtools,Http2,我们正在为我们的网站启用H2。在测试期间,我观察到一些资源似乎是通过Http/1.1请求的,而大多数其他资源是通过H2请求的。有趣的是,当通过一条路径请求相同的资源时,它似乎在使用http/1.1,而在另一点上,它似乎在使用H2 我使用的是在OSX Sierra上运行的Chrome版本58.0.3029.96(64位),以匿名模式运行 这两个资源都是从同一来源请求的 请参见下面Chrome开发者工具的屏幕截图以获取资源 此外,使用http/1.1请求的其他资源很少。你知道为什么会这样吗?另

我们正在为我们的网站启用H2。在测试期间,我观察到一些资源似乎是通过Http/1.1请求的,而大多数其他资源是通过H2请求的。有趣的是,当通过一条路径请求相同的资源时,它似乎在使用http/1.1,而在另一点上,它似乎在使用H2

  • 我使用的是在OSX Sierra上运行的Chrome版本58.0.3029.96(64位),以匿名模式运行
  • 这两个资源都是从同一来源请求的
请参见下面Chrome开发者工具的屏幕截图以获取资源

此外,使用http/1.1请求的其他资源很少。你知道为什么会这样吗?另外,当从http/2切换到http/1.1时,似乎重复使用了相同的连接,这是否也会导致行首阻塞问题


任何帮助都将不胜感激

我无法解释为什么HTTP/1.1有时会被使用,但根据您在屏幕截图中提供的有限信息,其他部分不会被使用,因为这不应该发生

你百分之百确定他们都来自同一个产地吗?这些资源可能是从缓存中提供的,它们是在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限制,通过浏览器和服务器通常会实现一个限制)


尽管如此,我仍然认为在客户端和服务器上还有很多优化工作要做,以充分利用HTTP/2。互联网也对HTTP/1.1及其工作方式进行了大量优化,因此,为了充分利用HTTP/2,可能需要撤销或至少调整其中一些内容。例如,页面加载通常加载HTML,然后加载CSS,然后加载图像,这自然会导致优先级。在HTTP/2下,您可以同时请求所有资产,但实际上应该优先考虑CSS而不是图像。大多数浏览器都会这样做,但它们是以最理想的方式进行的吗?

关于您的查询,我在Chrome开发工具中使用“禁用缓存”来运行它,所以两个GET请求都是从同一个源请求的。这并不意味着两个GET请求都是从同一个源请求的:-),但我同意这确实意味着它们不是从缓存中读取的。:-。进行了双重检查,两者都是从同一来源获取的。另外,我对线路阻塞头部的担心是,基本上相同的连接似乎用于H/1.1和H/2。因此,当使用H/1.1时,有可能出现行首阻塞,不是吗?关于时间,Chrome开发工具中显示的“加载”时间应该已经考虑到了您在(2a)和(2b)中提到的数字,对吗?我真的怀疑HTTP/1.1和HTTP/2请求是否使用了相同的连接。我根本不知道服务器会如何处理这个问题!所以,要么你在Chrome中发现了一个错误,误报了协议,要么你错认为它们是同一个来源。检查你的服务器日志,看看它认为它在谈论哪个协议。你有没有找到解决方案?我也有类似的问题