【问题标题】:Why does the user agent resubmit a request after server does a TCP reset?为什么用户代理在服务器重置 TCP 后重新提交请求?
【发布时间】: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


【解决方案1】:

这是 HTTP 1.1 协议的一部分,用于处理被服务器过早关闭的连接。

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.2.4.

我遇到过类似的情况,我们在几毫秒内发布了几次相同的表单。

通过wireshark 捕获的数据包确认了浏览器的重新传输,并且来自服务器的日志表明请求已到达。

此外,进一步调查还显示,F5 等负载均衡器报告了重传行为的发生率。因此,也值得向您的负载均衡器供应商咨询。

【讨论】:

  • 我被引导相信因为POST不是幂等操作,不应该自动重试,但是你指出的条件似乎对所有请求方法都是通用的。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 2013-12-21
  • 2021-09-16
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2017-05-13
  • 1970-01-01
相关资源
最近更新 更多