2014-07-22 3 views
1

J'ai un problème avec le socket TCP lors de l'utilisation du tunnel HTTP via proxy. Le client (C++) ouvre un socket TCP à un serveur (JAVA).Le socket TCP sur le proxy HTTP se déconnecte après un délai d'inactivité

J'ai ajouté le support pour le proxy HTTP. Tout marchait bien, le client envoie « connexion HTTP » telle demande et continue de connexion TCP simple après:

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

HTTP/1.1 200 

Toutefois, si le délai d'inactivité est configuré en proxy et il n'y a pas de données réelles envoyées, la connexion est interrompue si le client envoie TCP garder les paquets vivants toutes les 60 secondes. Le délai d'inactivité est configuré sur 10 minutes.

TCP garder en vie est configuré comme suit: WSAIoctl (prise, SIO_KEEPALIVE_VALS, & vivant, sizeof (vivant), 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 

Toute idée comment garder en vie la connexion?

J'ai essayé d'ajouter l'en-tête "Connection: Keep-Alive" bien que HTTP1.1 le fasse automatiquement. Cela n'a pas aidé de toute façon.

Répondre

2

Il s'agit d'un dépassement de délai au niveau de la couche d'application, par ex. la connexion est inactive car aucune donnée d'application n'est envoyée. Ce que vous avez essayé ne fonctionnera pas parce que:

  • Connection: keep-alive est d'avoir plusieurs requêtes HTTP sur une même connexion. Ceci ne s'applique pas ici car à partir de la vue du proxy il n'y a qu'une seule requête (CONNECT).
  • TCP keep-alive est à remarquer si l'homologue n'est plus joignable (mort sans fermeture de connexion ou connexion interrompue quelque part au milieu). Cela ne s'applique pas aux cas où la connexion TCP est toujours active, mais elle est inactive (pas de données d'application).

Avoir un délai d'inactivité pour le proxy est logique. L'idée de HTTP est que le client envoie une requête et que le serveur envoie une réponse. Si elle est inactive lors de la réception de la requête ou de la réponse, quelque chose est généralement cassé (ou vous avez une connexion lente). S'il est inactif après la fin de la requête et de la réponse, il est parfaitement possible de fermer la connexion, même si le client a demandé Connection: keep-alive, car keep-alive n'est pas une exigence sur le serveur mais seulement une suggestion pour garder la connexion ouverte pour plus de requêtes si le serveur dispose de suffisamment de ressources pour le faire.