我正在实现一个超简单的虚拟HTTP服务器,它响应任何请求的Hello world消息。它仅用于使用wrk
或等效的Web服务器基准测试工具对异步事件处理进行基准测试。
在Web上进行一些搜索之后,我找不到明确的EndOfMessage(EOM)标记。它与HTTP 1.0接缝,我们知道我们已经在连接关闭时收到了完整的请求。是吗?
对于HTTP 1.1,我们如何知道是否使用了流水线技术?在这种情况下,EOM是什么?
答案 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.3和section 6.3.2。如果您担心必须支持此功能,您可以随时阅读第一个请求并发回包含Connection: close
的回复。客户端将知道必须建立新连接。
在这种情况下,EOM是什么?
同样,没有标记,因为在流水线操作期间对请求没有特殊处理。实际上,所有流水线操作都是一次性发出多个请求。有关如何确定消息长度,请参阅上面的3.3.3节。