所有基于 TCP 的协议每次传输都使用一个套接字吗?

Do all protocols based on TCP use one socket per transfer?

我正在研究 Socket Programming HOWTO 并且作者在某些时候说

A protocol like HTTP uses a socket for only one transfer.

是不是HTTP协议本身的设计问题?还是因为它是基于TCP的,所以所有基于它的协议(例如UDP)都必须使用一个套接字进行一次传输?

该声明可能是在 1996 年或更早的时候写的。自 1997 年以来,HTTP 支持持久连接,为多个查询重复使用相同的 TCP 连接和相同的套接字。

这种说法是断章取义的。上下文是为了指出TCP不是基于消息的协议而是非结构化的字节流。并且要具有消息语义,需要有某种方法来确定消息的结束位置。

然后它以 HTTP 为例,其中一条消息可能只是以连接关闭结束,并指出了限制 - 即每个连接每个方向只能有一条消息。然后它继续描述如何在没有这种限制的情况下设计协议,即每个连接有多个消息。

HTTP 仍然可以这样使用,即有一个请求并以连接关闭结束。这是HTTP 0.9版本的设计,但是用HTTP/1还是可以做到的。但是对于 HTTP/1 它也可以用于多个消息,一个接一个。使用 HTTP/2 它可以并行处理多个消息,通过单个 TCP 连接进行多路复用。 HTTP/3 甚至不再使用 TCP。

Do all protocols based on TCP use one socket per transfer?

协议不限于每条消息(“传输”)一个连接(“套接字”)。根据协议的设计,通过具有一些预先知道的消息大小或明确的消息定界符,可以一个接一个地发送多个消息。某些协议可能会通过在 TCP 之上实现多路复用层来并行发送多条消息。一些协议甚至可能使用多个并行的 TCP 连接来传递单个消息,即将消息分发到多个连接上。