想知道是否有任何人能够在流水线操作的背景下提供有关HTTP 1.1是半双工还是全双工的令人信服的解释?据我所知,在客户端获得响应之前,可以通过同一个持久连接发送多个请求。这是否意味着服务器可以在客户端发送新请求时响应先前的请求?
答案 0 :(得分:21)
HTTP是请求 - 响应协议。客户端发送请求。服务器等待直到收到完整的请求。然后发送回复。客户端和服务器无法同时发送。
全双工通道意味着客户端和服务器可以同时发送数据。电话线是全双工的示例。要在Web中实现全双工,建议使用Web套接字。建立Web套接字连接后,双方可以同时交换消息。 Web套接字在TCP之上工作,不使用HTTP协议。
答案 1 :(得分:14)
让我们看看标准,在这种情况下RFC-2616。我们在第8.1.1节中找到了持久连接:
- HTTP requests and responses can be pipelined on a connection.
Pipelining allows a client to make multiple requests without
waiting for each response, allowing a single TCP connection to
be used much more efficiently, with much lower elapsed time.
稍后在文档中:
8.1.2.2 Pipelining
A client that supports persistent connections MAY "pipeline" its
requests (i.e., send multiple requests without waiting for each
response). A server MUST send its responses to those requests in the
same order that the requests were received.
正如在这两种情况下一样,它清楚地表明客户端可以在不等待响应的情况下发送请求,我认为说明HTTP 1.1支持全双工是安全的。
编辑:在RFC-7230中,RFC集的一部分取代了RFC-2616,该声明变为:
A client that supports persistent connections MAY "pipeline" its
requests (i.e., send multiple requests without waiting for each
response). A server MAY process a sequence of pipelined requests in
parallel if they all have safe methods (Section 4.2.1 of [RFC7231]),
but it MUST send the corresponding responses in the same order that
the requests were received.
答案 2 :(得分:1)
因为它使用tcp,这并不意味着tcp上的每个应用程序协议都是全双工。
HTTP使用请求 - 响应范例,而不是全双工流范例。让我重复一遍:HTTP是一个请求 - 响应协议!这意味着客户端发送请求,并且在发送完整请求后,服务器发送响应。即使使用所谓的保持活动,即在同一TCP连接上发送多个请求,情况也是如此。由于此行为是协议的基础,因此大多数实现都会进行某些(有效)假设,从而难以创建全双工连接。
如果你想要一个完整的双面包去webockets,它是为完全不同的目的而设计的。
答案 3 :(得分:0)