空闲超时后,TCP代理通过HTTP代理断开连接

时间:2014-07-22 08:49:38

标签: sockets http tcp proxy

在使用HTTP隧道代理时,我遇到TCP套接字问题。

客户端(C ++)打开到服务器(JAVA)的TCP套接字。我添加了对HTTP代理的支持。一切都运作良好,客户端发送" HTTP连接"像这样请求并继续在以下之后进行纯TCP连接:

CONNECT servername:5555 HTTP/1.1
Host: servername:5555
Proxy-Connection: Keep-Alive

HTTP/1.1 200

但是,如果在代理中配置了空闲超时并且没有发送实际数据,则连接会终止,尽管客户端每隔60秒发送一次TCP保持活动数据包。空闲超时配置为10分钟。

TCP keep alive配置如下: WSAIoctl(socket,SIO_KEEPALIVE_VALS,& alive,sizeof(alive),NULL,0,& dwBytesRet,NULL,NULL)

客户端IP - 192.168.91.xxx
代理IP - 192.168.92.yyy

244 47.133017000    192.168.91.xxx  192.168.92.yyy  TCP 55  [TCP Keep-Alive] 64351 > 808 [ACK] Seq=4336 Ack=13084 Win=65700 Len=1
245 47.133336000    192.168.92.yyy  192.168.91.xxx  TCP 66  [TCP Keep-Alive ACK] 808 > 64351 [ACK] Seq=13084 Ack=4337 Win=65536 Len=0 SLE=4336 SRE=4337

如何保持连接活着的任何想法?

我尝试添加" Connection:Keep-Alive"尽管HTTP1.1应该自动执行此标头。无论如何它都没有帮助。

1 个答案:

答案 0 :(得分:1)

这是应用层的超时,例如连接空闲,因为没有发送应用程序数据。您尝试过的内容不起作用,因为:

  • Connection: keep-alive用于通过单个连接发出多个HTTP请求。这不适用于此,因为从代理的角度来看,只有一个请求(CONNECT)。
  • TCP keep-alive将注意到对等体是否再也无法访问(在没有关闭连接的情况下死亡或连接在中间某处断开)。它不适用于TCP连接仍处于活动状态但空闲(没有应用程序数据)的情况。

让代理空闲超时是有道理的。 HTTP的想法是,客户端发送请求,服务器发送响应。如果它在接收请求时处于空闲状态,或者响应通常会出现问题(或者您的连接速度很慢)。如果在请求和响应完成后它处于空闲状态,即使客户端要求Connection: keep-alive,关闭连接也是完全有效的,因为保持活动不是服务器上的要求,而只是保持连接打开的建议如果服务器有足够的资源可以提供更多请求。