【发布时间】:2013-11-06 15:48:56
【问题描述】:
我们最近注意到一个问题,即某些用户代理会重复相同的 POST 请求,而用户实际上并未实际触发两次。
经过进一步研究,我们注意到这只发生在请求通过我们的负载均衡器并且服务器需要很长时间来处理请求时。数据包捕获会话最终显示负载均衡器通过向客户端发送 TCP 重置在 5 分钟超时后断开连接;但是,客户端自动重新提交请求,无需用户干预。
我们在 Java、Firefox 和 IE 8 的 Apache HTTP 客户端中观察到了这种行为。(我无法安装其他浏览器进行测试。)这让我认为这种行为是 HTTP 标准的一部分,但这并不容易 google .
此外,这似乎只有在第一个请求是通过保持活动的 TCP 连接提交时才会发生。
【问题讨论】:
-
当 HTTP 客户端使用 HTTP keepalive 时,它会尝试保持请求之间的 TCP 连接。但是客户端无法确定连接是否正常。因此,当它收到 RST 时,它可能认为连接在发送请求之前就已经死了,并再次发送请求。顺便说一句,我不确定这是一个真正的原因,这只是一个猜测。
-
@Den 这也是我的猜测。我希望有人能提出定义这一点的 RFC。 HTTP/1.1 RFC 似乎说这不能发生。
-
请附上截图。
-
查看“Avoid duplicate POSTs with REST”或“How to deal with timed out POST requests”等问题,了解如何处理重新提交的请求。
标签: http tcp user-agent