Que signifie «connexion réinitialisée par un pair»?

649

Quelle est la signification de l'erreur "réinitialisation de la connexion par l'homologue" sur une connexion TCP? S'agit-il d'une erreur fatale ou simplement d'une notification ou liée à la panne du réseau?

Franck Freiburger
la source

Réponses:

772

C'est fatal. Le serveur distant vous a envoyé un paquet RST, ce qui indique une interruption immédiate de la connexion, plutôt que la prise de contact habituelle. Cela contourne la transition d'état semi-fermée normale. J'aime cette description :

"Réinitialisation de la connexion par l'homologue" est l'équivalent TCP / IP du claquement du téléphone sur le crochet. C'est plus poli que simplement de ne pas répondre, laissant une pendaison. Mais ce n'est pas le FIN-ACK attendu du converseur TCP / IP vraiment poli.

ire_and_curses
la source
49
Pourquoi est - il étiqueté « réinitialisation de la connexion par les pairs « Il semble que cela devrait être « remise à zéro de connexion par l'hôte » ou « réinitialisation de la connexion par le serveur »?
Robert
27
@Robert Parce que c'est de là que vient la réinitialisation. L'homologue a envoyé un paquet RST.
Marquis de Lorne
106
... Robert, votre inquiétude n'a aucun sens pour moi. Le pair est juste plus général que cela. Dans un modèle client-serveur typique, le serveur peut tout aussi facilement recevoir cette notification du "client". La machine qui demande initialement la connexion a tout autant de pouvoir pour envoyer cette notification. Au niveau TCP, il semble identique une fois la connexion en cours. Les deux machines, lorsqu'elles communiquent, ne sont que des pairs.
codetaku
9
Ce paquet aurait pu être envoyé par un autre appareil au milieu comme un routeur?
Arnold Roa
3
Il ne peut pas être appelé «connexion réinitialisée par le serveur» car il peut être envoyé par le client ou le serveur. Il ne peut pas être «contourné». Si un client reçoit cette erreur, cela signifie que la connexion TCP n'est plus ouverte sur le serveur, par exemple depuis que le serveur est tombé en panne et a été redémarré.
Johannes Overmann
193

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é à partir de votre extrémité de la connexion mais que l'autre extrémité ne reconnaît pas la connexion; il renverra un paquet avec le bit RST défini afin de fermer de force la connexion.

Cela peut se produire si l'autre côté se bloque puis revient ou s'il appelle close()le socket alors qu'il y a des données de vous en transit, et cela vous indique que certaines des données que vous avez précédemment envoyées peuvent ne pas avoir été reçues.

C'est à vous de décider si c'est une erreur; si les informations que vous envoyiez étaient uniquement destinées au client distant, il peut ne pas être important que des données finales aient été perdues. Cependant, vous devez fermer le socket et libérer toutes les autres ressources associées à la connexion.

mark4o
la source
11
Si vous définissez l'option de socket SO_LINGER à zéro lors de l'ouverture d'un nouveau socket, puis fermez-le normalement, le bit RST sera défini. Donc, TOUTE connexion se terminera par une réinitialisation. N'essayez pas ça à la maison, c'est juste ennuyeux. stackoverflow.com/questions/3757289
Chris Huang-Leaver
1
Comment résoudre ce problème alors, devons-nous redémarrer à la fois à distance et notre hôte?
user2225190
3
@ user2225190 Vous devez reconnecter le client, mais vous devez d'abord examiner votre logiciel pour vous assurer qu'il n'est pas dû à une erreur de protocole d'application, c'est-à-dire fermer une connexion vers laquelle l'autre extrémité écrit toujours.
Marquis de Lorne
1
Merci pour votre commentaire. Il fonctionnait pendant deux mois. J'essaie également à partir d'une ligne de commande, mais j'obtiens toujours cette erreur. J'essaie "sftp user @ machine". L'erreur est incohérente.
user2225190