浏览器如何处理HTTP keepalive竞争条件?

时间:2017-03-06 16:57:13

标签: http browser race-condition keep-alive

HTTP keepalive机制中存在已知的竞争条件:

据我所知,我需要HTTP客户端的超时时间比HTTP服务器短,或者在获取TCP-FIN或TCP-RST时重试。

我的问题是,今天的网络浏览器use the HTTP keepalive feature如何处理这种竞争条件。他们重试了吗?

我很乐意参考,谷歌搜索还没有提出任何建议。

1 个答案:

答案 0 :(得分:19)

根据RFC,在这些情况下,服务器应该响应408错误代码,向客户端发信号通知连接已经关闭。正如RFC所述:

  

如果客户在传输过程中有未完成的请求,则客户端可以   在新连接上重复该请求。

这意味着由客户端(也称为每个浏览器)决定如何处理408响应。有两种选择:

  • 正常处理:自动重试新连接中的剩余请求,以便用户完全不知道发生的潜在故障
  • fail-fast:使用相应的408错误消息显示用户失败

例如,似乎Chrome过去一直遵循第二种方法,直到某一点,人们开始将此视为“错误”行为并切换到第一种方式。您可以找到与Chromium错误here相关的错误线程以及相关的代码更改here

注意:正如您可以阅读链接主题中的最终电子邮件一样,只有当某些请求在此连接中成功完成时,Chrome才会执行这些重试。因此,如果您尝试使用单个请求重现该请求,并返回408响应,您会注意到Chrome在这种情况下可能不会重试。