http端点是否应该响应来自特定客户端的请求以便接收它们?
如果在代理后面的集群处理的请求或者使用NIO处理的请求(其中一个请求比另一个请求完成得更快)没有意义的话怎么办?
是否有一种标准方法可以将唯一ID与每个http请求相关联以与响应相关联?如何处理像http components httpclient或curl这样的客户端?
问题归结为以下情况:
假设,我从服务器下载文件并且请求未完成.客户端是否能够在相同的保持连接上完成其他请求?
每当打开TCP连接时,源端口和目标端口以及IP地址都会识别连接.因此,如果我在目标端口80(HTTP的默认设置)上连接到www.google.com,我需要一个操作系统将生成的免费源端口.
然后将Web服务器的回复发送到源端口(和IP).这也是NAT工作的方式,记住哪个源端口属于哪个内部IP地址(反之亦然,用于传入连接).
至于你的编辑:不,单个http连接可以同时执行一个命令(GET/POST/etc).如果在从先前发出的命令中检索数据时发送另一个命令,则结果可能因客户端和服务器实现而异.例如,我想Apache会在发送第一个请求的数据后传输第二个请求的结果.
我不会重写 CodeCaster 的答案,因为它措辞非常好。
回应您的编辑 - 不。它不是。单个持久 HTTP 连接一次只能用于一个请求,否则会变得非常混乱。因为 HTTP 没有定义任何形式的请求/响应跟踪机制,所以这是不可能的。
应该注意的是,还有其他协议使用类似的消息格式(符合RFC822),它们确实允许这样做(使用SIP 的 cSeq header等机制),并且可以在自定义 HTTP 应用程序中实现这一点,但是 HTTP 没有定义任何执行此操作的标准机制,因此无法做任何可以假设在任何地方都有效的事情。它还会给第二条消息的响应带来问题 - 您是否等待第一个响应完成后再发送第二个响应,或者在发送第二个响应时尝试暂停第一个响应?您将如何以保证消息不会损坏的方式进行传达?
另请注意,SIP(通常)通过 UDP 运行,UDP 不保证数据包排序,这使得 cSeq 系统更加必要。
如果您想在另一个事务仍在进行时向服务器发送请求,则需要创建到服务器的新连接,从而创建新的 TCP 流。
Facebook 在构建 CDN 时对此进行了一些研究,他们得出的结论是,您可以在任何时间有效地拥有 2 或 3 个打开的 HTTP 流,但由于额外的数据包开销成本,更多的数据会减少总体传输时间。如果我能找到链接,我会链接到该博客条目...