我们的应用程序是基于ExtJS 3.4的应用程序我们经常在UI上出现“ Communication Failure ”错误,我们将我们的应用程序部署在不同的域上但在某些域上我们经常得到这个 .
Without HTTP Keep Alive we are not getting that error. :
但是在1秒和5秒的不同情况下,我们经常得到它 .
我们在Wireshark上观察到由于高RTT(往返时间)请求所花费的时间超过预期 . 这种情况下的数据包流不一致:
如果活着是5秒:
-
成功提供请求后,它将返回200 OK(成功响应)和5秒的超时参数(服务器试图向客户端说服务器将在关闭此连接之前等待5秒) .
-
现在,只要经过5秒的时间,服务器就会发送一个FIN数据包(完成数据包将关闭连接从服务器发送到客户端,在我们的例子中是浏览器) .
-
现在,这是从客户端到关闭连接的ACK(确认数据包)所用的时间很长(高RTT) .
-
现在服务器已启动关闭但由于在连接关闭之前的高RTT,客户端在服务器从客户端收到FINISH for FINISH之前发送新的HTTP请求(例如ExampleABC.do请求) .
-
由于它已启动连接关闭,因此哪个服务器无法处理该请求 .
将1秒设置为保持活动意味着我们正在减少服务器等待关闭连接的时间,因为我们想要在1秒后关闭一个连接并为新请求设置新连接以避免在5秒后发出不需要的请求 .
在此先感谢这是我的第一篇文章,如果需要请纠正我 . 抱歉英文不好:)
Image for communication failure :
1 回答
我们通过同步浏览器超时和服务器超时来解决此问题 .
修复是为了确保TCP keepalive时间和浏览器重合或同时到来,导致TCP连接完全丢弃 .