内容长度是了解何时完全接收HTTP消息的唯一方法吗?

时间:2011-08-02 21:56:12

标签: http tcp content-length

我一般都在考虑通过TCP为自己的目的编写一个协议,并且遇到了确定消息结束的问题。

从HTTP派生,我可以看到内容长度中提到了消息长度,并且可能是确定消息已被完全接收的方法。这是唯一的方法吗?如果缺少此标头会发生什么,因为AFAIK标头在HTTP消息中是可选的。

感谢。

3 个答案:

答案 0 :(得分:3)

  

这是唯一的方法吗?

还有其他方法,例如

  • 有一个特殊的分隔符标记结尾(也许是下一条消息的开头)。例如你可以使用换行符结束所有消息,所以要读取消息,你要读取所有内容直到换行。在这种情况下,您需要确保邮件内容本身不包含换行符,例如:在阅读时发送和取消转义时,在邮件中转义换行符。或者使用不包含换行符的编码对消息进行编码(例如base64或ascii-hex)

  • 格式化消息,使其包含一个结构,解析器将隐式检测消息的开始和结束。例如如果您发送json,则必须在收到数据时解析json,并且一旦匹配了所有{[个字符,您就会收到一条消息。

  • 为每条消息添加长度前缀。这非常类似于HTTP中的“Content-Length”,而是用二进制编码长度,例如每条消息的前4个字节保存后面数据的长度。

  

如果缺少此标头会发生什么,因为AFAIK标头在HTTP消息中是可选的。

这更棘手,因为有很多案件都在处理这个问题。

e.g。对于HTTP / 1.0,如果实际存在正文,则请求中必须有Content-Length。对于HTTP / 1.1,请求可能包含某些内容编码(例如,分块编码),其中可以在消息正文中解析长度。

对于http响应,可以通过关闭连接来指示消息的结尾,从头的末尾到流的末尾的所有内容都将被视为“消息”。更多信息here

答案 1 :(得分:0)

了解消息完成位置的其他方法 - 发送后关闭套接字)。但最好使用内容长度等内容。

当我编写自己的http服务器时:我编写的程序会关闭所有带有内容长度的http post数据包。

答案 2 :(得分:0)