我一件事都搞不清楚。4.4.5中的RFC 2616指出,CCD_;By the server closing the connection.
";。
这意味着,服务器用标头中没有Content-Length
的响应进行响应(例如返回大图像)是有效的,但客户端应该继续获取,直到连接关闭,然后假设所有数据都已下载。
但是,客户端如何确定服务器有意关闭了连接?服务器应用程序可能在发送数据的过程中崩溃,服务器的操作系统很可能会发送FIN
数据包,以正常关闭与客户端的TCP连接。
你说得对,这种机制完全不可靠。这在RFC 7230:中有介绍
由于没有办法区分成功完成的,部分接收到的中断消息中的封闭分隔消息由于网络故障,服务器应该生成编码或只要可能,以长度分隔的消息。结束定界该功能的存在主要是为了和HTTP/1.0向后兼容。
幸运的是,目前大多数HTTP流量都是HTTP/1.1,使用Content-Length或"Transfer Encoding"来明确定义消息的结尾。
教训是,一条信息必须有自己的终止方式;我们不能将底层传输层的EOF重新用作消息的EOF。
在这一点上,(格式良好的)html
文档,或.gif
、.avi
等,确实定义了其自身的终止;如果我们收到一份不完整的文件,我们就会知道。因此,在没有Content-Length的情况下通过HTTP/1.0传输它并不是什么大问题。
然而,对于纯文本文档,javascript
、css
等,EOF用于标记文档的末尾,因此在HTTP/1.0上存在问题。