HTTP 客户端是否总是在单个 TCP 连接上等待响应?

Do HTTP clients always wait for a response on a single TCP connection?

这是一个纯粹由好奇心驱动的问题,涉及 HTTP 和 TCP 之间边界上的一些微妙问题。我没有具体问题要解决。

HTTP 请求是通过 TCP 连接完成的,单个 TCP 连接可用于连续的多个 HTTP 请求。

原则上,这意味着客户端可以在前一个请求的响应到达之前在连接上发送请求。

有趣的是,这样的多个请求最终可能会出现在同一个 IP 数据包中,理论上甚至多个响应也可能是 - 实际上是批处理请求。

我在查看 Techempower 基准测试时遇到了这个主题,其中包括一个“纯文本”基准测试,其中 10 个此类请求在一个发送操作中一起批处理(使用 wrk 工具这样做)。

我想知道这是否纯粹是人为的黑客攻击,或者这是否真的发生了,例如当浏览器从同一服务器请求多个资源时。

此外,是否可以使用常见编程语言的 HTTP 客户端执行此操作,还是必须转到 TCP 套接字才能获得该行为?

发送多个 HTTP/1.1 请求而不等待响应被称为 HTTP pipelining (wikipedia link).

正如您在维基百科上看到的那样,该技术很有前途,但它在浏览器中默认情况下未启用,“由于代理服务器存在问题和 HOL 阻塞等若干问题。”尽管如此,主要的 HTTP 客户端和服务器都支持它。

该技术不适用于协议的更高版本:HTTP/2 使用 TCP 连接的方式完全不同,HTTP/3 甚至不使用 TCP。