浏览器如何处理 HTTP keepalive 竞争条件?
How do browsers handle HTTP keepalive race condition?
HTTP keepalive 机制中存在已知竞争条件:
据我了解,我需要我的 HTTP 客户端的超时时间比我的 HTTP 服务器短,或者在获取 TCP-FIN 或 TCP-RST 时重试。
我的问题是,今天的 use the HTTP keepalive feature 网络浏览器如何处理这种竞争情况。他们会重试吗?
我很乐意提供参考,google 搜索没有找到任何结果。
根据 RFC,在这些情况下,服务器应响应 408 错误代码,向客户端发出连接已在其端关闭的信号。正如 RFC 所述:
If the client has an outstanding request in transit, the client MAY
repeat that request on a new connection.
这意味着由客户端(也就是每个浏览器)决定如何处理 408 响应。有 2 个选择:
- 优雅地处理它:自动重试新连接中的剩余请求,这样用户就完全不知道发生的潜在故障
- fail-fast:通过适当的 408 错误消息向用户显示失败
例如,似乎 Chrome 过去一直遵循第二种方法,直到人们开始认为这是一种“错误”行为并转而使用第一种方法。您可以找到与 Chromium 错误相关的错误线程 here and the associated code change here。
注意:正如您在链接线程的最后一封电子邮件中所读到的,Chrome 仅在某些请求在此连接中成功时才执行这些重试。因此,如果您尝试通过单个请求重现该请求并返回 408 响应,您会注意到 Chrome 在这种情况下可能不会重试。
HTTP keepalive 机制中存在已知竞争条件:
据我了解,我需要我的 HTTP 客户端的超时时间比我的 HTTP 服务器短,或者在获取 TCP-FIN 或 TCP-RST 时重试。
我的问题是,今天的 use the HTTP keepalive feature 网络浏览器如何处理这种竞争情况。他们会重试吗?
我很乐意提供参考,google 搜索没有找到任何结果。
根据 RFC,在这些情况下,服务器应响应 408 错误代码,向客户端发出连接已在其端关闭的信号。正如 RFC 所述:
If the client has an outstanding request in transit, the client MAY repeat that request on a new connection.
这意味着由客户端(也就是每个浏览器)决定如何处理 408 响应。有 2 个选择:
- 优雅地处理它:自动重试新连接中的剩余请求,这样用户就完全不知道发生的潜在故障
- fail-fast:通过适当的 408 错误消息向用户显示失败
例如,似乎 Chrome 过去一直遵循第二种方法,直到人们开始认为这是一种“错误”行为并转而使用第一种方法。您可以找到与 Chromium 错误相关的错误线程 here and the associated code change here。
注意:正如您在链接线程的最后一封电子邮件中所读到的,Chrome 仅在某些请求在此连接中成功时才执行这些重试。因此,如果您尝试通过单个请求重现该请求并返回 408 响应,您会注意到 Chrome 在这种情况下可能不会重试。