如何通过关闭连接可靠地确定 body 长度 (RFC 2616 4.4.5)

How is determining body length by closing connection reliable (RFC 2616 4.4.5)

我无法弄清楚一件事。 RFC 2616 in 4.4.5 声明 Message Length 可以确定为“By the server closing the connection.”。

这意味着,服务器响应(例如,返回大图像)在 header 中没有 Content-Length 的响应是有效的,但客户端应该继续获取直到连接关闭,然后假设所有数据都已下载。

但是客户端如何确定服务器有意关闭了连接?服务器应用程序可能在发送数据的过程中崩溃,服务器的 OS 很可能会发送 FIN 数据包以正常关闭与客户端的 TCP 连接。

你说的对,那个机制完全不靠谱。这包含在 RFC 7230 中:

Since there is no way to distinguish a successfully completed, close-delimited message from a partially received message interrupted by network failure, a server SHOULD generate encoding or length-delimited messages whenever possible. The close-delimiting feature exists primarily for backwards compatibility with HTTP/1.0.

幸运的是,如今大多数 HTTP 流量都是 HTTP/1.1,使用 Content-Length 或 "Transfer-Encoding" 明确定义消息的结尾。

教训是,消息必须有自己的终止方式;我们不能将底层传输层的 EOF 重新用作消息的 EOF。

就此而言,(格式良好的)html 文档或 .gif.avi 等确实定义了自己的终止;如果我们收到的文件不完整,我们就会知道。因此,在没有 Content-Length 的情况下通过 HTTP/1.0 传输它并不是什么大问题。

但是,对于纯文本文档,javascriptcss等。EOF用于标记文档的结尾,因此在HTTP/1.0.[=上存在问题16=]