HTTP 1.1全双工吗?

时间:2014-05-02 01:36:47

标签: http

想知道是否有任何人能够在流水线操作的背景下提供有关HTTP 1.1是半双工还是全双工的令人信服的解释?据我所知,在客户端获得响应之前,可以通过同一个持久连接发送多个请求。这是否意味着服务器可以在客户端发送新请求时响应先前的请求?

4 个答案:

答案 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)

大多数实现都允许全双工HTTP(针对2xx响应)。

正式讨论可以在

找到

https://tools.ietf.org/html/draft-zhu-http-fullduplex