Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets 通过闭合连接确定车身长度的可靠性如何(RFC 2616 4.4.5)_Sockets_Http_Tcp_Rfc2616 - Fatal编程技术网

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并不完全是一个新规范,它更多的是一个澄清。