在使用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应该自动执行此标头。无论如何它都没有帮助。
答案 0 :(得分:1)
这是应用层的超时,例如连接空闲,因为没有发送应用程序数据。您尝试过的内容不起作用,因为:
Connection: keep-alive
用于通过单个连接发出多个HTTP请求。这不适用于此,因为从代理的角度来看,只有一个请求(CONNECT)。让代理空闲超时是有道理的。 HTTP的想法是,客户端发送请求,服务器发送响应。如果它在接收请求时处于空闲状态,或者响应通常会出现问题(或者您的连接速度很慢)。如果在请求和响应完成后它处于空闲状态,即使客户端要求Connection: keep-alive
,关闭连接也是完全有效的,因为保持活动不是服务器上的要求,而只是保持连接打开的建议如果服务器有足够的资源可以提供更多请求。