Http 为什么用户代理在服务器执行TCP重置后重新提交请求?

Http 为什么用户代理在服务器执行TCP重置后重新提交请求?,http,tcp,user-agent,Http,Tcp,User Agent,我们最近注意到一个问题,一些用户代理会重复相同的POST请求,而用户实际上不会触发它两次 在进一步研究之后,我们注意到只有当请求通过负载平衡器并且服务器处理请求花费了很长时间时,才会发生这种情况。数据包捕获会话最终显示,负载平衡器通过向客户端发送TCP重置,在5分钟超时后断开连接;但是,客户端会自动重新提交请求,而无需用户干预 我们在Apache HTTP client for Java、Firefox和IE8中观察到了这种行为。(我无法安装其他浏览器进行测试。)这让我认为这种行为是HTTP标准

我们最近注意到一个问题,一些用户代理会重复相同的POST请求,而用户实际上不会触发它两次

在进一步研究之后,我们注意到只有当请求通过负载平衡器并且服务器处理请求花费了很长时间时,才会发生这种情况。数据包捕获会话最终显示,负载平衡器通过向客户端发送TCP重置,在5分钟超时后断开连接;但是,客户端会自动重新提交请求,而无需用户干预

我们在Apache HTTP client for Java、Firefox和IE8中观察到了这种行为。(我无法安装其他浏览器进行测试。)这让我认为这种行为是HTTP标准的一部分,但这对谷歌来说并不容易


此外,似乎只有通过保持活动的TCP连接提交第一个请求时才会发生这种情况。

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

我也经历过类似的情况,在几毫秒之内,我们将相同的表单发布了几次

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


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

当HTTP客户端使用HTTP keepalive时,它会尝试维护请求之间的TCP连接。但是客户端无法确定连接是否正常。因此,当它接收到RST时,甚至在发送请求并再次发送请求之前,它可能认为连接已断开。顺便说一句,我不确定这是一个真正的原因,这只是一个猜测。@Den这也是我的猜测。我希望有人能想出定义这个的RFC。HTTP/1.1 RFC似乎说这不能发生。请包括捕获。请参阅“或”之类的问题,了解如何处理重新提交的请求。我被引导相信,因为POST不是幂等操作,所以不应该自动重试,但是您指出的条件似乎对所有请求方法都是通用的。