5

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

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

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

问题归结为以下情况:

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

4

2 回答 2

5

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

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

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

于 2011-09-05T10:05:26.183 回答
3

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

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

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

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

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

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

于 2011-09-05T10:29:02.770 回答