HTTP 连接保持逻辑

HTTP 连接保持逻辑

我对 HTTP 还不太熟悉,如果这个问题看起来很愚蠢,请原谅我。我无法理解 HTTP keepalive 逻辑。我正在学习 HTTP 权威指南。

我们发送多个请求,通过单个 TCP 连接进行响应是明确的,但我不知道这如何与代理一起工作。代理不应该转发 keepalive 标头(这是逐跳的),那么服务器如何知道连接必须打开?如果服务器不知道,它将发送一个关闭响应数据包?那么客户端连接如何在同一 TCP 连接上转发更多请求。

例子

客户端(10.0.0.1)---------代理(1.1.1.1)----------(1.1.1.5)服务器

客户端向 1.1.1.5 发送带有连接:keepalive 的请求。代理接收并:1)如果是 HTTP/1.0,则盲目转发 2)代理将连接 1.1.1.1 -> 1.1.1.5 发送到服务器,连接:keepalive 是否已发送?

它说代理不缓存或转发连接和保持活动标头,那么服务器如何知道它应该保持打开还是关闭它。

请帮忙....我有点迷路了

答案1

逐跳仅意味着代理可以根据需要自由更改标头并立即解释它;不应在未经解释的情况下转发标头。

HTTP/1.1 默认为持久连接,除非连接中的一方(客户端到代理或代理到服务器)指定标Connection: close头。此标头特定于连接,并且与客户端-代理-服务器循环中的另一个连接无关。

因此,代理可以与原始服务器建立持久连接或指定,而Connection: close不管客户端在 中指定了什么Connection。同样,如果原始服务器发送Connection: close,则代理无需将该标头转发回客户端,然后客户端可以在仍然处于活动状态的客户端到代理连接上发出进一步的请求。

唯一被禁止的是发送Keep-Alive到 http/1.0 代理,因为它们不需要解释Keep-AliveConnection标头,因为这会锁定一个哑代理。

RFC 2616 第 13.5.1 节指定必须逐跳处理的所有标头(不缓存、不转发)。

相关内容