中间有多个代理的 TCP 连接

中间有多个代理的 TCP 连接

客户端发送一个Proxy-Connection: Keep-Alive报头,中间智能代理看到该报头并将其替换为Connection: Keep-Alive并发送到 Web 服务器。一切顺利。

如果中间有 2 个智能代理,会怎么样?当第一个代理转发Connection: Keep-Alive到第二个代理时,第二个代理不知道如何处理此标头。它知道如何处理Proxy-Connection,但不知道如何处理Connection: Keep-Alive。它是否只是将标头重新发送到 Web 服务器?这不会在当前 TCP 连接中造成问题吗?

答案1

客户端发送一个 Proxy-Connection: Keep-Alive 标头,中间智能代理看到此标头并将其替换为 Connection: Keep-Alive 并发送到 Web 服务器。

事实并非如此。

Proxy-Connection并且Connection是逐跳报头,而不是端到端报头。这意味着客户端决定要使用与代理的持久连接,而代理决定要与上游主机(服务器或代理)建立持久连接。代理想要建立持久连接并不是因为客户端想要,而是这些是独立的决定。事实上,客户端可能使用与代理的相同 TCP 连接来访问多个主机,而代理需要从中建立不同的 TCP 连接,因为它需要访问不同的主机。

除此之外,无论下一跳是代理还是目标服务器,这Proxy-Connection都是错误的,并且应该是唯一的。另请参阅Connectionhttps://trac.tools.ietf.org/wg/httpbis/trac/ticket/158

这不会导致当前 TCP 连接出现问题吗?

这些标头只是一种愿望,无论如何,HTTP/1.1 隐含了 keep-alive,也就是说,当客户端想要 keep-alive 时,这种情况下根本不需要标头。由于这只是一种愿望,因此客户端和服务器都可以在请求之间随时关闭底层 TCP 连接。可能存在这样的情况:服务器在客户端发送新请求的同时关闭连接,客户端必须处理这种情况,大多数情况下,通过在新的 TCP 连接中重新执行请求。

相关内容