分块编码和连接:紧密结合在一起

phi*_*_44 5 http chunked-encoding

我对使用分块编码时如何处理“连接”标头有点困惑。是否应不添加“Connection”标头(或设置为 keep-alive,这与我们谈论的 HTTP 1.1 相同),或者是否授权将其设置为 Connection:close 发送空块,意味着结束传输,但这是否意味着连接的结束?我认为当我的目的是在发送空块后关闭连接时,我需要添加 Connection:close ,如果我不添加 Connection 标头,它将保持打开状态

谢谢

Rem*_*eau 5

消息长度和连接管理是两个不同的事情,实际上彼此无关(除了消息长度完全未知并且关闭连接是表示 EOF 的唯一可能方法的情况除外,但这种情况很少发生,并且不是你的情况)。

分块仅适用于消息长度,其中 0 长度的分块表示 EOF。如果连接在到达 EOF 之前提前关闭,则消息不完整,接收方可以决定是否保留/处理它。

Connection客户端使用标头来指定是否希望服务器在发送响应后关闭连接或保持连接打开状态。服务器使用相同的标头来指定连接在发送响应后是实际关闭还是保持打开状态。

是否应添加“Connection”标头(或设置为 keep-alive,这与我们谈论的 HTTP 1.1 相同),或者是否有权将其设置为 Connection:close

这与分块无关。无论消息的格式如何,客户端和服务器都应始终表明其对当前连接的意图,无论应该关闭还是保持打开状态。这是通过是否存在Connection标头来完成的,具体取决于 HTTP 版本:

如果使用 HTTP 1.0,则默认行为是close除非Connection: keep-alive显式发送。

如果使用 HTTP 1.1+,则默认行为是keep-alive除非Connection: close显式发送。

如果客户端请求保持活动状态,服务器将决定是否接受它。服务器可以保持连接打开,也可以关闭连接。

如果客户端请求关闭,服务器必须遵守它并关闭连接。

发送一个空块,意味着传输结束,但这是否意味着连接结束?

不,只有Connection标题可以做到这一点。特别是在某种keep-alive情况下,连接保持打开状态,以便客户端可以在前一个响应传输完成后重用现有连接来发送新请求。

我认为当我的目的是在发送空块后关闭连接时,我需要添加 Connection:close

正确,特别是在 HTTP 1.1+ 中,这keep-alive是默认行为。

如果我不添加连接标头,它将保持打开状态

Connection如上所述,省略标头的含义取决于所使用的 HTTP 版本。