878 votes

Que signifie "réinitialisation de la connexion par un pair" ?

Quelle est la signification de l'erreur "connection reset by peer" sur une connexion TCP ? S'agit-il d'une erreur fatale, d'une simple notification ou d'une erreur liée à la défaillance du réseau ?

1033voto

ire_and_curses Points 32802

C'est fatal. Le serveur distant vous a envoyé un paquet RST, qui indique un abandon immédiat de la connexion, plutôt que la poignée de main habituelle. Cela permet de contourner la transition d'état normale de demi-fermeture. J'aime cette description :

"Connection reset by peer" est l'équivalent TCP/IP de raccrocher le téléphone. C'est plus poli que de ne pas répondre, ce qui laisse un vide. Mais ce n'est pas le FIN-ACK attendu d'un converseur TCP/IP vraiment poli.

79 votes

Pourquoi est-il étiqueté "connexion réinitialisée par pair " ? On dirait que ça devrait être "connexion réinitialisée par l'hôte", ou "connexion réinitialisée par le serveur".

40 votes

@Robert Parce que c'est de là que vient le reset. Le pair a envoyé un paquet RST.

171 votes

... Robert, votre préoccupation n'a aucun sens pour moi. Peer est juste strictement plus général que cela. Dans un modèle client-serveur typique, le serveur peut tout aussi bien recevoir cette notification du "client". La machine qui demande initialement la connexion a tout autant le pouvoir d'envoyer cette notification. Au niveau du protocole TCP, la situation est identique une fois que la connexion est en cours. Les deux machines, lorsqu'elles communiquent, ne sont que des pairs.

263voto

mark4o Points 20472

Cela signifie qu'un TCP RST a été reçu et que la connexion est maintenant fermée. Cela se produit lorsqu'un paquet est envoyé depuis votre extrémité de la connexion mais que l'autre extrémité ne reconnaît pas la connexion ; elle renverra un paquet avec le bit RST activé afin de fermer de force la connexion.

Cela peut se produire si l'autre partie s'effondre puis se remet en marche ou si elle appelle close() sur la prise pendant que vos données sont en transit, et vous indique que certaines des données que vous avez envoyées précédemment n'ont peut-être pas été reçues.

C'est à vous de décider s'il s'agit d'une erreur ; si les informations que vous envoyiez étaient uniquement destinées au client distant, la perte de données finales n'a peut-être pas d'importance. Cependant, vous devez fermer le socket et libérer toutes les autres ressources associées à la connexion.

14 votes

Si vous mettez l'option de socket SO_LINGER à zéro lorsque vous ouvrez un nouveau socket, puis que vous le fermez normalement, le bit RST sera mis à zéro. Ainsi, TOUTES les connexions se termineront par une réinitialisation. N'essayez pas cela chez vous, c'est juste ennuyeux. stackoverflow.com/questions/3757289

1 votes

Comment résoudre ce problème alors, devons-nous redémarrer à la fois le serveur distant et notre hôte ?

3 votes

@user2225190 Vous devez reconnecter le client, mais vous devez d'abord examiner votre logiciel pour vous assurer que ce n'est pas dû à une erreur de protocole d'application, c'est-à-dire la fermeture d'une connexion sur laquelle l'autre extrémité écrit encore.

7voto

chaos Points 69029

Cela signifie que l'autre côté de la connexion l'a fermée. C'est généralement assez fatal si vous ne vous y attendiez pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X