HTTP 1.1是否全双工?

25

想知道是否有人可以在管线化的上下文中,提供关于HTTP 1.1是半双工还是全双工的令人信服的解释?据我所知,在客户端收到响应之前,可以通过相同的持久连接发送多个请求。那么这是否意味着服务器可以对先前的请求进行响应,同时客户端发送新请求?


1
这不是一个编程问题(而是一个关于网络协议的问题)。StackOverflow 是用于编程(代码)和程序员工具相关问题的。[帮助]页面有更多关于适合在此处提问的问题类型的详细信息。 - Ken White
4个回答

26

HTTP是一种请求-响应协议。客户端发送请求,服务器等待完整的请求接收后再发送响应。客户端和服务器不能同时发送。

全双工通道意味着客户端和服务器可以同时发送数据。电话线路就是全双工的例子。为了在Web中实现全双工,Web Sockets是推荐的标准。一旦建立Web Socket连接,双方都可以同时交换消息。Web Sockets在TCP之上工作,不使用HTTP协议。


6
服务器无需等待整个请求完成,客户端也无需等待服务器回复即可继续进行。 - Julian Reschke

19

让我们来看看标准,在这个例子中是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-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.

1
vijayst的“全双工”定义不是正确的吗?即使使用流水线技术,HTTP 1.1也不是全双工连接,对吧? - user487478
1
@user487478 我不同意他的解释,RFC 7230 的作者之一 Julian Reschke 也不同意... - fvu
HTTP通信协议在除了WebSockets的情况下通常是半双工的。HTTP服务器在响应请求时不会发送任意通知,这也适用于使用流水线技术的HTTP/1.1和使用服务端推送的HTTP/2协议。 - Ersin Er
1
@ErsinEr 不好的答案肯定需要被投票否决。然而,你对“全双工”的理解是相对于http之上的层次的。在流水线传输的情况下,服务器可以在客户端发送请求时发送响应,证明它是全双工的。我不知道为什么你认为没有任意通知就使http成为半双工......vijayst的电话类比也有同样的问题:当我们在通话时,我们不需要倾听并对对方做出反应 - 我们都可以发出声音,“两个声音”都会被传输。 - fvu
无论是否可以在等待第一个响应到达之前发送多个请求,都并不重要。这仍然意味着在任何给定时刻,连接可能只处理发送请求或接收响应之一,这将使其成为半双工,因此它并没有回答问题。 - Tomek Samcik
显示剩余2条评论

3

1
由于它使用TCP,这并不意味着在TCP上的每个应用程序协议都是全双工的。
HTTP使用请求-响应范例,而不是全双工流范例。让我再重复一遍:HTTP是一个请求-响应协议!这意味着客户端发送请求,并且当完整的请求被发送后,服务器才发送响应。即使使用所谓的保持连接,也就是多个请求通过同一TCP连接发送,情况仍然如此。因为这种行为对协议来说是基本的,大多数实现会做出某些(有效的)假设,这使得创建全双工连接变得困难。
如果您想要全双工,请选择WebSocket,它们是为完全不同的目的而设计的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接