Ce qui peut provoquer TCP/IP pour déposer des paquets sans la suppression de la connexion?

J'ai une application basée sur le web et un client, tous deux écrits en Java. Pour ce que ça vaut, le client et le serveur sont à la fois sur Windows. Le client émet HTTP via Apache HttpClient. Le serveur bloque jusqu'à une minute et si aucun des messages sont arrivés pour le client dans la minute, le serveur renvoie HTTP 204 Aucun Contenu. Sinon, dès qu'un message est prêt pour le client, il est retourné avec le corps d'un HTTP 200 OK.

Voici ce qui m'a intrigué: par Intermittence pour un sous-ensemble spécifique de clients, toujours les clients avec manifestement feuilletée connexions réseau -- le client émet un GET, le serveur reçoit et traite les OBTENIR, mais le client est assis pour toujours. L'activation de journaux de débogage pour le client, je vois que HttpClient est toujours en attente de la première ligne de la réponse.

Il n'y a aucune Exception n'est levée sur le serveur, au moins rien de connecté n'importe où, pas par Tomcat, pas par ma webapp. Selon les journaux de débogage, il y a tous les signes que le serveur a répondu à la client. Toutefois, le client ne montre aucun signe d'avoir reçu quoi que ce soit. Le client se bloque indéfiniment dans HttpClient.execute. Cela devient évident après la fin de la session et le client prend des mesures qui provoque un autre Thread pour émettre un HTTP POST. Bien sûr, le POST échoue parce que la session a expiré. Dans certains cas, heures se sont écoulés entre la session expire et le client d'émettre un POST et découvrir ce fait. Pendant ce temps, executeMethod est toujours en attente de la réponse HTTP de la ligne.

Lorsque j'utilise WireShark pour voir ce qui se passe vraiment au fil de niveau, ce problème ne se produit pas. Qui est cet échec va se produire dans un délai de quelques heures pour des clients spécifiques, mais quand WireShark est en cours d'exécution aux deux extrémités, ces mêmes clients fonctionner du jour au lendemain, à 14 heures, sans un échec.

Quelqu'un d'autre a rencontré quelque chose comme cela? Ce qui dans le monde peut-il provoquer? J'ai pensé que le protocole TCP/IP de la garantie de livraison de paquets, même à travers à court terme du réseau de pépins. Si j'ai mis un SO_TIMEOUT et immédiatement réessayer la demande sur le délai d'attente, la nouvelle tentative réussit toujours. (Bien sûr, j'ai d'abord abandonner le temps de votre demande et la libération de la connexion afin de vous assurer qu'un nouveau socket sera utilisé.)

Pensées? Des idées? Est-il un paramètre TCP/IP disponible à Java ou un paramètre de registre de Windows, qui permettra à plus agressif TCP/IP tentatives sur la perte de paquets?

Des sons comme l'observation est en train de changer le resultat -> Heisenbug -> quelque chose de mal avec le filetage. Dans ce cas, il sonne comme quelqu'un va trop rapide (je mettrais mon argent sur HttpClient) et tout simplement des blocages à cause de cela. Il est possible que vous avez atteint un bug dans HttpClient lui-même, j'espère que d'autres peuvent être plus utiles et vous aider avec ce problème.

OriginalL'auteur Eddie | 2009-04-24