使用NetHttpClient(或Indy)进行HTTP2请求



我使用nethtpclient请求多个图像。但是,正如我所知道的,而不是执行几个TCP请求以下载每个图像,我可以在一个TCP请求中请求所有图像。这对于HTTPS尤其重要,每个HTTPS TCP请求还必须执行其他几个请求(HTTPS需要初始握手,这可能非常慢(。众所周知,设置守护力不会避免需要此初始握手,但我不确定(有人可以确认吗?(

如何在nethttpclient/indy中进行http2请求?

,但据我所知,我可以在一个TCP请求中要求所有TCP请求下载每个图像。

无论您使用HTTP 0.9、1.X还是2,都必须为每个图像发送单独的HTTP请求。HTTP 1.1及以后允许您在响应后保持TCP连接打开,因此您可以通过单个TCP连接发送多个HTTP请求(甚至管道,甚至可以为它们提供更好的网络带宽使用情况(。但是,无论您使用1个或更多TCP连接,您仍然必须为每个图像发送单独的HTTP请求。

如果要并行检索多个图像,则HTTP 2允许通过允许请求和响应多路复用来通过单个TCP连接。使用HTTP 1.1和更早的情况,一次只能处理1个HTTP请求/响应对,因此您需要使用多个TCP连接进行并行处理。

这对于每个HTTPS TCP请求还必须执行其他几个请求(HTTPS需要一个初始握手,这可能非常慢(。

尤其重要。

这就是为什么HTTP 1.1首先引入了抗阳离子机制的原因,并使之成为默认行为的原因。为每个HTTP请求建立新的TCP连接是很耗时的,甚至在涉及HTTPS的SSL/TLS时,更耗时。因此,使用保留效果将允许您仅使用1个TCP连接,因此只需要1个SSL/TLS握手。

我知道,设置keep-alive不会避免需要此初始握手

否,它不会消除握手,但它将最小化您需要执行的握手数量。

如何在nethttpclient/indy中进行http2请求?

目前,其中一个都不支持HTTP 2(不过,这是Indy的待办事项(,并且对HTTP 2的服务器端支持也不广泛。但是,实际上您不需要http 2,http 1.1带有保留的http 1.1就足够了。

http/2尚不支持Indy。

HTTP/2比HTTP/1更复杂的协议,因此实施它需要大量的工作和测试。

无论如何,我想您在情况下不需要http/2。设置HTTP/1 Keep-Alive将使您的连接在单个TLS握手后保持可用,您将能够以完整的带宽下载所有图像。对于非常小的图像,http/2请求交错可能会使它更快,但是对于足够大的图像,它会很快。

如果您期望性能,请创建多个客户端,或者在服务器端准备所有图像作为单个斑点(例如,存储在无压缩的ZIP中(并立即下载。

最新更新