ConnectionTimeout et SocketTimeout

135

J'ai un problème avec une bibliothèque que j'utilise. C'est peut-être la bibliothèque ou c'est peut-être moi qui l'utilise mal!

En gros, quand je fais cela (Timeout en millisecondes)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Aucune exception de délai d'attente n'est générée et cela fonctionne bien, cependant, lorsque je fais ce qui suit,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

J'obtiens une exception de socket.

Alors, ma question est pourquoi ne puis-je pas simuler une exception de connexion? Suis-je mal compris la différence entre un socket et un délai de connexion? La bibliothèque est ici (pas encore officiellement publiée).

Robert
la source

Réponses:

227

Un délai d'expiration de la connexion se produit uniquement au démarrage de la connexion TCP. Cela se produit généralement si la machine distante ne répond pas. Cela signifie que le serveur a été arrêté, que vous avez utilisé le mauvais nom IP / DNS, un mauvais port ou que la connexion réseau au serveur est interrompue.

Un timeout de socket est dédié à la surveillance du flux de données entrant continu. Si le flux de données est interrompu pendant le délai spécifié, la connexion est considérée comme bloquée / interrompue. Bien sûr, cela ne fonctionne qu'avec les connexions où les données sont reçues tout le temps.

En définissant le délai d'expiration du socket sur 1, cela nécessiterait que chaque milliseconde de nouvelles données soient reçues (en supposant que vous lisez les données par bloc et que le bloc est suffisamment grand)!

Si seul le flux entrant se bloque pendant plus d'une milliseconde, vous rencontrez un délai d'expiration.

Robert
la source
1
Pourriez-vous obtenir un délai de connexion si le serveur n'est pas en panne mais est trop occupé? Ou serait-ce un timeout de socket?
Robert
9
Cela dépend - si la connexion TCP a été établie avant que le serveur ne soit surchargé, vous obtiendrez une exception de socket - sinon vous obtiendrez une exception de connexion, indiquant que la connexion TCP n'a pas pu être établie.
Robert
2
Compte tenu de la latence élevée des réseaux mobiles particulièrement anciens, le délai d'expiration de la connexion doit être réglé sur plusieurs secondes (par exemple 10 s ou plus de 10 000 ms). Le délai d'expiration du socket que je définirais uniquement si vous n'utilisez pas plusieurs connexions car HTTP peut réutiliser la connexion après une demande.
Robert
1
Cela signifie-t-il que si vous définissez un délai d'expiration de socket (par exemple 1 min), la connexion serait interrompue après 1 min d'inactivité, alors qu'elle serait normalement réutilisée si aucun délai d'expiration n'était défini?
Robert le
2
@Robert Vous n'obtiendrez pas nécessairement une exception de connexion si le serveur est trop occupé. Cela dépend de la plate-forme, de la plate-forme du serveur. Un délai de lecture de socket ne coupe pas la connexion. Cela provoque simplement une exception SocketTimeoutException. Que la connexion soit toujours utilisable est une décision que l'application doit prendre. Il n'y a certainement rien dans l'API qui indique que vous ne pouvez pas essayer plus d'E / S sur le socket. Votre déclaration de ne pas utiliser les délais d'expiration si vous utilisez plusieurs connexions n'a pas de sens. Trop de désinformation ici.
Marquis of Lorne
83

Un délai de connexion est la durée maximale que le programme est prêt à attendre pour établir une connexion à un autre processus. Vous n'obtenez ni ne publiez aucune donnée d'application à ce stade, vous établissez simplement la connexion elle-même.

Un timeout de socket est le délai d'attente lors de l'attente de paquets individuels. C'est une idée fausse courante qu'un délai d'expiration de socket est le délai pour recevoir la réponse complète. Donc, si vous avez un timeout de socket de 1 seconde et une réponse composée de 3 paquets IP, où chaque paquet de réponse prend 0,9 seconde pour arriver, pour un temps de réponse total de 2,7 secondes, alors il n'y aura pas de timeout.

entpnerd
la source
3
D'accord. 1. Pouvons-nous donc dire que SocketTimeout n'entre en scène que lorsqu'une connexion est déjà établie? 2. Que faire s'il n'y a pas de flux de données pendant, disons, 5 minutes après la réception des 3 paquets? Y aura-t-il une exception SocketTimeout après la réception du troisième paquet?
Saurabh Patil
2
@SaurabhPatil 1. Oui. Voir l'aperçu technique de Wikipedia sur le protocole HTTP pour confirmation. 2. Une fois la fin du message envoyée, aucune autre donnée n'est nécessaire, donc un délai d'expiration de socket ne se produira pas. Voir cette réponse sur le sujet.
entpnerd
7
J'aurais aimé qu'ils aient nommé "timeout de socket" comme "timeout d'inactivité".
Manish Maheshwari