如何知道HTTP 1.0和HTTP 1:1已收到完整请求?

时间:2016-05-13 13:07:06

标签: http

我正在实现一个超简单的虚拟HTTP服务器,它响应任何请求的Hello world消息。它仅用于使用wrk或等效的Web服务器基准测试工具对异步事件处理进行基准测试。

在Web上进行一些搜索之后,我找不到明确的EndOfMessage(EOM)标记。它与HTTP 1.0接缝,我们知道我们已经在连接关闭时收到了完整的请求。是吗?

对于HTTP 1.1,我们如何知道是否使用了流水线技术?在这种情况下,EOM是什么?

1 个答案:

答案 0 :(得分:2)

  

在网上进行一些搜索后,我无法找到明确的EndOfMessage(EOM)标记。

你找不到一个因为这样的东西不存在。您可能找到的唯一标记是CRLF对,表示标题字段的结尾。通常,封闭的实体长度(用于请求响应!)要么通过Content-Length标头或传输编码预先传达。

  使用HTTP 1.0

我们知道在连接关闭时我们收到了完整的请求。是吗?

这是RFC 1945强制要求的两种方式之一。所以一般来说:不。来自RFC 1945, section 7.2.2

  

当消息中包含实体主体时,可以通过两种方式之一确定该主体的长度。如果存在Content-Length标头字段,则其以字节为单位的值表示实体主体的长度。 否则,正文长度由服务器关闭连接确定。

这可能就像你通常在你的断言中一样。的 BUT:

  

关闭连接不能用于指示请求正文的结束,因为它不会让服务器发回响应。

当你处于接收方时,你的假设在每个可能的层面都是错误的:如果请求包含一个正文,则通过Content-Length标题宣布所述正文的大小是绝对要求< / em>的

HTTP / 1.1在这方面有点放松,因为它允许更多选项。朱利安指出,请咨询RFC 7230, section 3.3.3。该部分很容易阅读和回答您的问题,我必须整体解读。

  

对于HTTP 1.1,我们如何知道是否使用了流水线技术?

如果您通过一个连接收到多个请求,则会执行此操作。客户端不参与流水线操作的最强指标是在第一个收到的请求中存在Connection: close。请参阅RFC 7230, section 6.3section 6.3.2。如果您担心必须支持此功能,您可以随时阅读第一个请求并发回包含Connection: close的回复。客户端将知道必须建立新连接。

  

在这种情况下,EOM是什么?

同样,没有标记,因为在流水线操作期间对请求没有特殊处理。实际上,所有流水线操作都是一次性发出多个请求。有关如何确定消息长度,请参阅上面的3.3.3节。