HTTP/1.1是否允许通过半关闭连接来分隔请求的末尾?

7

RFC2616 part 4.4规定了HTTP/1.1中如何确定消息结束的方式。该部分的第5条规定,服务器可以关闭连接来表示响应已完成。

它还指出,像这样分隔请求是不可能的。然而,TCP允许客户端关闭其端口并继续接收响应。我甚至进行了测试,它起作用了。

问题:

  • 为什么1999年的标准说这是不可能的,而实际上却是可能的?当时TCP已经得到广泛应用,并且自1974年以来(可能一直到现在)就支持了半关闭。

  • 对于客户端半关闭连接来表示请求结束,是否违反了协议?

请忽略这是否是个好主意:我知道有时你无法确定连接是故意关闭还是断开了,保持连接打开以便以后重用更加合理。


听起来你有点偏离主题了,但我真的很想知道你是如何在关闭连接后测试消息接收的?我怀疑连接并没有关闭——只是你发送了一个FIN数据包。 - symcbean
@symcbean 我不确定你的意思是什么。这个问题根本不涉及TCP应该如何行动。此外,半关闭连接并不是什么奇怪的事故;它是一项得到适当支持的功能 - Roman Starkov
2
@symcbean 这些都是完全无关的。在RFC 793中定义了TCP半关闭,你没有任何“惊讶”的理由,这也不是分组交换网络本身的必然结果。你关于“大多数HTTP客户端”的断言站不住脚。你最后一句话也与此处所述的任何内容无关。简而言之,你的观点也使我困惑不解。 - user207421
@romkyns:你的分析似乎是建立在客户端和服务器同步操作的基础上。TCP网络并不是为这种工作方式而设计的。 - symcbean
1
https://github.com/httpwg/http-core/issues/22 - undefined
显示剩余4条评论
1个回答

3

这并不意味着半关闭是不可能的。它只是说“关闭连接不能用来表示请求体的结束”,这是正确的。它并没有考虑半关闭的可能性。因为RFC中没有提到它,所以我认为使用它将违反协议,你也没有理由期望服务器做出相应反应:例如,服务器有权在收到FIN时忘记请求并关闭连接。


此外,nginx 正是以这种方式工作的。http://mailman.nginx.org/pipermail/nginx/2008-September/007388.html - darkk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接