【问题标题】:How does a http client associate an http response with a request (with Netty) or in general?http 客户端如何将 http 响应与请求(使用 Netty)关联起来?
【发布时间】:2011-11-10 12:19:03
【问题描述】:

http 端点是否假设响应来自特定客户端的请求以便接收它们?

如果在由代理后面的集群处理的请求或使用 NIO 处理的请求(其中一个请求比另一个完成得更快)的情况下没有意义怎么办?

是否有一种标准方法可以将唯一 id 与每个 http 请求相关联以与响应相关联?这在 http 组件 httpclient 或 curl 等客户端中是如何处理的?

问题归结为以下情况:

假设,我正在从服务器下载文件,但请求尚未完成。客户端是否能够在同一个保活连接上完成其他请求?

【问题讨论】:

    标签: http nio netty


    【解决方案1】:

    每当打开 TCP 连接时,源和目标端口以及 IP 地址都会识别该连接。因此,如果我在目标端口 80(HTTP 的默认端口)上连接到 www.google.com,我需要一个由操作系统生成的免费源端口。

    然后将 Web 服务器的回复发送到源端口(和 IP)。这也是 NAT 的工作原理,记住哪个源端口属于哪个内部 IP 地址(传入连接反之亦然)。

    至于您的编辑:不,单个 http 连接可以同时执行一个命令 (GET/POST/etc)。如果在从先前发出的命令中检索数据时发送另一个命令,则结果可能因客户端和服务器实现而异。我猜想Apache,例如,在发送第一个请求的数据之后,会传输第二个请求的结果。

    【讨论】:

    • +1 - 简洁的解释。 Altoid Muncher,我认为您可能对read up on some of the basics of TCP 做得很好,这是 HTTP(通常)运行的传输层协议。 Web浏览器或cURL等相对高级的软件不必担心这一点,它由操作系统的底层TCP/IP堆栈处理。如@CodeCaster 所述,如需进一步阅读与此密切相关的内容,请阅读NAT (Network Address Translation)
    • +1 以获得不错的答案。一个警告:当使用 HTTP Pipelining 时,单个 HTTP 连接可以执行多个请求(wiki:en.wikipedia.org/wiki/HTTP_pipelining,例如:info-chaitra.blogspot.com/2011/03/…)。问题是请求必须是幂等的:GET 很好,但没有 POST。
    • @LucaInvernizzi 是的,但是服务器不会同时发送多个资源,它仍然是 FIFO:第二个响应的数据将在第一个响应的所有数据发送完之后发送。没有多路复用,例如在 SPDY 中。哦,当你不投票时不要说+1。 ;-)
    【解决方案2】:

    我不会重写 CodeCaster 的答案,因为它的措辞非常好。

    响应您的编辑 - 不。它不是。一个持久的 HTTP 连接一次只能用于一个请求,否则会变得非常混乱。因为 HTTP 没有定义任何形式的请求/响应跟踪机制,所以根本不可能。

    应该注意,还有其他协议使用类似的消息格式(符合RFC822),它们确实允许这样做(使用诸如SIP's cSeq header之类的机制),并且可以在一个自定义的 HTTP 应用程序,但 HTTP 没有为此定义任何标准机制,因此无法做任何可以假设在任何地方都可以工作的事情。第二条消息的响应也会出现问题 - 您是在发送第二条响应之前等待第一个响应完成,还是在发送第二条响应时尝试暂停第一个响应?您将如何以保证消息不会被损坏的方式传达这一点?

    另请注意,SIP(通常)通过 UDP 运行,它不能保证数据包的顺序,因此 cSeq 系统更加必要。

    如果您想在另一个事务仍在进行时向服务器发送请求,则需要创建与服务器的新连接,从而创建新的 TCP 流。

    Facebook 在构建 CDN 时对此进行了一些研究,他们得出的结论是,您可以在任何时候有效地拥有 2 或 3 个开放的 HTTP 流,但由于额外的数据包开销,因此减少了整体传输时间成本。如果我能找到链接,我会链接到博客条目...

    【讨论】:

      猜你喜欢
      • 2017-11-04
      • 2012-09-15
      • 2018-02-09
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      相关资源
      最近更新 更多