user3863470
user3863470

Reputation: 11

TCP socket over HTTP proxy disconnects after idle timeout

I have a problem with TCP socket when using HTTP tunneling over proxy.

Client (C++) opens a TCP socket to a server (JAVA). I added support for HTTP proxy. Everything worked good, client sends "HTTP connect" request like this and continues to plain TCP connection after:

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

HTTP/1.1 200

However, if idle timeout is configured in proxy and there is no actual data sent, connection is terminated though client sends TCP keep alive packets every 60 seconds. Idle timeout is configured to 10 minutes.

TCP keep alive is configured as following: WSAIoctl(socket, SIO_KEEPALIVE_VALS, &alive, sizeof(alive), NULL, 0, &dwBytesRet, NULL, NULL)

client IP - 192.168.91.xxx
Proxy 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

Any ideas how to keep connection alive?

I tried to add "Connection: Keep-Alive" header though HTTP1.1 should do it automatically. It didn't help anyway.

Upvotes: 1

Views: 4273

Answers (1)

Steffen Ullrich
Steffen Ullrich

Reputation: 123581

This is a timeout at the application layer, e.g. the connection is idle because no application data are sent. What you've tried will not work because:

  • Connection: keep-alive is for having multiple HTTP requests over a single connection. This does not apply here because from the view of the proxy there is only a single request (CONNECT).
  • TCP keep-alive is to notice if the peer is not reachable any longer (died without closing connection or connection broke somewhere in the middle). It does not apply for cases, where the TCP connection is still alive, but it is idle (no application data).

Having a idle timeout for the proxy makes sense. The idea of HTTP is, that the client sends a request and the server sends a response. If it is idle while receiving the request or the response usually something is broken (or you have a reaaaaaly slow connection). If it is idle after request and response finished it is perfectly valid to close the connection, even if the client asked for Connection: keep-alive, because keep-alive is not a requirement on the server but only a suggestion to keep the connection open for more requests if the server has enough resources to do so.

Upvotes: 2

Related Questions