有没有人遇到过 IIS10 上 HTTP/2 的这个问题。我在 Azure 上设置了一个 VM,并在 IIS10 上建立了一个网站。我设置了 SSL 等,并在 HTTP/2 上测试了网站,关闭了 SSL,并在同一个浏览器上使用 HTTP/1.1 对其进行了测试。结果出乎意料,HTTP/1.1 的表现远远优于 HTTP/2!
测试是在相同的机器、完全相同的网页(包含大量需要加载的资源)上进行的,唯一改变的是协议。
HTTP/2 结果:
HTTP/1.1 结果:
如您所见,HTTP/1.1 的性能优于 HTTP/2,在我看来,服务器似乎花费了大量时间来响应请求(绿色 - 第一个字节的时间)。
有任何想法吗?
答案1
区别在于 HTTP/1 和 HTTP/2 如何设置网络套接字。
在 HTTP/1 中,浏览器会请求单个资产,然后等待该资产下载完毕后再发出下一个请求。这非常慢,因此为了解决这个问题,浏览器开始多路复用其请求,一次发出 6-8 个请求,并将带宽分配给这 6-8 个请求。
在 HTTP/2 中,浏览器打开单个套接字,发出所有请求,然后等待所有资产以最高可用带宽进行流式传输。
您之所以会看到较高的 TTFB,是因为在 HTTP/1 中,每个请求都是一个单独的套接字,但在 HTTP/2 中,所有请求都通过单个流下载。您可能已经发出了请求,但您必须等待服务器响应您请求的所有数据。
理论上,HTTP/2 应该更快,因为它更高效 - 您无需为每个请求打开新的套接字。您将所有数据传输到单个数据管道,并且可以根据页面的加载方式对请求进行优先级排序。
实际上,这取决于浏览器是否正确地发出优先请求,以及网络是否允许单个套接字流的全部带宽,而不是人为地限制请求。
此外,由于您已声明您正在执行未加密的 HTTP/1 和加密的 HTTP/2,因此加密将导致额外的开销和性能损失。您可以尝试执行加密的 HTTP/1 以进行更好的比较。