web-dev-qa-db-fra.com

FIN vs RST dans les connexions TCP

D'après ce que je comprends, il existe 2 façons de fermer la connexion TCP:

  • envoyer le drapeau FIN
  • envoyer le drapeau RST

RST provoque l'arrêt immédiat de la connexion, tandis que dans FIN, vous obtenez une confirmation.

Dois-je comprendre ce droit, et y a-t-il d'autres distinctions entre les deux? Ces 2 drapeaux peuvent-ils être utilisés ensemble?

35
Arsen Zahray
  • FIN dit: "J'ai fini de te parler, mais je vais quand même écouter tout ce que tu as à dire jusqu'à ce que tu dises que tu as fini."

  • RST dit: "Il n'y a pas de conversation. Je ne dirai rien et je n'écouterai rien de ce que vous dites."

    RST est utile si vous avez une connexion de longue durée TCP avec peu de trafic. Si l'un des ordinateurs est redémarré, il oublie la connexion et l'autre ordinateur obtient RST, dès qu'il envoie un autre paquet.

76
escitalopram

FIN ou RST seraient envoyés dans le cas suivant

  • votre processus ferme le socket
  • OS fait le nettoyage des ressources lorsque votre processus se termine sans fermer le socket.

    Si votre processus appelle close (), FIN serait envoyé par défaut du côté de la fermeture (remarque: vous pouvez définir l'option de socket SO_LINGER pour lui faire envoyer RST au lieu de FIN)

    Si votre processus se termine sans fermer le socket, le noyau ferme la connexion TCP et effectue le nettoyage de votre processus. FIN ou RST peuvent être envoyés. S'il y a des données dans votre file d'attente de réception, RST serait envoyé. Sinon, FIN serait envoyé.

    Vous pouvez parcourir tcp_close () dans tcp.c pour plus de détails (j'utilise kernel-2.6.32-573.7.1 de la branche redhat)

7
Ben

De la RFC 1122, que tout le monde continue de citer, mais pas en fait, contre moi:

Une connexion TCP peut se terminer de deux manières: (1) la séquence normale TCP close utilisant une poignée de main FIN, et (2) une "interruption" dans laquelle un ou plusieurs segments RST sont envoyés et l'état de connexion est immédiatement rejeté.

Il n'est pas possible d'utiliser les deux en même temps. Le concept n'a même pas de sens.

Il est possible au moyen d'une ruse que je ne décrirai pas ici de fermer une connexion TCP avec un RST au lieu d'un FIN, mais c'est une idée stupide, c'est pourquoi je ne le documente pas. D'une part, toutes les données en attente en vol sont perdues.

6
user207421