2014-07-22 84 views
1

使用基于代理的HTTP隧道时,TCP套接字有问题。通过HTTP代理的TCP套接字在空闲超时后断开连接

客户端(C++)打开一个TCP套接字到服务器(JAVA)。我添加了对HTTP代理的支持。一切工作不错,客户端发送“HTTP连接”的请求,这样以后继续为纯TCP连接:

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

HTTP/1.1 200 

然而,如果空闲超时在代理配置并没有发送任何实际数据,连接将被终止,虽然客户端每60秒发送一次TCP保持活动数据包。空闲超时配置为10分钟。

TCP保持活跃被配置如下: 的WSAIoctl(插座,SIO_KEEPALIVE_VALS,&活着,的sizeof(活着),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 

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

虽然HTTP1.1应该自动执行,但我试图添加“Connection:Keep-Alive”标头。无论如何,这并没有帮助。

回答

2

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

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

代理的空闲超时值是有意义的。 HTTP的思想是,客户端发送请求,服务器发送响应。如果它在接收请求时处于空闲状态,或者响应通常会中断(或者您的连接速度很慢)。如果在请求和响应完成后它处于空闲状态,则即使客户端请求Connection: keep-alive也是完全有效的,因为在服务器上保持活动状态不是必需的,但是只有建议可以保持连接在更多的请求中处于打开状态。服务器有足够的资源来做到这一点。