【问题标题】:Is HTTP 1.1 Full duplex?HTTP 1.1 是全双工的吗?
【发布时间】:2014-06-18 15:01:40
【问题描述】:

想知道是否有人可以就流水线上下文中的 HTTP 1.1 是半双工还是全双工提供令人信服的解释?据我了解,在客户端获得响应之前,可以通过同一个持久连接发送多个请求。那么这是否意味着服务器可以在客户端发送新请求时响应先前的请求?

【问题讨论】:

  • 这不是编程问题(这是关于网络协议的问题)。 StackOverflow 是针对编程(代码)和程序员工具相关的问题。 help center 有更多关于适合在这里提问的问题类型的详细信息。

标签: http


【解决方案1】:

HTTP 是请求-响应协议。客户端发送请求。服务器等待直到收到完整的请求。然后发送响应。客户端和服务器不能同时发送。

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

【讨论】:

  • 服务器不需要等待整个请求,客户端也不需要等待服务器的回复才能继续。
【解决方案2】:

让我们看一下标准,在本例中为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 的 RFC 集的一部分,此语句变为:

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.

【讨论】:

  • vijayst 的定义不是“全双工”的正确定义吗?即使使用流水线,HTTP 1.1 也不是全双工连接,对吧?
  • @user487478 我不同意他的解释,RFC 7230 的作者之一 Julian Reschke 也不同意...
  • HTTP 绝对是半双工的,除了 WebSockets 的情况。 HTTP 服务器从不发送任意通知而不是对请求的响应。这适用于带有流水线的 HTTP/1.1 和带有 Server-Push 的 HTTP/2。
  • @ErsinEr 不好的答案肯定需要被否决。但是,您对“全双工”的理解是相对于 http 的 top 层而言的。在流水线的情况下,服务器可以在客户端发送请求时发送响应,证明它是全双工的。我不知道你为什么认为没有任意通知会导致 http 半双工...... vijayst 的电话类比也有同样的问题:当我们在打电话时,我们不需要听对方并做出反应 -我们都可以发出噪音,“两种噪音”都会被传播。
【解决方案3】:

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

可以在以下位置找到正式讨论

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

【讨论】:

    【解决方案4】:

    由于它使用 tcp,这并不意味着 tcp 上的每个应用程序协议都是全双工的。

    HTTP 使用请求-响应模式,而不是全双工流模式。让我重复一遍:HTTP 是一个请求-响应协议!这意味着客户端发送一个请求,当发送完整的请求时,服务器发送响应。即使使用了所谓的 keep-alive,即通过同一个 TCP 连接发送多个请求,情况也是如此。因为这种行为是协议的基础,所以大多数实现都会做出某些(有效的)假设,这使得创建全双工连接变得困难。

    如果您想要全双工,请选择 websockets,它的设计目的完全不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-15
      • 1970-01-01
      • 2015-04-14
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 2014-04-15
      • 2012-11-11
      相关资源
      最近更新 更多