Sockets 通过闭合连接确定车身长度的可靠性如何(RFC 2616 4.4.5)
我一件事都搞不清楚。“服务器关闭连接时,Sockets 通过闭合连接确定车身长度的可靠性如何(RFC 2616 4.4.5),sockets,http,tcp,rfc2616,Sockets,Http,Tcp,Rfc2616,我一件事都搞不清楚。“服务器关闭连接时,可以确定消息长度。” 这意味着,服务器使用响应(例如返回大图像)进行响应是有效的,该响应在头中没有内容长度,但客户端应继续获取,直到连接关闭,然后假设所有数据都已下载 但是,客户机如何确定连接是由服务器故意关闭的呢?服务器应用程序可能在发送数据的过程中崩溃,服务器的操作系统很可能会发送 FIN 包,以优雅地关闭与客户端的TCP连接。 您完全正确,该机制完全不可靠。RFC 7230中包括了这一点: 由于无法区分成功完成的项目, 从部分接收的消息中关闭分隔消息
可以确定消息长度。
”
这意味着,服务器使用响应(例如返回大图像)进行响应是有效的,该响应在头中没有内容长度
,但客户端应继续获取,直到连接关闭,然后假设所有数据都已下载
但是,客户机如何确定连接是由服务器故意关闭的呢?服务器应用程序可能在发送数据的过程中崩溃,服务器的操作系统很可能会发送<代码> FIN <代码>包,以优雅地关闭与客户端的TCP连接。 您完全正确,该机制完全不可靠。RFC 7230中包括了这一点:
由于无法区分成功完成的项目,
从部分接收的消息中关闭分隔消息中断
由于网络故障,服务器应生成编码或
尽可能使用长度分隔的消息。紧密划界
该功能的存在主要是为了与HTTP/1.0向后兼容
幸运的是,目前大多数HTTP流量都是HTTP/1.1,使用内容长度或“传输编码”来明确定义消息的结尾
教训是,消息必须有自己的终止方式;我们不能将底层传输层的EOF重新调整为消息的EOF
注意,(格式良好的)html
文档或.gif
、.avi
等确实定义了其自身的终止;如果我们收到不完整的文件,我们就会知道。因此,在没有内容长度的情况下通过HTTP/1.0传输它并不是什么大问题
但是,对于纯文本文档,javascript
,css
等。EOF用于标记文档的结尾,因此在HTTP/1.0上存在问题。您为什么要查看RFC 2616,顺便说一句?与此相关的是:由于大部分互联网仍在RFC2616上运行,723x在11个月前才被标准化。@RemyLebeau-Julian Reschke是HTTP的主要权威,所以他知道他在说什么:)新的RFC并不完全是一个新规范,它更多的是一个澄清。