如何知道何时关闭HTTP 1.1 Keep-Alive连接?

8
我正在使用Java编写Web服务器,并希望支持HTTP 1.1 Keep-Alive连接。但是,我该如何知道客户端在给定连接上发送请求时何时完成?(例如双换行符之类的东西)。
让我们看看stackoverflow如何处理这个非常晦涩的问题 - 在Google上,对此的答案深陷于技术规范和晦涩的语言中。我想要一个简单明了的回答,适用于非C程序员 :)
我明白了。这证实了我依赖SocketTimeoutException的怀疑。但是,我不确定是否有什么来自客户端的东西可以表明它已经完成了连接 - 这将允许我更早地关闭连接,在大多数情况下不必等待超时。谢谢
4个回答

8
如果您正在构建服务器以满足标准,那么这里已经有很多信息可以指导您。
简单来说,它应该基于连接使用的时间,而不是请求数据的级别。
更详细的解释,HTTP/1.1文档的实用考虑部分为您提供了一些指导:
“服务器通常会有一些超时值,超过该值后它们将不再保持非活动连接。代理服务器可能会使这个值更高,因为客户端很可能通过同一服务器建立更多的连接。使用持久连接对客户端或服务器的超时长度(或存在性)没有任何要求。” 或

当客户端或服务器希望超时时,应在传输连接上发出优雅的关闭。客户端和服务器都应该不断地观察传输关闭的另一端,并根据情况做出响应。如果客户端或服务器未能及时检测到另一端的关闭,则可能会对网络造成不必要的资源耗费。


4
让我们看看stackoverflow如何处理这个非常晦涩的问题——在谷歌上,对于这些问题的答案被困在技术规范和晦涩的语言中。
我刚刚在Google中输入When should I close an HTTP 1.1 connection?,第三个搜索结果是HTTP Made Really Easy。在目录中,有一个链接指向一个名为Persistent Connections and the "Connection: close" Header的部分。这个部分有三段很简单的语言,告诉你想要知道的一切。
我想要一个非C程序员的通俗易懂的答案:)
恕我直言,编程是一个需要技术细节的工作。阅读技术文档是一项绝对必要的技能。依赖第三方“通俗易懂”的解释只会导致您做得很差。

1

您可以随时关闭它。标头指示客户端希望您保持连接打开,但这并不要求服务器遵守。大多数服务器会将其保持打开状态约5-10秒钟,有些则根本不注意。


1

你应该阅读与Keep-Alive功能相关的RFC文档,否则你可能会得到一个不符合预期的服务器。

正如@[Stephen]所指出的那样,服务器可以随时关闭连接(当然,在请求/响应对之间不会这样做)。客户端也是如此。任何其他解决方案都将允许服务器或客户端对另一方进行DoS攻击。

编辑:查看Connection头。客户端(和服务器)可以使用该头请求优雅的连接关闭。例如,在请求中使用Connection: close表示请求服务器在发送响应后关闭连接。


1
我问的原因是大多数网络浏览器(特别是我测试过的所有浏览器)即使在请求和接收了所有.css/.js等文件之后,仍然继续发送“Connection: keep-alive”标头。我原以为它们会更加智能,而我可能遗漏了什么东西。 - Bret
浏览器倾向于保持连接的开放状态,因为这样可以增加响应时间,如果它们需要向同一服务器发送更多请求。没有什么阻止您的服务器忽略Keep-Alive功能,并在每个请求后关闭连接。 - Alexander

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