长时间运行的http连接永远不会得到回复

时间:2009-10-29 22:25:19

标签: http connection keep-alive

我正在制作一个http请求,最终需要花费超过8分钟。对我来说,这个长期运行的请求工作正常。我能够在没有任何问题的情况下回复我的浏览器。 (我与服务器位于同一网络上。)

但是,对于某些用户,浏览器永远不会返回任何响应。 (注意:当1分钟内执行相同的http请求时,这些用户可以毫无问题地看到响应)

这些用户碰巧在另一个网络上。并且它们的位置和服务器之间可能存在防火墙或两个防火墙。

我可以在他们的小提琴手上看到请求只是坐在那里等待回应。

我现在假设防火墙正在杀死空闲的http连接..但我不确定。

如果您知道为什么响应永远不会回来,或者为什么连接永远不会中断......这将非常有用。

另外:是否有可能通过编写一个Applet来解决这个问题,即使在将请求发送(刷新)到服务器之后,该Applet仍以某种方式设法将发送虚拟信号保持在服务器上?

3 个答案:

答案 0 :(得分:1)

用户可能在连接跟踪防火墙/ NAT网关后面。当一段时间内没有发生任何事情时,这种网关往往会丢弃TCP连接。在自定义协议中,您可以发送某种心跳消息来保持TCP连接的活动,但是使用HTTP,您无法正确控制该连接,HTTP也不会促进保持tcp连接“活动”所需的内容。

处理HTTP请求启动的长时间运行作业的常用方法是在后台启动该作业,立即向客户端发送适当的响应,并让applet / ajax请求轮询该作业的状态并返回完成后的结果。

如果您需要快速修复,请查看您是否可以控制服务器和用户之间网关的任何超时。

答案 1 :(得分:0)

您是否认为用户可能正在使用具有HTTP超时的浏览器,导致浏览器在一段时间后停止等待响应?

答案 2 :(得分:0)

http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html
http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/usingkeepalive.html

如果您使用的是Linux机器,请尝试

# cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200
# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75
# cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

# echo 1500 > /proc/sys/net/ipv4/tcp_keepalive_time
# echo 500 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes